ラビットチャレンジ　レポート　深層学習day3　day4

#Section1 再帰型ニューラルネットワークの概念
・RNN（Recurrent Newral Network）
　時系列データを処理するためのネットワーク
　　音声、テキスト、株価の変化等
　中間層からの出力を次の入力に使用する構造をもつ　
$u^t=W_{(in)}x^t+W_z^{t-1}+b$
$z^t=f(W_{(in)}x^t+W_z^{t-1}+b)$
　誤差逆伝搬法の際に、時系列をさかのぼる過程で勾配消失が起きるという問題がある

・実習（3_1_simple_RNN.ipynb）
　なぜバイナリ加算を学習しようと思ったのか謎

　tから(t+1)への更新部分

``` python
        u[:,t+1] = np.dot(X, W_in) + np.dot(z[:,t].reshape(1, -1), W)
        z[:,t+1] = functions.sigmoid(u[:,t+1])

        y[:,t] = functions.sigmoid(np.dot(z[:,t+1].reshape(1, -1), W_out))
```

![rnn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155671/b7b101cf-dc54-f190-ef49-3eee80030645.png)

　グラフが正解率からコスト関数に変わってるので、低下してるほうが学習できている

・演習メモ
　構文木で２つの関係を見るときは、特徴ベクトルを左右にそのまま連結し、必要に応じて数を圧縮する

・Backpropagation Through Time（BPTT）
　RNNの誤差逆伝搬法をこう呼ぶ
　特徴として、時系列のつながりを逆伝搬するため、t-1の状態をt状態で表す式が必要

・実習（3_1_simple_RNN_after.ipynb）

``` python
        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_out_grad += np.dot(z[:,t+1].reshape(-1,1), delta_out[:,t].reshape(-1,1))
        W_grad += np.dot(z[:,t].reshape(-1,1), delta[:,t].reshape(1,-1))
        W_in_grad += np.dot(X.T, delta[:,t].reshape(1,-1))
```

　t+1からtにさかのぼり、勾配を求めている

![rnn2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155671/65b70674-86ba-ae4c-7c9b-e40dc6872a6e.png)


#Section2 ＬＳＴＭ
　ＲＮＮが勾配消失により、長い時間の学習が困難であった問題をネットワークの構造により解決
 計算量が多いという問題がある

・勾配爆発
　勾配消失の逆で、遡る過程で勾配が無制限に大きくなる現象

LSTMの全体図（かいつまんで表現するのはあきらめ）
![lstm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155671/74d14c8e-64c1-2c91-87d8-74dfc88ca3ba.png)
　CEC、入力ゲート、出力ゲート、忘却ゲートが特徴
　青い点線は時間的なループの接続、黒い点線部分が中間層

・CEC (constant error carousel)
　情報を記憶しておくだけのノード。学習と記憶を切り離し、勾配を１に固定し消失が起きないものを作った

・入力ゲート
　ＣＥＣへの情報の入力を学習するためのノード
　今回の入力値と入力ゲートの出力を演算して、ＣＥＣの記憶を更新する
　入力ゲートには、今回の入力値に対する重み$W_i$と前回の出力値に対する重み$U_i$をもつ

・出力ゲート
　ＣＥＣの情報をどう使うかを学習するためのノード
　ＣＥＣの情報と出力ゲートの値を演算して出力層へ伝える
　ＣＥＣの出力： $c(t) = i(t) a(t) + f(t) c(t-1)c(t)=i(t)a(t)+f(t)c(t−1)$
　　　　　　　　＊１項目は今回の入力、２項目が前回の出力

・忘却ゲート
　ＣＥＣの不要な情報を削除する機能を学習
　言葉の予想に影響を及ぼさない単語を削除していく（確認テスト）

・覗き穴結合
　ＣＥＣから各ゲートへの伝搬。あまり効果はない

#Section3 ＧＲＵ
　ＬＳＴＭはパラメータが多く計算量が多い課題があったため、精度をあまり落とさずに軽量化したもの
　ＣＥＣを廃止して、隠れ層の$h(t)$に情報を保存
　更新ゲートとリセットゲートを持つ

・更新ゲート
　隠れ層からの出力を制御

・リセットゲート
　過去及び現在の値から隠れ層の情報を制御

　＊$h(t)$が２か所にあって定義がほかの資料と違う気がするので、あとで要整理
　　隠れ層の中にあるほうは誤り？


#Section4 双方向ＲＮＮ
　ＲＮＮの応用。過去の情報だけではなく未来の情報も利用
　文章など、前後の情報を利用して判断できる場合に使用

