AI Cho Mọi Người

AI Cho Mọi Người

Linear regression

 

 

Trong bài này, chúng ta sẽ học về linear regression và dùng giải thuật backpropagation (lan truyền ngược) để tìm ra các tham số tối ưu cho một dataset. Linear regression tuy đơn giản, nhưng nó bao gồm các bước quan trọng mà hầu hết các thuật toán deep learning hiện tại đang dùng như tính feed-forward, tính loss, tính đạo hàm và cập nhật cho các tham số dùng BP.

Linear regression được dùng để tiên toán giá trị từ dữ liệu input, và nó giả định mối quan hệ giữa input và output là tuyến tính. Một ví dụ đơn giản là tiên đoán giá nhà price dựa vào diện tích nhà theo công thức sau

$$price = a*area + b, \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, (1)$$
trong đó a và b là hai tham số cần tìm.

Một ví dụ khác là dự đoán doanh thu bán hàng (sale) dựa vào số tiền quảng cáo trên TV, trên radio, và trên newspaper. Khi đó công thức dự đoán sale dùng linear regression như sau

$$sale = c1∗TV + c2∗Radio + c3∗Newspaper + c4 \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, (2)$$
trong đó c1, c2, c3, và c4 là các tham số cần tìm.

 

I. Các bước cần làm khi dùng linear regression

– Chuẩn bị và xử lý dữ liệu
– Xây dựng mô hình
– Xây dựng hàm loss
– Tìm bộ tham số dùng giải thuật backpropagation

 

1. Chuẩn bị và xử lý dữ liệu

Bước chuẩn bị và xử lý dữ liệu rất quan trọng và chiếm phần lớn thời gian. Với bài toán dự đoán giá nhà dựa vào diện tích nhà và bài toán dự đoán doanh thu bán hàng, chúng ta cần có dữ liệu giao dịch thực tế. Dữ liệu này dùng để huấn luyện mô hình (model) ước lượng. Phương trình (1) và (2) là ví dụ cụ thể của mô hình ước lượng.

Trong các bài học hoặc trong nghiên cứu, các bộ dữ liệu thường được xử lý trước để tạo thuận lợi cho người sử dụng về sau. Tuy nhiên, trong thực tế, các dữ liệu thu thập hầu như cần xử lý để chỉnh sửa định dạng, thêm các trường dữ liệu, hay xóa các mẫu dữ liệu không cần thiết.

Bảng sau hiển thị bộ dữ liệu giá nhà theo diện tích.

3.875.38
2.293.45
5.176.94
4.937.1
45.47
3.975.31
6.778.89
2.484.08
2.854.59
6.438.52
6.998.63
2.744.29
2.073.34
3.645.48
5.667.4
1.853.3
4.736.19
4.556.46
6.48.65
2.143.35

Bộ dữ liệu nhà có 20 mẫu dữ liệu (không có header), và mỗi mẫu dữ liệu bao gồm diện tích nhà x (cột bên trái) và giá nhà y (cột bên phải). Diện tích nhà x thường được gọi tổng quát là đặc trưng, và giá nhà y là giá nhà thực, hay label, hay ground truth. Ở ví dụ cụ thể này, x chỉ chứa một đặc trưng là diện tích nhà.

Bộ dữ liệu dự đoán doanh thu bán hàng dựa vào số tiền cho quảng cáo.

