深層学習２

#深層学習Day3

##再帰型ニューラルネットワークの概念

時系列データに対応可能なネットワーク

時系列データとは
時間的順序を追って、一定間隔ごとに観察され、しかも相互に統計的依存関係が認められるようなデータの系列

具体的な時系列データ
音声データ、テキストデータ、株価のデータ

RNNの全体像
中間層の学習に入力層とひとつ前までの中間層の値を使う

RNNの中間層(z)と出力層(y)を求めるコード(バイアスのｂについては省略）
u[:,t+1]=np.dot(X,W_in)+np.dot(z[:,t],reshape(1,-1),W)
z[:,t+1]=functionssigmoid([:,t+1])
y[:,t]=functions.sigmoid(np.dot(z[:,t+1].reshape(1,-1),W_out))

RNNの特徴
時系列モデルを扱うには、初期の状態と過去のt-1の状態を保持し、そこから次の時間でのtを再帰的に求める再帰構造が必要になる。

RNNの実装
バイナリ加算は、下位桁から上位桁に向かった計算していく様子が、過去から未来に向かって計算していく様子になぞらえるので、例題としてとりあげた。
５３行目のfor文で1万回学習させている。1回の学習の中に時系列ループが存在する。順伝搬を行う時も逆伝搬を行う時も８単位分の時間が必要となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/b50763b1-e4f4-7413-2ed0-989874480bf9.png)
BPTTとは
RNNにおいてのパラメータ調整方法の一種→誤差逆伝播の一種

誤差逆伝播の実装
９７行目で逆伝播が実装されている。４８，４９行目にdeltaが定義されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/c4ca89f3-a48d-b961-5f73-8830325b5b8d.png)
コード
EをWinで微分したもの
np.dot(X.T,delta[:,t],reshape(1,-1))
EをWoutで微分したもの
np.dot(z[:,tf+1].reshape(-1,1),delta_out[:,t].reshape(-1,1))
EをWで微分したもの
np.dot(z[:,t].reshape(-1,1),delta[:,t].reshape(-1,1))
δtを表すと
delta[:,t]=(np.dot(delta[:,t+1].T,W.T)+np.dot(delta_out[;,t].T,W_out,T))*functions.d_sigmoid(u[:,t+1])

パラメータの更新式
出力層と出力層のバイアスｃは、時間的な遡りを考慮する必要がないのでΣがない。
入力層と中間層、中間層のバイアスｂは時間的な遡りを考慮する必要があるので、Σで前の時間までを加える
W_in-=learning_rate*W_in_grad
W_out-=learning_rate*W_out_grad
W-=learning_rate*W_grad 

loss関数はytとdtで表せる。この式に元の式を代入していくとt→t-1→t-2→t-3→…というように再帰的に辿っていくことができる。

BPTTの実装
５５行目からfor文で学習を1万回繰り返す。７３行目からの時系列ループでbinary_dim=8なので8回分の観測値に対して、入力値xに対してW_inを掛けて前の時間からの中間層の出力にWをかけて足している。
uをシグモイド関数に通してz中間層を作る。重要なことはtは０から始まるので、プログラム上のtは数式上のt-1を示している
誤差量については8回分を足して、１つの誤差として使っている。
更新量を計算するのにdeltaがtの時点とつながりながら計算していく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/2a9d450a-140b-5a94-382a-afd8ed4c4034.png)
５０００回ぐらい学習すると誤差が下がる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/420f5546-d98e-8c60-b815-e0d2d9d0de08.png)

##ＬＳＴＭ
RNNの課題
時系列を遡るほど、勾配が消失していく。→長い時系列の学習が困難。

解決策
前回の授業で触れた勾配消失の解決方法とは別で構造自体を変えて解決したものがLSTM

勾配爆発とは
勾配が層を逆伝播するごとに指数関数的に大きくなること

CEC
記憶機能だけを持っている
勾配消失および勾配爆発の解決方法として、勾配が、１であれば解決できる。

CECの課題
入力データについて、時間依存度に関係なく重みが一律である。
→ニューラルネットワークの学習特性がないということ。

入力層→隠れ層への重み　入力重みの衝突
隠れ層→出力層への重み　出力重みの衝突

入力ゲート
CECに覚えさせる方法を身に着ける
今回の入力値(W)と前回の出力値(U)をもとに、今回の入力値をどのくらい覚えさせるか(V)決める

出力ゲート
CECの情報をどんなふうに使うかを決める
今回の入力値(W0)と前回の出力値(U0)をもとに、今回の入力値をどのように使うかを決める