　通常のＲＮＮのネットワークと逆方法のＲＮＮを並列に接続した構造を取る

・演習チャレンジ

``` python
np.concatenate([hf, hb[::-1]],axis=1)
```
axis=1 で２つを時間的に同じもののペアで組み合わせる

#Section5 Ｓｅｑ２Ｓｅｑ
　Ｓｅｑはシーケンスのこと
　シーケンスからシーケンスを作るという意味で、翻訳等で利用
　ＥｎｃｏｄｅｒとＤｅｃｏｄｅｒの組み合わせ

・Ｅｎｃｏｄｅｒ
　文章から意味を集約。文脈を読み取る


・Ｄｅｃｏｄｅｒ
　Ｅｎｃｏｄｅｒの情報から対となる文章を生成。翻訳や対話等

・Ｅｍｂｅｄｄｉｎｇ
　単語はOne-hotベクトルで表現するが、単語数分の次元が生まれる
　それを類似した単語同士の距離が近くなるように特徴量（ベクトル）を表現し、次元圧縮

・ＭＬＭ（Ｍａｓｋｅｄ　Ｌａｕｎｇｕａｇｅ　Ｍｏｄｅｌ）
　文章から単語をマスクして、そこに適切な単語が入るように学習させる
　文章から単語を隠すだけで学習データが生成できるため、データを集めやすい

・ＨＲＥＤ
　Ｓｅｑ２Ｓｅｑの拡張。
　Ｓｅｑ２Ｓｅｑは文章に対して文章を返す単純な構造でしかない
　ＨＲＥＤは過去の文脈を次に引き継ぐ（ＲＮＮと同様の構造）を持った
　しかし、どんな文章に対しても、当たり障りのない回答をするように学習してしまう課題を持つ

・ＶＨＲＥＤ
　ＨＲＥＤの拡張
　潜在変数の利用により、より多様な応答をできるようにした

・オートエンコーダ
　教師なし学習。次元削減
　元データを情報量を圧縮し、重要な特徴をもった潜在変数を抽出し、そこから元のデータを復元するように学習させたＥｎｃｏｄｅｒ－Ｄｅｃｏｄｅｒ

・ＶＡＥ
　オートエンコーダの拡張
　潜在変数が確率分布の形式になるように誓約
　ＶＡＥの学習では、Ｅｎｃｏｄｅｒの出力にノイズを加えることで、汎化性能を向上させる（データ拡張の考え方）　
　

#Section6 Ｗｏｒｄ２ｖｅｃ
　Ｅｍｂｅｄｄｉｎｇの手法
　単語をあらわすone-hotベクトルをEnbeddingの系に変換する重みＷを学習させる

・分散仮説：「単語の意味は、周囲の単語によって形成される」というアイディアによりその単語の周囲に出現する単語の傾向から学習させる


#Section7 Ａｔｔｅｎｔｉｏｎ Ｍｅｃｈａｎｉｓｍ
　文章の中から注目すべき重要な単語を見つけ重みづけるメカニズム
　文章の中でなくなっても意味に影響が低いもの、高いもの等、関係性に重みづけをする
　Ｓｅｑ２Ｓｅｑの特性として長さにかかわらず、同じサイズの情報に圧縮されるため、情報の重要度を判別する必要がある

　現在、自然言語処理では最も重要する仕組み

#Section1 強化学習
　教師なし学習、教師あり学習と並ぶ学習の種類の一つ
　教師あり、教師なし学習がデータの特徴を学習していたのに対し、強化学習は目的に対して振る舞いを学習する

　環境に対し、価値（行動の価値と状態の価値）と方策を学習し、最終的な報酬を最大化する

　はじめはランダムや不完全な知識を元に行動をとり、その結果を見つつ効果的な行動をとれるようになる
　未知の行動をとるとそこから新たな知識が得られる。しかし、未知の行動ばかりでは過去の学習が生かせない。トレードオフ関係がある。

・Ｑ学習
　TD学習(Temporal-Difference Learning)の一種。行動1回単位で価値関数を更新
　行動価値関数Ｑを学習（ある状態で、こういう行動をとったら、どれだけの報酬をもらって、どういう状態になる）
　　ex)囲碁で、どういう石の並びで（状態）、どこに石を打ったら（行動）、どうなるか（報酬、次の状態）
　近年は、状態だけによって決まる状態価値関数より、行動価値関数のほうがよくつかわれる

