のんびり肉体改造ブログ

30代社会人のトレーニング記録と雑記

ラビットチャレンジレポート(深層学習/後編/その2)

トレーニングにまつわるあれこれを掲載しているブログではありますが,都合によりこのような記事を掲載いたします.
現在一般社団法人ディープラーニング協会のE資格を取得するため,ラビットチャレンジなるプログラムを受講しています.本プログラムにおいてレポート公開が必須になっていることから,こちらのブログにてレポートします.

強化学習

概要

方策関数と価値関数を学習することで,機械自身が行動判断できるようになる手法のこと. 通常の機械学習ではパターンの取得が目標であり,それを元に未知のデータに対して予測を行うのに対して,強化学習では優れた方策を見つけることを目標としている.

f:id:CivilEng:20211223060046p:plain

方策関数とは強化学習手法において,ある状態でどんな行動を採用するのかの確率を与える関数のこと.価値関数にはある状態の価値に着目する状態価値関数と,ある状態の価値とそれに対する行動の価値の両方を組み合わせた行動価値関数がある.

Alpha Go

囲碁用に開発された強化学習モデル.Policy NetとValue NetをそれぞれConvolution Networkで出力する.以下はAlpha Go(Lee)で使用されているモデル.

f:id:CivilEng:20211223060851p:plain

f:id:CivilEng:20211223060912p:plain

後にAlpha Go Zeroが開発され,ネットワークは統合されマルチタスク化されている.
正直,強化学習は難しく,また実務で使用する予定がないことから,浅い範囲だけ理解を努めるに留めたい.しかしAlpha Goでも画像認識と同様にConvolutionをしているというのが,面白い.

軽量化・高速化技術

特に深層学習は計算量が多いため,並列化やGPUを活用することで,高速に計算する方法を検討する必要がある.

高速化

データ並列化

親モデルをコピーして,ワーカーに子モデルを与える.ワーカーはそれぞれデータを使って子モデルにおける勾配を計算する.子モデルにおいて計算された勾配を集約して,親モデルにおけるパラメータを決定する.複数のワーカーにおいて同時に計算することで,計算時間を短縮する.

データ並列化には同期型と非同期型がある.同期型では各ワーカーが計算を終えるのを待ち,全ワーカーが出力した勾配の平均を親モデルのパラメータを更新する.非同期では各ワーカーはお互いの計算をまたずに,各子モデルごとに更新を行う.学習が終わった子モデルはパラメータサーバにPushされる.新たに学習を始める時は、パラメータサーバからPopしたモデルに対して学習を行う.

処理は非同期型のほうが早いが,学習が不安定になりやすい.現在の主流はより良い精度が得られることが多い,同期型.

モデル並列化

親モデルを各ワーカーに分割して,それぞれのモデルを学習させる.全てのデータで学習が終わった後に,1つのモデルに復元する.モデルが大きい時はモデル並列化を、データが大きい時はデータ並列化をすると良い。

GPU

CPUはコア数が少ない一方で高性能であり,複雑で連続的な処理が得意.これに対してGPUは比較的低性能なコア数が多く用意されており,並列処理が得意なユニットとなっている.開発環境として最も使われているのはNVIDIAが開発したCUDA(私もこれ).NVIDIA以外のGPUを使う場合はOpenCLを利用する.TensorflowやPytorch内で指定することでGPUの利用が可能となっている.

軽量化

機械学習モデルを計算資源の乏しいモバイル等で利用する際には,計算量やパラメータを削減を行う必要がある.代表的な手法として,量子化,蒸留,プルーニングがある.

量子化

パラメータを例えば64bit浮動小数点を32bitにする(倍精度演算→単精度演算)ことで,メモリと計算量の削減を行う.計算は高速化されるが,精度が低下する可能性がある.

蒸留

学習済みの複雑なモデルから,エッセンスを抽出してよりパラメータが少ない軽量なモデルを作成する手法のこと.学習済みのモデルを教師モデル,作成したい軽量なモデルを生徒モデルとして,誤差関数を使って生徒モデルの重みを更新していく.

プルーニング

問題を解く際に寄与の少ないニューロンをモデルから削除して,計算量を削減する.