アルファ碁:SLポリシーネットワークのモデル部分

アルファ碁のSLポリシーネットワークモデル部分

アルファ碁では入力の特徴量が48、中間層5x5の192チャネル、出力層の全13層からなっている。

# Network definition
class CNN(chainer.Chain):
  def __init__(self, train=True):
    super(CNN, self).__init__(
      conv1 = F.Convolution2D(48,192,5,pad=2),
      conv2 = F.Convolution2D(192,192,3,pad=1),
      conv3 = F.Convolution2D(192,192,3,pad=1),
      conv4 = F.Convolution2D(192,192,3,pad=1),
      conv5 = F.Convolution2D(192,192,3,pad=1),
      conv6 = F.Convolution2D(192,192,3,pad=1),
      conv7 = F.Convolution2D(192,192,3,pad=1),
      conv8 = F.Convolution2D(192,192,3,pad=1),
      conv9 = F.Convolution2D(192,192,3,pad=1),
      conv10 = F.Convolution2D(192,192,3,pad=1),
      conv11 = F.Convolution2D(192,192,3,pad=1),
      conv12 = F.Convolution2D(192,192,3,pad=1),
      conv13 = F.Convolution2D(192,1,1,nobias=True),
        bias14=L.Bias(shape=(361))
    )
    
  def __call__(self, x):
    h = F.relu(self.conv1(x))
    h = F.relu(self.conv2(h))
    h = F.relu(self.conv3(h))
    h = F.relu(self.conv4(h))
    h = F.relu(self.conv5(h))
    h = F.relu(self.conv6(h))
    h = F.relu(self.conv7(h))
    h = F.relu(self.conv8(h))
    h = F.relu(self.conv9(h))
    h = F.relu(self.conv10(h))
    h = F.relu(self.conv11(h))
    h = F.relu(self.conv12(h))
    h = self.conv13(h)
    h = F.reshape(h,(-1361))
    h = self.bias14(h)
    return h

データの用意

KGSから棋譜データを用意する(次回)。

Google ColaboratoryでChainerを使ってみる

Chainerを使ってSLポリシーネットワークを作成するため、まずはMNISTを使ってChainerの使い方を学習する。
勉強用なのでGoogle Colaboratoryで試してみる。
本格的にディープラーニングするときはクラウド使うかもしれない。

環境構築

Google Colaboratoryで新しいノートブックを作成する。

Runtime type: Python3
Hardware Accelerator: GPU Chainerは今はGoogle Colaboratoryで公式に提供されているため、マニュアルでのインストールは不要のようだ。

Chainerのimport

import chainer
import chainer.functions as F
import chainer.links as L
from chainer import training
chainer.print_runtime_info()

バージョン情報

Platform: Linux-4.14.79+-x86_64-with-Ubuntu-18.04-bionic
Chainer: 5.0.0
NumPy: 1.14.6
CuPy:
  CuPy Version          : 5.2.0
  CUDA Root             : /usr/local/cuda
  CUDA Build Version    : 10000
  CUDA Driver Version   : 10000
  CUDA Runtime Version  : 10000
  cuDNN Build Version   : 7301
  cuDNN Version         : 7301
  NCCL Build Version    : 2307
iDeep: 2.0.0.post3

ネットワークの定義

class CNN(chainer.Chain):
  def __init__(self, train=True):
    super(CNN, self).__init__(
      l1 = L.Linear(28*28, 100), #中間層。入力が28x28個のノード。中間層のノードは100個。
      l2 = L.Linear(100,10)) #出力層。100個のノードを受け取って10個の出力をする(0~9に相当する。) 
  def __call__(self, x): #接続関係を定義している。
    h = F.sigmoid(self.l1(x)) #l1のあとシグモイド関数を通して出力hを得る。
    h = self.l2(h) #l2を通して出力hを得る。
    return h

MNISTデータセットのロード

train, test = chainer.datasets.get_mnist(ndim=3)

CNNモデルと学習のセットアップ

model = L.Classifier(CNN())
optimizer = chainer.optimizers.Adam()
optimizer.setup(model)
train_iter = chainer.iterators.SerialIterator(train, batch_size=100)
updater = training.StandardUpdater(train_iter, optimizer)
trainer = training.Trainer(updater, (5, 'epoch'), out='result')

学習させる

trainer.run() # 前向き計算も誤差逆伝播法も実行される。

参考

最強囲碁AI アルファ碁 解体新書
Chainerのソースを解析。MNISTサンプルを追ってみる | コード7区

感想

Chainerの雰囲気は分かったが、当然ながら詳細は理解できていない。
簡単に記述できる分いろいろな計算が表には出てこないので、ちゃんと理解するには基礎から勉強する必要がある。

アルファ碁:SLポリシーネットワーク

今日やったこと

最強囲碁AI アルファ碁 解体新書の第一章、第二章を読んだ。

AlphaGOでの次の一手の予測モデル(CNN)

最強囲碁AI アルファ碁 解体新書第二章より。
(完全に理解できているわけではないので間違いがありますことご了承ください。)
AlphaGOでは次の一手を予測するモデルを畳み込みニューラルネットワーク(CNN)を用いて作成している。
次の一手:局面を入力して、各位置に打つ確率の予測値を出力する。
局面の勝率についてはバリューネットワークという評価関数を作成している。(別の記事でまとめる予定。)

Supervised Learning (SL)ポリシーネットワークによる次の一手予測

AlphaGOでの学習結果では57%の一致率だった。 入力層:48チャネル
第1層:5x5の192種類のフィルタとReLU関数
第2層~12層:3x3の192種類のフィルタとReLU関数
第13層:1x1の1種類のフィルタと位置に依存するバイアス項、ソフトマックス関数

入力層の48チャネル

黒石の位置、白石の位置、空白の位置が1チャネルずつ。 他にも直前8手の位置などの特徴量を使用している。

SLポリシーネットワークの学習手順

1.局面をランダムに取り出す。
2.ポリシーネットワーク経由の出力を計算
3.誤差を計算
4.SGDによるパラメータの更新

SGDとは

SGD: 確率的勾配降下法 (stochastic gradient decent)
勾配降下法において、毎回すべての学習データを使って勾配を更新するのではなく、一部の学習データ(ランダムに選択)を使って勾配を更新する方法。高速化のほか、局所的最適解からも抜け出しやすくなる。らしい。

疑問点

なぜ中間層では3x3のサイズにしているのか。 計算コスト削減のため?

次やること

  • ChainerでCNNの使い方の学習
    • まずはMNISTでテスト
    • 次に囲碁用のモデル作成
  • PCに触れない時間は3章以降を読み進める。

はじめに:囲碁AIをつくる

はじめに

このブログでは囲碁AIをつくる過程を記録していきます。

自己紹介

機械学習初心者。
普段はゲノム解析などバイオインフォマティクスやってます。
数年前から囲碁が好きなので囲碁AIやってみようと思いました。
R, Pythonはちょっと使えるレベル。

目標

終局までちゃんと打てる囲碁AIを作ること。(強さにはこだわらない。)
最終的にGUIで操作できるようにする。

方針

教師あり学習棋譜データをもとに囲碁AIをつくる。
AlphaGoを参考にする。

まずやること

何をやったらいいか分からないのでAlphaGOの解説本を読む。
流れをまずは理解する。