・方策関数
　実際に次ぎどうするかを決める関数
　これによって決められた行動を、行動価値関数で評価する
　現在は、この方策関数はニューラルネットワークで近似する
　　誤差関数の代わりに、期待収益を最大化するように学習

#Section2 AlphaGo
　Googleの囲碁ＡＩ。強化学習。Alpha Go Lee　と　Alpha Go Zero　がある
　Leeは人間を棋譜による教師あり学習との組み合わせ
　Zeroは教師あり学習なし

・Alpha Go Lee
　方策関数（畳み込みＮＮ）
　　入力: 盤面 19x19　を 48チャンネル
　　　　　自分の石、敵の石、空白、着手履歴８手、シチョウ等のデータ
　　出力: 盤面 19x19　の最適手の確率
　　学習：当初、教師あり学習（棋譜データ）で学習（後述のRollOutPolicyも同様）
　　　　　保存された過去の方策関数とランダムに対戦し評価
　　　　　
　価値関数（畳み込みＮＮ）
　　入力：方策関数＋手版
　　出力：勝率-1～1
　　学習：通常の方策関数（ＣＮＮ）は計算コストが高いため、RollOutPolicyという線形で高速な学習用方策関数を使用

・Alpha Go Zero
　教師あり学習をせず強化学習のみ
　シチョウ等の情報を入れず、盤面のみの入力
　方策関数と価値関数のネットワークを統合（途中で分岐）
　ResidualNetwork
　　入力と出力を直結するショートカットをもつブロック。
　　これを３９個重ねることで勾配消失。また、ショートカットをするのとしないので違うネットワークのように動作し、アンサンブル効果が期待される


#Section3 軽量化・高速化技術
　「いかに早く学習させるか」と「いかに軽量化し軽易な端末で動作させるか」がある

・学習高速化
　分散深層学習：複数の計算資源を使って並列処理
　　　　　　　　データ並列化、モデル並列化、ＧＰＵ
　データ並列化：データを分割し、複数の機材で学習、学習結果を統合する
　　　　　　　　同期型：各勾配がそろってから平均し学習（計算資源が管理ができるときはこちら）
　　　　　　　　非同期型：各計算資源ごと結果を出しそれをプールし、相互に利用（様々な計算資源を使うときはこちら）
　モデル並列化：巨大なモデルをブロックに分けて、計算資源に分担
　　　　　　　　結果を相互に利用する必要があるため、データの流れに応じて適切に分割する必要がある
　ＧＰＵ：安価な演算を大量に並列化
　　　　　ＧＰＧＰＵ：グラフィック以外の汎用計算ができるように設計
　　　　　　　　　　　ＧＵＤＡ（ＧＰＧＰＵの開発プラットフォーム）
　　　　　ＴＰＵ：ＤＬ用の計算に特化

・動作軽量化
　量子化：データの精度を落とす。64bitの浮動小数点より、32bit、16bitへ
　　　　　計算資源に応じて高速処理できるものへ。メモリも節約
　　　　　精度を落としても意外と性能は落ちない
　蒸留：高性能な大きなモデルから、軽量なモデルを作成
　　　　教師モデル（巨大、高性能、高コスト）から生徒モデル（軽量、低コスト）を作成。学習済みの教師モデルの出力と比較しながら学習
　プルーニング：大きなネットワークの中から影響の小さい（重みが小さい）ノードを削除する
　　　　　　　　重みの小さいネットワークの大半を削除しても性能はあまり落ちない。ex）重み0.1以下は削除
　　　　　　　　全結合層の９割以上を削減しても十分に機能（精度９０％ほどを維持）

#Section4 応用モデル
　E資格のシラバスにある代表的なネットワークの特徴を確認しよう！

・MobileNetwork
　画像認識モデル、畳み込みを軽量化（精度は上がりきったので、軽量化が現在のテーマ）
　情報を大きく捨て計算量を減らしたDepthwiseConvolution、PointwiseConvolutionの２つの畳み込みを組み合わせる
　DepthwiseConvolution：フィルタを１つしか使わない（チャネル方向の相関を捨てる）
　　　　　　　　　　　　チャンネルごとにのみ畳み込みを行う
　PointwiseConvolution：フィルタサイズが1×1（空間方向の相関を捨てる）
　　　　　　　　　　　　画素ごとのみチャネル方向に畳み込みを行う

・DenseNet
　画像認識モデル。レイヤーが進むたびに、過去のレイヤーの情報を追加チャネルとして使うDenseBlockが特徴
　grouth-rate：何層までチャネルを追加するか
　DenseBlockごとにその後、畳み込みとプーリングで同じサイズに戻す

