深層学習 Day4
動画講義の要約
強化学習について
Section1: 強化学習
報酬を最大化できるように、環境のなかで行動を選択できるエージェントを作ることを目標とする、機械学習の一分野。
(具体例)
たとえば、職場で頑張って問題を解決する。その結果何か目標を達成したらボーナスがもらえる。
つまり、何か報酬をもらえるにはどうすれば良いかを学習し、行動につなげていく。
方策(ポリシー)
どのように行動するか。ボーナス(報酬)を最大化させるための行動指針。
状態(ポリシー)
文字通り状態。オセロなら位置であり、上記例の職場なら職場環境という事になりそう。状態も変化していく。
行動(action)
ポリシーに従って行動する。
価値(value)
ポリシーに従って行動を選択するが、価値という状態に依存したものが存在する。 この状態に依存した価値は、この状態が今後ゴールに向かう際、どれだけの報酬を得る事が出来るか、で決められる。
探索と利用のトレードオフ
最初は、どのようにすれば価値がある行動を出来るか、報酬が貰えるかわからないので、探索のための行動。または探索の結果を利用する行動。 というのがあるらしい。
Eplison-Greedy法と呼ばれる。
(参考図書) pythonで学ぶ強化学習
これらの事柄を、数学的モデルに落とし込んでいく。つまり関数にしていく。 関数にするとニューラルネットワークに落とし込み、学習が出来る。
方策関数
と表すことが多い。方策関数は状態(s),行動(a)を引数とした関数である。
行動価値関数
行動価値関数は状態(s),行動(a)を引数とした関数である. もう一つ状態価値関数というのがあるが、これはaに依存しない。sのみに依存する。あまり使用されない。
学習する事で、優れた方策関数(ポリシー)を見つけていく。(policyベース)
ちなみにvalueベースの強化学習もあり、これは常に価値が最もたかい状態に遷移していくこと。
(参考図書) pythonで学ぶ強化学習
強化学習は方策関数と価値関数の精度が高ければより良いモデルとなり、その学習方法に勾配法がある。
方策勾配法
θは方策関数の重み。Jは $$ \theta ^ {(t + 1)} = \theta ^ {(t)} + e \nabla J (\theta) $$
これはニューラルネットワークの重みの学習 $$ w ^ {(t + 1)} = w ^ {(t)} - e \nabla E (w) $$ とほぼ同じ。- e => +e になってるくらい。 今回は最小に向かうわけではなく、最大の報酬を得る方向なので+になる。 Jとは、今の方策を続けて行った時に得られる期待報酬の関数。
Section2: Alpha Go
AlphaGoとは、Google DeepMindによって開発されたコンピュータ囲碁プログラムのこと。 AlphaGo Fan,AlphaGo Lee, AlphaGo Zero など、色んなバージョンがある。
学習のさせ方
まずは譜面データから教師あり学習で学習させる。それから強化学習を行う。
PolicyNet
方策関数によるネットワークのこと。
RollOutPolicy
PolicyNetの簡易版。計算量の多いPolicyNetより先に素早く学習させてしまう目的。
ValueNet
価値関数によるネットワークのこと。
モンテカルロ木探索
強化学習の学習手法の一つ。価値関数を学習させる時に用いる手法。
(参考) 強化学習入門 Part3 - AlphaGoZeroでも重要な技術要素! モンテカルロ木探索の入門 - - Platinum Data Blog by BrainPad
AlphaGo Zero
AlphaGo Leeの強化版?のようで、Leeとの違いは以下
ResidualNetwork
勾配消失や勾配爆発が起きないように、かつ精度が高くなるDeepな多層ネットワークになることを可能にしたモデル。ネットワークにショートカットを追加する。
Section3: 軽量化 高速化技術
近年、毎年10倍に学習に必要な計算量が増えている。との事。 より要領良くモデルの学習を進めるために、モデルの軽量化、計算の高速化をする必要がある。 (分散させて学習させる。並列化など。) 分散のさせ方として、演算機(CPU,GPU,TPU)を1台のコンピュータに複数用意させ、各演算機にデータを並列化して学習させる方法もある。
データ並列化
データを複数のコンピュータ(ワーカ)に分割し、学習をさせる。 データ並列化は各モデルのパラメータの合わせ方で、同期型か非同期型か決まる。
同期型
各ワーカーごとに算出された誤差、勾配を親に渡し、親は勾配の平均からパラメータを更新。 更新されたパラメータをまた各ワーカーに渡す。
つまり、全部のワーカーの学習を待ってから、親はその勾配の平均からパラメータを更新する。
非同期型
各々のワーカーは他のワーカーの処理を待たない。各ワーカーごとに学習し、モデルをパラメータサーバーにpushする。計算を待たないので、処理が早い。しかし、処理を待たない分最新のモデルで学習出来ない可能性がある。
モデル並列化
文字通り親モデルを各ワーカーに分割し、 ワーカーには分割された各モデルを学習させる。全てのデータで学習が終わった後で、一つのモデルに復元する事。 モデル並列化は1台のマシンの複数の演算機で実行する事が多い。理由はネットワーク遅延を防ぎたいため。
GPU
元々はゲームになどによく使われている演算機で、性能は低いがコアが多数。 なので、計算量の多さはともかく、シンプルな行列計算であるDeep Learnigの計算でGPUを使用すると、 コアが多数あるので並列的に処理が早い。
GPGPU
元々の使用目的であるグラフィック以外の用途で使用されるGPUの総称。 NVIDIAが有名。GPGPUで並列処理を行うためにプラットフォームにCUDAがあるが、ユーザーは GPU用の演算処理のやり方を改めて学習、実装する必要はない。 理由はDeep Learningフレームワーク(Tensorflow, Pytorch)内で実装されているから。 使用する際は指定すれば良い。
量子化
軽量化の手法の手法の一つ。 通常の重みの値、64bit浮動小数点を16bitなど、下位の精度に落とすことでメモリと演算処理の削減を行う事。欠点として、精度が落ちるという事があるが、そこまで著しく落ちるということはない。
蒸留
軽量化の手法の手法の一つ。
学習済みの精度の高いモデルの知識を軽量なモデルへ継承させること。 精度の高いモデルの知識を、軽量なモデルに継承させる。精度はさほど変わらない。 蒸留により、スマートフォンやIoTデバイスなどPCに比べてメモリが少ないデバイスでも、 モデルを利用することが出来る。 (参考): https://wirelesswire.jp/2016/09/56757/
プルーニング
モデルに影響が少ないパラメータを削除して、モデルの軽量化を行うこと。 例えば、値が0.1以下の重みはカットする。など。 以下の図がわかりやすい。
(参考) https://proceedings.neurips.cc/paper/2015/file/ae0eb3eed39d2bcef4622b2499a05fe6-Paper.pdf
Section4: 応用技術
MobileNet
文字通りモバイルデバイスでも動くくらいにモデルを軽量化する手法の一つ。
一般的な畳み込みレイヤーは計算量が多い。 MobileNetsはDepthwise ConvolutionとPointwise Convolutionの組み合わせで 計算量を減らす。
通常のCNNなら
- 入力サイズ (𝐻in,𝑊𝑙in,𝐶)
- カーネル (K,K,𝐶)
- フィルターがN個
の場合、出力マップは、
(𝐻out,𝑊out,N)
となる。(Hout, Woutはストライドやパディングによって決まる。)
この演算をDepthwise ConvolutionとPointwise Convolutionの組み合わせに分割する。
Depthwise Convolution
まずカーネルのフィルタ数を1に固定にした演算を行う。
入力(𝐻in,𝑊𝑙in,𝐶1) カーネル (𝐾,𝐾,𝐶1) フィルターは1つ! 出力(𝐻out,𝑊out,1) ← Hout, Woutはストライドやパディングによって決まる。
Pointwise Convolution
カーネルのサイズを1*1に固定した演算。フィルターはN個!
入力(𝐻out,𝑊out,1) カーネル (1,1,N) フィルターはN個! チャンネルは1つ。 出力(𝐻out,𝑊out,N) ← Hout, Woutはストライドやパディングによって決まる。
このように通常のCNNを分割することで、計算量が減る。
参考 https://agirobots.com/depthwise-pointwise-convolution/#DepthwisePointwise
DenseNet
出力層に、前の層の入力をチャネルに足しあわせていく。 入力がx 出力がkになるレイヤーがあったら、次の層への入力は x + kとなる。 以下の図がわかりやすかった。 Dense block イメージ
また、kをネットワークのgrouth rateと呼ぶ
このままだとチャネルが増えたままになるので、チャネルを戻すためのTransition Layerがある。
上記図でいうと k0 + 4kのチャンネル数をk0に戻すレイヤー(conv層とpooling層)
メリットとして、画像の特徴の伝達を強化する。などがある。
(参考) https://arxiv.org/pdf/1608.06993.pdf https://deepsquare.jp/2020/04/resnet-densenet
Batch正規化
ミニバッチ単位の正規化。 つまり1チャンネルあたりの画像をたとえばバッチサイズが6ならば、6枚単位で正規化。 過学習抑制などの効果があるが、ミニバッチ単位に環境依存がある(PC,mobile,CPU,GPU)ので、なるべく使いたくない。
Layer正規化
1つのデータの全チャネルに対して正規化を行う。 例として1枚のの画像行列が(r.g.b)と3チャンネルとして(H,W,C) = (28,28,3) の場合、この1枚の画像に対して正規化を行う。
Instance正規化
1つのデータの1つのチャネルに対して正規化を行う。 例として1枚のの画像行列が(r.g.b)と3チャンネルとして(H,W,C) = (28,28,3) の場合、この1枚のが1つのチャンネル(28,28,1)に対して正規化を行う。
Wavenet
自然な音声波形を生成する深層学習モデルのこと。 米Googleのスマートスピーカー「Google Home」や、Android端末に搭載される「Google アシスタント」にて使用されている。 音声を点にして、CNNを使っている。(チャンネルを考慮すると2次元) Dilated causal convolutionというアーキテクチャのCNNを使っている。
Dilated causal convolution
層が深くなるにつれて、畳み込む範囲を広くする。 深層学習を用いて結合確率を学習する際に、効率的に学習が行えるアーキテクチャを提案したことがWaveNet の大きな貢献の1 つである。 提案された新しいConvolution 型アーキテクチャは「Dilated causal convolution」と呼ばれ、結合確率を効率的に学習できるようになっている。
Dilated causal convolutionを用いた際の大きな利点は、単純なConvolution layerと比べて「パラメータ数に対する受容野が広い」ことである。
(参考)
* https://www.itmedia.co.jp/news/articles/1803/27/news053_2.html
Section5: Transformer
Seq2Seq
時系列データからある時系列データを生成する。エンコードして、デコードする。 翻訳などがSeq2Seqモデルである。
Transformer
RNNではなく、Attentionを使った文書生成モデル。RNNでの再起処理がない分、並列処理が可能になって学習時間が短くなった。 今後はこちらが主流になりそう。論文含めて、実装込みでよく読んで動かして理解していきたい。
[1706.03762] Attention Is All You Need
深層学習界の大前提Transformerの論文解説! - Qiita
論文解説 Attention Is All You Need (Transformer) - ディープラーニングブログ
Section6: 物体検知とSS解説
物体検出
ざっくり言うと、画像を入力、出力にラベルとラベル位置を示す矩形、このラベルが合ってるかどうかの値(conf)を返す機械学習モデル。以下に図を示す。
SSD
Single Shot Multibox Detectorの略で、物体検出アルゴリズムの一つ。 1度のCNN演算で物体の領域指定と「クラス分類」の両方を行う。なので高速。
アルゴリズムを簡単にまとめる
モデル
ざっくりというと、VGGネットワークに畳み込み層を追加した。
(参考) https://www.acceluniverse.com/blog/developers/2020/02/SSD.html https://avinton.com/blog/2018/03/single-shot-multibox-detector-explained1/
Segmentation
Segmentationとは各ピクセルに対し、単一にクラスラベルをつけて分割する機械学習の事。 入力は画像。 Semantic SegmentationとInstance Segmentationがある。ここでのまとめはSemantic Segmentationのみ。
Semantic Segmentation
物体の種類ごとに領域分割する。
Instance Segmentation
個体ごとに領域分割する。直感的にはこちらの方が難しそう。
アルゴリズム
FCN,SegNet,U-netなどがある。
(参考)
ディープラーニングによるSemantic Segmentationアルゴリズムまとめ | NegativeMindException