コンセプト:アダムは、トレーニングデータに基づいて、従来の一次確率的勾配降下アルゴリズムの最適化プロセスは、反復的に、ニューラルネットワークの重みを更新することができますに代わるものです。:アダムは、(確率的最適化のための方法アダムは2015 ICLR紙にトロント大学に提出OpenAI Diederik KingmaとジミーのBaの始まりである ) 提案しました。頭字語ではなく、名前ではありません「アダム」という名前のアルゴリズム。その名は、適応トルク推定値(適応モーメント推定)から来ています
本質的RMSprop運動量項を有するADAM(適応モーメント推定)、それはモーメント推定が動的各段階勾配の学習速度パラメータを調整することにより、二次モーメント推定されます。その主な利点は、パラメータは比較的安定しているように、オフセット補正の後、学習速度の各反復は、決定された範囲を有することです。次のように式は次のとおりです。
GT | |、E | GT最初の2つの式は、勾配一次モーメントと二次モーメント推定推定されていることが望ましいEとして見ることができる | ^ 2 ;推定
式3及び4は、2つの一次です推定された次モーメントを補正するので、所望の非バイアス推定値に近づけることができます。これは、勾配推定瞬間余分なメモリ要件に直接見ることができ、かつ動的勾配に基づいて調整することができます。最後に、動的学習制約指数nの前部が形成され、明確な範囲となります。
利点:
1、良い疎勾配Adagrad RMSprop良いと非定常目標の利点を組み合わせ、
2、より小さなメモリ要件;
3、異なる適応学習レートが異なるパラメータについて計算され、
図4に示すように、非凸最適化のほとんどに適用-大規模なデータセット、および高次元空間のため。
アプリケーションとソースコード:
パラメータの例:
クラスtorch.optim.Adam(paramsは、LR = 0.001、ベータ=(0.9、0.999)、EPS = 1E-08、weight_decay = 0)
定義:
paramsは(反復処理可能):反復最適化パラメータまたはパラメータ群を定義するために使用することができるdictsを。
LR (フロート、オプション):学習率(デフォルト: 。1E- 3) のベータ版、 (タプル[フロート、フロート]、オプション):
勾配に使用される平均二乗係数を計算する(デフォルト:(0.9、 0.999)) EPS (フロート、オプション):
数値的安定性を改善するために、の分母の項に追加される(デフォルト: 。1E- 8) weight_decay (任意フロート):減衰量(例えば、L2ペナルティ)(デフォルト: 0)
torch.optim.adam出典:
1つのインポート数学 .optimizerインポートオプティマイザから2 3 4クラスアダム(オプティマイザ): 5デフ__init __(自己、paramsは、LR = 1E-3、ベータ=(0.9、0.999)、EPS = 1E-8、weight_decay = 0)。 6デフォルト= dictの(LR = LR、ベータ=ベータ、EPS = EPS、weight_decay = weight_decay) 7超(アダム、自己).__ INIT __(paramsは、デフォルト) 8 9 DEF工程(自己、クロージャ=なし): 10のロス=なし 11閉鎖がNoneでない場合: =クロージャ12件の損失() 13 self.param_groupsのグループのための14: 群におけるp 15 [ 'のparamsは'] :16 p.gradなしであれば 17は続行します 18グラ= p.grad.data 19状態= self.state [P] 20 21#状態初期 22 lenは(状態)== 0の場合: 23状態[ 'ステップは'] 0 = 勾配の24#指数移動平均値 25を状態[ 'exp_avg'] = grad.new()。resize_as_(卒業生).zero_() 二乗勾配の26#指数移動平均値 27の状態[ 'exp_avg_sq'] = grad.new()。resize_as_(卒業生).zero_ () 28 29 exp_avg、exp_avg_sq =状態[ 'exp_avg']、状態[ 'exp_avg_sq'] 30ベータ1、ベータ2 =基[ 'ベータ'] 31 32状態[ 'ステップ'] + = 1 44 bias_correction2 = 1 -ベータ**状態[ 'ステップ'] 45 step_size =基[ 'LR'] *数学。SQRT(bias_correction2)/ bias_correction1 46] + = 1 33 34基[ 'weight_decay'] = 0の場合: 35グラ= grad.add(群[ 'weight_decay']、p.data) 36 37#ディケイ平均係数実行する第一及び第二モーメント 38 exp_avg.mul_(ベータ)を。 ADD_(1 -ベータ、卒業生) 39 exp_avg_sq.mul_(ベータ).addcmul_(1 -ベータ、卒業生、卒業生) 40 41 denom = exp_avg_sq.sqrt()ADD_(群[ 'EPS'])。 42 43 bias_correction1 = 1 -ベータ**状態[ 'ステップ'] 47 p.data.addcdiv _( - step_size、exp_avg、denom) 48 49リターンロス
例を使用します。
1つのインポートトーチ 2 3#Nはバッチサイズです。D_INは、入力の次元です。 4#Hが隠さ寸法です。D_OUTは、出力の次元です。 5 N、D_IN、H、D_OUT = 64、1000、100、10の 6 7#は、入力および出力を保持するためのランダムテンソル作成 8 X = torch.randn(N、D_IN) 9、Y = torch.randn(N、D_OUT) 10 11の#は、私たちのモデルと損失関数を定義するためにNNパッケージを使用してください。 12モデル= torch.nn.Sequential( 13 torch.nn.Linear(D_IN、H)、 14 torch.nn.ReLU()、 15 torch.nn.Linear(H、D_OUT)、 16)、 17 loss_fn = torch.nn .MSELoss(縮小= '合計') 18 19#の重みを更新するオプティマイザを定義するOPTIMパッケージを使用 20#私たちのためのモデル。ここでは、アダムが使用されます。OPTIMパッケージは、他の多くが含まれています 21#の最適化algoriths。アダムのコンストラクタの最初の引数は伝え 、それが更新する必要がありますテンソル22#オプティマイザを。 23 learning_rate = 1E-4 24オプティマイザ= torch.optim.Adam(model.parameters()、LR = learning_rate) の範囲内のT 25(500): 26位往路:計算モデルにXを通過させることにより、Yを予測しました。 27 y_pred =モデル(X) 28 29#計算し、印刷損失。 30の損失= loss_fn(y_pred、Y) 31プリント(T、loss.item()) 32 復路前に33#、ゼロの全てをオプティマイザオブジェクトを使用 (学習可能であり、それが更新された変数のための34の#勾配 モデルの35の#重み)。デフォルトでは、勾配があるためです .backwardいつでも(すなわち、上書きされていない)バッファに蓄積された36#を() 37位と呼ばれています。詳細はtorch.autograd.backwardのチェックアウトドキュメント。 38 optimizer.zero_grad() 39 40#復路:モデルに対する損失の計算勾配 41#パラメータ 42 loss.backward() 43 オプティマイザにステップ関数を呼び出す44#はそのに対して更新を行う 45#パラメータ 46オプティマイザ。ステップ()
ここでは、私は可能アップされているアプリケーションの大半に対処することを考えています。私の目的は、基本的に完了します。次のステップでは、アプリケーションの理解を深めています。
参照文献:
1 https://blog.csdn.net/kgzhang/article/details/77479737
2 https://pytorch.org/tutorials/beginner/examples_nn/two_layer_net_optim.html