$$で計算できることが分かります。AdaGradでは、これまでの全ての勾配の2乗和を$\mathbf{h}$として保存します。\mathbf{W}}$に掛けます。$\eta$は、全ての要素の学習幅を同じ比率で調整します。これに対して$\frac{1}{\sqrt{\mathbf{h}}}$は、要素ごとに学習幅を調整します。$j,k$要素に注目すると、パラメータ$w_{jk}$に関する過去の勾配の2乗和である$\frac{1}{\sqrt{h_{jk}}}$に従って、パラメータ$w_{jk}$の学習幅を個別に調整します。下のグラフからも分かる通り、$h_{jk}$が大きくなるほど$\frac{1}{\sqrt{h_{jk}}}$は小さくなります。$\mathbf{h}$はどの要素も更新を繰り返す度に勾配の2乗(必ず正の値になる)を加算するため、徐々に(勾配が0ならそのままか)大きくなります。更新が進むと$\frac{1}{\sqrt{\mathbf{h}}}$が小さくなり、その地点の勾配の値を大きく割り引き学習幅が狭くなります。これは、次の2つの働きがあります。1つ目は、始めの頃は最小値から遠いため大幅に値を更新し、更新が進んだ最小値付近では最小値を飛び越えてしまわないように繊細に探索する必要があることに対応するためです。始めの頃は$\mathbf{h}$が小さい($\frac{1}{\sqrt{\mathbf{h}}}$が大きい)ため、大幅に学習を進めます。更新値を繰り返すに従って$\mathbf{h}$が大きく($\frac{1}{\sqrt{\mathbf{h}}}$が小さく)なるため、少しずつ学習を進めるようになります。無限に更新を繰り返すと、更新幅が0になってしまうことを意味します。2つ目は、勾配が大きい要素については何度も学習機会があると捉えられることから細かく何度も更新し、逆に勾配が小さいあるいは観測されにくく勾配が0となることが多い要素については僅かな学習機会を活かすことに対応するためです。勾配が大きい要素は$\frac{1}{\sqrt{\mathbf{h}}}$が小さくなるため学習率が小さくなり、勾配が小さい要素は$\frac{1}{\sqrt{\mathbf{h}}}$が大きいままなので学習率が大きくなります。\epsilon}$とします。更新式の確認ができたので、AdaGradを実装します。plt学習率$\eta$は、インスタンスの作成時に引数lrとして指定し、インスタンス変数として値を保持します。デフォルト値として、よく用いられる値を設定しておきます。$\mathbf{h}$はパラメータ$\mathbf{W}$と同じ形状にする必要があるため、インスタンス作成時はNoneを定義してインスタンス変数だけ作成しておきます。更新メソッドの使用時に渡されるパラメータ(とパラメータごとの勾配)と同じ形状で全ての要素が0の変数を作成し、ディクショナリ型のインスタンス変数hに格納します。式(6.6)更新式に従いパラメータごとに値を更新します。0除算にならないように、分母に1e-7を加算しておきます。パラメータと勾配はどちらもディクショナリ変数として更新メソッド.update()の使用時に引数に指定します。