(1)「囲碁をディープラーニングするのは面白い」という噂なので(笑)、私も試しに一度やってみることにしました。作るならやっぱり評価関数。今回は19路盤用です。学習に使うデータについてです。評価する局面は、COSUMIで打たれた19路盤互先の作り碁の棋譜から作りました。最後のパスパスを取り除き、1手から最終手の間の一様乱数にまで棋譜の手数を短くして、さらに対称形を考慮しない完全な重複分を取り除き、残った棋譜の最終局面を使うことにしました。今回の作成方法は以下のとおりです。rateが0.5の反対側に行くまで、繰り返します先ほどと同じように、0.5をまたいだ2点を結んで、0.5と交わるところを「最終的な形勢」としますあまりにも素朴すぎる気はしますが、こんな感じで作りました。前半は消費リソースを減らすためにやっているだけなので、後半だけを行っても当然似たようなラベルができるはずです。最初のころは、これを10,000局面分作っていろいろ試していたのですが、ちょっと遊んでみたいだけとはいえ、それではあまりにも少なすぎたので、50,000局面分まで増やしました。それを対称形に8倍して、ここでもう一度重複分を除去し、きりの良い数字にまで少し減らして399,000局面分できました。今回は、その内80%の319,200局面分を学習用に、残りの20%の79,800局面分を検証用に使用します。ここまで、学習データは用意できましたので、次に実際に学習を始めます。メモリ:16GB)でいろいろ試していたのですが、実際に学習が動き始めると、さすがにやはりちょっと遅すぎるので、EC2使いました。学習内容によって結構変わってくるみたいですが、だいたい12倍ほど速かったです。速いとうれしいのですが、しかたないでしょうか?DNNのフレームワークには、バックエンドにTensorFlowを使ったKerasを使ってみました。Kerashttps://keras.io/TensorFlowhttps://www.tensorflow.org/Kerasはとても分かりやすくて、私のような素人には本当にありがたい。TensorFlowもですが、本家のドキュメントがしっかりしているのがいいですよね。今回のケースだと、こんな感じのコードになります。y_test))驚くほどシンプルに書けます。Adam(パラメータはKerasのデフォルト)です。バッチサイズは、実行速度などに影響がかなり大きいです。エポック数は、収束していなくても、過学習していても、なにがあっても、今回は一定でいきたいと思います。ネットワークへの入力は、とりあえず最初、「次の手番のプレーヤーの石」と「相手のプレーヤーの石」の2面(19,19,2)、数値は0と1です。ちなみにですが、今回の学習データのラベルは、平均5.7、標準偏差32.9、平均偏差21.5ぐらいです。盤面見ないで「黒5.7目形勢が良い」って答えておけば、Lossは21.5にはなりますので(どちらが黒か教えませんので、実際はもう少し難しいはずですが)、最終的にその数字がどれくらい0に近づくのか、っていう感じで見てもらうと良いと思います。それではいってみましょう。最初に考えたのはこんなネットワーク構成でした。13)))model.add(Flatten())model.summary()が吐いてくれるネットワークの要約がこちら。0.0パタパタパタと畳んで、ペタンを押しつぶして、フワーと見るイメージなんですが(笑)、ところがこれ、全く学習してくれません。21.9808試しに、活性化関数をtanhに変更してみます。今度はLeakyReLUに。ここで、なんとなく分かりましたよ。現在のネットワーク構成では、一番最後の活性化関数の後ろに、もう畳み込み層や全結合層がありません。活性化関数がひとつ余分なんですね。ReLUは正の値しか出力しないので、それを平均してもまた正の値の出力しか出てきませんが、ラベルの方には負の値(次の手番側が形勢悪い)もあります。その時にパラメータの更新ができないとか、たぶんそういう話です(合ってるかな?)。いうことで、活性化関数をReLUに戻して、一番最後のは削ります。18.2891OKのようです。LeakyReLUってなんとなく好きなんですが、ReLUの方がやはり軽いみたいなので、ここから先はひとまずReLUを使います。次に、ネットワークを深くしていきます。3×3の畳み込み層を全部で4層に。0.0そして5層、6層、7層、8層、と増やしていって、最後に全部で9層。今回はパディングを入れていないので、どんどん畳み込まれていって、3×3の畳み込みのみで1×1のサイズに。なると、最後の平均プーリングはもう意味がありませんので削除します。1×1の畳み込み層も、実質、ただの全結合になってしまいました。Lossをグラフにしてみます。カッコ内の秒数は、2エポック目に掛かった時間です。だいたいこれが、1エポックあたりの平均の実行時間になります。ネットワークが深くなるにつれ、どんどん賢くなっていくのがよく分かります。小さく畳み込まれたのをさらに畳み込んでいっているので、学習時間はあまり増えていきません。いえ、パラメータ数はどんどん増えていくので、過学習しやすくなったりはしてそうです。パディングを入れれば、3×3の畳み込みをもっと重ねていくことは可能ですが、ここから先はひとまず9層で続けていきます。次は、畳み込み層のフィルターの数を増やしていきたいと思います。