Day3
再帰型ニューラルネットワークの概念
RNN(Recurrent neural network)全体像
RNNとは
時系列データに対応するニューラルネットワーク
時系列データ
時間的順序を追って、相互関係が見られるデータ
例:音声データ、テキストデータ、株変動のデータ
RNN全体像
RNN数学的記述
u^t = W_{in}x^t + Wz^{t-1} + b\\
z^t = f(u^t)\\
v^t = W_{out}z^t + c\\
y^t = g(v^t)\\
実装
weight_init_std = 1
# ウェイト初期化
W_in = weight_init_std * np.random.randn(input_layer_size, hidden_layer_size)
b = weight_init_std * np.random.randn(1, hidden_layer_size)
W_out = weight_init_std * np.random.randn(hidden_layer_size, output_layer_size)
c = weight_init_std * np.random.randn(1, output_layer_size)
W = weight_init_std * np.random.randn(hidden_layer_size, hidden_layer_size)
...
u[:,t+1] = np.dot(X, W_in) + np.dot(z[:,t].reshape(1, -1), W) + b
z[:,t+1] = functions.sigmoid(u[:,t+1])
y[:,t] = functions.sigmoid(np.dot(z[:,t+1].reshape(1, -1), W_out) + c)
特徴
t-1状態を保つため、回帰構造が必要
BPTT(Back propagation through time)
BPTTとは
RNNのパラメータを調整する方法
BPTT数学記述
\frac{\partial E}{\partial u^t} = \delta^t\\
\frac{\partial E}{\partial v^t} = \delta^{out,t}\\
\frac{\partial E}{\partial W_{(in)}} = \frac{\partial E}{\partial u^t}\left[\frac{\partial u^t}{\partial W_{(in)}}\right]^T = \delta^t\left[x^t\right]^T\\
\frac{\partial E}{\partial W_{(out)}} = \frac{\partial E}{\partial v^t}\left[\frac{\partial v^t}{\partial W_{(out)}}\right]^T = \delta^{out,t}\left[z^t\right]^T\\
\frac{\partial E}{\partial W} = \frac{\partial E}{\partial u^t}\left[\frac{\partial u^t}{\partial W}\right]^T = \delta^{t}\left[z^{t-1}\right]^T\\
\frac{\partial E}{\partial b} = \frac{\partial E}{\partial u^t}\frac{\partial u^t}{\partial b} = \delta^{t}\\
\frac{\partial E}{\partial c} = \frac{\partial E}{\partial v^t}\frac{\partial v^t}{\partial c} = \delta^{out,t}\\
\delta^tの計算:\\
\delta^t = \frac{\partial E}{\partial u^t} = \frac{\partial E}{\partial v^t}\frac{\partial v^t}{\partial u^t} = \frac{\partial E}{\partial v^t}\frac{\partial \{W_{(out)}f(u^t)+c\}}{\partial u^t} = \delta^{out,t}W_{(out)}f'(u^t)
\delta^{t-1}更新量の計算:\\
\delta^{t-1} = \frac{\partial E}{\partial u^{t-1}} = \frac{\partial E}{\partial u^t}\frac{\partial u^t}{\partial u^{t-1}} = \frac{\partial E}{\partial u^t}\left[\frac{\partial u^t}{\partial z^{t-1}}\frac{\partial z^{t-1}}{\partial u^{t-1}}\right]\ = \delta^{t}Wf'(u^{t-1})
δ-deltaの更新ソース
update_from_t_plus_1 = np.dot(delta[:,t+1].T, W.T)
update_t = np.dot(delta_out[:,t].T, W_out.T)
delta[:,t] = ( update_from_t_plus_1 + update_t ) * functions.d_sigmoid(u[:,t+1])
勾配のクリッピングGradient Clipping
勾配爆発を防ぐ方法
def gradient_clipping(grad, threshold):
norm = np.linalg.norm(grad)
rate = threshold / norm
if rate < 1:
return grad * rate
return grad
LSTM
全体図
数学記述
f,g:活性関数tanh,sigmoid...\\
状態:\\
a^t = f(U_a h^{t-1} + W_a x^t)\\
入力ゲート:\\
i^t = \sigma(U_i h^{t-1} + W_i x^t)\\
忘却ゲート:\\
f^t = \sigma(U_f h^{t-1} + W_f x^t)\\
CECメモリ:\\
c^t = (i^t \otimes a^t)\oplus(f^t \otimes c^{t-1})\\
出力ゲート:\\
o^t = \sigma(U_o h^{t-1} + W_o x^t)\\
h^t = o^t \otimes g(c^t)
特徴
- CECは過去情報を保管する
- 忘却ゲートは要らなくなる情報を忘却する
- 入力ゲートと出力ゲートはCECにニューラルネットワーク学習特性を持たせる
- 覗き穴結合はCECの保管している過去情報を任意なタイミングで他のノードを伝播させれたり、
忘却させるたりする仕組み
GRU
LSTMではパラメータが多数存在しているため、計算コストが高い
パラメータが大幅削減され、精度もLSTMと同等またはそれ以上を期待される構造
全体図
数学記述
更新ゲート\\
z^t = \sigma(W_z x^t + U_z h^{t-1} + {b_z}^t)\\
リセットゲート\\
r^t = \sigma(W_r x^t + U_r h^{t-1} + {b_r}^t)\\
c = f(W_h x^t + U_h(r^t \otimes h^{t-1}))\\
h^t = (z^t \otimes c)\oplus((1 - z^t) \otimes h^{t-1})
双方向RNN
過去の情報だけでなく、未来の情報加味することで、精度を向上させるモデル
例:機械翻訳
ソース
def bidirectional_rnn_net(xs, W_f, U_f, W_b, U_b, V):
xs_f = np.zeros_like(xs)
xs_b = np.zeros_like(xs)
for i, x in enumerate(xs):
xs_f[i] = x
xs_b[i] = x[::-1]
hs_f = _rnn(xs_f, W_f, U_f)
hs_b = _rnn(xs_b, W_b, U_b)
hs = [np.concatenate([h_f, h_b[::-1]], axis=1)]
ys = hs.dot(V.T)
return ys
Seq2Seq
全体図
Encoder-Decoderモデルの一種
機械翻訳、機械対話などに使用されている
Encoder
インプットテキストを単語に分割し
分割した単語を分散表現ベクトルに変化(Embedding)
ベクトルを順番にRNNなどに入力していく
X1をRNNに入力し、hidden stateを出力し、
そのhidden stateと次のX2をまたRNNに入力していく
という流れを繰り返す
最後のXをRNNに入力した時のhidden stateをfinal state として
final stateがthought vector と呼ばれ、入力した分の意味を表すベクトルとなる
Decoder
アウトプットとして、単語のトークンに生成する
Encoderのfinal state(thought vector)をDecoderのintital stateとして使用する
生成確率に基づいて最初のtokenをランダムに選ぶ
ランダムに選んだ最初のtokenをEmbeddingして、Decoderのintital stateと共に、RNNに入力していく
hidden stateとYが得られる
YをEmbeddingして、hidden stateと共に、RNNに入力していく
HRED(Hierarchical Recurrent encoder-decoder)
Seq2seqでは、会話の文脈無視で、応答されている。
HREDでは、前の単語の流れに即して応答されるため、
より人間らしい文章が生成される。
Seq2seq + Context RNN
Context RNN
Encoderのまとめた各文章の系列をまとめて、これまでの会話コンテクスト全体を表すベクトルに
変換する構造
>過去の発話の履歴を加味した返答をできる
HREDの問題
- 確率的な多様性が字面にしかないため、同じコンテキストを与えられても、答えの内容が毎回、同じものしか出せない
- 短いよくある答えを学ぶ傾向がある
VAE
オートエンコーダ(Auto encoder)
教師なし学習の一つ
入力データから潜在変数Zに変換するニューラルネットワークをEncoder
潜在変数Zをインプットとして、元のデータを復元するニューラルネットワークをDecoder
Zの次元が入力データより小さい場合、次元削減とみなす
VAE
通常のオートエンコーダーの場合、
何かしら潜在変数Zにデータを押し込めているものの、
その構造がどのような状態か分からない
VAEはこの潜在変数Zに確率分布Z~N(0,1)を仮定したもの
>VAEは、データを潜在変数Zの確率分布という構造に押し込める
VHRED(Latent Variable Hierarchical Recurrent Encoder-Decoder)
HREDに、VAEの潜在変数の概念を追加したもの
word2vec
可変長の文字列をニューラルネットワークに与えることができない
→固定長形式で単語を表す必要がある。
大規模データから分散表現配列を学習させて
分散表現配列により、単語に対して、分散表現ベクトルを習得する。(Embedding化)
単語の分散表現ベクトルを用いることで、
単語間の意味的な距離を定量的に表現できる
この単語の分散表現ベクトルをRNN等に入力することで、
より、自然な結果が得られる
Attention Mechanism
seq2seqでは、固定次元ベクトルを入力としてしないといけないため、
長い文章へ対応が難しい
「入力と出力の単語が関連しているか」という関連度を学習する仕組み
Day4
強化学習
強化学習とは
行動の結果として与えられる報酬を基に、
行動を決定する方策を改善していく機械学習
強化学習のイメージ
強化学習の応用例
マーケティングの場合
- 環境:会社の販売促進部
- エージェント:プロフィールと購入履歴に基づいて、キャンペーンメールを送る顧客を決めるプログラム
- 行動:顧客ごとに送信・非送信の2つの行動を選ぶ
- 報酬:キャンペーンのコストという負の報酬とキャンペーンで生み出せる売上という正の報酬を受ける
検索と利用のトレードオフ
- 未知の行動のみを常に取り続ければ、過去の経験が生かせない(利用が足りない状態)
- 過去のデータでベストとされる行動のみを常に取り続ければ、他のもっとベストな行動を見つけられない(検索が足りない状態)
上記の2つの状態のトレードオフは検索と利用のトレードオフ
強化学習の差分(教師あり・無しに対する)
- 教師あり・なし学習では、データのパターンを見つけ出す、及び、そのデータから予測することが目標
- 強化学習では、優れた方策を見つけることが目標
強化学習の歴史
冬の時代があったが、計算速度が飛躍的に向上させたり、ニューラルネットワークの誕生だったりする
ことにより、強化学習を可能とした
Q学習:行動価値関数を、行動する毎に更新することにより学習を進める方法
関数近似法:価値関数や方策関数を関数近似する方法
行動価値関数
価値を表す関数として
- 状態価値関数:ある状態の価値に注目する場合
- 行動価値関数:状態と価値を組み合わせた価値に注目する場合
方策関数
ある状態でどのような行動を採るのかの確率を与える関数
方策勾配法
方策反復法
方策をモデル化して最適化する方法
J:方策の良さ
定義方法
- 平均報酬
- 割引報酬和
Alpha Go
Alpha Go(Lee)
PolicyNet
ValueNet
Alpha Go(Lee)のPolicyNet、ValueNetの入力
RollOutPolicy
ニューラルネットワークではなく線形の方策関数
検索中に高速に着手確率を出すために使用される
学習
- 教師あり学習によるRollOutPolicyとPolicyNetの学習
- 強化学習によるPolicyNetの学習
- 強化学習によるValueNetの学習
PolicyNetの教師あり学習
KGS Go Server(ネット囲碁対局サイト)の棋譜データから3000万局面分を用意し、
棋士と同じ着手を予測できるよう学習を行った
具体的には、棋士が着手した手を1とし、
残りを0とした19x19次元の配列を教師データとして、
それを分類問題として学習した
学習したPolicyNetは57%ほどの精度
PolicyNetの強化学習
現状のPolicyNetとPolicyPoolからランダムに選択されたPolicyNetと
対局シミュレーションを行い、その結果を用いて方策勾配法で学習を行った。
PolicyPoolとは、PolicyNetの強化学習の過程を500 iterationごとに記録し保存しておいたもの
現状のPolicyNet同士の対局ではなく、PolicyPoolに保存されているものとの対局を使用する理由は
対局に幅を持たせて過学習を防ごうというのが主
mini batch size 128で1万回
ValueNetの学習
PolicyNetを使用して対局シミュレーションを行い、その結果の勝敗を教師として学習した。
教師データ作成の手順
1.SL PolicyNet(教師あり学習で作成したPolicyNet)でN手まで打つ
2.N+1手目の手をランダムに選択し、その手で進めた局面をS(N+1)とする
3.S(N+1)からRL PolicyNet(強化学習で作成したPolicyNet)で終局まで打ち、その勝敗報酬をRとする。
S(N+1)とRを教師データに対して、損失関数を平均二乗誤差とし、回帰問題として学習する
mini batch size 32で5000万回
N手までとN+1手からのPolicyNetを別々にした理由は、過学習を防ぐため
モンテカルロ木探索
囲碁ソフトではもっと有効とされる探索法
囲碁では、minimax探索やαβ探索で盤面の価値や勝利予測値を出すのが困難
現局面から末端局面までPlayOutと呼ばれるランダムシミュレーションを多数回行い、
その勝敗を集計して着手の優劣を決定する
該当のシミュレーション回数が一定数を超えたら、その手を着手したあとの局面をシミュレーション開始局面とするよう、探索木を成長させる。
探索木の成長はモンテカルロ木探索の優れているところ
木の成長を行うことにより、一定条件下において、探索結果は最善手を返す
Alpha Go(Lee)のモンテカルロ木探索
選択
評価
バックアップ
成長
選択、評価、バックアップを繰り返し一定回数選択された手があったら、その手で進めた局面の合法手ノードを展開し、探索木を成長させる
AlphaGo(Lee)とAlphaGo Zeroの違い
- 教師あり学習を一切行わず、強化学習のみ
- 特徴入力からヒューリスティックな要素を排除し、石の配置のみ
- PolicyNetとValueNetを1つのネットワークに
- Residual Netの導入
- モンテカルロ木探索からRollOutシミュレーションを無くす
AlphaGo Zero
PolicyValueNet
Residual Network
ショートカット構造を追加し、勾配の爆発、消失を抑える
これにより、100層を超えるネットワークで安定に学習できる
層数の違うネットワークのアンサンブル効果が期待できる
派生形
Residual Blockの工夫
- Bottleneck:1x1KernelのConvolutionを利用し、1層目で次元削減を行い、3層目で次元回復を行う3層構造にし、2層のと比べたら、計算量がほぼ同じけど、1層を増やすによし、表現力が増す
- PreActivation:Residual Blockの並び:BatchNorm->ReLU->Convolution->BatchNorm->ReLU->Convolution->Add
構造の工夫
- WideResNet:ConvolutionのFilter数をK倍にしたResNet
- PyramidNet:各層でFilter数を増やしていくResNet
モンテカルロ木探索
選択
評価及び成長
Leafノードまで進めた局面saをPolicyValueNetで評価する。RollOutは行わない
また、局面saの合法手ノードを展開し木を成長させる。
バックアップ
学習法
自己対局による教師データの作成
現状のネットワークでモンテカルロ木探索を用いて自己対局を行う
まず30手までランダムで打ち、そこから探索を行い勝敗を決定する
自己対局中の各局面での着手選択確率分布と勝敗を記憶する
教師データの形は(局面、着手選択確率分布、勝敗)が1セット
学習
自己対局で作成した教師データを使い学習を行う
NetWorkのPolicy部分の教師に着手選択確率分布を用い、Value部分の教師に勝敗を用いる
損失関数はPolicy部分はCrossEntropy, Value部分は平均二乗誤差
ネットワークの更新
学習後、現状のネットワークと学習後のネットワークとで対局テストを行い、
学習後のネットワークの勝率が高かった場合、学習後のネットワークを現状のネットワークとする
軽量化・高速化技術
分散深層学習
複数の計算資源(ワーカー)を使用し、並列的にニューラルネットワークを構成することで、
効率の良い学習を行う
データ並列化
親モデルを各ワーカーに子モデルとしてコピー
データを分割し、各ワーカーごとに計算させる
同期形
各ワーカーが計算が終わるのを待ち、
全ワーカーの勾配が出たところで勾配の平均を計算し、親モデルのパラメータを更新
非同期形
各ワーカーはお互いの計算を田主、各子モデルごとに更新を行う
学習が終わった子モデルはパラメータサーバーにPushされる
新たに学習を始める時は、パラメータサーバーからPopしたモデルに対して学習する
同期形と非同期形の比較
- 処理スピードは非同期の方が速い
- 非同期は最新のパラメータを利用できないため、学習が不安定になりやすい
- 精度が良い同期が主流となる
モデル並列化
親モデルを各ワーカーに分割し、それぞれのモデルを学習させる。学習が終わった後で、1つのモデルに復元
データ並列化とモデル並列化
モデルが大きい→モデル並列化
データが大きい→データ並列化
GPUによる高速技術
GPGPU(General-purpose on GPU)
元々の使用目的であるグラフィック以外の用途で使用されるGPUの総称
CPU
高性能なコアが少数
複雑で連続的な処理が得意
GPU
比較的低性能なコアが多数
簡単な並列処理が得意
ニューラルネットワークの学習は単純な行列演算が多いため、高速化が可能
GPU開発環境
CUDA
GPU上で並列コンピューティングのプラットフォーム
NVIDIA社が開発しているGPUのみ
DeepLearning用に提供されている
OpenCL
オープンな並列コンピューティングのプラットフォーム
NVIDIA社以外でも使用可能
DeepLearning用の計算に特化しているわけではない
DeepLearning フレームワーク
Tensorflow
Pytorch
モデルの軽量化
精度を維持しつつパラメータや演算回数を低減する方法
→モバイル、IoT機器と相性がいい
量子化(Quantization)
通常のパラメータの64bit浮動小数点を32bitなど下位の精度に落とすことで、メモリと演算処理の削減
欠点:精度の低下
倍精度演算(64bit)
単精度演算(32bit)
計算の速度
省メモリ
精度
蒸留(Distillation)
精度の高いモデルは大きなモデルで推論に多くのメモリと演算処理が必須
教師モデルと生徒モデル
教師モデルの重みを固定し生徒モデルの重みを更新していく
誤差は生徒モデルと教師モデルのそれぞれの誤差を使い重みを更新していく
利点
学習回数が少なくても精度のよいモデルを作成することができる
プルーニング(Pruning)
寄与の少ないニューロンをモデルから削減し高速化と省メモリ化
応用モデル
Mobinet
一般的な畳み込みレイヤ―
入力特徴マップ(チャネル数):HxWxC
畳込みカーネルのサイズ:KxKxC
出力チャネル数(フィルタ数):M
スライド1でパディングを適用した場合の畳み込み計算量:HxWxKxKxCxM
Depthwise Convolution
Pointwise Convolution
構造
- Depthwise Separable Convolutionという手法を用いて計算量を削減している。通常の畳み込みが空間方向とチャネル方向の計算を同時に行うのに対して、Depthwise Separable Convolution ではそれらをDepthwise ConvolutionとPointwise Convolutionと呼ばれる演算によって個別に行う
- Depthwise Convolutionはチャネル毎に空間方向へ畳み込む
- Depthwise Convolutionの出力をPointwise Convolutionによってチャネル方向に畳み込む
Dense net
Dense Block
kをネットワークgrowth rateと呼ぶ
大きくなるほど、ネットワークが大きくなるため、小さい整数に設定するのがよい
Transition Layer
CNNで中間層でチャネルサイズを変更
特徴マップのサイズを変更し、ダウンサンプリング
DenseNetとResNetの違い
DenseBlock:前方の各層の入力を後方の層へ入力
ResidualBlock:前1層の入力のみを後方の層へ入力
DenseBlockにGrowth Rateハイパーパラメータが存在する
Norm
Batch Norm
ミニバッチに含まれるsampleの同チャネルが同一分布に従うような正規化
チャネルごとに正規化
ミニバッチのサイズを大きく取れない場合、効果が薄くなる
Layer Norm
それぞれのsampleの全てのpixelが同一分布に従うような正規化
特徴マップごとに正規化
Instance Norm
さらにチャンネルも同一分布に従うような正規化
各sampleの各チャネル毎に正規化
コントラスの正規化の寄与・画像のスタイル転送やテクスチャ合成タスクなど利用
Wavenet
生の音声波形を生成する深層学習モデル
Pixel CNN(高解像度の画像を精密に生成できる手法)を音声に応用
Dilated convolution
時系列データに対して畳み込み
Transformer
Seq2seq
ニューラルネットワーク機械学習の問題点
翻訳元の分の内容を1つのベクトルで表現
→文が長くなると表現力がたりなくなる
Attention
翻訳先の各単語を選択する際に、翻訳元の文中の各単語の隠れ状態を利用
Attentionの例
Attentionは辞書オブジェクト
query(検索クエリ)に一致するkeyを索引し、対応するvalueを取り出す操作である
Transformer
2017年6月に登場
英仏(3600万分)の学習を8GPUで3.5日で完了
主要モジュール
二種類Attention
Encoder
Self Attention
Position-Wise Feed-Forward Networks
Scaled dot product attention
Multi-Head attention
Decoder
Encoderと殆ど同じ
未来の単語をみないようマスクが存在している
Add & Norm
Add(Residual Connection)
入力力の差分を学習
実装上は出力に入力をそのまま加算するだけ
効果:学習・テストエラーの低減
Norm(Layer Normalization)
各層においてバイアスを除く活性化関数への入力を平均0、分散1に正則化
効果:学習の高速化
Position Encoding
物体検知・セグメンテーション
広義の物体認識タスク
Dataset
Confusion matrix
IoU:Intersection over Union
AP(Average Precision)
AP = \frac{1}{11}\sum_{r\in \{0,0.1,0.2,...,1\}}^{}p_{interp}(r)\\
p_{interp}(r) = \underset{\tilde{r}>r}{max}\:p(\tilde{r})\\
再現率r以上の範囲における適合率の最大値を採用する
mAP(Mean Average Precision)
グラス数がCとする
mAP = \frac{1}{C}\sum_{i = 0}^{C}AP_i\\
FPS:Flames per Second
フレームワーク
One-stage detectorとTwo-stage detectorの動作例
SSD: Single Shot Detector
ネットワークアーキテクチャ
特徴マップからの出力
デフォルトボックス数
他の工夫
損失関数
Semantic Segmentation
Deconvolution/Transposed convolution
輪郭情報の補完
U-Net
DeconvNet & SegNet
Unpooling
Dilated Convolution
GAN(Generative Adversarial Nets)
生成器と識別器を競わせて学習する生成&識別もでる
2プレイヤーのミニマックスゲーム
1人が自分の勝利する確率を最大化する作戦をとる
もう1人は相手が勝利する確率を最小化する作戦をとる
最適化方法
DCGAN(Deep Convolutional GAN)
GANを利用した画像生成モデル
Generator:
- Pooling層の代わりに転置畳み込み層を使用
- 最終層はtanh、その他はReLU関数で活性化
Discriminator:
- Pooling層の代わりに畳み込み層を使用
- Leaky ReLU関数で活性化
共通事項:
- 中間層に全結合層を使わない
- バッチノーマライゼーションを適用