Thứ Hai, 31 tháng 12, 2018

[Machine Learning] Vanishing và exploding gradient trong Neural Network

Thuật toán Gradient Descent dùng để để tìm cực tiểu của hàm cost ứng với các parameter của 1 NN. Trong NN, thông tin được tính toán từ trái qua phải, bắt đầu với input và kết thúc bởi output, trong khi đó, loss được tính và back propagation được tính theo chiểu ngược lại để ta có thể update các parameter trong mỗi qua mỗi iteration.
RNN cũng hoạt động tương tự, nhưng vì dữ liệu trong RNN là sequence nên sẽ có 2 điểm khác biệt.
- Dữ liệu đầu vào ở trạng thái hiện tại chính là đầu ra của trạng thái trước đó.
- Với mỗi thời điểm t nhất định, ta có thể tính toán cost function một cách độc lập.
Trong hình trên, với mỗi thời điểm t ta đều có thể tính toán error εt. Để tính toán và update các parameter, ta phải thực hiện back propagation từ chiều output quay ngược lại. Mỗi 1 neuron trong mạng đều tham gia vào quá trình tính toán ra output cuối cùng cũng như cost function, thông số của các neuron này cần tìm là các giá trị để cost function đạt cực tiểu. Tuy nhiên, trong RNN, mọi neuron từ neuron đầu tiên tới neuron cuối cùng đều tham gia vào quá trình này, do vậy, ta sẽ phải thực hiện back proapgate through time cho tất cả các neuron.
Vấn đề sẽ nằm ở việc update ma trận trọng số wrec.
Để tính toán xt-2 ta sẽ cần nhân xt-3 với wrec hoặc muốn tính xt-1 ta sẽ cần nhân xt-2 với wrec . Ma trận trọng số wrec là giống nhau trong toàn mạng RNN, dó vậy, nếu wrec nhỏ, giá trị gradient sẽ nhỏ, và nhỏ dần khi số lượng layer trong RNN là lớn, và giá trị này giảm theo hàm mũ.

Ta đã biết rằng ma trận này được khởi tạo lúc ban đầu với các giá trị mặc định xấp xỉ 0 và từ đó ta thực hiện train mạng NN. Tuy nhiên, nếu ra khởi tạo ma trận trọng số theo cách này và nhân với các giá trị xtxt-1xt-2xt-3, … gradient sẽ giảm nhanh sau mỗi phép nhân - vanishing gradient. Tương tự nếu giá trị này là lớn, khi đó gradient tăng nhanh và sẽ xảy ra hiện tượng tràn số, lúc này giá trị gradient ta nhận được sẽ là NaN, đây là hiện tượng exploding gradient.

Giá trị gradient càng nhỏ, NN sẽ khó để update các parameter và tốc độ converge của cost function sẽ chậm hơn rất nhiều. Ví dụ ta chỉ cần 1000 epochs để có thể tìm được giá trị tối ưu cho parameter tại thời điểm t, tuy nhiên 1000 epochs sẽ không đủ cho thời điểm t-3 do lúc này gradient đã bị giảm đi rất nhiều.
Ta có thể nghĩ rằng vậy ta có thể train đúng cho nửa mạng, nghĩa là từ t trở đi là đúng, còn t quay lại là sai, tuy nhiên tất cả mạng NN của ta sẽ bị train sai. Giải thích đơn giản là vì output của layer trước là input của layer sau, nếu ta train tại thời điểm t mà input lấy tại layer chưa được train trước đó, lúc này việc training ở thời điểm t sẽ trả về giá trị sai.

Kiến trúc Gated Recurrent Unit (GRU) hoặc Long Short Term Memory (LSTM) sẽ giải quyết vấn đề này.

Không có nhận xét nào:

Đăng nhận xét