はじめに
今回の記事は、前回に引き続き、私が受講しているE資格 JDLA認定プログラムの「ラビットチャレンジ」のレポート記事です。
今回のテーマは深層学習です。
講座ではDay1〜Day4まで分かれており、今回はDay4(前半)に取り組みます。
Day4は主に、強化学習について扱います。
強化学習
教師あり学習、教師なし学習と並ぶ学習手法の大きな分類の1つです。
教師あり学習は教師の有無の違いはあるものの、データから何らかの特徴を学習していました。
強化学習は何らかの目的を設定し、それを達成できるように学習します。
また、強化学習は、長期的に報酬を最大化できるように環境の中で行動を選択できるエージェントを作ることを目標とします。
そして、行動の結果として与えられる報酬をもとに行動を決定する原理を改善していきます。
エージェントは方策に基づいて行動することで、その結果に応じた報酬を環境から得られます。
また、その行動の結果、環境の状態が変化します。
強化学習は、このエージェントがうまく目的に向かって動くよう方策を学習します。
既知のデータを利用すること、未知のデータを探索することいずれも大切ではありますが、トレードオフの関係にあるため調整する必要があります。
既知のデータの利用ばかりでは、それ以上よりよい行動にはならず、未知のデータの探索ばかりでは既知のデータを活かせません。
Q学習
行動価値関数を行動するごとに更新することによって学習を進める方法です。
関数近似法
価値関数や方策関数を関数近似する手法です。
価値関数
エージェントが目的にゴールするまで今の方策を続けた場合の報酬の予測値を得る関数。
行動価値関数
環境の状態と価値を組み合わせた価値に注目する場合に使用されます。
ある環境の状態である行動を取った時の価値です。
状態\(s\)+行動\(a\)
$$
Q^{\pi}(s,a)
$$
状態価値関数
環境の状態の価値に注目する場合に使用されます。
環境の状態が良ければ価値が上がります。
$$
V^{\pi}(s)
$$
方策関数
方策関数とは、方策ベースの強化学習手法において、ある状態でどのような行動を採るのかの確率を与える関数のことです。
価値関数の値(価値)を最大化する行動をとるようにします。
状態価値関数\(V\)、行動価値関数\(Q\)を元にどういう行動をするかを考えます。
$$
\pi(s)=a
$$
方策勾配法
方策反復法
方策をモデルにすることで最適化(学習)する手法です。
$$
\theta^{(t+1)}=\theta^{(t)}+\epsilon\nabla J(\theta)
$$
\(J\)とは、方策の良さで、定義しなければなりません。
定義方法は、以下の2つです。
- 平均報酬
- 割引報酬和
上記の定義に対応して、行動価値関数\(Q^{\pi}(s,a)\)の定義を行い、方策勾配定理が成り立ちます。
$$
\begin{eqnarray}
\nabla_{\theta}J(\theta)&=&\nabla_{\theta}\sum_{a\in A}{\pi_{\theta}(a|s)Q^{\pi}(s,a)} \\
\nabla_{\theta}J(\theta)&=&\mathbb{E}_{\pi_{\theta}}[(\nabla_{\theta}log\pi_{\theta}(a|s)Q^{\pi}(s,a))]
\end{eqnarray}
$$
AlphaGo
AlphaGoの学習は以下のステップで行われます。
- 教師あり学習によるRollOutPolicyとPolicyNetの学習
- 強化学習によるPolicyNetの学習
- 強化学習によるValueNetの学習
PolicyNet、ValueNetは、いずれも畳み込みニューラルネットワークです。
PolicyNetの教師あり学習
KGS Go Server(ネット囲碁対局サイト)の棋譜データから3000万局面分の教師を用意し、教師と同じ着手を予測できるよう学習を行いました。
具体的には、教師が着手した手を1とし残りを0とした19×19次元の配列を教師とし、それを分類問題として学習しています。
この学習で作成したPolicyNetは57%ほどの精度でした。
PolicyNetの強化学習
現状のPolicyNetとPolicyPoolからランダムに選択されたPolicyNetと対局シミュレーションを行い、その結果を用いて方策勾配法で学習を行いました。
PolicyPoolとは、PolicyNetの強化学習の過程を500Iteraionごとに記録し保存しておいたものです。
現状のPolicyNet同士の対局ではなく、PolicyPoolに保存されているものとの対局を使用する理由は、対局に幅を持たせて過学習を防ごうというのが主です。
この学習をminibatch size 128で1万回行いました。
ValueNetの強化学習
PolicyNetを使用して対局シミュレーションを行い、その結果の勝敗を教師として学習しました。
教師データ作成の手順は、
- SL PolicyNet(教師あり学習で作成したPolicyNet)で\(N\)手まで打つ
- \(N+1\)手目の手をランダムに選択し、その手で進めた局面を\(S(N+1)\)とする
- \(S(N+1)\)からRLPolicyNet(強化学習で作成したPolicyNet)で終局まで打ち、その勝敗報酬を\(R\)とする
\(S(N+1)\)と\(R\)を教師データ、損失関数を平均二乗誤差とし、回帰問題で学習しました。
この学習をminibatch size 32で5000万回行っています。
\(N\)手までと\(N+1\)手からのPolicyNetを別々にしてある理由は、過学習を防ぐためであると論文では説明されています。
モンテカルロ木探索
コンピュータ囲碁ソフトでは現在もっとも有効とされている探索法です。
他のボードゲームではminmax探索やその派生形のαβ探索を使うことが多いですが、盤面の価値や勝率予想値が必要となります。
しかし、囲碁では盤面の価値や勝率予想値を出すのが困難であるとされてきました。
そこで、盤面評価値に頼らず末端評価値、つまり勝敗のみを使って探索を行うことができないか、という発想で生まれた探索法です。
囲碁の場合、他のボードゲームと違い最大手数はマスの数でほぼ限定されるため、末端局面に到達しやすいです。
具体的には、現局面から末端局面までPlayOutと呼ばれるランダムシミュレーションを多数回行い、その勝敗を集計して着手の優劣を決定します。
また、該当手のシミュレーション回数が一定数を超えたら、その手を着手したあとの局面をシミュレーション開始局面とするよう、探索木を成長させます。
この探索木の成長を行うというのがモンテカルロ木探索の優れているところです。
モンテカルロ木探索はこの木の成長を行うことによって、一定条件下において探索結果は最善手を返すということが理論的に証明されています。
AlphaGo Zero
AlphaGo LeeとAlphaGo Zeroの違い(AlphaGO Zeroの特徴)
- 教師あり学習を一切行わず、強化学習のみで作成
- 特徴入力からヒューリスティックな要素を排除し、石の配置のみにした
- PolicyNetとValueNetを1つのネットワークに統合した
- Residual Netを導入した
- モンテカルロ木探索からRollOutシミュレーションをなくした
PolicyValueNet
PolicyNetとValueNetが統合されましたが、それぞれ方策関数と価値観数の出力が得たいため途中で枝分かれしたニューラルネットワークとなります。
Residual Net(Residual Block)を導入することで勾配消失、勾配爆発を防いでいます。
Residual Blockの考え方はResNetと同じです。
Residual Block
Bottleneck
Residual Blockの工夫として次元削減を取り入れることで、2層のものと計算量はほぼ同じとしつつも1層増やしたものです。
PreActivation
Residual Blockの並びをBatchNorm、ReLU、Convolution、BatchNorm、ReLU、Convolution、Addにして性能向上したものです。
ネットワークの工夫
WideResNet
Convolutionのフィルタを\(k\)倍に段階的に幅を増やしていくResNetです。
フィルタを増やすことで、層が浅くても深い層のものと同等以上の性能を発揮します。
PyramidNet
WideResNetのように段階的にフィルタを増やすのではなく、各層でフィルタを増やすResNetです。
軽量化・高速化技術
分散深層学習
深層学習は多くのデータを使用したり、パラメータ調整のために多くの時間を使用したりするため、高速な計算が求められます。
複数の計算資源(ワーカー)を使用し、並列的にニューラルネットを構成することで、効率の良い学習を行います。
データ並列化、モデル並列化、GPUによる高速技術は不可欠です。
高速化
データ並列
親モデルを各ワーカー(いわゆるPC、またはGPU等の演算器)に子モデルとしてコピーし、分割したデータを与えて各ワーカーごとに計算させます。
同期型と非同期型がありますが、同期型が主流です。
同じ構造のモデルでデータを分けて学習するため、データが多いほど速度向上が見込ます(データが少ないならデータを分ける意味も薄くなる)。
つまり、データ並列化はデータが多い場合に選択する方が良いです。
データ並列:同期型
全ワーカーの学習が全て終わったらワーカーから出た勾配の平均を親モデルのパラメータに反映します。
これによって前より親モデルの性能が上がります。
さらに、親モデルを子モデルとしてコピーして学習します。そして、この流れを繰り返します。
全ワーカーの学習が全て終わるのを待つため非同期型よりは遅いですが、精度は同期型の方が高いです。
データ並列:非同期型
同期型と違って全ワーカーの学習が終わるのを待たず、子モデルのパラメータを更新します。
学習が終わったらそのワーカーはパラメータ更新した子モデルをサーバにPushし、また新しく学習する時はサーバから最新のモデルを取得して使用します。
速度は同期型より速いですが、非同期型の場合はタイミングによって使用されるモデルが最新でないため、学習が不安定となりやすいです。
モデル並列
親モデルを書くワーカーに分割し、それぞれのモデルを学習させます。そして、すべてのデータで学習が終わったあとで、一つのモデルに復元します。
モデルが大きいときはモデル並列化を、データが大きいときはデータ並列化すると良いとされています。
また、複数のPCで分散学習をさせると、誤差関数をまとめるのに時間がかかるため、GPUを複数用意することが多いです。
モデル並列においてはモデルのパラメータ数が多い(大きいモデル)ほど、スピードアップの効率も向上します。
GPU
分岐等様々な処理を得意とするCPUと違い、GPUは並列計算を得意とします(ゲームの3Dグラフィックの演算等)。
膨大な行列計算を行うニューラルネットワークにとって並列計算できるGPUは高速化に役立ちます。
- CPU:高性能なコアが少数、複雑で連続的な処理が得意
- GPU:比較的低性能なコアが多数、かんたんな並列処理が得意で高速化可能
GPGPU(General-purpose on GPU)
元々の使用用途であるグラフィック以外で使用されるGPUのことです。
CUDA
NVIDIAのGPUで使える並列コンピューティングプラットフォームです。
NVIDIA社が開発しているGPUのみで使用可能で、DL用に提供されているので使いやすいです。
OpenCL
オープンな並列コンピューティングのプラットフォームです。
NVIDIA社以外の会社(Intel, AMD, ARM)のGPUからでも使用可能です。
軽量化
量子化(Quantaization)
ネットワークが大きくなると、大量のパラメータが必要になり学習や推論に多くのメモリと演算処理が必要です。
通常のパラメータの64bit floatを32 bitなどの回の精度に起こす(量子化する)ことで、メモリと演算処理の削減を行います。それにより、メモリの使用量は半分で済みます。
量子化のメリット
- 計算の高速化
bit数が減ることで計算量も減る - 省メモリ
bit数が減ることで桁数が減ることになるため、データ量が減る
量子化のデメリット
- 精度の低下
bit数を減らすと浮動小数点数で表現できる小数点数の精度が落ちます(より小さい桁の情報が表現できない)。
蒸留(Distillation)
精度の高いモデルはニューロンの規模が大きくなっているため推論に多くのメモリと演算処理が必要です。
そのため、規模の大きなモデルの知識を使い、軽量なモデルの作成を行います。これが蒸留です。
蒸留は教師モデルと生徒モデルの2つで構成されます。
教師モデル
予測精度の高い複雑なモデルやアンサンブルされたモデル。
生徒モデル
教師モデルをもとに作られる軽量なモデル。
プルーニング(Pruning)
ネットワークが大きくなると大量のパラメータになりますが、すべてのニューロンが計算の精度に寄与しているわけではありません。
モデルの精度に寄与が少ないニューロンを削減することで、モデルの軽量化、高速化が見込まれます。