読者です 読者をやめる 読者になる 読者になる

TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

将棋でディープラーニングする その23(バリューネットワークの実装)

前々回の日記に書いたバリューネットワークの実装を行った。elmoで生成した教師データのフォーマットで教師データを読み込むようにした。前々回の日記で書いたAlphaGoの手法を参考にして、ネットワーク構成は、SL policy networkの出力層に全結合層を繋げてt…

将棋でディープラーニングする その22(評価値と勝率の関係)

前回の日記で書いたようにバリューネットワークの学習データとして、elmoの教師データを使用する予定である。elmoの教師データは自己対戦の勝敗だけでなく、深さ6で探索した評価値も同時に出力される。 そこで、学習がうまくいっているかの検証用として、elm…

将棋でディープラーニングする その21(elmoの学習データ)

バリューネットワークを実装する前に、検証に使用する学習データの仕様を決めておきたい。バリューネットワークの入力は、局面と勝敗のセットになる。AlphaGoの論文ではRL policy networkで終局まで打った際の勝敗データを使用しているが、私の検証しているR…

将棋でディープラーニングする その20(バリューネットワーク)

週末は電王戦の第2局を観戦していました。 人間のプロとコンピュータの対局はこれで最後となりましたが、コンピュータ同士の電王戦は継続されるということで、今後も楽しみです。検証しているディープラーニングによるコンピュータ将棋ですが、入力層のフィ…

将棋でディープラーニングする その19(報酬に応じた勾配 その2)

前回の日記でChainerでミニバッチの要素を1件ずつ処理することで報酬に応じた勾配の計算を実装したが、softmax_cross_entropyのbackwardの処理で、誤差逆の後続に伝えるデルタの値に重みを掛けることで実装できることがわかった。Chainerのリポジトリからsof…

将棋でディープラーニングする その18(報酬に応じた勾配)

前回の日記で、RL policy networkの勾配を求める際に、対数尤度の偏微分に報酬に応じた重み(勝敗の報酬から状態価値を引いた値)を掛ける計算の実装が、Chainerでは難しいということを書いた。Chainerでは損失関数のbackwardを行うと、ミニバッチで1つの勾…

将棋でディープラーニングする その17(強化学習の実装)

前回の日記に書いたように方策ネットワークを使って自己対戦できるようになったので、AlphaGoの手法(RL policy network)で強化学習の実装を行った。教師ありで十分に訓練できていないので、今の時点で強化学習を行っても効果はでないと思われるが、実装方法…

将棋でディープラーニングする その16(対局できるようにする)

教師ありで方策ネットワークを学習できたので、次に強化学習を試す予定であるが、強化学習を行うには自己対戦ができる必要がある。そこで、動作確認も兼ねてUSIエンジンとして動かせるようにした。 USIエンジン化 GUIとして将棋所を使用しようとしたが、USI…

将棋でディープラーニングする その15(強化学習)

前回まで棋譜を用いた教師あり学習で、将棋の方策ニューラルネットワークを学習した。今回から、強化学習で方策改善を行う。 強化学習の手法は、AlphaGoの論文と同じREINFORCE algorithm*1を試す。AlphaGoの論文の強化学習の手法は以下の通りである。 AlphaG…

将棋でディープラーニングする その14(floodgateの棋譜で学習)

前回までに調整したニューラルネットワークを、floodgateの棋譜を使って学習した。 floodgateの棋譜の入手 floodgateの棋譜は、コンピュータ将棋対局場の「情報収集」→「棋譜倉庫: 圧縮CSAファイル(7z形式)」から1年単位でアーカイブが入手できる。 とりあえ…

将棋でディープラーニングする その13(ハイパーパラメータの調整)

ディープラーニング将棋のニューラルネットワーク構成もだいぶ固まってきたので、そろそろ本格的に学習させてみたいが、その前にハイパーパラメータを調整を行った。ハイパーパラメータはベイズ推定など使って調整するのが本当は良いが、そんなに試行数もこ…

将棋でディープラーニングする その12(Wide ResNetを試す)

AlphaGoの論文ではSL policy networkは13層のCNNとなっているが、画像認識の分野では単純なDCNNよりGoogLeNet(Inception)やResidual Network(ResNet)が高い精度を上げている。 ResNetで層を増やすのが最も精度が上がるが、層が増えるほど学習時間も増える。R…

