SDT5に向けて徐々に手持ちの情報を公開していきます。
やねうら王の学習部はAdaGradを用いている。勾配をgとして、gの二乗を足し合わせたものを記憶しておき、これを基準にwを更新する。
$$r = r + g^2$$
$$w = w – eta \cdot \frac{g}{\sqrt{r} } $$
すべてのイテレーションを通じて、gがあまり変化しない(一定である)と仮定できるなら、n回目のイテレーションにおいて、
$$r = n \cdot g^2$$
であるから、\(\sqrt{r} = g \sqrt{n}\)である。
よって、
$$w = w – \frac{ eta }{\sqrt{n}} $$
となる。
nは1ずつ増えるので、初回(n=1)はetaだけwが動く。2回目(n=2)では\(\frac{eta}{\sqrt{2}}\) , 3回目は\(\frac{eta}{\sqrt{3}}\)である。このように徐々に1回にwが動く量が減衰していく仕組みとなっている。
ただ、この特徴が好ましいとは限らない。
そもそも最初のほう、値、動きすぎじゃね?
しかし、最初のほうの動きを抑えようとetaを下げると最終的にwが変化できる量がそれに比例して減ってしまうので、好ましくない。
出来ることなら動きかたがもう少し穏やかであって欲しい。
リアルな問題では、gも一定だと仮定できないので100回ぐらいイテレーションを回したあとのrの値を用いたい。
AdaGradではなく他の手法を使えばいいのかも知れないが、AdaGradの変数は、gとrだけで済むので、省メモリ化の観点からAdaGradは魅力的である。
そこでetaを可変にする。
"Attention Is All You Need" https://t.co/Iq2s5F3sZJ では Adam の学習率を 4000 イテレーションまでどんどん上げてその後で徐々に下げてると教えてもらいました……ワロタ…… pic.twitter.com/iqtPbpOYCp
— im132nd (@im132nd) August 21, 2017
etaを0から開始して、徐々に増やし、ある程度のところまで達したら、元の値(30)に戻していく。
やねうら王(V4.76)でやるには、learnコマンドに例えば次のように指定する。
eta 0.01 eta2 100 eta1_epoch 200 eta3 30 eta2_epoch 500
こうするとetaが0.01から始まり、200イテレーション目でetaは100になり、そのあと500イテレーション目で30になるように徐々に変化する。
評価関数をゼロから学習さるような場合には、格段に効果があるようだ。また、このeta2の100を1000ぐらいにすると10倍ぐらい値が動く。これくらい大きな値にしても、(ゼロから学習させる)初期の段階においてはそれなりの効果があるようだ。
ただまあ、何度も言うようにKPPT型の評価関数はもう表現力の限界付近にあるのでその限界を突破出来るわけでもなく…。
解像度の問題なら、etaを細かくするとかdoubleにするとかそういう話なのでしょうけどね。
あとは特徴出すために初期値を変な値にするとか。
etaとNを反比例させるとか。
Wを足しこんで計算回数で割るとか。
まぁ、立ち入った話はよくわかりません。Orz
素人にはもうついていけない領域になりつつありますねぇ。
うーん。Orz
> 解像度の問題なら
解像度の問題ではないです。
> etaとNを反比例させるとか。
AdaGradが見かけ上、etaが1/sqrt(N)ぐらいの速度で減衰してって、それですら早すぎる(最初が大きすぎる)という話なのでetaが1/Nに比例して減衰したら、早すぎて話にならんですよ。
> Wを足しこんで計算回数で割るとか。
それ平均化法なんですけど、その足し込むための変数がもったいないから、それはやりたくないという話をしています。ついでに言うとやねうら王で実験したところ、平均化法は、(計測できるレベルの)効果はないです。
自分はお手上げですね。んー。
アーティストになっちゃったみたいなので苦しいですね。
失礼しました。
もうちょっと思いついたので蛇足。
収束が早いならルートやめるとか、近視眼的に思いましたけどそうなると理論変わっちゃうんですよね?多分。
都合のいい数式引っ張ってくるとか。
逆にルートするのやめてn^2に類すれば初期はつぶせますよ?理論変わりますけど。
後はイテレートできるようにほかの値も適度に大きくする?と、どうなるかなぁ。
√Nをイテレート回数のX倍にするとかでもいいかなぁ?初期値が許容できるくらいまで小さくなるXを求める?って意味ないかなぁ。
って、結局解像度のこと喋ってる気がする。
やっぱそこは都合のいい数式を捏造しましょう。捏造。
w=w-(blackbox);
ところで生の値としてどういう傾向が良い悪いを決めるのでしょうかね??
数学むずいよぉ~。Orz
これ最後にします。
近視眼的に考えて、割り算を使うのが一番の元凶に思います。
もうちょっと足し引きで変異させる方法を考えるとかも思いました。
近視眼的に。
> 収束が早いならルートやめるとか
収束が速いのではない。見かけ上のetaの減衰が速いのだ。
> 逆にルートするのやめて
それただのSGDだよね。
ぐぬぬ。全滅デース!\(^o^)/
失礼しました。
etaをg倍する。(ボソ。
勾配という言葉を信じるなら、勾配がきつすぎるとか。
いや、何でもないです。
etq、elmoで30ですが、これを50とか60にすると発散ぎみになり、明らかに出来上がった評価関数の棋力が下がります。
大体できること言ったつもりですけど、この式自体に限界来てないです?
後はほんと分解能とか解像度上げて√Nを別の式にして(キュービック√とか,pow(X,1/7)とか)って感じじゃないでしょうか。
ホント式的に変形のしようがない感じがします。理解してないのもありますが。
雑巾固すぎです。
> 分解能とか解像度上げて
だから、なんべんも分解能も解像度も関係ないとゆうとるのに…。(´ω`)
> √Nを別の式にして
√Nは勾配が一定だと仮定すると、近似的に分母が√Nとみなせると言っただけで、実際の式のどこにも√Nなんて出てませんがな(´ω`)
うぅ。数学わかんない。Orz
もう何もないのでもう書くのやめます。
ごめんなさい。
sse4.2環境でYaneuraOu-2017-early-learn-sse42を起動しようとしたところ、
ハンドルされない例外が 0x000000000041EEDB (YaneuraOu-2017-early-learn-sse42.exe) で発生しました: 0xC000001D: Illegal Instruction。
とのエラーが出て起動しませんでした。
うおー。ごめんなさい。SSE 4.2用のビルドの前にmake cleanするの忘れてました(´ω`) 次バージョンで修正しときます。
やねうら王のGitHubのreleasesのところのファイル、修正してYaneuraOu-2017-earlyV476a.zipとしてアップしときました。(`・ω・´)b
OpenMP disabled ってでます(ToT)
SSE 4.2用のgccでのlearn版のbuild、何故か時々失敗するんですよね…。なんか根が深そうで、詳しく原因調べていないです。時間あるときに調べてみます。
etaはどのように変えればいいですか。
こちら、特にお勧めはないです。