【ラビットチャレンジ（E資格）】深層学習day4

#はじめに
本記事は、E資格の受験資格の取得を目的としたラビットチャレンジを
受講した際の勉強記録およびレポート記事である。

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

■強化学習のイメージ
![スクリーンショット (222).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/a1510532-125e-5358-6ba9-4dc20000a20c.png)


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

■強化学習と通常の教師あり、教師なし学習との違い
結論：目標が違う

・教師なし、あり学習では、データに含まれるパターンを見つけだすおよび、
　そのデータから推測することが目標

・強化学習では、優れた方策を見つけることが目標

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

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

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

■方策勾配法
方策をモデル化して最適化する手法
![スクリーンショット (223).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/5c2a5fd2-cb5b-a55f-af0a-0f0c936cb120.png)

##Section2)Alpha Go
■Alpha Go (Lee) のPolicyNet
出力は19×19マスの着手予想確率が出力される
![スクリーンショット (224).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/e8dc6620-462a-3fda-c967-4d0158b2cccc.png)

■Alpha Go (Lee) のValueNet
出力は現局面の勝率を-1～1で表したものが出力される
![スクリーンショット (225).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/cc165169-b2a7-b000-46f0-a3bf3ee6ee6f.png)

■Alpha Goの学習
Alpha Goの学習は以下のステップで行われる

1.教師あり学習によるRollOutPolicyとPolicyNetの学習
2.強化学習によるPolicyNetの学習
3.強化学習によるValueNetの学習

■モンテカルロ木探索
コンピュータ囲碁ソフトでは現在もっとも有効とされている探索法。
現局面から末端局面までPlayOutと呼ばれるランダムシミュレーションを多数回行い、その勝敗を集計して着手の優劣を決定する。

Alpha Goのモンテカルロ木探索は選択、評価、バックアップ、成長という4つのステップで構成される。
![スクリーンショット (226).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/deea4e6c-329e-4c63-e8c9-18552e4db85a.png)

■AlphaGo (Lee) とAlphaGo Zeroの違い
1.教師あり学習を一切行わず、強化学習のみで作成
2.特徴入力からヒューリンスティックな要素を排除し、石の配置のみにした
3.PolicyNetとValueNetを1つのネットワークに統合した
4.Residual Netを導入した
5.モンテカルロ木探索からRollOutシミュレーションをなくした
![スクリーンショット (227).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/c8fdf44c-deb3-3dd8-1634-60dc6a9bc103.png)

■Residual Network
ネットワークにショートカット構造を追加して、勾配の爆発、消失を抑える効果を狙ったもの。
Residual Networkを使うことにより、100層を超えるネットワークでの安定した学習が可能となった。
![スクリーンショット (228).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/94c19c44-2761-afcb-f3bb-20ed36d8fd9e.png)

##Section3)軽量化・高速化技術
■データ並列化
・親モデルを各ワーカーに子モデルとしてコピー
・データを分割し、各ワーカーごとに計算させる
![スクリーンショット (229).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/24620160-8227-61aa-276b-4789aff195e3.png)

データ並列化は、各モデルのパラメータの合わせ方で、同期型か非同期型か決まる

■データ並列化：同期型
各ワーカーが計算が終わるのを待ち、全ワーカーの勾配が出たところで勾配の平均を計算し、親モデルのパラメータを更新する。

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

■同期型と非同期型の比較
・処理のスピードは、お互いのワーカーの計算を待たない非同期型の方が早い。
・非同期型は最新のモデルのパラメータを利用できないので、学習が不安定になりやすい。
・現在は同期型の方が精度が良いことが多いので、主流となっている。

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

・モデルが大きいときはモデル並列化をデータが大きいときはデータ並列化をすると良い。
![スクリーンショット (230).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/2b13e76e-4f0e-efb5-308b-668ca26911e1.png)

■モデルの軽量化とは
モデルの精度を維持しつつパラメータや演算回数を低減する手法の総称。

■軽量化の手法
代表的な手法として下記の3つがある

・量子化
・蒸留
・プルーニング

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

・利点
計算の高速化
省メモリ化

・欠点
精度の低下

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

■教師モデルと生徒モデル
・教師モデル
予測精度の高い、複雑なモデルやアンサンブルされたモデル

・生徒モデル
教師モデルをもとに作られる軽量なモデル

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

![スクリーンショット (231).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/bca29b68-1d49-da81-e7ea-ccbff37ca5bb.png)

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

##Section4)応用技術
■MobileNet
□提案手法
ディープラーニングモデルの軽量化・高速化・高精度化を実現

MobileNETはDepthwise ConvolutionとPointwise Convolutionの組み合わせで軽量化を実現。

■Depthwise Convolution
□仕組み
・入力マップのチャネルごとに畳み込みを実施
・出力マップをそれらと結合 (入力マップのチャネル数と同じになる)
![スクリーンショット (232).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/557bf7b6-ce24-4248-0e48-371d4ee833ba.png)