TVRadioNewspaperSales
230.137.869.222.1
44.539.345.110.4
17.245.969.312
151.541.358.516.5
180.810.858.417.9
8.748.9757.2
57.532.823.511.8
120.219.611.613.2
8.62.114.8
199.82.621.215.6
66.15.824.212.6
214.724417.4
23.835.165.99.2
97.57.67.213.7
204.132.94619
195.447.752.922.4
67.836.611412.5
281.439.655.824.4
69.220.518.311.3
147.323.919.114.6
218.427.753.418
237.45.123.517.5
13.215.949.65.6
228.316.926.220.5
62.312.618.39.7
262.93.519.517
142.929.312.615
240.116.722.920.9
248.827.122.918.9
70.61640.810.5
292.928.343.221.4
112.917.438.611.9
97.21.53013.2
265.6200.317.4
95.71.47.411.9
290.74.18.517.8
266.943.8525.4
74.749.445.714.7
43.126.735.110.1
22837.73221.5
202.522.331.616.6
17733.438.717.1
293.627.71.820.7
206.98.426.417.9
25.125.743.38.5
175.122.531.516.1
89.79.935.710.6
239.941.518.523.2
227.215.849.919.8
66.911.736.89.7
199.83.134.616.4
100.49.63.610.7
216.441.739.622.6
182.646.258.721.2
262.728.815.920.2
198.949.46023.7
7.328.141.45.5
136.219.216.613.2
210.849.637.723.8
210.729.59.318.4
53.5221.48.1
261.342.754.724.2
239.315.527.320.7
102.729.68.414
131.142.828.916
699.30.911.3
31.524.62.211
139.314.510.213.4
237.427.51118.9
216.843.927.222.3
199.130.638.718.3
109.814.331.712.4
26.83319.38.8
129.45.731.311
213.424.613.117
16.943.789.48.7
27.51.620.76.9
120.528.514.214.2
5.429.99.45.3
1167.723.111
76.426.722.311.8
239.84.136.917.3
75.320.332.511.3
68.444.535.613.6
213.54333.821.7
193.218.465.720.2
76.327.51612
110.740.663.216
88.325.573.412.9
109.847.851.416.7
134.34.99.314
28.61.5337.3
217.733.55919.4
250.936.572.322.2
107.41410.911.5
163.331.652.916.9
197.63.55.916.7
184.9212220.5
289.742.351.225.4
135.241.745.917.2
222.44.349.816.7
296.436.3100.923.8
280.210.121.419.8
187.917.217.919.7
238.234.35.320.7
137.946.45915
251129.77.2
90.40.323.212
13.10.425.65.3
255.426.95.519.8
225.88.256.518.4
241.73823.221.8
175.715.42.417.1
209.620.610.720.9
78.246.834.514.6
75.13552.712.6
139.214.325.612.2
76.40.814.89.4
125.736.979.215.9
19.41622.36.6
141.326.846.215.5
18.821.750.47
2242.415.616.6
123.134.612.415.2
229.532.374.219.7
87.211.825.910.6
7.838.950.66.6
80.209.211.9
220.3493.224.7
59.61243.19.7
0.739.68.71.6
265.22.94317.7
8.427.22.15.7
219.833.545.119.6
36.938.665.610.8
48.3478.511.6
25.6399.39.5
273.728.959.720.8
4325.920.59.6
184.943.91.720.7
73.41712.910.9
193.735.475.619.2
220.533.237.920.1
104.65.734.410.4
96.214.838.912.3
140.31.9910.3
240.17.38.718.2
243.24944.325.4
3840.311.910.9
44.725.820.610.1
280.713.93716.1
1218.448.711.6
197.623.314.216.6
171.339.737.716
187.821.19.520.6
4.111.65.73.2
93.943.550.515.3
149.81.324.310.1
11.736.945.27.3
131.718.434.612.9
172.518.130.716.4
85.735.849.313.3
188.418.125.619.9
163.536.87.418
117.214.75.411.9
234.53.484.816.9
17.937.621.68
206.85.219.417.2
215.423.657.617.1
284.310.66.420
5011.618.48.4
164.520.947.417.5
19.620.1177.6
168.47.112.816.7
222.43.413.116.5
276.948.941.827
248.430.220.320.2
170.27.835.216.7
276.72.323.716.8
165.61017.617.6
156.62.68.315.5
218.55.427.417.2
56.25.729.78.7
287.64371.826.2
253.821.33017.6
20545.119.622.6
139.52.126.610.3
191.128.718.217.3
28613.93.720.9
18.712.123.46.7
39.541.15.810.8
75.510.8611.9
17.24.131.65.9
166.8423.619.6
149.735.6617.3
38.23.713.87.6
94.24.98.114
1779.36.414.8
283.64266.225.5
232.18.68.718.4

Bộ dữ liệu advertising có 200 mẫu dữ liệu. Các đặc trưng gồm TV, Radio, và Newspaper, thường được gọi là vector đặc trưng. Cột cuối cùng sales là doanh thu thực, label, hay ground truth. Nó không phải là đặc trưng, mà nó được dùng để so sánh với giá trị tiên đoán của mô hình. Nói cách khác, ground truth đóng vai trò dẫn dắt cho mô hình, sao cho các giá trị tiên đoán từ mô hình gần với giá trị ground truth nhất.

 

