##はじめに
本記事は機械学習の個人的な勉強におけるメモとして活用しています。
数式や実装は間違っている可能性がありますので、ご了承願います。
参考書籍:ゼロから作るDeepLearning②自然言語処理編
#【深層学習Day3】
##Section1:再帰型ニューラルネットワークの概念
###要点のまとめ
- 再帰型ニューラルネットワークとは内部にループ構造を持つことで、過去の情報を記憶しながら新たにパラメータを更新することができるネットワーク
- 再帰型ニューラルネットワークの代表例がRNN
$$
\Large h_{t}=tanh(h_{t-1}W_{h}+x_{t}W_{x}+b)
$$ - RNNはフィードフォワードネットワークで扱うことができなかった時系列データ(時間的順序を追って一定間隔ごとに観察され、相互に総計的依存関係があるようなデータ)を処理することが可能
-時系列データの例として次のようなものがある- 日付ごとの植物の成長観察記録
- 音声データ
- 映像データ
- 月毎の売り上げ
- RNNにおける勾配計算は通常のニューラルネットワークと同様の手順で行うことが可能で、時間方向に関して計算することからBPTT(Backpropagation Through Time)と呼ばれる
###実装演習結果
RNN実装コードURL
###確認テストなどの考察
(問題)
RNNのネットワークには大きく分けて3つの重みがある。1つは入力から現在の中間層を定義する際にかけられる重み、1つは中間層から出力を定義する際にかけられる重みである。残り1つの重みについて説明せよ。
(回答)
過去の中間層から出力への重み
(問題)
連鎖律の原理を使い、dz/dxを求めよ。 $z=t^{2},t=x+y$
(回答)
$\cfrac{dz}{dx}=\cfrac{dz}{dt}\cfrac{dt}{dx}=2t*1=2t$
###コラム
自然言語処理の目標は「人が話す言葉をコンピューターに理解させること」です。しかし、当たり前のことですが、人間は言葉を使いますが、コンピューターは本来数値しか扱うことができず言葉という概念はありません。つまり、人が話す言葉をコンピューターに理解させるためには、人の言葉をコンピューターが理解できるように数値で表現する必要があります。その手法としてRNNという手法が登場する以前は、①シソーラス、②カウントベース、③推論ベース、という3つのアプローチが行われていました。それぞれのアイデアは、次のとおりです。シソーラスは単語を辞書化。カウントベースはコーパスと呼ばれる大量のデキストデータから単語をベクトル表現。推論ベースは、ある単語やその周辺の単語を確率的に表現。
##Section2:LSTM
###要点のまとめ
- RNNには時系列を遡るほど勾配が消失しやすいという課題があった。
- RNNの勾配消失問題を改善した手法がLSTM
- LSTMはRNNの内部に中間層としてLSTMブロックが存在する
- LSTMは3つのゲート(入力、忘却、出力)とCECというセルで構成されているという特徴がある
- CECは過去の情報を記憶する機能を持っている(記憶する機能しか持たない)
- CECの存在により勾配消失や勾配爆発問題を回避(時系列ごとの勾配を1にする)
$$
\Large \delta^{t-z-1}=\delta^{t-z} \biggl(Wf^{'}\Bigl(u^{t-z-1}\Bigl)\biggl)=1
$$
- CECは学習機能がないため、3つのゲートが学習機能を補完
- 入力ゲートはCECに対し記憶の仕方を指示する機能を持つ
- 出力ゲートはCECからどのような情報を使うかを指示する機能を持つ
- 入力ゲート、出力ゲートの指示の仕方(重み)はニューラルネットで学習する
- 忘却ゲートはCECで不要な記憶を削除する機能を持つ
- 覗き穴結合は、3つのゲートの学習時に、CECの情報を参考にするアイデア
###実装演習結果
LSTM実装コードURL
###確認テスト
(問題)
シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値として正しいものを選択肢から選べ。
(回答)
(回答)0.25
(考察)
\begin{align}
\cfrac{d}{dx}\sigma(x=0)&=\cfrac{d}{dx}\cfrac{1}{1+exp(-(x=0)}\\
&=\cfrac{1}{1+exp(-(x=0))}\cfrac{1+exp(-(x=0)-1}{1+exp(-(x=0)}\\
&=\sigma(x=0)(1-\sigma(x=0))\\
&=0.5(1-0.5)\\
&=0.25
\end{align}
(問題)
以下の文章をLSTMに入力し空欄に当てはまる単語を予測したいとする。文中の「とても」という言葉は空欄の予測においてなくなっても影響を及ぼさないと考えられる。このような場合、どのゲートが作用すると考えられるか。「映画おもしろかったね。ところで、とてもお腹が空いたから何か____。」
(回答)
忘却ゲート
###コラム
RNNにおいて勾配消失または勾配爆発が起こる原因は、活性化関数と行列計算の2点にあります。まず、活性化関数については、RNNの活性化関数として一般にtanh関数が使われていました。tanh関数は層を深くするほど勾配が小さくなるというシグモイド関数と似た性質を持ちます。次に、行列計算においては、誤差逆伝搬時にMatMulという行列の積を計算するノードがあります。この行列計算では特異値の最大値が計算されます。ここで特異値の最大値が1より大きい値の場合、勾配は指数関数的に増加し、勾配爆発を引き起こす可能性があります。ただし、特異値が1より大きい場合に必ずしも勾配爆発が起こるとは限らないことに注意が必要です。
##Section3:GRU
###要点のまとめ
- GRUはLSTMの課題(パラメータ数が多く計算コストが高い)を解決するための手法
- GRUはパラメータを大幅に削減した上で精度が同等以上となる
- GRUはLSTMの特徴であったCECと3つのゲートを削除
- GRUはリセットゲートと更新ゲートを新規導入
- 中間層ではCECを用いなくても記憶が保持される
$$
\Large h(t)=f(W_{r}x(t)+U_{r}(r(t)h(t-1))b_{h}(t))
$$
###確認テストなどの考察
(問題)
LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。
(回答)
LSTMの課題はパラメータ数が多く計算コストが高いこと
CECの課題は過去の記憶が蓄積され続けてしまうこと→△
(考察)
CECの課題は学習機能がないこと。そのため、3つのゲート(入力、出力、忘却)が必要となった。
(問題)
LSTMとGRUの違いを簡潔に述べよ。
(回答)
GRUはLSTMの構造である3つのゲートとCECを取り除き、リセットゲートと更新ゲートを導入。
GRUはLSTMよりもパラメータ数を削減し、高精度を実現。
(考察)
最も重要な違いはGRUはLSTMよりも計算量が少ないこと。
###コラム
GRUにおけるリセットゲートは過去の隠れ状態をどれだけ無視するかを決定します。リセットゲートの値が0であれば新しい隠れ状態は入力のみに依存します。一方で更新ゲートは隠れ状態を更新するゲートであり、LSTMでいうところのインプットゲートと忘却ゲートの役割を担っています。
##Section4:双方向RNN
###要点のまとめ
- 双方向RNNは過去の情報だけでなく、未来の情報を加味することで精度を向上させるモデル
- LSTMでは過去の情報をもとに予測する単語を出力していたが、双方向RNNでは未来の情報もLSTMで処理
- 各時刻では2つのLSTMレイアの隠れ状態を連結し、隠れ状態ベクトルを生成
###実装演習結果
双方向LSTM実装コードURL
##Section5:seq2seq
###要点のまとめ
- seq2seqは入力された時系列データを時系列で出力するためのモデル
- seq2seqは2つのRNNを用いており、Encoder-Decoderモデルとも呼ばれる
- seq2seqは機械翻訳や機械対話に用いられている
- Encoderでは単語にIDを付与、IDをワンホットベクトル表現、ワンホットベクトルをembedding表現
- ワンホットベクトルをembedding表現とすることで万単位のベクトルを数百のベクトルに圧縮
- embedding表現では似た単語同士を似たベクトルで表現する(これが難しい)
- DecoderではEncoderからの入力をもとに生成確率に基づいて単語を生成
- 手順はEncoderの逆手順
- seq2seqの課題は、一つの文章に一つの回答しかできないこと(文脈を考慮できない)
- 文脈を考慮した出力をするためにHREDという手法がある
- HREDは過去の文脈情報を次の層に引き継ぐモデル(seq2seq+contextRNN)
- HREDの課題はありきたりな出力しかしないこと(バリエーションに乏しい)
- VHREDはHREDの課題を克服するためにHREDにVAEを適用させたモデル
- VAEはオートエンコーダの潜在変数を平均0分散1に標準化して確率分布を仮定
- VAE入力データと出力データが同じ分布になるように学習
###確認テストなどの考察
(問題)
下記の選択肢から、seq2seqについて説明しているものを選べ。
- (1)時刻に関して順方向と逆方向のRNNを構成し、それら2つの中間層表現を特徴量として利用するものである。
- (2)RNNを用いたEncoder-Decoderモデルの一種であり、機械翻訳などのモデルに使われる。
- (3)構文木などの木構造に対して、隣接単語から表現ベクトル(フレーズ)を作るという演算を再帰的に行い(重みは共通)、文全体の表現ベクトルを得るニューラルネットワークである。
- (4)RNNの一種であり、単純なRNNにおいて問題となる勾配消失問題をCECとゲートの概念を導入することで解決したものである。
(回答)
(2)
(問題)
seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。
(回答)
seq2seqは文脈を考慮した出力ができないがHREDは可能
HREDは出力のバリエーションに乏しいがVHREDは潜在変数に確率分布を仮定し、出力を多様化
##Section6:word2vec
###要点のまとめ
- 単語をベクトル表現する手法
- embedding表現を得る手法の一つ
- word2vecは推論ベースの単語予測手法
- 推論ベースの手法とは、ターゲット周辺の単語から周囲の単語を予測する手法
- 推論ベースのメリットはミニバッチ学習により計算コストを抑えることが可能であること
- 一方でカウントベースの手法ではバッチ学習しかできなかった
- 基本的な処理は単語をワンホットベクトル表現に変換
###コラム
word2vecはCBOWとskip-gramという2つのモデルで構成されています。CBOWはコンテキストからターゲットを推測することが目的のニューラルネットワークです。つまり、周辺の単語からターゲットなる単語をピンポイントで予測します。CBOWの構造は入力層が2つ、中間層を経て出力層へたどり着きます。skip-gramはCBOWのコンテキストとターゲットを逆転させたモデルで、ターゲットとなる単語から周辺の単語を推測します。
##Section7:Attention Mechanism
###要点のまとめ
- seq2seqの課題は長い文章に対応が困難であること
- seq2seqはEncoderの出力が固定長のベクトルであったため、入力文章の長さに応じた最適なベクトル表現ができなかった
- seq2seqの課題を克服するための手法がAttention
- Attentionは単語の関連性(重要度)に着目
- 具体的には各単語に対してどれだけ重要かを示す重みを求める
- 各単語の重みとベクトルから重み付き和を求めることでコンテキストベクトルを生成
###実装演習結果
Attention実装コードURL
###確認テストなどの考察
(問題)
RNNとword2vec、seq2seqとAttentionの違いを簡潔に述べよ。
(回答)
RNNは時系列データを処理可能、word2vecは分散表現をするための手法
seq2seqは時系列データを入力し、時系列データを出力。Attentionは単語の重要度を考慮。
###コラム
Attentionは翻訳先の単語と対応関係にある翻訳元の単語の情報を選び出します。この時、単語を選ぶという処理は計算上課題がありました。それは複数のものから選ぶというのは微分計算ができないという点です。ニューラルネットワークは誤差逆伝播法を用いて計算を行うため、微分計算が基本的には必要になってきます。この課題を克服するためのアイデアが、複数のものからいくつかを選ぶのでなく、「全てを選ぶ」というものです。そうすることで、各単語の重要度を重みとして計算することが可能となりました。
#【深層学習Day4】
##Section1:強化学習
###要点のまとめ
- 強化学習とはある環境の中で長期的に報酬を最大化するような行動選択をするエージェントを作ることが目標
- 教師なし学習:特徴量抽出 教師あり学習:特徴量から予測 強化学習:最良の方策を決定
- 試行錯誤する過程で失敗と成功を繰り返しながら最も効果的な方策を学習
- エージェントが方策に基づき行動→環境の状態が変化→エージェントは環境の状態に応じた報酬を獲得→報酬に応じて方策を改善
- 環境の状態が分からない中、試行錯誤を繰り返す「探索」と探索の結果判明した環境の「利用」はトレードオフ関係
- 探索しなければ選択肢が狭まる。一方で、利用しなければ過去の経験が活かせない。バランスが大事
- 強化学習ではエージェントの方策と価値を学習する
- 方策関数$TT(s,a)$ 行動価値関数$Q(s,a)$
- 強化学習の基本手法はQ学習と関数近似法の組み合わせ
- Q学習とは行動価値関数を行動するごとに更新する学習手法
- 関数近似法とは方策関数や行動価値関数を関数近似する手法
- 価値関数は2種類。状態価値関数と行動価値関数
- 方策をモデル化して最適化する手法として方策勾配法を用いる
$$
\Large \theta^{(t+1)}=\theta^{(t)}+\epsilon\Delta(\theta)
$$
###実装演習結果
Q-Learning実装コードURL
##Section2:AlphaGo
###要点のまとめ
- AlphaGo(Lee)はPolicyNetとValueNetで構成
- PolicyNetは方策関数をValueNetは行動価値関数を表現する畳み込みニューラルネットワーク
- 入力はPolicyNetで19×19×48チャンネル、ValueNetで19×19×49チャンネル
- チャンネルの内訳は石の種類、着手履歴、取れる石の数等の特徴量
- ValueNetのチャンネルがPolicyNetよりも1つ多い理由は「手番」と呼ばれる特徴量の有無のため
- 入力が2次元→畳み込み演算(鉄則)
- PolicyNetの活性化関数は中間層でReLU、出力層でソフトマックスを使用(2次元)
- ValueNetの活性化関数は中間層でReLU、出力層でtanhを使用(勝率を-1~1の1次元で出力したい)
- ValueNetは2次元の入力を1次元で出力したいので出力層の前に全結合(鉄則)
- AlphaGoの学習ステップは次のとおり
- 教師あり学習:RollOutPolicy(24%の精度),PolicyNet(57%の精度)
- 強化学習:PolicyNet
- 強化学習:ValueNet
- RollOutPolicyはPlicyNetの超高速版
- AlphaGo(Zero)とAlphaGo(Lee)の違いは次のとおり
- AlphaGo(Zero)は強化学習のみ
- AlphaGo(Zero)はPolicyNetとValueNetを統合
- AlphaGo(Zero)はResNetを導入
- AlphaGo(Zero)はモンテカルロ木探索からRollOutシミュレーションを削除
- ResNetはSkipconnectionを用いて層が深くなっても勾配爆発・消失を防止する工夫を採用
- ResNetはアンサンブル学習効果を生み出す
- 深層学習のコア技術:①畳み込み②プーリング③RNN④Attention⑤活性化関数
###コラム
PolicyNet、ValueNetともに入力は19×19×48チャンネルとなっているが、19×19の意味は囲碁の盤面が19本×19本(19路盤)で作られているためです。(囲碁のことを詳しく知らない私は今回初めて知りました。)
続いて、モンテカルロ木探索について調べた内容を簡単に解説します。まず、モンテカルロ木探索のベースはゲーム木です。ゲーム木は確定的なモデル(囲碁や将棋のように自分の手によって相手の手は決まるようなゲーム)に適用できます。一方でサイコロのような確率的なモデルはゲーム木で表現しようとすると複雑になります。次にモンテカルロ法は、何らかの報酬が得られるまで行動を繰り返し、報酬値を知ってからエージェントの行動に対し報酬を与える方法です。モンテカルロ法とゲーム木を組み合わせた考え方がモンテカルロ木探索となります。具体的には、囲碁である手を打った場合、その後の終局までの流れをランダムにシミュレーションし、勝敗を予測し、報酬値を得るという考え方です。
##Section3:軽量化・高速化技術
###要点のまとめ
- 軽量化高速化技術は極めて重要(深層学習モデルのボトルネックは計算処理に時間がかかること)
- 軽量化高速化技術の中でも「分散深層学習」は最も重要な概念
- 分散深層学習は複数の脳みそで並列計算を行うことで高速化を実現
- 分散深層学習は深層学習モデルの複雑さに脳みそ(コンピューターの性能)の成長が追いつかないため、複数の脳みそを使うというアイデア
- 分散深層学習の具体的な手法としてデータ並列化とモデル並列化がある
- データ並列化には同期型と非同期型がある
- 同期型は複数の頭脳で計算した結果を親モデルに集約、全て集約してから別の計算へ(待ち時間発生)
- 非同期型は複数の頭脳で計算した結果を親モデルに集約せず次々に計算を進める(待ち時間はないが精度が落ちる)
- モデル並列化は親モデルを分割して複数の頭脳で計算
- モデルが多い場合はモデル並列化、データが多い場合はデータ並列化を用いると良い
- 一般的にデータ並列化は複数のPCを、モデル並列化は1つのPC(複数のGPUで並列化)を用いる
- モデル並列化はモデルが大きいほど効果が高く、モデルが小さいほど効果が小さい
- CUDAとはNVIDA製のGPUで動作する開発環境のこと(現在の主流)
- 軽量化の手法として、量子化、蒸留、プルーニングがある
- 量子化とは64bit浮動小数点を32bit等に精度を落とすこと(演算処理量の軽減、メモリ消費量の軽減)
- 量子化のデメリットは精度が落ちること(実験では著しく精度が落ちるようなことはないという結果が得られている)
- 蒸留とは学習済みの教師モデルから簡略化した生徒モデルを作成することにより軽量化を実現
- プルーニングは役に立たないパラメータのニューロンを削除し、軽量化を実現(かなり削減できて精度があまり落ちない良策)
###コラム
複雑な計算問題を複数の頭脳を使って効率よく解くという概念を人間の頭脳で実現させた面白い動画を紹介したいと思います。予備校のノリで学ぶというYoutube動画をご存知の方は見たことがあるかもしれません。
リンク:分散深層学習の概念を人間に例えたおもしろ動画(参考)
##Section4:応用モデル(MobileNet,DenseNet,WaveNet)
###要点のまとめ
####MobileNet
- MobileNetは画像認識分野で軽量化高速化を実現したモデル
- MobileNetはDepthWiseConvolutionとPointWiseConvolutionで構成
- DepthWiseConvolutionはフィルタ数を1で固定、チャンネルごとに畳み込み演算
- DepthWiseConvolutionは出力マップのチャンネル数=入力マップのチャンネル数となる
- DepthWiseConvolutionは「1/フィルタサイズ」に軽量化
- PointWiseConvolutionはカーネルサイズを1×1で固定
- PointWiseConvolutionは出力チャンネル数=カーネルのチャンネル数となる
- PointWiseConvolutionは「1/カーネルサイズ」に軽量化
####DenseNet
- MobileNetは画像認識分野で軽量化高速化を実現したモデル
- Denseブロックが特徴であり、Denseブロックを介してチャンネル数が増加
- Denseブロックで増えたチャンネル数はTransitionLayerで減らす
- DenseブロックとTransitionLayerにより各特徴マップのサイズは同じになる
- MobileNetは成長率(チャンネル増加数)というハイパーパラメータが存在
####Normalization
- Normalizationは3種類(BatchNorm, LayerNorm, InstanceNorm)
- BatchNorm:全ミニバッチの同一チャンネルが同一分布に従うように正規化
- LayerNorm:ミニバッチごとの全pixelが同一分布に従うように正規化
- InstanceNorm:各ミニバッチ内のチャンネルが同一分布に従うように正規化
- BatchNormalizationはバッチサイズが小さい時に学習が収束しないという問題がある
- バッチサイズはGPUやTPUといったハードウェアの性能に依存するため都合が悪い(物理的に大きくできない)
- LayerNormはバッチサイズに依存しないというメリットがある
####WaveNet
- WaveNetは時系列データに畳み込み(Dilated convolution)を適用した生成モデル
- Dilated convolutionにより、時系列に対してスキップした畳み込みを可能にする(長い時間枠の情報を扱える)
##Section5:Transformer
###要点のまとめ
- Encoder-Decoderモデルでは長い文章の翻訳が苦手であった(文章の長さに関係なく固定長ベクトルに圧縮するため)
- TransformerはRNNを用いず、Attention機構を用いることで長い文章の翻訳を可能にした
- TransformerはRNNを用いない代わりにPositionalEncodingを導入(位置情報を付加するため)
- TransformerはKey,Query,Valueによる辞書オブジェクト機能を活用
- DecoderではMasked-Multi-Head-Attention層で未来の情報が見えないようにマスク
###コラム
Transformerを理解する鍵として、Self-Attentionというテクニックが重要なポイントとなります。Attentionは文章中のある単語に注意を向けるテクニックでしたが、Self-Attentionはその名の通り、自分自身、つまり、同じ時系列内において各単語間の関連性に注意を向けます。より具体的には、AttentionはTimeAttentionレイアに対して異なる2つの時系列からデータが入力されますが、Self-AttentionではTimeAttentionレイアに対して1つの時系列から2つの入力を行います。Self-Attentionはデクニックの一つですが、この他にもskip-connectionやLayer-Normalizationといった工夫を組み合わせることで、Transformerは、計算量を削減し、GPUによる並列計算を可能にします。その結果、学習時間を従来よりも大幅に短縮することに成功しています。
##Section6:物体検知・セグメンテーション
###要点のまとめ
- 画像認識分野は出力タスクによって4つに区分される
- 分類:Classification(画像に対してラベリング)
- 物体検知:ObjectDetection(BoundingBoxを使用)
- 意味領域分割:SemanticSegmentation(各ピクセルに対しラベリング)
- 個体領域分割:InstanceSegmentation(物体検知と意味領域分割の融合)
- データセットの特徴を把握することは学習、評価をする上で重要
- データセットを選択する際は、クラス数、データ数、BOX/画像の3つの要素が特に重要
- 性能評価では分類問題における評価指標の理解が重要(混同行列)
- 分類問題と物体検出では閾値(Threshold)の変化によって混同行列に用いられるサンプル数が異なる
- 分類問題では閾値に関係なく混同行列に用いられるサンプル数は変わらない
- 物体検出では閾値によって混同行列に用いられるサンプル数が変わる(閾値が高いほどサンプルは少なくなる)
- 物体検出ではIoUという指標を用いて物体位置の予測精度に対する評価も行う(jaccard係数)
- 物体検出ではConfidenceとIoUの2つの閾値によりTP or FPが決まるため注意が必要
- 物体検出ではAP(Average Precision)という評価指標を用いている
- APはIoUの閾値を固定、Confidenceの閾値を0~1まで変化させた時の面積(PR曲線の下側面積)
- APの他に全クラスラベルに対するAPの平均値であるmAP(mean Average Precision)という指標を用いることもある
- 検出精度に加えて検出速度を評価する指標としてFPS(Flame per Second)がある
- 性能評価値を考察する際は、どのデータセットを用いたか注目する必要がある(データセットが違えば精度も異なる)
- 物体検知のフレームワークは多数あるが1段階検出と2段階検出の2種類に大別することができる
- 1段階検出と2段階検出の違いは物体検出とクラス推定を同時に行うか別々に行うかが異なる(精度と速度のトレードオフ)
- 特徴マップにおいて解像度が変化しても物理的な大きさが変化する訳ではないことに注意
- 物体検出の損失関数にはConfidenceと位置それぞれに対する損失が含まれている
- SemanticSegmentationでは小さくなった解像度をどう復元するかが鍵
- 小さくなった解像度を復元するためにUp-samplingを導入
- Up-samplingにはDeconvolutionとUn-poolingの2つの手法がある
- 一般的にpoolingを繰り返すと輪郭情報が失われる→element-wiseadditionにより輪郭情報を補完
- Convolutionの段階で受容野を広げる工夫としてDilated Convolutionという手法がある
###コラム
物体検出モデルの1つにR-CNNがあります。R-CNNのベースモデルはその名の通りCNNです。R-CNNは物体検出モデルの中でも有名な手法と言われています。R-CNNの処理を簡単に説明すると、画像を入力後にまず、物体の候補領域を抽出します。その後、抽出した領域に対してCNNの処理を行います。R-CNNの発展バージョンとしてFaster-CNNが登場します。Faster-CNNはR-CNNにおける物体の候補領域抽出もCNNで行うことが特徴です。全ての処理をCNNで行うので処理がR-CNNよりも高速になることがメリットです。