■Pointwise Convolution
□仕組み
・1×1convとも呼ばれる (正確には1×1×c)
・入力マップのポイントごとに畳み込みを実施
・出力マップ (チャンネル数) はフィルタ数分だけ作成可能 (任意のサイズが指定可能)
![スクリーンショット (233).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/aa9bffce-d7ed-3462-cf8c-9577b577074d.png)

■DenseNet
□概要
Dense Convolution Network (以下、DenseNet) は、畳込みニューラルネットワーク (以下、CNN) アーキテクチャの一種である。ニューラルネットワークでは層が深くなるにつれて、学習が難しくなるという問題があったが、Residual Network (以下、ResNet) などのCNNアーキテクチャでは前方の層から後方の層へアイデンティティ接続を介してパスを作ることで問題を対処した。DenseBlockと呼ばれるモジュールを用いた、DenseNetもそのようなアーキテクチャの一つである。

![スクリーンショット (234).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/02e39ce3-044d-fc15-b4a3-9a6f16f17320.png)

■Batch Norm Layer
□Batch Norm
ミニバッチに含まれるsampleの同一チャネルが同一分布に従うよう正規化

□Layer Norm
それぞれのsampleの全てのpixelsが同一分布に従うように正規化

□Instance Norm
channelも同一分布に従うように正規化

![スクリーンショット (235).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/03aac0f9-2677-b4e2-e9b7-4567972b33b5.png)

■Wavenet
・生の音声波形を生成する深層学習システム
・Pixel CNN (高解像度の画像を精密に生成できる手法) を音声に応用したもの

□Wavenetのメインアイデア
・時系列データに対して畳み込み (Dilated convolution) を適用する

□Dilated convolution
・層が深くなるにつれて畳み込むリンクを離す
・受容野を簡単に増やすことができるという利点がある

![スクリーンショット (236).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/2fcb2b80-2623-04f2-e761-9335fef795ec.png)

##演習
###Seq2Seq
英語から日本語への機械翻訳を行う。
■データの読み込み　
英語と日本語を読み込んでいる。
![スクリーンショット (238).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/c5dffaa2-785d-d4c0-ba11-bc0c58e9aaae.png)
![スクリーンショット (239).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/9982c000-cf6f-388a-54c0-5382595fca1c.png)

■単語辞書の作成

![スクリーンショット (240).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/c5049c0c-8a6b-517c-07ef-f7dfc8987b0c.png)
![スクリーンショット (241).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/471c8a23-7d26-fa14-f472-386507099a32.png)
![スクリーンショット (242).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/8ccb9d01-4278-6aaa-6108-81d877df33a8.png)
入力言語の語彙数：3725
出力言語の語彙数：4405
であることが確認された。

■テンソルへの変換
![スクリーンショット (243).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/2f096b94-1951-11c6-5912-b4ccb1061bab.png)
![スクリーンショット (244).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/7c4e32bc-c306-2dfd-6da5-3e2b0ba062d2.png)

■DataLoaderの定義
![スクリーンショット (245).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/628385ae-0953-9eca-f36c-7c97482c3a30.png)
![スクリーンショット (248).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/0edb52d5-c7c5-e362-2018-15e137889ce8.png)

■モデルの構築
EncoderとDecoderのRNNの定義をする。
![スクリーンショット (249).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/f8000ce9-5bdf-af0d-cb59-f6f87c602b61.png)
![スクリーンショット (250).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/638d8380-ddca-6061-12cb-483b39c69cb0.png)
![スクリーンショット (251).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/ad425ae7-84dd-e325-4c84-41028670c4b7.png)

■EncoderDecoder
![スクリーンショット (252).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/0a0d6897-3c42-2bd9-9fff-9d6b36181b68.png)

■訓練
□損失関数の定義
![スクリーンショット (253).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/77705375-b1a6-e07b-cb03-f577f46810fb.png)
![スクリーンショット (254).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/a82398f2-edcd-d019-e1f1-b43dba78f0fe.png)
![スクリーンショット (255).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/b933f319-6809-b96b-d03d-5f8bfc90c6f6.png)
ここでLoss以外に学習の進捗を確認するためにモデルの性能を評価する指標として、BLEUを計算する。
![スクリーンショット (256).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/06b9dc1f-8e33-3045-426e-c151f7e1f995.png)
モデルの訓練を実行する。

![スクリーンショット (257).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/9319da45-28ab-2a0f-1da0-884caf1b1977.png)
![スクリーンショット (258).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/5439d18d-57f9-5e3d-5a2a-5407cef3c51a.png)
![スクリーンショット (259).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/c7d75e75-f8a3-7d73-4eeb-61f5577772ae.png)

