Giới thiệu về synthetic gradient

Trong các giải thuật neural network, chúng ta thường xuyên sử dụng Backpropagation (lan truyền ngược) để update các tham số của từng lớp hidden layer. Tuy nhiên , việc sử dụng Backpropagation trong các mô hình neural network có kích thước rất lớn sẽ có thể gây ra hiện tượng bottleneck.Giả sử trong 1 mạng neural có 100 lớp hidden layer,để chỉnh sửa các trọng số trong layer 1, layer 1 sẽ buộc phải đợi thực hiện full forward qua 100 lớp layer, tính loss function, và sau đó thực hiện Backpropagation qua 99 lớp ở sau đó để update các tham số của mình. Deepmind đã giới thiệu 1 giải pháp mới thay thế cho Backpropagation trong paper này, đó là sử dụng synthetic gradient. Bài viết sẽ tập trung giới thiệu về ý tưởng mới này , so sánh với Backpropagation ( bài 1 ), và demo cho cả 2 phương thức trong 1 mạng neural network cơ bản với numpy ( bài 2 ).

Chuỗi bài viết sẽ gồm có 2 phần chính

1. Giới thiệu về synthetic gradient
2. Implement synthetic gradient cho feedforward network(chưa viết)

Trong bài đầu tiên này chúng ta sẽ review lại Backpropagation , giới thiệu synthetic gradient.

Nếu các bạn chưa quen với neural network và backpropagation thì có thể xem ở đây : neural networkbackpropagation

1.Giới thiệu về synthetic gradient

Giả sử chúng ta có 1 mạng feedforward đơn giản với 3 layers, tất cả đều sử dụng activation function là sigmoid. Trước hết chúng ta hãy cùng xem xét vấn đề bottleneck của Backpropagation trong mạng này ( Mũi tên đen là đường đi của feedforward, mũi tên xanh là đường đi của backpropagation ) :

Quá trình feedforward :


Z

1


=

W

0
1




X

+

b
1

A 1 = sigmoid ( Z 1 ) Z 2 = W 1 2 ∗ A 1 + b 2 A 2 = sigmoid ( Z 2 ) Z 3 = W 2 3 ∗ A 2 + b 3 A 3 = sigmoid ( Z 3 )

Tiếp theo chúng ta sẽ tính loss function. Ở đây chúng ta sẽ sử dụng Mean Square Error:

ξ = 1 2 ∑ i = 0 m ( A 3 - Y ) 2

Quá trình backpropagation :

∂ ξ ∂ A 3 = A 3 - Y ∂ ξ ∂ Z 3 = ∂ ξ ∂ A 3 . ∂ A 3 ∂ Z 3 = ( A 3 - Y ) ∗ A 3 ∗ ( 1 - A 3 ) ∂ ξ ∂ A 2 = ∂ ξ ∂ Z 3 . ∂ Z 3 ∂ A 2 = ∂ ξ ∂ Z 3 . W 2 3 T ∂ ξ ∂ Z 2 = ∂ ξ ∂ A 2 . ∂ A 2 ∂ Z 2 = ∂ ξ ∂ A 2 ∗ A 2 ∗ ( 1 - A 2 ) ∂ ξ ∂ A 1 = ∂ ξ ∂ Z 2 . ∂ Z 2 ∂ A 1 = ∂ ξ ∂ Z 2 . W 1 2 T ∂ ξ ∂ Z 1 = ∂ ξ ∂ A 1 . ∂ A 1 ∂ Z 1 = ∂ ξ ∂ A 1 ∗ A 1 ∗ ( 1 - A 1 )

Cuối cùng là chúng ta update các trọng số W và b của từng parameters :

∂ ξ ∂ W x = ∂ ξ ∂ Z x . ∂ Z x ∂ W x = ∂ ξ ∂ Z x . A x T ∂ ξ ∂ b x = ∂ ξ ∂ Z x W x = W x - ∂ ξ ∂ W x b x = b x - ∂ ξ ∂ b x

Trên là cách 1 neural network cơ bản chạy với backpropagation. Vậy vấn đề ở đây là gì ? chúng ta có thể thấy là kết quả
\(dA1\)
phụ thuộc vào
\(dA2\)
,
\(dA2\)
phụ thuộc vào
\(dA3\)
, ... , tức là layer2 phải đợi quá trình fullforward kết thúc, và layer3 trả về kết quả
\(dA3\)
, layer1 phải đợi kết quả fullfoward,
\(dA3\)

\(dA2\)
. Nếu như là 1 mạng không có quá nhiều lớp hidden layer thì thời gian phải chờ đợi không đáng bao nhiêu, nhưng nếu như có 100 hidden layer thì sao ? layer1 sẽ phải đợi kết quả từ 99 layer trước đó, tốn thời gian chờ đợi 1 cách vô ích,và có thể là rất dài. Nếu như các layer có thể tự động update tham số một cách độc lập , không cần phải đợi kết quả của các lớp layer sau đó thì tốc độ học sẽ tăng lên rất nhiều, và đó là ý tưởng của synthetic gradient.