入力・出力ゲートの役割とは
入力・出力ゲートを追加することで、それぞれのゲートへの入力値の重みを、重み行列W,Uで可変可能にする。
→CECの課題を解決

LSTMの現状
CECは、過去の情報がすべて保管されている

課題
過去の情報がいらなくなった場合、削除することはできず保管され続ける

解決策
過去の情報がいらなくなった場合、そのタイミングで情報を忘却する機能を追加する
→忘却ゲートの誕生

覗き穴結合

課題
CECの保存されている過去の情報を、任意のタイミングで他のノードに伝播させたり、あるいは任意のタイミングで忘却させたい
CEC自身の値は、ゲート制御に影響を与えていない。

覗き穴結合とは
CEC自身の値に、重み行列を介して伝播可能にした構造
使ってみたが大きな改善はみられなかった

##ＧＲＵ
LSTMの改良版

LSTMの課題
パラメータ数が多く、計算負荷が高くなる問題があった。
→GRUの誕生
従来のLSTMでは、パラメータが多数存在していたため、計算負荷が大きかった。
しかし、GRUでは、そのパラメータを大幅に削減し精度は同等またはそれ以上が望めるようになった構造

メリット
計算負荷が低い

隠れ層の状態をh(t)に保存しておく
リセットゲートr(t)は隠れ層の状態をどのように保持しておくか決める
更新ゲートz(t)は、今回の入力と前回の入力からどのように出力を求めるかを決める

プログラムの実装
前回まではnumpyを使っていたが、今回はtensorflowを利用している。ライブラリに用意されているので、188行、1行でRNNを使ったモデルというのが記述できる
 

##双方向ＲＮＮ
過去の情報だけでなく、未来の情報を加味することで精度を向上させるためのモデル

実用例
文章の推敲や、機械翻訳など

##Seq2seq
２つのネットワークをつなげたもの。機械翻訳に用いられる
最初のネットワーク（エンコーダ）の入力から隠れ層には記憶がたまっていく→その文の意味がベクトル表現として保持される
文の意味をもとに次のネットワーク（デコーダ）で別の表現を得る

Encorder-Decorderモデルの一種を指す

Seq2seqの具体的な用途は、機械対話や機械翻訳に使用される

Encoder　RNN
ユーザがインプットしたテキストデータを、単語等のトークンに区切って渡す構造
Taking:文章を単語等のトークン毎に分割し、トークン毎のIDに分割する
Embedding:IDから、そのトークンを表す分散表現ベクトルに変換
Encorder RNN:ベクトルを順番にRNNに入力していく

処理手順
vec1をRNNに入力し、hidden stateを出力
このhiddebn stateと次の入力vec2をまたRNNに入力してきたhiddebn stateを出力という流れを繰り返す

最後のvecを入れた時のhidden stateをfinal stateとしてとっておく。このfinal stateがthought vectorと呼ばれ、
入力した文の意味を表すベクトルになる。

同じような意味の単語が、同じようなベクトルになることを特徴量抽出という。グーグルのBERTが有名で、
MLM masked language modelと呼ばれる。モデルを学習するときに1か所を見えなくし、どういうベクトルが入ればよいかを
学習させる。教師なし学習でモデルの学習が行ることが重要。飛躍的に大量のデータを学習可能。

Decorder　RNN
システムがアウトプットデータを単語等のトークン毎に生成する構造。

Decorder　RNNの処理
１．Decorder　RNN:Encoder　RNNのfinal state(thought vector)から各トークンの生成確率を出力していく。
final stateをDecorder RNNのinitial stateとして設定し、Embeddingを入力。
２．Sampling:生成確率にもとづいてトークンをランダムに選ぶ
３．Embedding:２で選ばれたトークンをEmbeddingしてDecorder RNNへの次の入力とする
４．Detokenize:１～３を繰り返し、２で得られたトークンを文字列に直す

Seq2seqの課題
一問一答しかできない
→問いに対して文脈も何もなく、ただ応答が行われ続ける

解決策
HRED

HREDとは
過去ｎ－１個の発話から次の発話を生成する
→Seq2seqではｍ会話の文脈無視で、応答がなされたが、HREDでは、
前の単語の流れに即して応答されるため、より人間らしい文章が生成される

例
システム：インコかわいいよね。
ユーザ：うん
システム：インコかわいいのわかる。

HREDの構造
Seq2seq＋Context　RNN
ContextRNN:Encorderのまとめた各文章の系列をまとめて、これまでの会話コンテキスト全体を
表すベクトルに変換する構造。
→過去の発話の履歴を加味した返答ができる

HREDの課題

HREDは確率的な多様性が字面にしかなく会話の流れのような多様性がない
→同じコンテキスト（発話リスト）を与えられても、答えの内容が毎回会話の流れとしては同じものしか出せない