■評価
![スクリーンショット (260).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/5c72e3eb-b991-a467-fb43-82b0132c75ab.png)
![スクリーンショット (261).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/843831fb-186e-0fe9-4a16-7adba23b4df4.png)
![スクリーンショット (262).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/a526fdde-fede-2df9-57a8-6b0940949407.png)
![スクリーンショット (263).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/6967737f-a3ce-0ee5-d96c-fd4127d7ee44.png)
Bleuスコアは約17.7となった。
下記サイトによると10～19では「主旨を理解するのが困難である」ということ。
よって本結果は、精度がよくないと考えられる。

参考
https://cloud.google.com/translate/automl/docs/evaluate?hl=ja

###Transformerモデル
■Transformerとは
RNNやCNNを使用せず、Attentionのみを用いるSeq2Seqモデル。
並列計算が可能なためRNNに比べて計算が高速な上、Self-Attentionと呼ばれる機構をっ用いることにより、局所的な位置しか参照できないCNNと異なり、系列内の任意の位置の情報を参照することを可能にしている。

データの読み込み～データローダーまで上記Seq2Seqと同様。

■Position Encoding
![スクリーンショット (264).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/d8d9b96c-7583-885b-4c6f-8b5b0e6c2c2a.png)

■Multihead Attention
![スクリーンショット (265).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/b575b0e7-40d9-e97f-1e39-48ea8383719f.png)
![スクリーンショット (266).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/a1abf64d-7840-1639-1d70-a45eb1b11175.png)
![スクリーンショット (267).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/511f6aff-d5e5-a69a-932c-331d5ad74b60.png)
![スクリーンショット (268).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/22ed22fb-5a77-8c14-0a36-4924e8f8de55.png)

■Position-Wise Feed Forward Network
![スクリーンショット (269).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/01c24e94-9cef-e65c-7bac-b6c5f8605268.png)

■Masking
TransformerではAttentionに対して2つのマスクを定義します。
一つはkey側の系列のPADトークンに対してAttentionを行わないようにするマスク。
![スクリーンショット (270).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/3aaf2ebd-985a-24d8-49f1-040407107c00.png)

もう一つはDecoder側でSelf Attentionを行う際に、各時刻で未来の情報に対するAttentionを行わないようにするマスク。
![スクリーンショット (271).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/59e7a82f-f3b3-c132-2359-1c6bb305237d.png)

■モデルの定義
□Encoder
![スクリーンショット (273).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/dcb6ab0b-6142-8365-ffab-4c978cae130e.png)
![スクリーンショット (274).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/a4db43d7-3719-1647-ba69-2583b9a7faa6.png)
![スクリーンショット (275).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/971acee0-bb58-629e-00d6-3f9f16aeadfe.png)

□Decoder
![スクリーンショット (276).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/66d4e667-cb70-458b-3393-00e440c25014.png)
![スクリーンショット (277).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/8becaeb2-7729-29c1-0d99-baab9cdb268f.png)
![スクリーンショット (279).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/1cc3179b-d5b7-d273-afe5-b8b36093a3ff.png)
![スクリーンショット (280).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/26af0ec6-fc02-c420-13f3-4d9880d15428.png)
![スクリーンショット (281).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/f02c7592-bdf3-0088-d2e6-cc8422040fa2.png)
![スクリーンショット (282).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/14444137-c397-f608-8f5b-73c8a1ae0c60.png)
![スクリーンショット (283).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/bec07c2f-2a84-2715-df23-ec0b540086dc.png)

■学習
![スクリーンショット (284).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/26c51469-c4d1-86ae-a4a6-692f0105e594.png)
![スクリーンショット (285).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/64840a1c-e8b8-3bc4-71dd-08fd9bd81043.png)
![スクリーンショット (286).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/be31631c-acd4-ac40-b340-114dd57e492a.png)
![スクリーンショット (287).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/69b169aa-60fa-6901-506b-72c5e25bb96a.png)
![スクリーンショット (288).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/8d9254a0-5e17-e9c0-cdef-d43901550a06.png)
![スクリーンショット (289).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/6c185599-3e84-8dae-566e-95e95e31142c.png)

■評価
![スクリーンショット (290).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/4b7ac45b-ac87-c4e2-4ec8-4ecaef335547.png)
![スクリーンショット (294).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/5b649760-c908-b94c-2af2-af1e8d8113b5.png)
![スクリーンショット (292).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/47cb3869-f77c-c944-7215-a3af667a4b7a.png)
![スクリーンショット (293).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/f6b58c89-0b6c-e184-89b7-3b90a7555571.png)

BLEUスコアは約26.6となった。
これは下記参考によると「主旨は明白であるが文法上重大なエラーがある」ということ。
よって本結果は、精度が悪いと考えられる。

参考：
https://cloud.google.com/translate/automl/docs/evaluate?hl=ja