AdaGradアルゴリズムは、このようにすべての次元に適応することは困難な問題の統一的次元を避け、独立変数に応じて、各次元の勾配値の各次元における学習率を調整します。
特長:
-
蓄積可変要素による少量の確率的勾配は、学習率の分母に表示されます。(目的関数の偏導関数は、関連する引数が大となっている場合は、学習率は急速に減少し、その逆も同様です。)
-
初秋早すぎる反復+現在のソリューションは依然として不良である場合、それは難しい効果的な解決策を見つけるために作ることができます。
まず、アルゴリズムの早期解決
研究を使用して達成AdaGradアルゴリズムは0.4でした。自動可変出力軌道よりスムーズにイテレーション。しかし、
学習率の累積効果では、動きの繰り返しの小さいサイズの範囲で可変の後に自動的に、崩壊し続けています。
%matplotlib inline
import math
import torch
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
def adagrad_2d(x1, x2, s1, s2):
g1, g2, eps = 0.2 * x1, 4 * x2, 1e-6
s1 += g1 ** 2
s2 += g2 ** 2
x1 -= eta /math.sqrt(s1 + eps) * g1
x2 -= eta / math.sqrt(s2 + eps) * g2
return x1, x2, s1, s2
def f_2d(x1, x2):
return 0.1 * x1 **2 + 2 *x2 ** 2
eta = 0.4
d2l.show_trace_2d(f_2d, d2l.train_2d(adagrad_2d))
結果:
2にズーム学習率を上げます。自動変数は、より迅速に最適解に近づいて見ることができます
eta = 2
d2l.show_trace_2d(f_2d, d2l.train_2d(adagrad_2d))
結果:
第二に、ゼロから達成するために
勢い方法⼀のような、それにAdaGradアルゴリズム各変数に対して自動的な形状のような状態変数を⼀維持する必要性を持ちます。以下AdaGradオペレータ
法アルゴリズム式を実現します。
# 从零开始实现
%matplotlib inline
import math
import torch
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
features, labels = d2l.get_data_ch7()
def init_adagrad_states():
s_w = torch.zeros((features.shape[1], 1), dtype=torch.float32)
s_b = torch.zeros(1, dtype=torch.float32)
return (s_w, s_b)
def adagrad(params, states, hyperparams):
eps = 1e-6
for p, s in zip(params, states):
s.data += (p.grad.data**2)
p.data -= hyperparams['lr'] * p.grad.data / torch.sqrt(s + eps)
d2l.train_ch7(adagrad, init_adagrad_states(), {'lr' : 0.1},features,labels)
結果:
第三に、実行時エラーの出現
エラーコードのOSError: ../../data/airfoil_self_noise.dat not found.
ファイルが見つかりません:
で、このサイトのダウンロード「airfoil_self_noise.dat」、「../../data/airfoil_self_noise.dat」このパスにそれを置きます。あなたは正常に実行することができます。