将棋でディープラーニングする その11(Kerasの実装)

将棋でのディープラーニングをChainerを使って検証していたが、Kerasでも試してみた。13層のDCNNを学習するには、少なくとも全パラメータ数の数倍の訓練データで学習する必要がある。 保存したmodelファイルをzipで解凍したファイルの合計サイズが約25MB(nu…

将棋でディープラーニングする その10(入力特徴から盤面の空の位置を削除)

GitHubに公開していたソースにバグがあり、Pull requestを頂きました。github.comバグの内容は、入力特徴である盤面の空の位置に先手の駒の位置が混ざっていました。 Pull requestをマージして測定し直しました。 train loss test accuracy 修正前 2.19 0.42…

将棋でディープラーニングする その9(王手を入力特徴に追加)

以前の日記に書いたがPonanza Chainerでは王手かどうかを入力特徴に入れているようだ。 そこで自分のニューラルネットワークにも王手を入力特徴に追加してみた。現在の局面が王手かどうかを判定し、2値画像1チャネルを入力チャネルに追加する。 王手かどうか…

将棋でディープラーニングする その8(出力に移動元を追加)

前回までのニューラルネットワークでは、差し手の移動先のみを出力して、移動元については考慮していなかった。 移動元をどのように出力するかは悩んでいたのでとりあえず移動先のみで検証を行った。移動元クラス数:盤のマス数(9×9)+持ち駒の種類(7) 移動先…

将棋でディープラーニングする その7(最適化手法の変更)

前回に続き、学習の改善を試します。 今回は、最適化手法を変えて収束性、精度を測定します。最適化手法は、はじめAdamではうまく学習できなかったためAdaGradとしていました。 Batch Normalizationを入れたことで、Adamを含めた他の手法でも学習できるよう…

elmoのアピール文書を読む

世界コンピュータ将棋選手権で優勝したelmoのアピール文書を読んでいますが、結構難しいです。 勝率が二項分布に従う場合、評価値はロジスティック分布に従う(※1)だろう、 ということでロジスティック回帰を適用しています(※2)。 この部分は、ある局面の勝敗…

将棋でディープラーニングする その6(BatchNormalizationを追加)

前回は、手番を入力特徴に加えても効果がないことを確認した。今回は、ニューラルネットワークの畳み込み層の後にBatch Normalizationを追加して精度への影響を確認する。Batch Normalizationを適用することで以下のメリットがある。 学習を速く進行させるこ…

将棋でディープラーニングする その5(入力特徴に手番を追加)

世界コンピュータ将棋選手権を参加者の生放送の方で見ていました。 開発者の話が聞けて、大変面白かったです。Ponanza Chainerの手法については、後日公開予定ということなので、公開されたら拝見させていただきたいと思います。 生放送でもだいぶ中身につい…

将棋でディープラーニングする その4(ネットワーク構成の変更)

本日から世界コンピュータ将棋選手権が始まりましたね。 一次予選を参加者の方の生放送で見ていました。今回からPonanza Chainer以外にもディープラーニングを取り入れて参加している方がちらほらいるようです。 こちらの方のアピール文章に、ネットワーク構…

TF-IDFのword2vecによる改良

先日doc2vecで気象庁のFAQの質問文を使って、類似質問文の検索を行ったが、質問文が短い場合うまくいかなかった。 質問文が短い場合は、TF-IDFのような古典的手法の方が有効であった。しかし、TF-IDFには以下のような欠点がある。 語順が失われる 高次元 単…

fastTextでwikipediaを学習する

先日の日記でfastTextでWikipediaの要約を学習させたが、期待した結果にはならなかったので、全記事を使って学習し直した。 Wikipediaの学習済みモデルは、 fastTextの学習済みモデルを公開しました - Qiita こちらの方が配布されていますが、MeCabの辞書の…

doc2vecでWikipediaを学習する

先日の日記でTF-IDFでFAQに回答することを試したが、TF-IDFでは質問文の類似度を単語の頻度に重み付けをして測っている。 そのため、単語が完全に一致している必要があり、同じ意味の単語でも異なる単語として認識してしまう。word2vecを使用すると単語をベ…

英語の論文を翻訳する際のTips

機械学習を勉強している際に必ずぶち当たるのが英語の壁である。 有用な論文のほとんどは英語で書かれているのだ。無料で読める論文は arXiv.org e-Print archive で公開されていることが多い。例えば、以下の論文などを無料で読むことができる。 <物体検出…

TF-IDFを使ってFAQに回答する

とある理由からBotについて調べています。最近はAIを使ったBotもありますが、古典的な方法として、あらかじめ質問と回答を用意しておき、ユーザが入力した質問と類似度の高い質問を選んで回答する方法があります。TF-IDFがその代表的なアルゴリズムになりま…

64bitのWindowsにMeCabをインストールする

MeCabの公式のサイトではWindows用は32bitのインストーラしか提供されていないため、64bitのWindowsで64bitのPythonから使おうとすると使用できない。64bit向けには、32bitのインストーラでインストールした後、個別にビルドしたファイルで実行ファイルとラ…

AIで質問の回答を選ぶ

ディープラーニングを使って自然言語の質問に、自然言語の選択肢から回答することを試します。例えば、 Which of the following is the primary advantage of sexual reproduction when compared to asexual reproduction? という質問文に、 (A) There is a …

WindowsでKerasを使う

とある理由でKerasを使い始めました。 備忘録を兼ねてWindowsでバックエンドにTensorFlowを使用してKerasを使う方法について書きます。 環境 Windows 10 Home 64bit Python 3.5.2(Anaconda 4.2.0 (64-bit)) Tensorflow-gpu (1.0.1) Keras (2.0.3) TensorFlow…

Windows(Bash on Windows)でfastTextを使う

word2vecより高速で学習できて精度がよいというfastTextを試してみました。 環境 Windows Home 64bit Bash on Windows 学習用データの準備 確認用にコンパクトなデータセットとして、Wikipediaの全ページの要約のデータを使用した。Index of /jawiki/latest/…

強化学習の教科書

昨日の日記で強化学習の勉強を始めたと書いたが、教科書についてまとめておく。購入した教科書は、昨日の日記で取り上げた と、TD学習を発案した著者による この本である。強化学習を体系的に記述してあり、本格的に学ぶなら後者の本がよいと思う。ただし、…

ホームページのデザイン変更

わりとどうでも良い話ですがホームページのデザインを変更しました。はてなブログに記事を書き始めてからほとんど更新しなくなっていますが、90年代のようなデザインを直したいと思っていました。最近CSSフレームワークの存在を知ったので、人気があるらしい…

強化学習の勉強

コンピュータ将棋の記事をちょっと書いたこともあり、強化学習について勉強を始めました。教科書として用いるのは、 この本です。この本で使用されているサンプルプログラムは、Octaveとg++が使用されいます。 Windowsで最新のOctaveとMSYS2で実行するのに少…

将棋でディープラーニングする その3(棋譜から学習)

プロの棋譜を使って前回の日記で作成したニューラルネットワークの学習を行った。棋譜サイトにあった竜王戦の棋譜を使用した。訓練データとテストデータの数は以下の通り。 訓練データ テストデータ 局数 3744 417 局面数 422852 47242 学習には非常に時間が…

将棋でディープラーニングする その2(ニューラルネットワークの構成)

先日の日記に続き、将棋でのディープラーニングの実装を試す。今回は、ニューラルネットワークの構成を検討する。 ネットワーク構成 ネットワーク構成は、AlphaGoのネットワーク構成を参考にし、13層の畳み込みニューラルネットワーク(DCNN)とする。 位置に…

将棋でディープラーニングする

先日の日記で1行もコードを書かずに、将棋におけるディープラーニングについて考察した。コードを書いて実験しないとただの机上の空論になるのでコードを書いて検証してみたいと思う。 といっても、将棋のプログラムの実装は行ったことがない。 一からコード…

コンピュータ将棋におけるディープラーニングの考察

先日の日記で、コンピュータ将棋とAlphaGoについて言及したが、次のPonanzaがディープラーニングに成功したということで、どのように適用しているのかが気になっている。そこで適当に考察してみる。電王戦のインタビューでもプロの棋譜との一致率について言…

Bonanzaメソッドの解説

昨日、電王戦 Ponanza×佐藤天彦名人の第1局をニコニコ生放送で見ていました。コンピュータ将棋には以前より興味があり、初めの頃から電王戦はウォッチしていました。名人に勝ったPonanzaは、次はディープラーニングを使うということですが、昨日の対戦で使わ…

3Dモデルから学習データを生成する その3(顔の向きを変える)

前回に続きBlenderで読み込んだ初音ミクのMMDモデルを使って、マンガキャラクターの顔パーツ検出用学習データの生成を試みる。前回は、トゥーンレンダリングを使用して3Dモデルからマンガ風の画像を生成した。 今回は、学習データのバリエーションを増やすた…

ボーカル音程モニター(Volcal Pitch Monitor)のバージョンアップ

約3ヶ月ぶりに、ボーカル音程モニター(Volcal Pitch Monitor)のバージョンアップしました。play.google.com変更点は以下の通りです。1.4.4 ・横方向にピンチズームできるようにした ・前回の縦軸の位置を保存するようにした ・縦軸に半音を表示するオプショ…

3Dモデルから学習データを生成する その2(トゥーンレンダリング)

前回に続きBlenderを使用してMMDの初音ミクの3Dモデルから、マンガキャラクターの顔パーツ検出用学習データの生成を試みる。BlenderでMMDのモデルを読み込むとそのままでは、シェーディングが有効になっており、レンダリングを行うと陰影のある画像となる。 …

3Dモデルから学習データを生成する

以前よりDCNNによるマンガキャラクターの顔パーツ検出に取り組んでいるが、学習データを手作業で準備するのが大変なので自動化できる方法を模索している。写真を線画化するする方法や、Free-Form Deformationを使う方法を試しているが、ここでは3Dモデルから…

SSDによる物体検出を試してみた

先日の日記でYOLOv2による物体検出を試してみたが、YOLOと同じくディープラーニングで物体の領域検出を行うアルゴリズムとしてSSD(Single Shot MultiBox Detector)がある。YOLOv2の方が精度が高いとYOLOv2の論文に書かれているが、SSDの精度も高いようなので…

WindowsにCaffeをインストールする

以前にWindowsでCaffeをビルドしてGPUで実行する方法について書きましたが、内容が古くなったので書き直します。以前に日記を書いた時点では、ビルド済みバイナリが配布されていなかったため、自分でビルドを行いましたが、ビルド済みバイナリが配布されるよ…

YOLOv2による物体検出を試してみた

前回の日記でWindowsにインストールしたDarknetを使ってYOLOv2による物体検出を試してみました。Darknetの学習済みモデルを使用して、ニコニコ動画の上位にあった動画に対して行ってみました。こちらの動画です。www.nicovideo.jp キャラクターがだいたいper…

DarknetをWindowsにインストールする

以前に行ったマンガの顔パーツ検出では、顔の領域の検出にdlibのHOG+SVMを使った方法で矩形領域を抽出してから、DCNNで顔パーツ検出を行っていた。 HOG+SVMである程度マンガから顔の領域を抽出できるが、少なからず検出漏れがあった。 また、スライディング…

Free-Form Deformationでテクスチャを変形する

前回までの日記で、OpenGLでテクスチャ(2D画像)を平面に描画する方法と、ベジエ曲面を描画する方法について記述した。 この2つを組み合わせて、テクスチャの変形を行う。テクスチャの変形には、自由形状変形(FFD: Free-Form Deformation)という手法を使う。 …

Pythonでベジエ曲面を描く

前回の日記でPythonでベジエ曲線を描いたが、今回はベジエ曲面(Bezier patches)を描く。ベジエ曲面は、以下の式で表される。 は、前回の日記で説明したバーンスタイン(Bernstein)多項式である。は、平面上に格子状に配置した制御点で、m, nは、それぞれu軸、…

Pythonでベジエ曲線を描く

Free-Form Deformation(FFD)を使用して2D画像の変形を行おうと試みているが、FFDはベジエ(Bezier)曲面で表される座標系を使用して変形する。 そこで、ベジエ曲線を復習を兼ねてmatplotlibで描画してみる。ベジエ曲線を2次元に拡張するとベジエ曲面となる。 …

PyOpenGLを使ってみる その6(テクスチャに頂点配列を使う)

テクスチャに頂点配列を使う。 import sys from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from PIL import Image def load_texture(): img = Image.open("sample2.png") w, h = img.size glTexImage2D(GL_TEXTURE_2D, 0, GL_…