Chào các bạn, hôm nay mình sẽ nói về adaptive learning rate trong Deep learning 😎
Ý tưởng của Adaptive learning rate ? Và tại sao lại cần tới adaptive learning rate ?
Đầu tiên, các bạn nhìn vào ảnh bên phải (learning rate quá cao) và ảnh bên trái (leaning rate quá bé). Hai trường hợp này đều gây ra vấn đề cho quá trình training. Khi set lr quá cao, mô hình càng ngày càng đi xa khỏi vị trí optimal. Ngược lại, khi lr quá bé, mô hình tìm được điểm tối ưu, tuy nhiên mất nhiều thời gian (mà đôi khi chúng ta sẽ hết tài nguyên trước khi các tham số tới đích đến của mình như hình bên dưới
Vậy thì, người ta mới nghĩ ra một hướng khác, là tại sao phải cho giá trị lr cố định (hoặc cao hoặc bé), mà không update nó. Vì thế nên chúng ta có Adaptive learning rate (Adaptive nghĩa là điều chỉnh). Trong đó, giá trị của các lr sẽ được giảm dần khi trong quá trình training. Các bạn có thể nhìn vào phần "just right" của ảnh đầu. Các learning rate được giảm từ từ, đảm bảo tính "đi nhanh" của model khi còn lâu mới tới optimal value, và "đi cẩn thận" khi sắp tới điểm tối ưu, vừa tiết kiệm tài nguyên gpu, thời gian, vừa tìm ra tham số tối ưu, còn gì bằng.
Các cách implement Adaptive learning rate
Oke, hi vọng khi đọc tới đây, bạn đã hòm hòm nắm được ý tưởng của Adaptive learning rate rồi. Bây giờ chúng ta sẽ đi tới phần làm thế nào để implement nó bây giờ 🤔
Cách 1: Gán thành một số mới sau một số lượng epoch nhất định
Đây là cách đơn giản nhất, ví dụ như ở hình trên:
- ở 10 epochs đầu : 0.1
- epochs 10-20: 0.05
- epochs 20-35: 0.01 bla bla
Cách 2: Gán learning rate với một hàm số
Cách trên trông không được mượt cho lắm, mình sẽ tới với cách mới sau đây. Cụ thể, learning rate sẽ được gắn với một hàm liên tục. Có rất nhiều cách để chọn hàm:
Sử dụng AdaGrad
Thuật toán update tham số bằng công thức như sau:
Trong đó: gt: gradient tại iteration thứ t Gt: tổng gradient tích lũy Theta: learning rate Epsilon: hằng số thêm vào để tránh mẫu bằng 0 Như vậy, khi iteration càng lớn thì Gt càng lớn -> mẫu càng lớn -> learning rate càng nhỏ.
Tuy nhiên, AdaGrad không phải luôn hoạt động tốt trong mọi trường hợp. Vấn đề nằm ở Gt - gradient tích lũy, càng về sau quá trình training, Gt càng lớn. Gt ở mẫu, vì vậy mẫu càng lớn, phân số η/sqrt(Gt + ϵ) càng nhỏ
-> tham số được update càng ít ít ít ít
-> mô hình hội tụ lâu lâu lâu lâu, thậm chí là không bao giờ : D
Như vậy, AdaGrad chỉ tốt cho các trường hợp điểm cực tiểu ở gần.
Sử dụng bản cải tiến của AdaGrad
Ưu điểm của AdaGrad là chia learning rate cho căn bậc hai của hàm tích lũy + epsilon. Nhưng đây cũng chính là yếu điểm của nó khi điểm cực tiểu ở xa. Câu hỏi đặt ra là, làm thế nào để vẫn giữ được tính chất của hàm tích lũy, mà không làm cho nó quá lớn dẫn tới learning rate quá nhỏ.
Cách cải thiện chính là dùng cửa sổ, nghĩa là thay vì lấy tích lũy ngay từ đầu thì chỉ lấy gradient của k lần gần nhất, hoặc giảm hệ số của các gradient (gradient càng xa hệ số càng bé). Để tìm hiểu thêm, các bạn có thể google thuật toán RMSProp.
Oke, bài viết của mình tới đây là kết thúc rồi, mình không chắc mình viết đúng hết nên các bạn nên double check nhé. Peace🌹