2015闇雲ってこういうことかも次に記事を書く時は別の話題にしようと思っていたのですが、三目並べの強化学習に関して試さずにはいられなかったので、闇雲と言われようが思いつくままにやってみたことを書いておきます。HACKS」の中で序盤より終盤の手を重視する方法について記述されていることに触れました、そして今まで試した方法は報酬を与えるにしても罰するにしても選択した全ての局面で同じ値を加算したり減算したりしていましたが、今回は手数毎に違う値を加減算する方法を試してみました。HACKS」には以下のように書かれています。動物が学習する手法をまねたい場合、ゲーム終盤近くの手が、ゲーム序盤よりも重大であるようなシステムに調整してもよい。これは行動が適切な時期に近いほど、その行動を強化する効果が最大になるという観察結果を反映することを意図したものだ。現時点の機械学習プログラムは、勝負がついた時点で局面を初期盤面まで遡りながら局面に配置されている小石(score配列)の数を増減させて学習効果を反映させる仕様です。勝った場合は、一つ手前の局面の9個ある配列データ(score配列)の内、選択した手の場所の値を増やして(報酬を与えて)次からもその局面では再度その手を選ぶ確率を上げるようにするわけです。その前の局面、その前の局面と遡りながら同じように数値を加減算していきます。以前の記事にも書きましたが、辿った全ての局面のデータを一律に同じ数だけ増やして(あるいは減らして)いくというのは確かに少し疑問を感じます。相手の石が揃うのを防がなかったような場合、その手は大悪手であるにも関わらず、序盤の一手と同様の罰しか受けないわけで、感覚的にはそれでいいの?って感じです。ここに書かれているように、報酬も罰も終盤ほど大きな値になるように調整してみました。最終手が1になるように1を手数で割った値を係数にして、勝ちなら3負けなら−1を掛けた値を反映させるようにしてみました。なり、勝った場合は、負けた場合はの値を各局面のデータ(score配列)に加算します。なり、勝ちなら、負けならが加算されます。値が加算され、終盤の局面ほど大きな報酬が与えられるわけです。1.000グラフにすると下のようになります。この状態での対戦結果は以下のようになりました。若干ですが最強プログラムとの対戦成績は向上したようですが、乱数プログラムとの対戦成績(=学習効果)は悪化しました。210万回の対戦の途中経過を観察していないのではっきりとは言えませんが、終盤の手ほど重要視するようにはしてみたけど劇的に学習効果が上がるってわけでもなさそうです。ように等間隔の増分でいいのでしょうか?1手目、2手目、3手目と等間隔で手の重要度が変化するとはとても思えません。相手のラインが揃うのを防がない手を選択して負けるケースなんかを考えると最終手は段違いに重要な気がします。いうことで、指数関数的に指し手の重要度が増すと仮定して方程式を改造しました。してこんな感じになるんじゃないかという値を捏造して、その値をLibreOffice(Excelでも可)を使って回帰して得られた方程式が以下のものです1。グラフは以下の青のラインです対戦結果は以下です。報酬や罰が等間隔で配分される線形関数の時より、対最強プログラムも対乱数プログラムも勝率が落ちてしまいました。最強プログラムとの対戦成績に関しては「従来の強化学習」よりいい成績なので、この時点では一応効果はあると思っていました。3指数曲線にした方が勝率(というか引き分け率)が落ちてしまったのは回帰曲線が線形関数を下回っているのがよくないのかと思って、もう一度値を弄って重みを掛ける係数の値が線形関数の上にくるようにしてみました。3.030グラフは以下です対戦結果。対乱数プログラムでは改善しています。対乱数プログラムで勝率がアップしたのは係数を大きな値にしたことが素直に反映されたのだと思います。対最強プログラムの場合では相手は絶対負けないので勝ち点3を得る機会がないので指数関数で係数を大きくしてもあまり恩恵を受けなかったということでしょう。係数を大きな値にしたために小石(score配列)を補充する際のデフォルト値を10から20に増やす必要があったのです(小石の数がマイナスにならないよう)が、それがよくなかったのだと思います。以前の記事にも書いたように小石の総数を増やすと学習効果が上がらなくなるのです。ここでは総手数が6手で終了する場合のデータをもとに作成した回帰方程式を、全ての対戦に使用しています。本来なら総手数毎に動的に計算(LibreOfficeやExcelのgrowth関数のようなものを自作する必要あり?)しなければいけないところを取り敢えず6手の場合で作った方程式を流用して手抜きしているのでよくありません。いい結果に繋がりそうなら追求してみようかと思ってましたが、やってみる価値は無さそうです。4終盤ほど報酬を多くして報酬の総数はなるべく増やさずに曲線で回帰するにはどうすればいいのか考えた結果、対数グラフにしてみました。「一手の重要度が等間隔で変化するはずがない」から「曲線で推移するはずだ」けど「報酬が増え過ぎると学習効果が薄れる」から「対数関数にしてみよう」という、形から入っただけというかなんとも根拠が薄い感じがしますが、もしかしたらいい結果が出るかもしれないと期待しました。指数関数と違ってこの方程式のいいところは、根拠のない数値から回帰したものではないところです。HACKS」に書いていたのと、Jリーグなどの多くのスポーツで勝てば勝ち点3、引き分けで勝ち点1となっているので何か(経験則的な?)根拠があるのだろうと思います。対戦結果は以下のようになりました。66,706勝22,489敗10,805分なぜか乱数プログラムに対する勝率はさらに向上しましたが、最強プログラムとの対戦成績は直前の指数関数よりはちょっとましになっただけで、全体として「従来の強化学習」と似たような結果に終わっているので期待はずれでした。この「従来の強化学習」をあらためて説明すると、勝ちは+3、引き分けは+1、負けは−1の値を序盤、終盤関係なく全ての辿った局面データに一律に加減算する強化方法です。弄ってみて結局「元の木阿弥」という感じですが、最強プログラムとの対戦成績に関しては終盤に重きを置くことの意味はありそうです。なんで報酬を等間隔に配分した線形方程式(直線)の方が良い成績になるのかは未だに疑問です。表の範囲を指定すれば係数と切片(定数項)が得られます。