2. Xây dưng mô hình

Mô hình tổng quát của linear regression có dạng sau

$${h_\theta }\left( x \right) = {\theta _0}x_0 + {\theta _1}x_1 + … + {\theta _n}x_n$$
trong đó \(\theta = \left( {{\theta _0},{\theta _1},…,{\theta _n}} \right)\) là bộ tham số, và \(x = \left( {{x_0},{x_1},…,{x_n}} \right)\) là vector đặc trưng. \({h_\theta }\left( x \right)\) là giá trị tiên đoán dựa vào bộ tham số \(\theta\) cho mẫu dữ liệu x.

Bài toán dự đoán giá nhà có một đặc trưng là diện tích nhà. Do đó, cùng với tham số bias, bộ tham số \(\theta\) có chiều dài \(n = 2\). Vector đặc trưng (bao gồm bias) có dạng \(x = \left( {{x_0},{x_1}} \right) = \left( {1,area} \right)\).

Với bài toán advertising, các đặc trưng bao gồm TV, Radio, Newspaper. Do đó, vector đặc trưng (bao gồm bias) có dạng \(x = \left( {{x_0},{x_1},{x_2},{x_3}} \right) = \left( {1,TV,Radio,Newspaper} \right)\), và bộ tham số có dạng
\(\theta = \left( {{\theta _0},{\theta _1},{\theta _2},{\theta _3}} \right)\).

 

3. Xây dựng hàm loss

Mục đích của hàm loss nhằm đo mức độ khác biệt (khoảng cách) giữa giá trị tiên đoán \({h_\theta }\left( x \right)\) với giá trị thực y. Hàm loss phổ biến cho bài toán linear regression là hàm bình phương độ lệch. Bình phương độ lệch giữa hai giá trị \({h_\theta }\left( x \right)\) và y được tính như sau

$$J\left( {x,y;\theta} \right) = {\left( {{h_\theta }\left( x \right) – y} \right)^2}$$

Khi muốn tính giá trị loss cho cả bộ dữ liệu, chúng ta tính giá trị loss trung bình như sau

$$J\left( \theta \right) = \frac{1}{{m}}\sum\limits_{i = 1}^m {{{\left( {{h_\theta }\left( {{x^{(i)}}} \right) – {y^{(i)}}} \right)}^2}}$$
trong đó, (\(x^{(i)}, y^{(i)}\)) là mẫu dữ liệu thứ \(i^{th}\) trong bộ dữ liệu gồm m mẫu dữ liệu. Chú ý, ở một số tài liệu, công thức tính giá trị loss trung bình ở trên còn chia thêm cho 2 như \(J\left( \theta \right) = \frac{1}{{m}}\sum\limits_{i = 1}^m {{{\left( {{h_\theta }\left( {{x^{(i)}}} \right) – {y^{(i)}}} \right)}^2}}\). Việc có chia cho 2 hay không không ảnh hưởng đến quá trình huấn luyện.

 

4. Tìm bộ tham số dùng giải thuật backpropagation

Quá trình tìm giá trị tối ưu cho bộ tham số gọi là quá trình huấn luyện mô hình. Hình sau mô tả các bước để huấn luyện mô hình.

Bước đầu tiên là khởi tạo giá trị cho bộ tham số \(\theta\). Thông thường bộ tham số được khởi tạo với các giá trị nhỏ và ngẫu nhiên. Cụ thể, các giá trị ngẫu nhiên theo phân bố chuẩn (normal distribution) thường được sử dụng để khởi tạo giá trị cho bộ tham số.

Tiếp đó, các bước tính feed-forward, tính loss, tính đạo hàm cho từng tham số, và cập nhật tham số được thực hiện lặp đi lặp lại cho đến khi nào đạt đến điều kiện dừng. Điều kiện dừng thường là số lần sử dụng (duyệt qua) bộ dữ liệu. Một lần duyệt qua hết các mẫu trong bộ dữ liệu được gọi là một epoch.

– Tính feed-forward cho mẫu thứ \(i^{th}\) trong bộ dữ liệu