・正規化
　データの正規化により学習時間の短縮や初期値への依存低減、過学習の抑制が期待できる
　Batch Norm：ミニバッチ単位で正規化を行う（バッチサイズは計算機により制約を受ける）
　Layer Norm：画像データ内で複数チャンネルを正規化
　Instance Norm：画像データ内の単一チャネル内だけで正規化
　　　　　　　　 データの特性を捨てている気がするが、案外うまくいくらしい

・Wavenet
　２０１６年、音声生成モデル
　ＲＮＮではなくＣＮＮ（時系列への畳み込み）
　Dilated causal convolution：層が深くなるにつれて畳み込みのリンク（間隔）を開くことで、より広いレンジに対応（受容野が広い）

#Section5 Ｔｒａｎｓｆｏｒｍｅｒ
　Encorder-Decorder + Attention
　ＲＮＮを使わずにAttentionだけでEncorder-Decorderを構成。
　時系列データを順番に処理する必要がないため、並列処理に強い。最近の流行

・言語モデル
　単語の並びが自然か確率で出力　

![tr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155671/0bf6f7d5-87c2-9087-b6d9-ec7af406abbb.png)

・Self Attention
　Source Target Attentionと異なり、入力ソース内の単語間の関係性の重みづけを実施

・Position Encording
　ＲＮＮではないため付与した位置情報を保持して処理することが必要

・Multi-Head attention
　重みのことなる８個のAttentionを並列することで、複数の観点から処理（アンサンブルのようなイメージ）

・BLEUスコア
　翻訳家の翻訳データとの一致度で機械翻訳の性能を評価
　類語などを評価できない表面的な評価しかできないので留意

・実習

＊lecture_chap1_exercise_public.ipynb は単体で動かないので環境構築に注意

``` python
　from wheel.pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag
```

　lecture_chap2_exercise_public.ipynb

　小さなデータセットでも訓練に５分半ほどかかった

![tr2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155671/fe1d50a0-0504-3ade-66b8-7d9102765e5d.png)
 かなり適切に変換できている

![tr3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155671/3b280920-2bdf-a59d-534d-fe6adef5dbf3.png)
BLUEスコア

#Section6 物体検知・セグメンテーション
・物体検知、セグメンテーションの種類
　　分類：画像の中に分類クラスのものが含まれているかの確率
　　物体検知：BB(BoundingBox)で物体のある矩形エリアを解くて　
　　意味領域分割：Semantic Segmentation　ピクセル単位でクラス認識
　　個体領域分割：Instance Segmentation　ピクセル単位でクラス認識及び個体認識

・データセット
　　様々な画像データセットがあるが、使用するデータセットの特性に留意
　　　　＊クラス数が多くても、ラベル付けに誤りや揺らぎなどが多い場合もある
　　VOC12：クラス数２０、画像数11,540、物体数平均2.4
　　ILSRC17：クラス数２００、画像数476,668、物体数平均1.1
　　MS COCO18：クラス数８０、画像数123,267、物体数平均7.3
　　OICOD18：クラス数５００、画像数1,743,042、物体数平均7.0
　　　＊動画のデータセット名は誤記が多いので注意

・評価基準
　IoU : Intersection over Union。分子に「真のエリアと予測エリアの重複」、分子に「両エリアの和」
　　　　＊予測エリアを極端に大きくしたり、小さくしても不当に評価が上がらない指標
　Precision/Recallの考え方：重複検出は２回目の検出以降をＦＰとして分類することに留意
　AP (Average Precision)：物体検出は閾値によって、正誤判定が変化する
　　　　　　　　　　　　　閾値を変化させ、クラスラベルごとにPrecision/Recallを計算
　　　　　　　　　　　　　mAP (mean Average Precision)：全クラスで平均をとる
　FPS (Frame per Second)：処理速度を評価

・ＳＳＤ：Single Shot Detector
　　　　　１段階検出器（検出と分類を同時に実施）
　　　　　デフォルトのBBを複数設置し、それの変形で検出
　　　　　基本構造：Convolution 層が 13, 全結合層 3 層
　　　　　出力：（DefaultBox係数）×（クラス数＋４）×（特徴マップのサイズ）
　　　　　　　　　＊デフォルトボックスの数（DefaultBox係数）×（特徴マップのサイズ）
　　　　　同一物体の検出については、最も確率が高いものを残しＢＢを削除
　　　　　背景に属するＢＢも偏りすぎないように減らす
　　　　　評価関数：確率と位置に関する誤差の和