AI Cho Mọi Người

AI Cho Mọi Người

Computational graph

 

 

Computational graph (CG) được dùng để mô tả các biểu thức tính toán cũng như minh họa trực quan cách tính đạo hàm cho các biến. Trong bài học này, chúng ta sẽ làm quen với cách xây dựng CG cho một hàm số và tính đạo hàm cho các biến tham số của hàm số đó. Sau đó, chúng ta sẽ áp dụng CG cho bài toán tiên đoán giá nhà mà ở tuần 4 chúng ta áp dụng GA để tìm ra các trọng số cần thiết.

 

Dùng CG cho một hàm đơn giản

Giả sử chúng ta cần xây dựng CG cho hàm số \(f(x,y,z) = x \times y + z\). CG cho hàm \(f(x,y,z)\) như sau

trong đó \(t = x \times y\). Vẽ CG rất đơn giản vì chỉ yêu cầu biết các phép toán cơ bản và thứ tự ưu tiên của chúng. Bây giờ, dự vào CG vừa được xây dưng, chúng ta tính giá trị f với \(x = 2\), \(y = 3\), và \(z = -2\). CG tính giá trị f như sau

Sau khi tính f, chúng ta cho thể dựa vào CG để tính đạo hàm cho các biến trên đồ thị dựa vào giá trị f.

Biến x và y không nối trực tiếp đến f mà thông qua biến t trên đồ thị, nên tính đạo hàm f theo x và y thông qua việc tính đạo hàm f theo t (chain rule). Do đó, đồ thị tính đạo hàm cho các biến như sau

Dựa vào công thức hàm f và t, chúng ta tính được giá trị đạo hàm cho hàm f theo biến z và t; và giá trị đạo hàm cho hàm t theo biến x và y. Lúc này chúng ta có thể tính giá trị đạo hàm cho hàm f theo biến x và y. Cuối cùng, đồ thị tính giá trị đạo hàm có kết quả như sau

Vậy là chúng ta đã hoàn thành việc xây dựng một CG cho một hàm đơn giản và tính giá trị đạo hàm cho các biến trên đồ thị. Tiếp theo để hiểu rõ hơn về CG và tác dụng của nó, chúng ta sẽ sử dụng CG để giải bài toán tiên đoán giá nhà.

 

Toán tiên đoán giá nhà dùng CG

Cho trước bộ dữ liệu định giá nhà dựa vào diện tích nhà như sau

Bộ dữ liệu này có 4mẫu và có 2 cột. Cột 1 là diện tích (area), và cột 2 là giá nhà (price). Biểu diễn dữ liệu này lên đồ thị ta được như sau

Yêu cầu bài toán đặt ra là dựa vào dữ liệu cho trước, hãy dự đoán giá nhà khi diện tích là 800 \(m^2\).

Quan sát đồ thị chúng ta thấy rằng sự phân bố của dữ liệu xấp xỉ với một đoạn thẳng. Do đó, chúng ta giả sử phân bố của dữ liệu có dạng price = a*area + b, trong đó a và b là hai giá trị cần tìm.

Với mỗi giá trị area trong bộ dữ liệu cho trước, chúng ta tính được giá ước lượng dựa vào công thức price = 1.4*area + 2.0. Sau đó, so sánh giữa giá ước lượng và giá thực tế trong bộ dữ liệu ta được độ lệch về giá cho từng mẫu. Trong bài này, hàm squared difference (bình phương độ lệch giữa hai giá trị) để tính giá trị loss cho hàm ước lượng. Đồ thị CG được xây dựng như sau

trong đó o viết tắt cho từ output, chính là giá nhà tiên đoán được tính từ công thức price = a*area + b. Biến price_t là giá nhà thực, được cho trước từ bộ data. Để thuận tiện, chúng ta sẽ thay từ area bằng X, và price_t bằng y. Đồ thị được vẽ lại như sau

 

Trong đồ thị này, X và y là hai biến để nhận dữ liệu input từ bộ dữ liệu; và a và b là hai biến cần tìm để giá trị loss nhỏ nhất có thể. Ban đầu, hai biến a và b chưa có giá trị. Do đó, chúng ta cần gán giá trị khởi tạo cho chúng để có thể tính được giá nhà ước lượng. Ở bài này, bỏ qua các phương pháp chọn giá trị khởi tạo cho một biến, giả sử cho a = -0.34b = 0.04, đồ thị được vẽ lại như sau

Bây giờ chúng ta dùng mẫu dữ liệu đầu tiên để tính loss như sau

 

Tiếp theo, dựa vào các công thức, chúng ta tính được đạo hàm cho hai biến a và b như sau