HREDは短く情報量に乏しい答えをしがちである。
→短くよくある答えを学ぶ傾向がある。

VHRED
HREDに、VAEの潜在変数の概念を追加したもの。
HREDの課題を解決した構造

オートエンコーダ
教師なし学習の一つ。そのため学習時の入力データは訓練データのみで教師データは利用しない

具体例
MNISTの場合、２８×２８の数字の画像を入れて、同じ画像を出力するニューラルネットワークになる。

オートエンコーダ構造

入力データから潜在変数ｚに変換するニューラルネットワークをEncoderといい、
逆に潜在変数ｚを入力として元画像を復元するニューラルネットワークをDecorderという

メリット
次元削減が行える。


VAE
通常のオートエンコーダの場合、何かしらの潜在変数ｚにデータを押し込めているものの
その構造がそのような状態かわからない
→VAEはこの潜在変数ｚに確率分布z-N(0,1)を仮定したもの

VAEは、データを潜在変数ｚの確率分布という構造に押し込めることを可能にする

##word2vec
RNNでは、単語のような可変長の文字列をニューラルネットワークに与えることはできない
→固定長形式で単語を表す必要がある。

学習データからボキャブラリを作成。本来は辞書の単語数だけできあがる

メリット
大規模データの分散表現の学習が、現実的な計算速度とメモリ量で実現可能にした

##Attention Mechanism

Seq2seqの問題は長い文章への対応が難しい
Seq2seqでは、2単語でも100単語でも固定次元ベクトルの中に入力しなければならない

解決策
文章が長くなるほどそのシーケンスの内部表現の次元も大きくなる仕組みが必要になる。
→Attenntion Mechanism

#深層学習ｄａｙ４

##強化学習

長期的に報酬を最大化できるように環境のなかで行動を選択できるエージェントを作ることを目標とする機械学習の一分野
→行動の結果として与えられる利益（報酬）をもとに、行動を決定する原理を改善していく仕組み

強化学習の応用例

マーケティングの場合
環境：会社の販売促進部
エージェント：プロフィールと購入履歴に基づいて、キャンペーンメールを送る顧客を決めるソフトウェア
行動：顧客ごとに送信、非送信のふたつの行動を選ぶことになる。
報酬：キャンペーンのコストという負の報酬とキャンペーンで生み出されると推測される売り上げという正の報酬を受ける

探索と利用のトレードオフ

環境について事前に完璧な知識があれば、最適な行動を予測し決定することは可能
→どのような顧客にキャンペーンメールを送信すると、どのような行動を行うのかが既知である状況。

強化学習の場合、上記仮定は成り立たないとする。不完全な知識を基に行動しながら、データを収集。最適な行動を見つけていく。

過去のデータで、ベストとされる行動のみを常にとり続ければ他にもっとベストな行動を見つけることはできない。
→探索が足りない状態
　　　　↑
　　　　↓トレードオフの関係性
未知の行動のみを常にとり続ければ、過去の経験を生かせない。
→利用が足りない状態

方策：(s,a)
行動価値関数：Q(s,a)

強化学習の差分

強化学習と教師あり、教師なし学習との違い

結論；目標が違う
教師なし、教師あり学習では、データに含まれるパターンを見つけ出す、
及びそのデータから予測することが目標
強化学習では、優れた方策を見つけることが目標
人間より、効率的な方策を見つけることができる。

強化学習の歴史
冬の時代があったが、計算速度の進展により大規模な状態をもつ場合の、
強化学習を可能としつつある。
関数近似法とＱ学習を組み合わせる手法の登場

Ｑ学習
行動価値関数を、行動するごとに更新することにより学習を進める方法

関数近似法
価値関数や方策関数を関数近似する手法のこと

価値関数
価値を表す関数としては、状態価値関数と行動価値関数の2種類がある。

ある状態の価値に注目する場合は、状態価値関数
状態と価値を組み合わせた価値に注目する場合は、行動価値関数

方策関数
方策ベースの強化学習において、ある状態でどのような行動を取るのかの
確率を与える関数

方策関数：π(s)=a

関数の関係
エージェントは方策に基づいて行動する
π(s,a):ＶやＱを基にどういう行動をとるか⇒経験を生かすorチャレンジする⇒その瞬間、瞬間の行動をどうするか

V(s):状態関数
Q(s,a):状態・行動関数⇒ゴールまで今の方策を続けたときの報酬の予測値が得られる
　　　　　　　　　　⇒やり続けたら最終的にどうなるか

方策勾配法について

関数はＮＮで学習できる→方策関数をＮＮで学習

