Làm quen với TensorFlow qua giải bài toán Linear regression


Posted on 10 Aug 2018 by Tulip Tulip

TensorFlow là một framework về machine learning, đặc biệt chuyên về Deep learning của Google. Nếu chưa biết về TensorFlow, bạn có thể coi giới thiệu về TensorFlow mà mình từng viết 2 năm trước ở đây.

Flow khi sử dụng TensorFlow

Khi sử dụng TensorFlow để giải quyết các bài toán machine learning, mình sẽ thực hiện theo flow như sau:

  • Xây dựng graph: bước nào bao gồm tạo ra graph theo chiều xuôi (foward), bao gồm việc tạo ra các placeholders/variables để làm các nodes, sau này mình đưa thông tin input, lưu trữ và lấy thông tin các weights/output. Ngoài ra, trong graph còn có các edges mang thông tin các operations nữa.
  • Xây dựng optimizer: phần đa các thuật toán machine learning đều cần 1 thuật toán optimization nhằm điều chỉnh các parameters để tạo ra model chính xác hơn. Ở bước này, ta cần tạo ra loss node, và tạo ra 1 optimizẻ object để thực hiện bước optimization đó.
  • Tạo session: những thứ chúng ta tạo ra phía trên chỉ là việc chúng ta define ra 1 graph, tuy nhiên để có thể thực hiện tính toán, chạy model, ta cần các session để thực hiện các tính toán đã được define đó. Ta thực hiện các bước training ở phần session này.

Ngoài ra, ta cần feed data vào model nữa. Việc này có thể thực hiện ở bước xây dựng graph hoặc trong bước tạo session, tuỳ theo model và lựa chọn của chúng ta.

Giải quyết bài toán Linear regression

Trước hết chúng ta import các package cần thiết. Ở đây ta có import thêm matplotlib và imageio nhằm mục đích visualization sau này.

1
2
3
4
5
import tensorflow as tf
import numpy as np
import time
import matplotlib.pyplot as plt
import imageio

Chúng ta bắt đầu với 1 tập toy dataset gồm xy như sau:

1
2
x = np.arange(0, 1, 0.01)
y = np.arange(2, 4, 0.02) + np.random.randn(x.shape[0],) * 0.2

Tiếp đó, chúng ta sẽ tạo ra các nodes, mang thông tin cần thiết của layers. Do chúng ta xác định model sẽ dùng là linear regression, nên ta cần thêm 1 layer nữa, mà không có activation function cho lớp này, đây đồng thời cũng là kết quả cần tính. Chú ý 1 điều, ta cho luôn data vào input và output luôn (cái này tuỳ bài toán mà sẽ có lựa chọn phù hợp)

1
2
3
4
5
6
7
x_train = tf.constant(x, dtype=np.float32, shape=[x.shape[0], 1])
y_train = tf.constant(y, dtype=np.float32, shape=[x.shape[0], 1])
with tf.variable_scope("foo"):
    weights = tf.get_variable("weights", [1, 1],
                    initializer=tf.random_normal_initializer())
    biases = tf.get_variable("biases", [1, 1],
                    initializer=tf.constant_initializer(0.0))

Chiều foward có thể xác định khá đơn giản:

1
y_hat = tf.add(tf.matmul(x_train, weights), biases)

Chiều backward thì ta dùng gradient descent, với loss function là RMSE:

1
2
3
loss = tf.reduce_mean(tf.square(y_hat - y_train))
optimizer = tf.train.GradientDescentOptimizer(0.1)
train = optimizer.minimize(loss)

Tới đây, ta sẽ tạo session để chạy model:

1
2
3
4
5
6
7
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    for i in range(200):
        _, loss_value = sess.run((train, loss))
        if i % 5 == 0:
            print(loss_value)

Và đây là kết quả của chúng ta:


Sử dụng gradient để fit linear regression

Kết luận

Chúng ta đã hoàn thành code xong thuật toán linear regression sử dụng TensorFlow. Đây là thuật toán đơn giản, dễ code, đặc biệt là khi dùng “dao mổ trâu” như TensorFlow. Nếu bạn muốn làm quen TensorFlow, đây là bài toán ban đầu phù hợp, trước khi chuyển tới những bài toán khác, ví dụ như dùng Neural network giải quyết bài toán fizzbuzz. Dự định tiếp theo của mình sẽ là dùng TensorFlow để thực hiện implement word2vec.