Open keitom61 opened 3 years ago
【実装演習結果】
2進数のバイナリ加算を予測するモデルの実装を 3_1_simple_RNN_after.ipynbにて行った。
初期値では横軸エポックにて縦軸の誤差関数は下記のように収束した。
重みの初期平均を元の実装値1から10にした場合、学習は進まなかった。
同様に重みの初期平均を元の実装値1から0.1にした場合も、学習は進まなかった。
学習率を元の0.1から0.2に増やした場合、学習スピードは向上した。
重みの初期値をXaviarとした場合は、学習速度に大きな差はみられなかった。
重みの初期値をHeとした場合は、4000エポック手前で急速な学習の進展がみられた。。
中間層の活性化関数をReLUとした場合、勾配爆発が起きて学習が進まなくなった。
中間層の活性化関数をtanhとした場合も学習の進展は確認できなかった。
【確認テスト】 Q1:RNNの重みについて説明せよ
A1: W(in):入力から現在の中間層を定義する際にかけられる重み W(out):中間層からの出力を定義する際にかけられる重み W:1つ前の時間の中間層からの出力から、現在の中間層を定義する際にかけられる重み
Q2:下図のy1をx,s0,s1,win,w,woutを用いて数式で表せ。中間層からの出力に関数g(x)を作用させる。
A2:
Section2:LSTM 【要点】 RNNの課題として、時系列を遡るほど勾配が消失又は爆発するため、 長い時系列の学習が困難であることがあげられる。 解決策としてニューラルネットワークの構造を変えて解決したのがLSTMである。
LSTMの全体図を以下に示す。
LSTMはCECに過去の情報を記録させる。RNNと異なり、CECは入力データについて時間依存度に関係なく重みは一律であるため、勾配は常に1である。そのため、時系列が長くなっても消失又は爆発する恐れがない。ただし、重みが一律ということは、ニューラルネットワークの学習特性がないことを意味する。そのため、CECとは別に入力ゲートおよび出力ゲートを用意して学習を行う。
入力ゲートでは、"現在の時間tの入力x(t)"と"前回の時間t-1の出力h(t-1)に重み行列Winをかける。出力ゲートでも同様に重み行列Woutをかける。各ゲートの結果はCEC前後で内積演算される。
またCECは過去の情報がすべて保管されているため、メモリ容量を考慮すると過去の情報は不要になったタイミングで忘却する機能が必要である。忘却機能を果たすのが忘却ゲートであり、CECに保管されている前回の時間t-1の情報c(t-1)とf(t)の積をとり、不必要な情報を忘却する。
【実装演習結果】 実装演習としてLSTMを使って、小説を執筆した。LSTMのモデルを構築し、文書を自動生成した。 文書データは青空文庫より夏目漱石の「坊ちゃん」を用いた。
学習にあたり文字はone-hot表現によりベクトル化した。
kerasを用いて以下のLSTMのネットワークを作成した。
Model: "sequential_1"
Layer (type) Output Shape Param #
lstm (LSTM) (None, 128) 1039360
dense_1 (Dense) (None, 1901) 245229
Total params: 1,284,589
Trainable params: 1,284,589
Non-trainable params: 0
None
設定したハイパーパラメータは以下の通りである。 時系列の数:10 バッチ数:128 エポック数:60
エポック数に対する誤差関数の推移を以下に示す。
後述のGRUと比較し、誤差関数の減り方が遅い傾向にある。
60エポックの学習後に得られた文章を以下に示す。 日本語としては意味不明であるが、ところどころ意味が通る文書ができている。
『親譲りの無鉄砲で小供の時から損ばかりしている。漢学の先生が蒟蒻版を畳んだり、無論にあしたからといた。どうせ、おれはこれですかと聞くから、山嵐が憤然と飛び込んを、どよかろう。しないんだ」 中へはいって何だか憐れてもらめるしておれるんだ。妙な病気だ。しかしから、出ているのは残念だ。 おれは大きいやるのがった。野だが小使に下さってもの中からだが分らないがだから、この辺の事情が出来た。こうも大きに見えがいい。 おれの方を見て、おや書を出せ。おれはただ先生とことにひとかしたい、あたいうと思って、いついた事をするところへおれの前へ乗って玄関ましたが出立って仕方がないと、赤シャツさんと云うから、その人は思い声で呑みだと云ってもらなものだ。おれはこの時からこの癖にと云うから、今日は学校で、このに諸君の学校でいって、前任の水にならなっているのにおれという眼を云ったが、一ヶ月立つから、惜しゃない。ところくおれの顔を見てたらいいえ』
【確認テスト】
Q:以下の文章をLSTMに入力し空欄に当てはまる単語を予測したいとする。 文中の「とても」という単語は空欄の予測において、影響を及ぼさないと考えるため、 どのゲートが作用すると考えられるか?
「映画おもしろかったね。ところでとてもお腹が空いたから何か____。」
A:忘却ゲート
Section3:GRU 【要点】 LSTMではパラメータ数が多く、計算負荷が高くなり学習時間が長くなることが課題であった。 GRUではパラメータを大幅に削減し、精度は同等またはそれ以上が望める様になった構造である。 機械学習分野ではLSTMとGRUのように、先に高精度を目指したモデルが開発され、 その後計算負荷の軽減を目指したモデルが開発されることが多い。
GRUの全体像を以下に示す。
LSTMと比較しパラメータがリセットゲートと更新ゲートの2つに減っている。LSTMと比較し過去の記録を保持するCECがなくなっているため計算コストは軽減されている。
【実装演習結果】 実装演習としてGRUを使って、小説を執筆した。GRUのモデルを構築し、文書を自動生成した。 文書データは青空文庫より夏目漱石の「坊ちゃん」を用いた。
学習にあたり文字はone-hot表現によりベクトル化した。
kerasを用いて以下のGRUのネットワークを作成した。
Model: "sequential"
Layer (type) Output Shape Param #
gru (GRU) (None, 128) 779904
dense (Dense) (None, 1901) 245229
Total params: 1,025,133
Trainable params: 1,025,133
Non-trainable params: 0
None
設定したハイパーパラメータは以下の通りである。 時系列の数:10 バッチ数:128 エポック数:60
エポック数に対する誤差関数の推移を以下に示す。
60エポックの学習後に得られた文章を以下に示す。 日本語としては意味不明であるが、ところどころ意味が通る文書ができている。
『親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居た時分、学校の方でもいと、三間体数学の教師になるべら男ら帰ると今日清の事になったから、なんでにはいないよ」と云うかも知れないから、ことにようぽどの自分で、した人を心になっても、え?」と聞いてみった。野だが話しだに取った時、眼が死んだったり、赤手拭は宿へ帰って荷作りをする覚悟でいた。どうせ、こんな手合を弁口で屈伏させる手際はなし、させたところですぐ考えると思うと、いえこの時は君はどうですかね。赤シャツは一人間だんで、もっちの送別会に見た。うんかりき違うなと気を付けたって、一番うのいって六人を逐っ放してやった。おれは言葉や様子こそはより比べしちの山嵐と赤っしかにやろうと思ってしまった。そうしくねえ、行くなんか。校長と山嵐に似たくさ。おれはこれを見ると、また赤シャツの同じ所より気に付けて一応じゃしない。けれともういうんですが、宿屋上はついてい、何ヶ月がわかい」』
【確認テスト】 Q:LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。
A: LSTM:パラメータ数が多く、計算負荷が高くなり学習時間が長くなる CEC:保持する過去のデータ量が多く、多大なメモリを必要とする。
Section4:双方向RNN 【要点】 双方向RNNは過去の情報だけでなく、未来の情報を加味することで、精度を向上させるためのモデルである。過去と未来の情報を、文脈として学習する必要がある機械翻訳等で実用されている。
構造を下記に示す。
入力はそれぞれおよび層に送られ、過去および未来からの情報との積をとる。及びからの情報をもとに出力を生成する。
Section5:Seq2Seq 【要点】 Seq2seqはEncoder-Decoderモデルの一種である。機械対話や機械翻訳等の自然言語処理に使用されている。 Seq2seq全体図を下記に示す。
例えば日本語から英語への翻訳であれば、入力xは日本語の文章になる。 日本語文章をEncoderで時系列のベクトル表現hにする。ベクトル表現hはDecoderにて英語文章の出力yに変換される。
詳細手順は以下となる。 ①Taking:文章を単語等のトークン毎に分割し、IDを付与する。 ②Embedding:付与したIDごとに、そのトークンを表す分散表現ベクトルに変換する。 ③Encoder RNN:vec1を RNNに入力し、隠れ層からの出力を得る。この隠れ層出力と次の入力vec2をRNNに入力し次の隠れ層出力を得る。この工程を繰り返し、最終出力をfinal state(thought vector)と呼び、入力した文の意味を表すベクトルとなる。 ④Decoder RNN:final state(thought vector)から、各トークンの生成確率を出力する。 ⑤Sampling:生成確率に基づいてトークンをランダムに選ぶ。 ⑥Embedding:⑤で選ばれたトークンをEmbeddingして、Decoder RNNの次の入力とする。 ⑦Detokenize:④~⑥を繰り返し、②で得られたトークンを文字列に直す。
【確認テスト】 Q1:seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。
A1:seq2seqは一問一答しかできないのに対し、HREDは過去n-1個の発話を踏まえて応答を行う。しかしHREDは会話の「流れ」のような多様性がなく、情報量に乏しいと答をしがちな課題がある。VHREDはHREDにVAEの潜在変数の概念を追加することで、HREDの課題を解決した。
Q2:VAEに関する下記の説明の空欄を埋めよ。 『自己符号化器の潜在変数に____を導入したもの。』
A2:確率分布
Section6:Word2vec 【要点】 RNNでは単語のような可変長の文字列をニューラルネットワークへ与えることはできない。 単語をニューラルネットワークへ入力するためには、固定長形式に変換する必要がある。 word2vecは単語をベクトル(固定長形式)に変換する技術を指す。
word2vecは学習データからボキャブラリを作成する。 ベクトルはone-hot表現によって単語を表す。 word2vecはボキャブラリ×任意の単語ベクトル次元で重み行列を生成するため、 大規模データの分散表現の学習が現実的な計算速度とメモリ量で実現可能になった。
Section7: Attention Mechanism 【要点】 seq2seqは何単語の文章であっても、固定次元ベクトルの中に入力する必要がある。 そのためseq2seqは長い文章への対応が難しいことが課題であった。 そこで、文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていくような仕組みが必要になる。
解決策として考案されたのが、Attention Mechanismである。 Attention Mechanismは「入力と出力のどの単語が関連しているのか」の関連度を学習する仕組みである。
Attention Mechanismではi番目の単語に対して、j番目の単語が関連している確率をで表す。 はsoftmax関数であり、総和が1になる。
とj番目のencoderの隠れ層の値の積の総和をとり、decoderのi番目の単語の隠れ層への入力とすることで、関連度が学習できる。
【確認テスト】 Q:RNNとword2vec、seq2seqとAttentionの違いを簡潔に述べよ。
A:RNNは単語のような可変長の文字列をニューラルネットワークへ与えることはできない。word2vecは単語をベクトル(固定長形式)に変換し、RNNへの入力を可能にした技術である。 seq2seqは何単語の文章であっても、固定次元ベクトルの中に入力するのに対し、 Attention Mechanismは「入力と出力のどの単語が関連しているのか」の関連度を学習することで、 文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく。
Section1:強化学習 【要点】 強化学習とは機械学習の一分野で、長期的に報酬を最大化できるエージェントを作ることを目的とする。 強化学習は状態関数S、方策関数π、価値関数Vを更新することで学習を進める。 学習を進めるにあたって、未知の行動をとる「探索」と過去の経験を活かす「利用」のトレードオフを適切にとることが重要である。
価値関数は状態価値関数と行動価値関数の2種類がある。ある状態Sの価値に着目する場合は状態価値関数。状態Sと行動aを組み合わせた価値に着目する場合は行動価値関数Q(S,a)をとる。 Q学習は行動価値関数を、行動するたびに値を更新することににより学習を進める手法である。 学習はニューラルネットワークの誤差逆伝播に似た、方策勾配法を用いる。
【実装演習結果】 ディープラーニングを利用したQ学習を実装した。 Q値を出力するニューラルネットワークをKerasで構築し、Q値が正解に近づくように訓練した。 Q学習に用いる式は以下で表される。 ここでは行動、、はQ値、は学習係数、は報酬、は割引率になる。
エージェントをクラスとして実装し、x座標が-1から1まで、y座標が-1から1までの正方形の領域を考える。エージェントの初期位置はx=-1とする。エージェントには自由落下とジャンプの行動を選択し、エージェントがx=1に到達したら、報酬1を与え、エージェントがy=-1,1に達した場合は報酬-1を与えた。
γの値を0.99に設定し、εが減衰するようにした。 これにより、次第にQ学習が行われるようになった。y=-1,1に達せずにエージェントがx=-1に到達できるようになった。
Section2:AlphaGo 【要点】 AlphaGo(Lee)はPolicyNet, ValueNet, RollOutPolicyで強化学習を進めた、囲碁のエージェントである。
PolicyNetは以下に示すニューラルネットワークであり、19×19マスの着手予想確率が出力される。
ValueNetは以下に示すニューラルネットワークであり、現局面の勝率を-1~1で示す。
RollOutPolicyはニューラルネットワークではなく、線形の方策関数である。 探索中に高速で着手予想確率を出すために使用される。
AlphaGo(Lee)は以下のステップで学習を行う。
1.教師あり学習によるRollOutPolicyとPolicyNetの学習 2.強化学習によるPolicyNetの学習 3.強化学習によるValueNetの学習
一方AlphaGo Zeroでは教師あり学習を行わず、強化学習のみで学習を行った。 また、特徴入力からヒューリスティックな要素を排除し、石の配置のみにした。 などがAlphaGo(Lee)と異なる。
Section3:軽量化・高速化技術 【要点】 1.分散学習 深層学習に必要な計算量は膨大であるため、高速化のためには複数の計算資源を使用し、並列的にニューラルネットワークを構成することが必要である。 分散学習の高速化技術を下記に示す。 ①データ並列化 親モデルを各ワーカに子モデルとしてコピーさせる。データは分割し、各ワーカごとに分割したデータを計算させる手法である。 各ワーカが計算が終わるのを待ち、全ワーカの勾配が出たところで平均をとり、親モデルのパラメータをとるのが同期型で、データ並列化の主流方法である。
②モデル並列化 親モデルを各ワーカーに分割し、それぞれのモデルを学習させる手法である。全てのデータで学習が終わった後で、一つのモデルに復元する。モデルが大きい時はモデル並列化を、データが大きい時はデータ並列化と使い分ける必要がある。
③GPU ディープラーニングの学習にはCPUよりも、簡単な並列計算を得意とするGPUを用いたほうが高速化が可能である。
2.軽量化 モバイル端末やIoT端末にモデルを搭載するための軽量化手法を以下に示す。 ①量子化 演算精度を64bitから32bit又は16bitに落とし、メモリ使用量を低減する。 bitを精度が低下するデメリットが発生するが、精度がほぼ変わらないモデルも多い。
②蒸留 精度の高いニューロンの規模が大きなモデルを教師として、簡便な軽量モデルを生成する手法である。 教師モデルの重みを固定し、生成モデルとの出力に対する誤差が小さくなるように、生成モデルの重みを更新していく。
③プルーニング ニューラルネットワークにおいて、出力に対して寄与の少ないニューロンをモデルから削減し高速化と小メモリ化を行う技術である。
Section4:応用モデル 【要点】 ①MobileNet 一般的なCNNのディープラーニングモデルと比較し、軽量化・高速化・高精度化を実現したモデルである。 MoblieNetではDepthwise Convolution層とPointwiseConvolution層を、通常のCNN層の代替として重ねる。Depthwise Convolutionはフィルタ数1での畳み込み、PointwiseConvolutionは1x1カーネルでの畳み込みである。 これにより通常のCNNであれば計算量がH x W x K x K x C x Mになるのに対し、MoblieNetではH x W x K x K x C + H x W x C x Mとなり、計算量が低減される。
②DenseNet CNNの層を深くするため、DenseBlock層を間に挟むことで、勾配消失問題を解決した。 DenseBlock層では前の層の情報に出力結果を新たなチャンネルとして追加する。すなわち出力チャンネル数がkであった場合、次の層の入力は前の層の入力+kとなる。
③正規化 Batch Normはミニバッチに含まれるsampleの同一チャネルが同一分布に従うよう正規化する手法である。しかし、ミニバッチサイズは計算機の性能によって変動するため、バッチ正規化の効果を比較しにくい課題があった。 そのため、それぞれのsampleの全てのpixelsが同一分布に従うよう正規化する、Layer Normや単一チャンネルで正規化するInstance Normが用いられている。
④Wavenet 生の音声波形を生成する深層学習モデルである。 層が深くなるにつれて畳み込むリンクを離すDilated convolutionを用いている。
Section5:Transformer 【要点】 Transformerは自然言語処理に用いる、Encoder-Decoder型のニューラルネットワークである。特徴として、RNNを使用せずAttention機構のみでネットワークを構成している。Transformerの主要モジュールを下記に示す。
Attentionは以下にて定義される ここでQ:query、K:key、V:valueである。queryに一致するkeyを検索し、対応するvalueを取り出す操作とみなすことができる。 TransformerではQKVが全てソースのSelf-Attention機構を用いて各単語をエンコードする。QKVが全てソースであるため、各単語が文脈を考慮してエンコードされる。デコーダでも自己注意機構を使用するが、未来の情報を見ないようにマスクされている。 Transformerモデルの利点は ・文長が長くなっても処理精度が落ちない ・RNNを使用しないのでRNNモデルより計算量が小さい ことがあげられる。
【実装演習結果】 Transformerを用いた自然言語処理の実装を行った。 今回は田中コーパスを学習させて、英語から日本語への学習を行った。 学習は15エポックまで行い、検証データのBLEU値が飽和したため学習を止めた。学習ログを下記に示す。 学習したTransformerモデルにテストデータで評価した結果BLEU値は22.9となった。下記に本モデルでの翻訳例を添付する。
Section6:物体検知・セグメンテーション 【要点】 物体検知は画像内の物体に対し、BoundingBox(BB)の範囲と物体のクラスを識別することがタスクである。物体検知の代表的なデータセットとしてはVOC12、ILSVRC17、MS COCO18などが存在する。これらのデータセットはBox/画像やクラス数が異なるため、目的に応じたデータセットの選択が必要となる。
物体検知の指標評価としてIoUが用いられる。IoUはGround-Truth BBとPredicted BBのOverlapをUnionで割った値となり、BBの識別指標となる。IoUの閾値を決めて、全Predicted BBのうち閾値以上であったPredicted BBの割合がPrecisionとなる。ここで特定のクラスラベルにおいてクラス分類の閾値を変えながら、Precisionを算出する。Precision-Recall cuveの下側面積をAPと呼ぶ。さらに複数クラス間のAPの平均がmAPと定義される。 また、検出速度についてはFPSという指標で評価を行う。
物体検知のフレームワークは2段階検出器と1段階検出器に分類される。候補領域の検出とクラス推定を同時に行うか、別々に行うかの違いがある。2段階が高精度、1段階が高速である。 代表的なフレームワークにSSDがある。SSDは1段階検出器である。SSDはVGG16をもとに作成されたニューラルネットワークである。
深層学習day3
Section1:再帰型ニューラルネットワークの概念 【要点】 再帰型ニューラルネットワーク(RNN)とは時間的順序を追って一定間隔ごとに観測され、相互に統計的依存関係が認められるデータ系列(時系列データ)に対応可能なニューラルネットワークである。
RNNの構成例を下記に示す。
通常のニューラルネットワークと異なり、前時間t-1の中間層の出力と重みWの内積をとり、現時間tの中間層への入力としている。
RNNは数学的には以下のように記載される。
ここで x:RNNへの入力, W(in):RNNへの入力に対する重み, W:前時間の中間層の出力に対する重み, b:バイアス u:中間層への総入力, f:中間層で作用させる活性化関数 z:中間層の出力, W(out):出力層への入力に対する重み, c:バイアス, v:出力層への総入力 g:出力層で作用させる活性化関数, y:出力層からの出力
一方RNNにおける誤差逆伝播をBPTTとよぶ。 BPTTは数学的には以下のように記載される。 通常の誤差伝播法と同様に、誤差関数Eの偏微分を連鎖律で計算している。 また、[ ]の右上のTは時間をさかのぼって微分することを意味している。 誤差関数Eに対するuの偏微分をδとし、前時間のδに対する関係は以下で表される。
ここからパラメータの更新式は以下であらわされる。ここでεは更新率である。