方策反復法　
方策をモデル化して最適化する手法

方策勾配法　　　π(s,a|θ)
θ(t+1)=θ(t)+ｅ∇Ｊ(θ)
　　　　　　　　　↑
　　　　　　　　　ＮＮでは誤差関数、ここでは期待収益
                  θが方策関数のパラメータ
　　　　　　　　　ＮＮでは誤差を小さく
　　　　　　　　　強化学習では、期待収益を大
Ｊとは…方策の良さ
→定義しなければならない
定義方法
・平均報酬
・割引報酬和

上記の定義に対応して、行動価値関数：Q(s,a)の定義を行い、方策勾配定理が成り立つ。

##Ａｌｐｈａ　Ｇｏ

Alpha Go Lee
Policy Net…方策関数 CNN，出力は19×19マスの着手予想確率が出力される
ValueNet…価値関数　 CNN，出力は現局面の勝率を-1～1で表した物が出力される

PolicyNet,ValueNetの入力
   特徴　　チャンネル数　　　　　　　説明
石　　　　　　　3　　　　　自石、敵石、空白の3チャンネル
オール1　　　　 1　　 　　全面1
着手履歴　　　　8　　　　　8手前までに石が打たれた場所
呼吸点　　　　　8　　　　　該当の位置に石がある場合、その石を含む連の呼吸点の数　　
取れる石の数　　8　　　　　該当の位置に石がある場合、取れる石の数　　
取られる石の数　8　　　　　該当の位置に石がある場合、捉える石の数　　
着手後の呼吸点　8　　　　　該当の位置に石がある場合、その石を含む連の呼吸点の数　　
着手後にｼﾁｮｳで取れるか8　  該当の位置に石がある場合、ｼﾁｮｳで隣接連を取れるか
着手後にｼﾁｮｳで取られるか8　該当の位置に石がある場合、ｼﾁｮｳで隣接連を取られるか
合法手　　　　　1　　　　　合法手であるかどうか
オール0　　　　1　　　　　 全面0
手番　　　　　　1　　　　　現在の手番が黒番であるか？(ValueNetのみ)

PolicyNetの強化学習
現状のPolicyNetとPolicyPoolからランダムに選択されたPolicyNetと対局シミュレーションを行い、その結果を用いて方策勾配法で学習を行った。
PolicyPoolとは、PolicyNetの強化学習の過程を500Iterationごとに記録し保存しておいたものである。
現状のPolicyNet同士の対局ではなく、PolicyPoolに保存されているものとの対局を使用する理由は、対局に幅を持たせて過学習を防ごうというのが主である。
この学習をミニバッチサイズで128で1万回行った。

ValueNetの学習
PolicyNetを使用して対局シミュレーションを行い、その結果の勝敗を教師として学習した。教師データ作成の手順は
１．まずSL　PolicyNet（教師あり学習で作成したPolicyNet）でN手まで打つ。
２．N+1手目の手をランダムに選択し、その手で進めた局面をS(N+1)とする。
３．S(N+1)からRL　PolicyNet（強化学習で作成したPolicyNet）で終局まで打ち、その勝敗報酬をRとする。
S(N+1)とRを教師データ対とし、損失関数を平均２乗誤差とし、回帰問題として学習した。
この学習をミニバッチサイズ32で5000万回行った。
N手までとN+1手からのPolicyNetを別々にしてある理由は、過学習を防ぐためであると論文では説明されている

Alpha Goの学習
学習は以下のステップで行われる
１．教師あり学習によるRollOutPolicyとPolicyNetの学習
２．強化学習によるPolicyNetの学習
３．強化学習によるValueNetの学習
1盤面の処理にPolicyNetは3ミリ秒、RollOutPolicyは3ﾏｲｸﾛ秒かかる

PolicyNetの教師あり学習
KSG　GO　Server(ネット囲碁対局サイト)の棋譜データから3000万局面分の教師を用意し、教師と同じ着手を予測できるよう学習を行った。
具体的には、教師が着手した手を1とし残りを0とした19×19次元の配列を教師とし、それを分類問題として学習した。
この学習で作成したPolicyNetは57%ほどの精度である。
RollOutPolicyの精度は24%ほど。

モンテカルロ木探索
コンピュータ囲碁ソフトでは現在もっとも有効とされている探索法。
盤面評価値に頼らずに末端評価値、つまり勝敗のみを使って探索を行うことができないかという発想で生まれた探索法である。囲碁の場合、他のボードゲームと違い最大手数はマスの数でほぼ限定されるため、末端局面に到達しやすい。
具体的には、現局面から末端局面までPlayOutと呼ばれるランダムシミュレーションを多数行い、その勝敗を集計して着手の優劣を決定する。

