-
Tuần 1 - Ngày 10 tháng 7 năm 2019
- Giới thiệu về khóa học
- Hướng dẫn viết chương trình Python trên web
- Hướng dẫn sử dụng PyCharm
- Tổng quan về Python
- Kỹ năng sử dụng Google search
- Viết tài liệu kỹ thuật dùng Markdown
- Hàm xây dựng sẵn trong Python – math và random
- Cài đặt các công thức toán cơ bản
- Xây dựng hàm trong python
- Điều kiện if-else
- Những lỗi thường gặp trong Python
- Reading assignment
-
Tuần 2 - Ngày 17 tháng 7 năm 2019
-
Tuần 3 - Ngày 24 tháng 7 năm 2019
-
Tuần 4 - Ngày 31 tháng 7 năm 2019
-
Tuần 5 - Ngày 7 tháng 8 năm 2019
-
Advanced Python
-
Tuần 6 - Ngày 14 tháng 8 năm 2019
-
Tuần 7 - Ngày 28 tháng 8 năm 2019
-
Tuần 8
-
Tuần 9
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.87 | 5.38 |
---|---|
2.29 | 3.45 |
5.17 | 6.94 |
4.93 | 7.1 |
4 | 5.47 |
3.97 | 5.31 |
6.77 | 8.89 |
2.48 | 4.08 |
2.85 | 4.59 |
6.43 | 8.52 |
6.99 | 8.63 |
2.74 | 4.29 |
2.07 | 3.34 |
3.64 | 5.48 |
5.66 | 7.4 |
1.85 | 3.3 |
4.73 | 6.19 |
4.55 | 6.46 |
6.4 | 8.65 |
2.14 | 3.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.
TV | Radio | Newspaper | Sales |
---|---|---|---|
230.1 | 37.8 | 69.2 | 22.1 |
44.5 | 39.3 | 45.1 | 10.4 |
17.2 | 45.9 | 69.3 | 12 |
151.5 | 41.3 | 58.5 | 16.5 |
180.8 | 10.8 | 58.4 | 17.9 |
8.7 | 48.9 | 75 | 7.2 |
57.5 | 32.8 | 23.5 | 11.8 |
120.2 | 19.6 | 11.6 | 13.2 |
8.6 | 2.1 | 1 | 4.8 |
199.8 | 2.6 | 21.2 | 15.6 |
66.1 | 5.8 | 24.2 | 12.6 |
214.7 | 24 | 4 | 17.4 |
23.8 | 35.1 | 65.9 | 9.2 |
97.5 | 7.6 | 7.2 | 13.7 |
204.1 | 32.9 | 46 | 19 |
195.4 | 47.7 | 52.9 | 22.4 |
67.8 | 36.6 | 114 | 12.5 |
281.4 | 39.6 | 55.8 | 24.4 |
69.2 | 20.5 | 18.3 | 11.3 |
147.3 | 23.9 | 19.1 | 14.6 |
218.4 | 27.7 | 53.4 | 18 |
237.4 | 5.1 | 23.5 | 17.5 |
13.2 | 15.9 | 49.6 | 5.6 |
228.3 | 16.9 | 26.2 | 20.5 |
62.3 | 12.6 | 18.3 | 9.7 |
262.9 | 3.5 | 19.5 | 17 |
142.9 | 29.3 | 12.6 | 15 |
240.1 | 16.7 | 22.9 | 20.9 |
248.8 | 27.1 | 22.9 | 18.9 |
70.6 | 16 | 40.8 | 10.5 |
292.9 | 28.3 | 43.2 | 21.4 |
112.9 | 17.4 | 38.6 | 11.9 |
97.2 | 1.5 | 30 | 13.2 |
265.6 | 20 | 0.3 | 17.4 |
95.7 | 1.4 | 7.4 | 11.9 |
290.7 | 4.1 | 8.5 | 17.8 |
266.9 | 43.8 | 5 | 25.4 |
74.7 | 49.4 | 45.7 | 14.7 |
43.1 | 26.7 | 35.1 | 10.1 |
228 | 37.7 | 32 | 21.5 |
202.5 | 22.3 | 31.6 | 16.6 |
177 | 33.4 | 38.7 | 17.1 |
293.6 | 27.7 | 1.8 | 20.7 |
206.9 | 8.4 | 26.4 | 17.9 |
25.1 | 25.7 | 43.3 | 8.5 |
175.1 | 22.5 | 31.5 | 16.1 |
89.7 | 9.9 | 35.7 | 10.6 |
239.9 | 41.5 | 18.5 | 23.2 |
227.2 | 15.8 | 49.9 | 19.8 |
66.9 | 11.7 | 36.8 | 9.7 |
199.8 | 3.1 | 34.6 | 16.4 |
100.4 | 9.6 | 3.6 | 10.7 |
216.4 | 41.7 | 39.6 | 22.6 |
182.6 | 46.2 | 58.7 | 21.2 |
262.7 | 28.8 | 15.9 | 20.2 |
198.9 | 49.4 | 60 | 23.7 |
7.3 | 28.1 | 41.4 | 5.5 |
136.2 | 19.2 | 16.6 | 13.2 |
210.8 | 49.6 | 37.7 | 23.8 |
210.7 | 29.5 | 9.3 | 18.4 |
53.5 | 2 | 21.4 | 8.1 |
261.3 | 42.7 | 54.7 | 24.2 |
239.3 | 15.5 | 27.3 | 20.7 |
102.7 | 29.6 | 8.4 | 14 |
131.1 | 42.8 | 28.9 | 16 |
69 | 9.3 | 0.9 | 11.3 |
31.5 | 24.6 | 2.2 | 11 |
139.3 | 14.5 | 10.2 | 13.4 |
237.4 | 27.5 | 11 | 18.9 |
216.8 | 43.9 | 27.2 | 22.3 |
199.1 | 30.6 | 38.7 | 18.3 |
109.8 | 14.3 | 31.7 | 12.4 |
26.8 | 33 | 19.3 | 8.8 |
129.4 | 5.7 | 31.3 | 11 |
213.4 | 24.6 | 13.1 | 17 |
16.9 | 43.7 | 89.4 | 8.7 |
27.5 | 1.6 | 20.7 | 6.9 |
120.5 | 28.5 | 14.2 | 14.2 |
5.4 | 29.9 | 9.4 | 5.3 |
116 | 7.7 | 23.1 | 11 |
76.4 | 26.7 | 22.3 | 11.8 |
239.8 | 4.1 | 36.9 | 17.3 |
75.3 | 20.3 | 32.5 | 11.3 |
68.4 | 44.5 | 35.6 | 13.6 |
213.5 | 43 | 33.8 | 21.7 |
193.2 | 18.4 | 65.7 | 20.2 |
76.3 | 27.5 | 16 | 12 |
110.7 | 40.6 | 63.2 | 16 |
88.3 | 25.5 | 73.4 | 12.9 |
109.8 | 47.8 | 51.4 | 16.7 |
134.3 | 4.9 | 9.3 | 14 |
28.6 | 1.5 | 33 | 7.3 |
217.7 | 33.5 | 59 | 19.4 |
250.9 | 36.5 | 72.3 | 22.2 |
107.4 | 14 | 10.9 | 11.5 |
163.3 | 31.6 | 52.9 | 16.9 |
197.6 | 3.5 | 5.9 | 16.7 |
184.9 | 21 | 22 | 20.5 |
289.7 | 42.3 | 51.2 | 25.4 |
135.2 | 41.7 | 45.9 | 17.2 |
222.4 | 4.3 | 49.8 | 16.7 |
296.4 | 36.3 | 100.9 | 23.8 |
280.2 | 10.1 | 21.4 | 19.8 |
187.9 | 17.2 | 17.9 | 19.7 |
238.2 | 34.3 | 5.3 | 20.7 |
137.9 | 46.4 | 59 | 15 |
25 | 11 | 29.7 | 7.2 |
90.4 | 0.3 | 23.2 | 12 |
13.1 | 0.4 | 25.6 | 5.3 |
255.4 | 26.9 | 5.5 | 19.8 |
225.8 | 8.2 | 56.5 | 18.4 |
241.7 | 38 | 23.2 | 21.8 |
175.7 | 15.4 | 2.4 | 17.1 |
209.6 | 20.6 | 10.7 | 20.9 |
78.2 | 46.8 | 34.5 | 14.6 |
75.1 | 35 | 52.7 | 12.6 |
139.2 | 14.3 | 25.6 | 12.2 |
76.4 | 0.8 | 14.8 | 9.4 |
125.7 | 36.9 | 79.2 | 15.9 |
19.4 | 16 | 22.3 | 6.6 |
141.3 | 26.8 | 46.2 | 15.5 |
18.8 | 21.7 | 50.4 | 7 |
224 | 2.4 | 15.6 | 16.6 |
123.1 | 34.6 | 12.4 | 15.2 |
229.5 | 32.3 | 74.2 | 19.7 |
87.2 | 11.8 | 25.9 | 10.6 |
7.8 | 38.9 | 50.6 | 6.6 |
80.2 | 0 | 9.2 | 11.9 |
220.3 | 49 | 3.2 | 24.7 |
59.6 | 12 | 43.1 | 9.7 |
0.7 | 39.6 | 8.7 | 1.6 |
265.2 | 2.9 | 43 | 17.7 |
8.4 | 27.2 | 2.1 | 5.7 |
219.8 | 33.5 | 45.1 | 19.6 |
36.9 | 38.6 | 65.6 | 10.8 |
48.3 | 47 | 8.5 | 11.6 |
25.6 | 39 | 9.3 | 9.5 |
273.7 | 28.9 | 59.7 | 20.8 |
43 | 25.9 | 20.5 | 9.6 |
184.9 | 43.9 | 1.7 | 20.7 |
73.4 | 17 | 12.9 | 10.9 |
193.7 | 35.4 | 75.6 | 19.2 |
220.5 | 33.2 | 37.9 | 20.1 |
104.6 | 5.7 | 34.4 | 10.4 |
96.2 | 14.8 | 38.9 | 12.3 |
140.3 | 1.9 | 9 | 10.3 |
240.1 | 7.3 | 8.7 | 18.2 |
243.2 | 49 | 44.3 | 25.4 |
38 | 40.3 | 11.9 | 10.9 |
44.7 | 25.8 | 20.6 | 10.1 |
280.7 | 13.9 | 37 | 16.1 |
121 | 8.4 | 48.7 | 11.6 |
197.6 | 23.3 | 14.2 | 16.6 |
171.3 | 39.7 | 37.7 | 16 |
187.8 | 21.1 | 9.5 | 20.6 |
4.1 | 11.6 | 5.7 | 3.2 |
93.9 | 43.5 | 50.5 | 15.3 |
149.8 | 1.3 | 24.3 | 10.1 |
11.7 | 36.9 | 45.2 | 7.3 |
131.7 | 18.4 | 34.6 | 12.9 |
172.5 | 18.1 | 30.7 | 16.4 |
85.7 | 35.8 | 49.3 | 13.3 |
188.4 | 18.1 | 25.6 | 19.9 |
163.5 | 36.8 | 7.4 | 18 |
117.2 | 14.7 | 5.4 | 11.9 |
234.5 | 3.4 | 84.8 | 16.9 |
17.9 | 37.6 | 21.6 | 8 |
206.8 | 5.2 | 19.4 | 17.2 |
215.4 | 23.6 | 57.6 | 17.1 |
284.3 | 10.6 | 6.4 | 20 |
50 | 11.6 | 18.4 | 8.4 |
164.5 | 20.9 | 47.4 | 17.5 |
19.6 | 20.1 | 17 | 7.6 |
168.4 | 7.1 | 12.8 | 16.7 |
222.4 | 3.4 | 13.1 | 16.5 |
276.9 | 48.9 | 41.8 | 27 |
248.4 | 30.2 | 20.3 | 20.2 |
170.2 | 7.8 | 35.2 | 16.7 |
276.7 | 2.3 | 23.7 | 16.8 |
165.6 | 10 | 17.6 | 17.6 |
156.6 | 2.6 | 8.3 | 15.5 |
218.5 | 5.4 | 27.4 | 17.2 |
56.2 | 5.7 | 29.7 | 8.7 |
287.6 | 43 | 71.8 | 26.2 |
253.8 | 21.3 | 30 | 17.6 |
205 | 45.1 | 19.6 | 22.6 |
139.5 | 2.1 | 26.6 | 10.3 |
191.1 | 28.7 | 18.2 | 17.3 |
286 | 13.9 | 3.7 | 20.9 |
18.7 | 12.1 | 23.4 | 6.7 |
39.5 | 41.1 | 5.8 | 10.8 |
75.5 | 10.8 | 6 | 11.9 |
17.2 | 4.1 | 31.6 | 5.9 |
166.8 | 42 | 3.6 | 19.6 |
149.7 | 35.6 | 6 | 17.3 |
38.2 | 3.7 | 13.8 | 7.6 |
94.2 | 4.9 | 8.1 | 14 |
177 | 9.3 | 6.4 | 14.8 |
283.6 | 42 | 66.2 | 25.5 |
232.1 | 8.6 | 8.7 | 18.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