Thế giá trị vào các công thức tính đạo hàm cho a và b ta được giá trị đạo hàm như sau

Hai biến t và o là hai biến trung gian, chúng ta không cần làm gì thêm với chúng. Tuy nhiên, chúng ta cần xử lý thêm với hai biến a và b với mục đích là làm cho loss L giảm.

Ôn tập về đạo hàm: Biến a có giá trị đạo hàm cho hàm L là \(\delta_a = -151.9292\). \(\delta_a\) có giá trị âm nên giảm a với một giá trị đủ nhỏ (lân cận của a) sẽ làm hàm L tăng. Ngược lại, tăng a với một giá trị đủ nhỏ sẽ làm hàm L giảm.

Nói theo cách dân dã, nếu muốn tìm giá trị min cho hàm L, thay đổi giá trị biến a ngược hướng đạo hàm. Lập luận tương tự cho biến b.

Ở ví dụ này, giá trị đạo hàm của hàm L theo a và b đều có giá trị âm, nên để L giảm, a và b cần tăng thêm một giá trị \(k_a\) và \(k_b\) nào đó. Có nhiều cách để tính \(k_a \) và \(k_b\); và cách đơn giản và phổ biến như sau \(k_a = -\delta_a \times r\) và \(k_b= -\delta_b \times r\), trong đó r là learning rate và là giá trị được xác định trước. Ở ví dụ này, chúng ta cho r = 0.01.

Cập nhận giá trị cho hai biến a và b ta được đồ thị sau

 

Để kiểm chúng hàm L giảm, chúng ta tính loss cho mẫu data đầu tiên một lần nữa, nhưng với giá trị a và b mới được cập nhật.

Chúng ta thấy giá trị loss giảm từ 128.55 xuống 0.868. Điều này chứng tỏ hàm ước lượng đã học được từ mẫu dữ liệu và trở nên tốt hơn.

Đồ thị hàm ước lượng trước và sau khi cập nhật a và b. Vớia = -0.34b = 0.04

Vớia = 1.179292b = 26676

Hình ảnh trực quan thể hiện sự cải thiện hàm ước lượng một cách rõ ràng.

 

Bài tập nhanh: Các bạn ‘chạy tay’ dùng 3 mẫu còn lại và cập nhật biến a và b. Learning rate r vẫn giữ cố định là r = 0.01.

 

Rõ ràng, hàm ước lượng cải thiện sau khi sử dụng mẫu dữ liệu đầu tiên. Bây giờ, làm theo cách tương tự như trên, chúng ta sẽ lần lượt dùng các mẫu dữ liệu để cập nhật giá trị a và b. Chúng ta hy vọng giá trị loss càng ngày càng nhỏ.

Hình sau minh họa hàm ước lượng với các giá trị a và b được cập nhật sau mỗi mẫu dữ liệu được sử dụng, với tất cả 30 lần lặp.

và giá trị loss (bỏ qua giá trị loss cho mẫu dữ liệu đầu tiên)

Chúng ta thấy rằng, kết quả không như mong đợi khi loss không liên tục giảm mà biến thiên lên xuống.

 

Bài tập nhanh: Các bạn quan sát và tìm hiểu nguyên nhân vì sao lại cho hiện tượng này.

 

Để khắc phục vấn đề trên, chúng ta sẽ dùng 4 mẫu để tính cùng một lúc như sau

Sau khi tính giá trị đạo hàm cho cả 4 mẫu dữ liệu, thay vì cập nhật a và b 4 lần với 4 giá trị đạo hàm, chúng ta chỉ cập nhật 1 lần với giá trị mean của 4 giá trị đạo hàm tính được.

Hình sau minh họa hàm ước lượng với các giá trị a và b sau 30 lần lặp. Mỗi lần lặp dùng tất cả 4 mẫu để tính đạo hàm, và cập nhật a và b bằng giá trị mean của các giá trị đạo hàm tính được.

và giá trị loss (bỏ qua giá trị loss cho lần lặp đầu tiên)

Với cách này, chúng ta thấy giá trị loss giảm đều và không còn bị vấn đề loss biến thiên lên xuống nữa.

 

Bài tập nhanh: Các bạn tìm hiểu tại sao dùng tất cả mẫu dữ liệu lại tránh được vấn đề loss biến thiên lên xuống.

 

Vậy là chúng ta đã học xong cách thức xây dựng và tính đạo hàm dùng computational graph. Ở bài tiếp theo, chúng ta sẽ thực hiên dựa vào công thức để tính đạo hàm và cập nhật các biến. Tuy nhiên, để hiểu sâu về neural network, hay xa hơn là các mô hình deep learning, thì việc hiểu rõ bài học này mang lại rất nhiều hữu ích cho các bạn.