###AlphaGo Zero
AlphaGo LeeとAlphaGo Zeroの違い
１．教師あり学習を一切行わず、強化学習のみで作成
２．特徴入力からヒューリスティックな要素を排除し、石の配置のみにした
３．PolicyNetとValueNetを１つのネットワークに統合した
４．ResidualNet（後述）を導入した
５．モンテカルロ木探索からRollOutPolicyシミュレーションをなくした

AlphaGo ZeroのPolicyValueNet
途中で方策関数の部分と価値関数の部分に枝分かれする

Residual Network
ネットワークにショートカット構造を追加して、勾配の爆発、消失を抑える効果を狙ったもの
Residual Networkを使うことにより、100層を超えるネットワークでの安定した学習が可能になった
基本構造は
Convvolution→BatchNorm→ReLU→Convvolution→BatchNorm→Add→ReLUのブロックを1単位にして積み重ねる形となる

軽量化・高速技術

分散深層学習とは
・深層学習は多くのデータを使用したりパラメータ調整のために多くの時間を使用したりするため、高速な計算が求められる。
・複数の計算資源を使用し、並列的にニューラルネットワークを構成することで、効率の良い学習を行いたい。
・データ並列化、モデル並列化、GPUによる高速技術は不可欠である。

##データ並列化
・親モデルを各ワーカーに子モデルとしてコピー
・データを分割して、各ワーカーごとに計算させる

データ並列化：同期型
・データ並列化は各モデルのパラメータの合わせ方で、同期型か非同期型か決まる。
同期型のパラメータ更新の流れ。各ワーカーが計算が終わるのを待ち、全ワーカーの勾配が出たところで勾配の平均を計算し、親モデルのパラメータを更新する。

データ並列化：非同期型
非同期型のパラメータ更新の流れ。
各ワーカーはお互いの計算を待たず、各子モデルごとに更新を行う。学習が終わった子モデルはパラメータサーバにPushする。新たに学習を始めるときは、パラメータサーバからPopしたモデルに対して学習する。

同期型と非同期型の比較
・処理のスピードは、お互いのワーカーの計算を待たない非同期型の方が速い。
・非同期型は最新のモデルのパラメータを利用できないので、学習が不安定になりやすい。
・現在は同期型の方が精度が良いことが多いので、主流となっている。
・データセンターは同期型。世界中のスマートフォンを利用して分割モデルを作るというようなときは非同期型

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

効果
・モデルのパラメータ数が多いほど、スピードアップの効率も向上する
GPUによる高速化
・GPGPU
元々の使用目的であるグラフィック以外の用途で使用されるGPUの総称
・CPU
高性能コアが少数
複雑で連続的な処理が得意

・GPU
比較的低性能なコアが多数
簡単な並列処理が得意
ニューラルネットワークの学習は単純な行列演算が多いので、高速化が可能

GPGPU開発環境
・CUDA
GPU上で並列コンピューティングを行うためのプラットフォーム
NVIDIA社が開発しているGPUのみで使用可能
DeepLearning用に提供されているので、使いやすい
・OpenCL
オープンな並列コンピューティングのプラットフォーム
NVIDIA社以外の会社のGPUからでも使用可能
DeepLearning用の計算に特化しているわけではない

DeepLearningフレームワーク内で実装されているので、使用する際は指定すれば良い

##量子化とは
ネットワークが大きくなると大量のパラメータが必要になり学習や推論に多くのメモリと演算処理が必要
↓
通常のパラメータの64bit浮動小数点を32bitなど下位の精度に落とすことでメモリと演算処理の削減を行う

省メモリ化
ニューロンの重みを浮動小数点のbit数を少なくし有効桁数を下げることで、ニューロンのメモリサイズを小さくでき、大きなモデルのメモリ使用量を抑えれる

量子化の利点と欠点
利点…計算の高速化、省メモリ化
欠点…精度の低下

精度の低下
先に述べたようにニューロンが表現できる小数の有効桁が小さくなるとモデルの表現力が低下する

ただし、実際の問題では倍精度を単精度にしてもほぼ精度は変わらない

極端な量子化
極端な量子化を考える。表現できる値が０，１の1bitの場合
a=0.1が真値の時、関数y(x)=axを近似する場合を考える際、学習によってaが0.1を得る必要がある。しかし、量子化によってaが表現できる値が0,1のため求められる式は
y(x)=0､y(x)=x
のようになり、誤差の大きな式になってしまう。
量子化する際には、極端に精度が落ちないようにしなければならない

速度の実験結果
32bit　32.269s
6bit　6.113s