Vậy làm cách nào để có thể update các tham số 1 cách độc lập ? hãy dùng 1 neural network khác để dự báo nó. Dựa trên kết quả đầu ra của mỗi hidden layer, mỗi hidden layer sẽ có 1 neural network bên trong nó để tự dự báo gradient của lớp đó (
\(dA_x\)
) mà không cần phải đợi kết quả tính toán của feedforward cũng như của backpropagation, tức là việc update các trọng số của 1 hiden layer có thể thực hiện ngay lập tức mà không cần phải chờ đợi các hidden layer ở sau lớp đó :

.

Training data cho neural network này sẽ đến từ đâu ? Đương nhiên là từ gradient thực sự được truyền từ hidden layer phía sau rồi ( chúng ta sẽ gọi đây là real gradient để phân biệt với synthetic gradient - real gradient sẽ là
\(dX\)
, synthetic gradient sẽ là
\(dX'\)
) . Nhưng nếu vậy tức là chúng ta vẫn cần thực thi backpropagation ? và nếu vậy thì thực sự synthetic gradient sẽ chỉ gia tăng thêm các phép tính toán, dẫn tới môt hiệu suất chậm hơn. Nhưng gradient thực sự được truyền từ hidden layer phía sau thực tế lại được tạo ra 1 synthetic gradient neural network khác. Các bạn có thể nhìn vào hình sau để dễ hiểu hơn :

Từ kết quả của
\(A1\)
được truyền đến hidden layer2 ( feed forward ), chúng ta tính được kết quả của
\(A2\)
. Từ kết quả của
\(A2\)
, synthetic gradient network sẽ predict ra
\(dA2'\)
để trả về cho hidden layer 2, và dựa trên kết quả
\(dA2'\)
layer 2 sẽ tính ra
\(dA1\) để trả về cho synthetic neural network của hidden layer 1. Vậy synthetic gradient neural network của hidden layer 1 sẽ có input là \(A1\), output thực là \(dA1\) được trả về từ hidden layer 2. Nhưng \(dA1\) thực sẽ được tính từ \(dA2'\) được dự báo bởi hidden layer 2 , không phải là kết quả trả về từ backpropagation ( \(\frac{∂ξ}{A_1}\) ) .

Vậy thực tế \(dA1\) cũng không phải là output chính xác( không phải là \(\frac{∂ξ}{A_1}\) ), vậy với dữ liệu không chính xác làm sao chúng ta dự báo \(dA1'\) chính xác được ? Hãy cùng xem 1 trường hợp cụ thể hơn, trong 1 mạng feedforward gồm 3 hidden layer:

  1. synthetic gradient neural network của hidden layer 1 sẽ có input là \(A1\), output thực là \(dA1\) được tính dựa trên \(dA2'\), dự báo \(dA1'\) ( gọi neural network này là M1 )

  2. synthetic gradient neural network của hidden layer 2 sẽ có input là \(A2\), output thực là \(dA2\) được tính dựa trên \(dA3'\), dự báo \(dA2'\) ( gọi neural network này là M2 )

  3. synthetic gradient neural network của hidden layer 3 sẽ có input là \(A3\), output thực là \(dA3\) được tính theo \(\frac{∂ξ}{A_3}\), dự báo \(dA2'\) ( gọi neural network này là M3 )

Các bạn có thể hiểu đơn giản quá trình học như sau : với output thực là
\(\frac{∂ξ}{A_3}\)
(không phụ thuộc vào các synthetic network khác ) ,M3 sẽ dần dự báo \(dA3'\) chính xác hơn. Vì \(dA3'\) chính xác hơn,\(dA2\) sẽ chính xác hơn, bởi vậy M2 sẽ dự báo \(dA2'\) chính xác hơn. Vì \(dA2'\) chính xác hơn,\(dA1\) sẽ chính xác hơn, bởi vậy M1 sẽ dự báo \(dA1'\) chính xác hơn. Nói cách khác, các synthetic network của chúng ta sẽ bắt đầu từ việc dự báo chính xác \(dA_x'\) của lớp cao nhất, sau đó sẽ tiếp tục học để dự báo \(dA_x'\) của các lớp thấp hơn. ( một cách tuần tự )

Vậy liệu chúng ta có cần 1 mạng phức tạp để học cho các synthetic gradient neural network không ? như trong bài báo trên đã nếu, chỉ với 1 mô hình rất đơn giản ( linear regression ), các mô hình neural network phức tạp sử dụng synthetic gradient có cho ra cùng kết quả với việc sử dụng backpropagation.

Ok vậy là các bạn đã hiểu cách synthetic gradient hoạt động trong 1 neural network rồi đó. Trong các bài tiếp theo chúng ta sẽ cùng nhau implement 1 synthetic gradient cho một mạng feedforward để hiểu rõ hơn cách thực hoạt động của phương pháp mới này.

Tài liệu tham khảo:

  1. https://arxiv.org/pdf/1703.00522.pdf
  2. https://deepmind.com/blog/decoupled-neural-networks-using-synthetic-gradients/