.. _sec_adadelta:
Adadelta
========
Adadelta, AdaGrad'ın başka bir çeşididir (:numref:`sec_adagrad`).
Temel fark, öğrenme oranının koordinatlara uyarlanabilir olduğu miktarı
azaltmasıdır. Ayrıca, gelecekteki değişim için kalibrasyon olarak
değişiklik miktarını kullandığından, geleneksel olarak bir öğrenme
oranına sahip olmamak olarak adlandırılır. Algoritma
:cite:`Zeiler.2012` çalışmasında önerildi. Şimdiye kadar önceki
algoritmaların tartışılması göz önüne alındığında oldukça basittir.
Algoritma
---------
Özetle, Adadelta, gradyanın ikinci momentinin sızıntılı ortalamasını
depolamak için :math:`\mathbf{s}_t` ve modeldeki parametrelerin
değişiminin ikinci momentinin sızıntılı ortalamasını depolamak için
:math:`\Delta\mathbf{x}_t` diye iki durum değişkeni kullanır. Yazarların
orijinal gösterimini ve adlandırmalarını diğer yayınlarla ve
uygulamalarla uyumluluk için kullandığımızı unutmayın (momentum,
Adagrad, RMSProp ve Adadelta, Adagrad, RMSProp ve Adadelta'da aynı amaca
hizmet eden bir parametreyi belirtmek için farklı Yunan değişkenleri
kullanılmasının başka bir gerçek nedeni yoktur).
İşte Adadelta'nın teknik detayları verelim. Servis edilen parametre
:math:`\rho` olduğu göz önüne alındığında, :numref:`sec_rmsprop`'a
benzer şekilde aşağıdaki sızdıran güncellemeleri elde ediyoruz:
.. math::
\begin{aligned}
\mathbf{s}_t & = \rho \mathbf{s}_{t-1} + (1 - \rho) \mathbf{g}_t^2.
\end{aligned}
:numref:`sec_rmsprop` ile arasındaki fark, güncellemeleri yeniden
ölçeklendirilmiş :math:`\mathbf{g}_t'` gradyanı ile
gerçekleştirmemizdir, yani
.. math::
\begin{aligned}
\mathbf{x}_t & = \mathbf{x}_{t-1} - \mathbf{g}_t'. \\
\end{aligned}
Peki yeniden ölçeklendirilmiş gradyan :math:`\mathbf{g}_t'` nedir? Bunu
aşağıdaki gibi hesaplayabiliriz:
.. math::
\begin{aligned}
\mathbf{g}_t' & = \frac{\sqrt{\Delta\mathbf{x}_{t-1} + \epsilon}}{\sqrt{{\mathbf{s}_t + \epsilon}}} \odot \mathbf{g}_t, \\
\end{aligned}
burada :math:`\Delta \mathbf{x}_{t-1}` karesi yeniden ölçeklendirilmiş
gradyanların sızdıran ortalaması :math:`\mathbf{g}_t'` dir.
:math:`\Delta \mathbf{x}_{0}`'ı :math:`0` olacak şekilde ilkleriz ve her
adımda :math:`\mathbf{g}_t'` ile güncelleriz, yani,
.. math::
\begin{aligned}
\Delta \mathbf{x}_t & = \rho \Delta\mathbf{x}_{t-1} + (1 - \rho) {\mathbf{g}_t'}^2,
\end{aligned}
ve :math:`\epsilon` (:math:`10^{-5}` gibi küçük bir değerdir) sayısal
kararlılığı korumak için eklenir.
Uygulama
--------
Adadelta, her değişken için iki durum değişkenini, :math:`\mathbf{s}_t`
ve :math:`\Delta\mathbf{x}_t`, korumalıdır. Bu, aşağıdaki uygulamayı
verir.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
%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):
# [:] aracılığıyla yerinde güncellemeler
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
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
%matplotlib inline
import torch
from d2l import torch as d2l
def init_adadelta_states(feature_dim):
s_w, s_b = torch.zeros((feature_dim, 1)), torch.zeros(1)
delta_w, delta_b = torch.zeros((feature_dim, 1)), torch.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):
with torch.no_grad():
# [:] aracılığıyla yerinde güncellemeler
s[:] = rho * s + (1 - rho) * torch.square(p.grad)
g = (torch.sqrt(delta + eps) / torch.sqrt(s + eps)) * p.grad
p[:] -= g
delta[:] = rho * delta + (1 - rho) * g * g
p.grad.data.zero_()
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
%matplotlib inline
import tensorflow as tf
from d2l import tensorflow as d2l
def init_adadelta_states(feature_dim):
s_w = tf.Variable(tf.zeros((feature_dim, 1)))
s_b = tf.Variable(tf.zeros(1))
delta_w = tf.Variable(tf.zeros((feature_dim, 1)))
delta_b = tf.Variable(tf.zeros(1))
return ((s_w, delta_w), (s_b, delta_b))
def adadelta(params, grads, states, hyperparams):
rho, eps = hyperparams['rho'], 1e-5
for p, (s, delta), grad in zip(params, states, grads):
s[:].assign(rho * s + (1 - rho) * tf.math.square(grad))
g = (tf.math.sqrt(delta + eps) / tf.math.sqrt(s + eps)) * grad
p[:].assign(p - g)
delta[:].assign(rho * delta + (1 - rho) * g * g)
.. raw:: html
.. raw:: html
:math:`\rho = 0.9` seçilmesi, her parametre güncelleştirmesi için 10'luk
yarı ömür süresine ulaşır. Bu oldukça iyi çalışma eğilimindedir.
Aşağıdaki davranışları görürüz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
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);
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
loss: 0.246, 0.121 sec/epoch
.. figure:: output_adadelta_0b41cb_15_1.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
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);
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
loss: 0.246, 0.016 sec/epoch
.. figure:: output_adadelta_0b41cb_18_1.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
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);
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
loss: 0.243, 0.151 sec/epoch
.. figure:: output_adadelta_0b41cb_21_1.svg
.. raw:: html
.. raw:: html
Kısa bir uygulama için ``Trainer`` sınıfından ``adadelta`` algoritmasını
kullanıyoruz. Bu, çok daha sıkılmıştır bir çağırma için aşağıdaki
tek-satırlık kodu verir.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
d2l.train_concise_ch11('adadelta', {'rho': 0.9}, data_iter)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
loss: 0.243, 0.123 sec/epoch
.. figure:: output_adadelta_0b41cb_27_1.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
trainer = torch.optim.Adadelta
d2l.train_concise_ch11(trainer, {'rho': 0.9}, data_iter)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
loss: 0.244, 0.014 sec/epoch
.. figure:: output_adadelta_0b41cb_30_1.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
# adadelta is not converging at default learning rate
# but it's converging at lr = 5.0
trainer = tf.keras.optimizers.Adadelta
d2l.train_concise_ch11(trainer, {'learning_rate':5.0, 'rho': 0.9}, data_iter)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
loss: 0.245, 0.106 sec/epoch
.. figure:: output_adadelta_0b41cb_33_1.svg
.. raw:: html
.. raw:: html
Özet
----
- Adadelta'nın öğrenme oranı parametresi yoktur. Bunun yerine, öğrenme
oranını uyarlamak için parametrelerin kendisindeki değişim oranını
kullanır.
- Adadelta, gradyanın ikinci momentleri ve parametrelerdeki değişikliği
depolamak için iki durum değişkenine ihtiyaç duyar.
- Adadelta, uygun istatistiklerin işleyen bir tahminini tutmak için
sızdıran ortalamaları kullanır.
Alıştırmalar
------------
1. :math:`\rho` değerini ayarlayın. Ne olur?
2. :math:`\mathbf{g}_t'` kullanmadan algoritmanın nasıl uygulanacağını
gösterin. Bu neden iyi bir fikir olabilir?
3. Adadelta gerçekten oranını bedavaya mı öğreniyor? Adadelta'yı bozan
optimizasyon problemlerini bulabilir misin?
4. Yakınsama davranışlarını tartışmak için Adadelta'yı Adagrad ve
RMSprop ile karşılaştırın.
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html