$${h_\theta }\left( {{x^{(i)}}} \right) = {\theta _0}x_0^{(i)} + {\theta _1}x_1^{(i)} + … + {\theta _k}x_k^{(i)}$$

– Tính giá trị loss trung bình cho m mẫu dữ liệu

$$J\left( \theta \right) = \frac{1}{{m}}\sum\limits_{i = 1}^m {{{\left( {{h_\theta }\left( {{x^{(i)}}} \right) – {y^{(i)}}} \right)}^2}}$$

– Tính đạo hàm cho từng tham số

$$\frac{{\partial J\left( \theta \right)}}{{\partial {\theta _j}}} = \frac{2}{m}\sum\limits_{i = 1}^m {\left( {{h_\theta }\left( {{x^{(i)}}} \right) – {y^{(i)}}} \right)} x_j^{(i)}$$

– Cập nhật tham số

$${\theta _j} = {\theta _j} – \eta \frac{{\partial J\left( \theta \right)}}{{\partial {\theta _j}}}$$

trong đó \(\eta\) là learning rate  và là giá trị được xác định trước.

Khi đọc các 4 công thức bên trên, các bạn cần phân biệt các biến ở dạng vector (như \(x^{(i)}, y^{(i)}\) và biến thông thường (như \(\theta _j, x_j^{(i)}\)). Để hiểu rõ hơn về các bước huấn luyện cho mô hình linear regression, các bạn xem phần áp dụng cho bài toán dự đoán giá nhà dựa vào diện tích nhà.

 

II. Áp dụng cho bài toán dự đoán giá nhà

Ở phần này, code cho việc huấn luyện mô hình chứa các chú thích chi tiết. Các bạn đọc code và so sánh với các công thức của từng bước để hiểu rõ hơn về các bước trong việc huấn luyện cho mô hình linear regression.

 

Đọc và xử lý data

import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt

data = genfromtxt('my_house_price_prediction.csv', delimiter=',')
m = data.shape[0]
X = data[:,0]
y = data[:,1:]
X_b = np.c_[np.ones((m, 1)), X]

plt.scatter(X, y)
plt.xlabel('Diện tích nhà (x 100$m^2$)')
plt.ylabel('Giá nhà (chục lượng vàng)')
plt.show()

 

Hiển thị dữ liệu để xem sự phân bố của chúng

 

Source code để huấn luyện mô hình. Có vài biến thể của giải thuật gradient descent. Chúng ta sẽ học các biến thể này ở bài tiếp theo. Trong bài này, chúng ta sử dụng batch gradient descent, tức là dùng tất cả các mẫu dữ liệu trong bộ dữ liệu để tính loss trung bình và để giá trị đạo hàm trung bình cho từng tham số.

Với các bạn lần đầu học về linear regression hay chưa làm nhiều về các giải thuật có huấn luyện mô hình, các bạn nên chạy tay source code bên dưới. Các bạn có thể xóa bớt dữ liệu để chạy tay nhanh hơn. (Đây là ví dụ quan trọng, các bạn cần hiểu được nó thật kỹ trước khi tiếp tục các bài học tiếp theo).

def batch_gradient_descent():
    n_iterations = 50
    learning_rate = 0.01
    
    # khởi tạo giá trị tham số
    thetas = np.random.randn(2, 1)
    thetas_path = [thetas]
    losses = []
    
    for i in range(n_iterations):
        # tính output
        output = X_b.dot(thetas)
        
        # tính loss
        loss = (output - y)**2        
                
        # tính đạo hàm cho loss
        loss_grd = 2*(output - y)/m
        
        # tính đạo hàm cho các tham số
        gradients = X_b.T.dot(loss_grd)
        
        # cập nhật tham số
        thetas = thetas - learning_rate*gradients
        thetas_path.append(thetas)
        
        mean_loss = np.sum(loss)/m
        losses.append(mean_loss)

    return thetas_path, losses

bgd_thetas, losses = batch_gradient_descent()

plt.scatter(X, y)
data_y = X*bgd_thetas[-1][1]+ bgd_thetas[-1][0]
plt.plot(X,data_y, color="r")
plt.show()

 

Hiển thị giá trị loss cho các vòng lặp

 

Đường thẳng linear regression tìm được sau khi huấn luyện