精度の実験結果
32bitより6bitのほうが検出した矩形の領域が大きくなる。

##蒸留
精度の高いモデルはニューロンの規模が大きなモデルになっている
そのため、推論に多くのメモリと演算処理が必要
→規模の大きなモデルの知識を使い軽量なモデルの作成を行う

モデルの簡約化
学習済みの精度の高いモデルの知識を軽量なモデルに継承させる
知識の継承により、軽量でありながら複雑なモデルに匹敵する精度のモデルを得ることが期待できる。

教師モデルと生徒モデル
蒸留は教師モデルと生徒モデルの２つで構成される
教師モデル…予測精度の高い、複雑なモデルやアンサンブルされたモデル
生徒モデル…教師モデルをもとに作られる軽量モデル

教師モデルの重みを固定し、生徒モデルの重みを更新していく。
誤差は教師モデルと生徒モデルのそれぞれの誤差を使い重みを更新していく

蒸留の利点
蒸留によって少ない学習回数でより精度の良いモデルを作成することができる

##プルーニング
ネットワークが大きくなると大量のパラメータになるが、すべてのニューロンの計算が精度に寄与しているわけではない
↓
モデルの精度に寄与が少ないニューロンを削減することでモデルの軽量化、高速化が見込める

計算の高速化
寄与の少ないニューロンの削減を行いモデルの圧縮を行うことで計算を高速化できる

ニューロンの削減
重みが閾値以下の場合ニューロンを削減し、再学習を行う

ニューロン数と精度
ニューロンの削減を行っても意外と精度は変わらない。表ではニューロンを半分以下に減らしたにも拘らず精度は９１％となっている。また９４％削減しても精度は９０％以上となっている。

応用技術






##MobileNet
ディープラーニングモデルは精度は良いが、その分ネットワークが深くなり計算量が増える
計算量が増えると多くの計算リソースが必要で、お金がかかってしまう。
ディープラーニングモデルの軽量化、高速化、高精度化を実現（その名の通りモバイルなネットワーク）

一般的な畳み込みレイヤー
入力特徴マップＨ×Ｗ×Ｃ
畳込カーネルのサイズＫ×Ｋ×Ｃ　フィルタ数Ｍ
出力チャネル数Ｍ
計算量Ｈ×Ｗ×Ｋ×Ｋ×Ｃ×Ｍ

一般的な畳込レイヤーは計算量が多い
Depthwise Convolution
入力マップのチャネルごとに畳込を実施
出力マップをそれらと結合（入力マップのチャネル数と同じになる）
通常の畳込カーネルはすべての層にかかっていることを考えると計算量が大幅に削減可能
各層ごとの畳込なので層間の関係性は全く考慮されない。通常はＰＷ畳込とセットで使うことで解決
計算量Ｈ×Ｗ×Ｃ×Ｋ×Ｋ

PointwiseConvolution

1x1convとも呼ばれる
入力マップのポイントごとに畳込を実施
出力マップ（チャネル数）はフィルタ数分だけ作成可能
計算量Ｈ×Ｗ×Ｃ×Ｍ

アーキテクチャ
Depthwise Separable Convolutionという手法を用いて計算量を削減している。通常の畳込が空間方向とチャンネル方向の計算を同時に行うのに対して、それらをDepthwise ConvolutionとPointwise Convolutionによって個別に行う。

組み合わせで軽量化を実現

##DenseNet
ＣＮＮアーキテクチャの一種である、ニューラルネットワークでは層が深くなるにつれて、学習が難しくなるという問題があったが、ResNetなどのＣＮＮアーキテクチャでは前方の層から後方の層へアイデンティティ接続を介してパスを作ることで問題に対処した。DenseBlockと呼ばれるモジュールを用いた。

DenseBlock
出力層に前の層の入力を足し合わせる
層間の情報の伝達を最大にするためにすべての同特徴量サイズの層を結合する

特徴マップの入力に対し、下記の処理で出力を計算
・バッチ正規化
・ReLU関数による変換
・3x3畳込層による処理
・前スライドで計算した出力に入力特徴マップを足し合わせる
・第ｌ層の出力とすると
　　　xl=Hl([x0,x1,…,xl-1])
・ｋをネットワークのgrowth rateと呼ぶ
ｋが大きくなるほどネットワークが大きくなるため、小さな整数にするのがよい

TransitionLayer
・CNNでは中間層でチャネルサイズを変更し、特徴マップのサイズを変更し、ダウンサンプリングを行う

DenseNetとResNetの違い
・DenseBlockでは前方の各層からの出力すべてが後方の層への入力として用いられる
・RssidualBlockでは前1層の入力のみ後方の層へ入力

