🏷️sec_adadelta
Adadelta là một biến thể khác của AdaGrad.
Điểm khác biệt chính là Adadelta giảm mức độ mà tốc độ học sẽ thay đổi với các tọa độ.
Hơn nữa, Adadelta thường được biết đến là thuật toán không sử dụng tốc độ học vì nó dựa trên chính lượng thay đổi hiện tại để căn chỉnh lượng thay đổi trong tương lai.
Thuật toán Adadelta được đề xuất trong :cite:Zeiler.2012
.
Nó cũng khá đơn giản nếu bạn đã biết các thuật toán được thảo luận trước đây.
Nói ngắn gọn, Adadelta sử dụng hai biến trạng thái,
$$\begin{aligned} \mathbf{s}t & = \rho \mathbf{s}{t-1} + (1 - \rho) \mathbf{g}_t^2, \ \mathbf{g}t' & = \sqrt{\frac{\Delta\mathbf{x}{t-1} + \epsilon}{\mathbf{s}_t + \epsilon}} \odot \mathbf{g}_t, \ \mathbf{x}t & = \mathbf{x}{t-1} - \mathbf{g}_t', \ \Delta \mathbf{x}t & = \rho \Delta\mathbf{x}{t-1} + (1 - \rho) \mathbf{x}_t^2. \end{aligned}$$
Điểm khác biệt so với trước là ta thực hiện các bước cập nhật với gradient
Thuật toán Adadelta cần duy trì hai biến trạng thái ứng với hai biến
%matplotlib inline
from d2l import mxnet as d2l
from mxnet import np, npx
npx.set_np()
def init_adadelta_states(feature_dim):
s_w, s_b = np.zeros((feature_dim, 1)), np.zeros(1)
delta_w, delta_b = np.zeros((feature_dim, 1)), np.zeros(1)
return ((s_w, delta_w), (s_b, delta_b))
def adadelta(params, states, hyperparams):
rho, eps = hyperparams['rho'], 1e-5
for p, (s, delta) in zip(params, states):
# In-place updates via [:]
s[:] = rho * s + (1 - rho) * np.square(p.grad)
g = (np.sqrt(delta + eps) / np.sqrt(s + eps)) * p.grad
p[:] -= g
delta[:] = rho * delta + (1 - rho) * g * g
Việc chọn
data_iter, feature_dim = d2l.get_data_ch11(batch_size=10)
d2l.train_ch11(adadelta, init_adadelta_states(feature_dim),
{'rho': 0.9}, data_iter, feature_dim);
Để lập trình súc tích, ta chỉ cần sử dụng thuật toán adadelta
từ lớp Trainer
. Nhờ vậy mà ta có thể chạy thuật toán chỉ với một dòng lệnh ngắn gọn.
d2l.train_concise_ch11('adadelta', {'rho': 0.9}, data_iter)
- Adadelta không sử dụng tham số tốc độ học. Thay vào đó, nó sử dụng tốc độ thay đổi của chính bản thân các tham số để điều chỉnh tốc độ học.
- Adadelta cần sử dụng hai biến trạng thái để lưu trữ các mô-men bậc hai của gradient và của lượng thay đổi trong các tham số.
- Adadelta sử dụng trung bình rò rỉ để lưu ước lượng động của các giá trị thống kê cần thiết.
- Điều gì xảy ra khi giá trị của
$\rho$ thay đổi? - Hãy lập trình thuật toán trên mà không cần dùng biến
$\mathbf{g}_t'$ . Giải thích tại sao đây có thể là một ý tưởng tốt? - Adadelta có thực sự không cần tốc độ học? Hãy chỉ ra các bài toán tối ưu mà Adadelta không thể giải.
- Hãy so sánh Adadelta với Adagrad và RMSprop để thảo luận về sự hội tụ của từng thuật toán.
Bản dịch trong trang này được thực hiện bởi:
- Đoàn Võ Duy Thanh
- Nguyễn Văn Cường
- Nguyễn Văn Quang
- Phạm Minh Đức
- Lê Khắc Hồng Phúc
- Phạm Hồng Vinh
- Nguyễn Cảnh Thướng