・DenseNet内で使用されるDenseBlockと呼ばれるモジュールでは成長率と呼ばれるハイパーパラメータが存在する

##BatchNorm
レイヤー間を流れるデータの分布を、ミニバッチ単位で平均が０、分散が１になるように正規化
バッチ正規化はニューラルネットワークにおいて学習時間の短縮や初期値への依存低減、過学習の抑制などの効果がある。

問題点
バッチサイズが小さい条件下では、学習が収束しないことがあり、代わりにLayerNormalizationなどの正規化手法が使わることが多い。

Batch Norm
H×W×CのサンプルがN個あった場合に、N個の同一チャネルが正規化の単位
・RGBの3チャネルのサンプルがN個の場合は、それぞれのチャンネルの平均と分散を
求め正規化を実施。チャンネルごとに正規化された特徴マップを出力
・ミニバッチのサイズを大きく取れない場合には、効果が薄くなってしまう

##Layer Norm
N個のサンプルのうち一つに注目。H×W×Cのすべてのピクセルが正規化の単位
・RGBの3チャネルのサンプルがN個の場合は、あるサンプルを取り出し、すべてのチャンネルの平均と分散を
求め正規化を実施。特徴マップごとに正規化された特徴マップを出力
・ミニバッチの数に依存しないので、Batch Normの問題を解消できる
・入力データや重み行列に対して、以下の操作を施しても出力が変わらない
　○入力データのスケールに関してロバスト
　○重み行列のスケールやシフトに関してロバスト

Instance Norm
・各サンプルの各チャンネルごとに正規化
・コントラストの正規化に寄与・画像のスタイル転送やテクスチャ合成タスクなどで利用

##Wavenet
生の音声波形を生成する深層学習モデル
Pixcel CNN（高解像度の画像を精密に生成できる手法）を音声に応用したもの

メインアイデア
・時系列データに対して畳込を適用する
・Dilated convolution
  ○層が深くなるについて畳み込むリンクを離す
　○受容野を簡単に増やすことができるという利点がある

深層学習を用いて結合確率を学習する際に、効率的に学習が行えるアーキテクチャを提案したことがWaveNetの大きな貢献の一つである





BERTまでのロードマップ

Encoder-Decorder Model
↓
Transformer
↓
BERT

##Seq2seq
系列を入力として、系列を出力するもの
Encoder-Decoderモデルとも呼ばれる

Seq2seqの理解に必要な材料
要は言語モデルを２つ連結した形になっている

RNNの理解…RNNの動作原理、LSTMなどの改良版RNNの理解
言語モデルの理解

RNNとは
系列データを読み込むために再帰的に動作するNN
再帰処理は時間軸方向に展開できる
前の時刻の出力を現在の時刻の入力にする
系列情報内部状態に変換できる

言語モデルとは
単語の並びに確率を与える。文章として自然かを確率で評価する
時刻ｔ－１までの情報で、時刻ｔの事後確率を求めることが目標
→これで同時確率が計算できる

RNN×言語モデル
各地点で次にどの単語が来れば自然（事後確率最大）かを出力できる

まとめ
事後確率を求めることがRNNの目標
先頭の単語を与えれば文章を生成することも可能

Seq2seq
EncorderからDecorderに渡される内部状態ベクトルが鍵
Decorder側の構造は言語モデルRNNとほぼ同じだが隠れ状態の初期値にEncorder側の内部状態を受け取る
Decorder側のoutput側に正解を割り当てれば教師あり学習がEnd2endで行える

##Transformer
Self-Attention(自己注意機構）に焦点を当てて

ニューラル機械翻訳の問題点
長さに弱い…翻訳元の文の内容を一つのベクトルで表現→文長が長くなると表現力が足りなくなる

Attention（注意機構）
翻訳先の各単語を選択する際に、翻訳元の文中の各単語の隠れ状態を利用

Attentionは何をしているのか→辞書オブジェクト
queryに一致するkeyを検索し、対応するvalueを取り出す操作であるとみなすことができる
これは辞書オブジェクトの機能と同じである

文長が長くなっても翻訳精度が落ちないことが確認できる

Transformer
2017年6月に登場
RNNを使わない
必要なのはAttentionだけ
当時のSOTAをはるかに少ない計算量で実現
英仏（3600万文）の学習を８GPUで3.5日で完了

主要モジュール
Encoder
1.単語ベクトルに単語の位置を追加
2.複数のヘッドで行うDot Product Attention
3.単語の位置ごとに独立処理する全結合
Decorder
4.未来の単語を見えないようにマスク

注意機構には2種類ある
ソース・ターゲット注意機構
ソース（情報が来る場所）とターゲット（情報が狙う場所）に分かれている

自己注意機構
Query,Key,Valueがすべて同じ場所からくる
入力をすべて同じにして学習的に注意個所を決めていく

Postion-Wise　Feed-Forward　Networks
位置情報を保持したまま順伝播させる
・各Attention層の出力を決定
・2層の全結合NN
・線形変換→ReLU→線形変換

Transformer-Encorder
自己注意機構により文脈を考慮して各単語エンコード

Scaled　dot　product　attention
全単語に関するAttentionをまとめて計算する

Mult-Head　attention
重みパラメータの異なる8個のヘッドを使用
・8個のScaled Dot-Product Attentionの出力をConcat
・それぞのヘッドが異なる種類の情報を収集

Decorder
・Encoderと同じく6層
　○各層で2種類の注意機構
　○注意機構の仕組みはEncoderとほぼ同じ
・自己注意機構
　○生成単語列の情報を収集
　○直下の層の出力へのアテンション
　○未来の情報を見ないようにマスク
・Encorder-Decorder attention
　○入力文の情報を収集
　○Encoder出力へのアテンション

Add&Norm
・Add(Sesidual　Connection)
　○入出力の差分を学習させる
　○実装上は出力に入力をそのまま加算するだけ
　○効果：学習・テストエラーの低減
・Norm(LayerNormalization)
　○各層においてバイアスを除く活性化関数への入力を平均０分散1に正則化
　○効果：学習の高速化

Postion　Encoding
RNNを用いないので単語列の語順情報を追加する必要がある
・単語の位置情報をエンコード
・posのソフトな２進数表現

##物体検知
物体検出においてはクラスラベルだけでなく物体位置の予測精度も評価したい
IoU=Area of Overlap/Area of Union
AveragePrecision
P(R)曲線の下側の面積をAPとする（クラスラベル固定のもとで考えていたことに注意）
meanAveragePrecision
クラス数がCのとき、すべてのAPの和をCで割ったもの
mAPcocoは0.5から0.95まで0.05刻みでAP&mAPを計算し算術平均を計算

FPS:Flames per Second
応用上の要請から検出精度に加え検出速度も問題となる

InferenceTime:1枚の推論にかかる時間

深層学習以降の物体検知
AlexNetの登場を皮切りに、時代はSHIFTからDCNNへ


2段階検出
・候補領域の検出とクラス推定を別々に行う
・精度が高い
・計算量が大きく推論も遅い

1段階検出
・候補領域の検出とクラス推定を同時に行う
・精度が低い
・計算量が小さく推論も早い
##セグメンテーション
SSD:SingleShotDetector
1.DefaultBoxを用意
2.DefaultBoxを変形しconfを出力

SSDの構成
VGG16が基になっている←16という数字はConv層とFC層の数
VGG16のFC層2層をConv層に変更
SSDの特徴はマルチスケール特徴マップ

特徴マップからの出力
マップ中の１つの特徴量における１つのDefaultBoxについて
　　出力サイズ　#Class+4(オフセット項)
マップ中の各特徴量にｋ個のDefaultBoxを用意するとき
　　出力サイズ k(#Class+4)
更に特徴マップのサイズがｍ×ｎであるとすれば、
　　出力サイズ　 k(#Class+4)mn

Non-MaxmumSupressiom
IoUが大きなものの中でConfidenceが最も大きなものを残す
HardNegativeMining
NegativeとPositiveの割合が不均衡になるので、Negativeを削る




損失関数
Confidenceに関する損失
locationに関する損失

Semantic Segmentationの概略
Convolution+Poolingにより解像度が落ちていく
落ちた解像度を戻すことをUp-sampling
正しく認識するためには受容野にある程度の大きさが必要
受容野を広げるには→深いConv層、プーリング
FCNによりHeatMapが得られる

Deconvolution
3×3の特徴マップから5×5にUp-samplingされる
処理手順
１．特徴マップのpixcel感覚をstrideだけ空ける
２．特徴マップのまわりに(kernel size-1)-paddingだけ余白を作る
３．畳込演算を行う
プーリングで失われた情報が復元されるわけではない

輪郭情報の補完
プーリングによりローカルな情報（輪郭）が失われていく
↓
低レイヤープーリング層の出力をelement-wise additionすることでローカルな情報を補完してからUp-sampling

Dilated Convolution
Convolutionの段階で受容野を広げる工夫
[３ヶ月で現場で潰しが効くディープラーニング講座](http://study-ai.com/jdla/)
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/ed06438c-368f-3293-6aa5-f35443068bed.png)](http://study-ai.com/jdla/)