【ラビットチャレンジ】 深層学習:その3 Day3まとめ

ラビットチャレンジ 深層学習:その3

前回からのおさらい

確認テスト

    サイズ5×5の入力画像を、サイズ3×3のフィルタで 畳み込んだ時の出力画像のサイズを答えよ。 なおストライドは2、パディングは1とする。

→ 3×3 画像

(5 + 2 * 1 - 3) / 2 + 1 = 3

Section1) RNN

  • RNNとは?
  • 時系列データとは?
  • 時間的順序を追って一定間隔ごとに観察され,しかも相互に統計的依存関係が認められるようなデータの系列
    • 音声データ
    • テキストデータ
  • 中間層が重要な意味を持ってくる

RNN全体像

f:id:n_morioka:20190708011622p:plain f:id:n_morioka:20190708011642p:plain f:id:n_morioka:20190708011707p:plain

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

確認テスト

    RNNのネットワークには大きくわけて3つの重みが ある。1つは入力から現在の中間層を定義する際に かけられる重み、1つは中間層から出力を定義する際に かけられる重みである。 残り1つの重みについて説明せよ。

→ 中間層から次の中間層にかけられる重みがある

RNNの特徴とは

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

Jupyter演習

weight_init_std = 1 f:id:n_morioka:20190708011822p:plain

Xavier f:id:n_morioka:20190708011849p:plain

He f:id:n_morioka:20190708011912p:plain

Relu f:id:n_morioka:20190708011932p:plain

tanh

    def d_tanh(x):
        return 1/(np.cosh(x) ** 2)

f:id:n_morioka:20190708012006p:plain

BPTT

BPTTとは? Backpropagation Through Time RNNにおいてのパラメータ調整方法の一種 ↓ 誤差逆伝播の一種

※ 人に教える → 誤差逆伝搬法を説明してみよう 計算結果(=誤差)から微分を逆算することで、不要な再帰的計算を避けて 微分を算出できる。

確認テスト

    連鎖律の原理を使い、dz/dxを求めよ。 
    z = t^2
    t = x +y

dz/dx = dz/dt * dt/dx dz/dt = 2t dt/dx=1

BPTTの数学的記述

f:id:n_morioka:20190708012129p:plain

f:id:n_morioka:20190708012143p:plain

確認テスト

    下図のy1をx・s0・s1・win・w・woutを用いて数式で表せ。 ※バイアスは任意の文字で定義せよ。 ※また中間層の出力にシグモイド関数g(x)を作用させよ。

f:id:n_morioka:20190708012219p:plainf:id:n_morioka:20190708012237p:plain

ビジネス事例

速度のためにGPUを使いたい → AWSGCPを利用している

講師の人はスマートミラーを開発している

  • 肌検出、異常検知
  • キャラクターAI

などなど

※ ユーザーのためになるなら、AIを投入するのはやっていって良いのでは?

BTPPの全体像

パラメータの更新式 f:id:n_morioka:20190708012325p:plain

コード演習問題

※解説 RNNでは中間層出力 h{t}が過去の中間層出 力 h{t-1},.., h{1}に 依存する。 RNNにおいて損失関数を重 みWやUに関して偏微分す るときは、それを考慮する必 要があり、 dh{t}/dh_{t-1} = U であることに注意すると、過 去に遡るたびにUが掛けられ る。

Section2) LSTM

LSTM = Long short-term memory

RNNの課題

時系列を遡れば遡るほど、勾配が消失していく。 → 長い時系列の学習が困難。

勾配消失問題

誤差逆伝播法が下位層に進んでいくに連れて、勾配がどんど ん緩やかになっていく。 そのため、勾配降下法による、更新では下位層のパラメータ はほとんど変わらず、訓練は最適値に収束しなくなる。

解決策として活性化関数を調整する → シグモイド関数など → 0 ~ 1の間を緩やかに変化する関数で、ステップ関数ではON/OFFしかない 状態に対し、信号の強弱を伝えられるようになり、予想ニューラルネットワーク普 及のきっかけとなった。 → 大きな値では出力の変化が微小なため、勾配消失問題を引き起こすがあった

f:id:n_morioka:20190708012433p:plain

確認テスト

シグモイド関数を微分した時、入力値が0の時に最大値 をとる。その値として正しいものを選択肢から選べ。

→ 0.25

勾配爆発

勾配が、層を逆伝播するごとに指数関数的に大きくなっていく

演習チャレンジ

RNNや深いモデルでは勾配の消失または爆発が起こる傾向がある。勾配爆発を防ぐために勾配のクリッピングを行うという 手法がある。具体的には勾配のノルムがしきい値を超えたら、勾配のノルムをしきい値に正規化するというものである。以下は勾配のクリッピングを行う関数である。
(さ)にあてはまるのはどれか。

→ (1) gradient * rate

勾配のノルムがしきい値より大きいときは、勾配のノルムをしきい値に正規化するので、クリッピングした勾配は、勾配×(し きい値/勾配のノルム)と計算される。つまり、gradient * rateである。

つまり、delta_t = delta_t.dot(U)となる。

CEC

勾配消失および勾配爆発の解決方法として、勾配が、1であれば解決できる。

課題

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

入力ゲート・出力ゲート

入力・出力ゲートの役割とは?

入力・出力ゲートを追加することで、 それぞれのゲートへの入力値の重みを、 重み行列W,Uで可変可能とする。

CECの課題を解決

忘却ゲート

LSTMの現状(CEC, 入出力ゲートのみ) CECは、過去の情報が全て保管されている → 過去の情報が要らなくなった場合、削除することはできず、保管され続ける

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

確認テスト

以下の文章をLSTMに入力し空欄に当てはまる単語を予測したいとする。 文中の「とても」という言葉は空欄の予測において なくなっても影響を及ぼさないと考えられる。 このような場合、どのゲートが作用すると考えられるか。
「映画おもしろかったね。ところで、とてもお腹が空いたから何か____。」

→ 忘却ゲート

演習チャレンジ

以下のプログラムはLSTMの順伝播を行うプログラムである。ただし_sigmoid関数は要素ごとにシグモイド関数を作用 させる関数である。
(け)にあてはまるのはどれか。

→ 3

新しいセルの状態は、計算されたセルへの入力と1ステップ前のセルの状態に入力ゲート、忘却ゲートを掛けて足し合 わせたものと表現される。つまり、input_gate * a + forget_gate * prev_cとなる

のぞき穴結合

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

  • 覗き穴結合とは?
    • CEC自身の値に、重み行列を介して伝播可能にした構造。

Section3) GRU

LSTMの課題 → LSTMでは、パラメータ数が多く、計算負荷が高くなる問題があった → GRUで解決する

GRUとは?

Gated Recurrent Unit 従来のLSTMでは、パラメータが多数存在していたため、計算負荷が大きかった。しかし、GRUでは、そのパラメータを大幅に削減 し、精度は同等またはそれ以上が望める様になった構造。 → 構造を変えたLSTM。大幅に構造が変わっている

※ 必ずしもGRUがLSTMの上位互換ではない

確認テスト

LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。

LSTMはパラメータ数が多く、計算負荷が高い CECは勾配が1になるので、最適なパラメータを学習するという概念がなくなってしまう

演習チャレンジ

GRU(Gated Recurrent Unit)もLSTMと同様にRNNの一種であり、単純なRNNにおいて問題となる勾配消失 問題を解決し、長期的な依存関係を学習することができる。LSTMに比べ変数の数やゲートの数が少なく、より単純 なモデルであるが、タスクによってはLSTMより良い性能を発揮する。以下のプログラムはGRUの順伝播を行うプログラム である。ただし_sigmoid関数は要素ごとにシグモイド関数を作用させる関数である。
(こ)にあてはまるのはどれか。

→ 4

新しい中間状態は、1ステップ前の中間表現と計算された中間表現の線形和で表現される。つまり更新ゲートzを用 いて、(1-z) * h + z * h_barと書ける。

確認テスト

LSTMとGRUの違いを簡潔に述べよ

→ パラメータの数がLSTMの方が多い。そのためGRUの方が実行速度の面で有利 どっちがどのタスクで有利かはケースバイケース

Section4) 双方向RNN

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

演習チャレンジ

以下は双方向RNNの順伝播を行うプログラムである。順方向については、入力から中間層への重みW_f, 一ステッ プ前の中間層出力から中間層への重みをU_f、逆方向に関しては同様にパラメータW_b, U_bを持ち、両者の中 間層表現を合わせた特徴から出力層への重みはVである。_rnn関数はRNNの順伝播を表し中間層の系列を返 す関数であるとする。(か)にあてはまるのはどれか

→ 4 np.concatenate([h_f, h_b[::-1]], axis=1)

双方向RNNでは、順方向と逆方向に伝播したときの中間層表現をあわせたものが特徴量となるので、 np.concatenate([h_f, h_b[::-1]], axis=1)である。

※ np.concatenateは配列の結合。axisに指定した軸方向に新しい要素を追加するため、axisによっては配列の形状が噛み合わないとエラーが発生します。(1次元配列ではaxis=1以上はエラー)

Section5) Seq2Seq

  • Seq2Seqとは?
    • Encoder-Decoderモデルの一種
  • Seq2seqの具体的な用途とは?

Encoder RNN

ユーザーがインプットしたテキストデータを、 単語等のトークンに区切って渡す構造

f:id:n_morioka:20190708013133p:plain

  • Taking : 文章を単語等のトークン毎に分割し、トークンご とのIDに分割する。
  • Embedding : IDから、そのトークンを表す分散表現ベクトル に変換。
  • Encoder RNN:ベクトルを順番にRNNに入力していく

vec1をRNNに入力し、hidden stateを出力。 このhidden stateと次の入力vec2をまたRNNに入力してき たhidden stateを出力という流れを繰り返す。 最後のvecを入れたときのhidden stateをfinal stateとし てとっておく。このfinal stateがthought vectorと呼ばれ、 入力した文の意味を表すベクトルとなる

Decoder RNN

システムがアウトプットデータを、 単語等のトークンごとに生成する構造

f:id:n_morioka:20190708013209p:plain

確認テスト

下記の選択肢から、seq2seqについて説明しているものを選べ。
(1)時刻に関して順方向と逆方向のRNNを構成し、それら2つの中間層表現を特徴量として利用 するものである。
(2)RNNを用いたEncoder-Decoderモデルの一種であり、機械翻訳などのモデルに使われる。
(3)構文木などの木構造に対して、隣接単語から表現ベクトル(フレーズ)を作るという演算を再帰的に行い(重みは共通)、文全体の表現ベクトルを得るニューラルネットワークである。
(4)RNNの一種であり、単純なRNNにおいて問題となる勾配消失問題をCECとゲートの概念を 導入することで解決したものである。

→ 2

演習チャレンジ

機械翻訳タスクにおいて、入力は複数の単語から成る文(文章)であり、それぞれの単語はone-hotベクトルで表 現されている。Encoderにおいて、それらの単語は単語埋め込みにより特徴量に変換され、そこからRNNによって (一般にはLSTMを使うことが多い)時系列の情報をもつ特徴へとエンコードされる。以下は、入力である文(文 章)を時系列の情報をもつ特徴量へとエンコードする関数である。ただし_activation関数はなんらかの活性化関 数を表すとする。
(き)にあてはまるのはどれか。

→ 1

単語wはone-hotベクトルであり、それを単語埋め込みにより別の特徴量に変換する。これは埋め込み行列E を用いて、E.dot(w)と書ける。

HRED

Seq2seqの課題 → 一問一答しかできない

問に対して文脈も何もなく、ただ応答が行われる 続ける。

HREDとは? → 過去 n-1 個の発話から次の発話を生成する

Seq2seqでは、会話の文脈無視で、 応答がなされたが、HREDでは、 前の単語の流れに即して応答されるため、 より人間らしい文章が生成される。

HRED = Seq2Seq+ Context RNN

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

VHRED

HREDに、VAEの潜在変数の概念を追加したもの。 → HREDの課題を、 VAEの潜在変数の概念を追加することで解決した構造。

※ 毎回同じ答えしか出ないというHREDの課題を解決するもの

確認テスト

seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。

Seq2seqとHREDの違い → 1問1答しか出来ない構造を改修したのがHRED HREDとVHREDの違い → 同じ文脈だと毎回同じ答えしか出ないHREDを改修したのがVHRED

AE(オートエンコーダ)

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

オートエンコーダ具体例

MNISTの場合、28x28の数字の画像を入れて、 同じ画像を出力するニューラルネットワークということ

オートエンコーダ構造説明

入力データから潜在変数zに変換するニューラルネットワークをEncoder 逆に潜在変数zをインプットとして元画像を復元するニューラルネットワーク をDecoder。

メリット → 次元削減が行えること

牽引企業

  • AWS
    • 使いやすい
  • GCP
    • TPUとかのせいでNVIDIA-GPUが使えてない
    • 若干の使いにくさ

※ TensorFlowについては講師の人も勉強している

VAE

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

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

f:id:n_morioka:20190708013614p:plain

確認テスト

VAEに関する下記の説明文中の空欄に当てはまる言葉を答えよ。
自己符号化器の潜在変数に____を導入したもの。

→ 確率分布

Section6) word2vec

課題:RNNでは、単語のような可変長の文字列をNNに与えることはできない。 → 固定長で単語を表す必要がある

学習データからボキャブラリを作成 わかりやすく7語のボキャブラリを作成したら 本来は、辞書の単語数だけできあがる

Ex) I want to eat apples. I like apples.
{apples,eat,I,like,to,want}

One-hot ベクトル

Applesを入力する場合は、入力層には以下のベクトルが入力される。 → 本来は、辞書の単語数だけone-hotベクトルができあがる。

    1...apples 
    0...eat 
    0...I 
    0...like 
    0...to
    …

word2vecのメリット

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

X:ボキャブラリ×ボキャブラリだけの重み行列が誕生。
○:ボキャブラリ×任意の単語ベクトル次元で重み行列が誕生。

Section7) Attention Mechanism

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

解決策: 文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく、 仕組みが必要になる → Attention Mechanism → 「入力と出力のどの単語が関連しているのか」 の関連度を学習する仕組み。

具体例

f:id:n_morioka:20190708013841p:plain

確認テスト

RNNとword2vec、seq2seqとseq2seq+Attention Mechanismの違いを簡潔に述べよ。

word2vecはwordに対して重みをつけて、現実的な処理速度にしている。RNNはボキャブラリ×ボキャブラリでデータを処理する seq2seqに比べてAttention Mechanismは長い文章を入れたときにでも翻訳として成り立ちやすい。入出力間の重要度が学習に対して効いてくる

演習チャレンジ

 以下は再帰的ニューラルネットワークにおいて構文木を入力として再帰的に文全体の表現ベクトルを得るプログラムである。ニューラルネットワークの重みパラメータはグローバル変数として定義してあるものとし、_activation関数はなんらかの活性化関数であるとする。木構造は再帰的な辞書で定義してあり、rootが最も外側の辞書であると仮定する。
(く)にあてはまるのはどれか

→ 2 W.dot(np.concarenate([left, right))

実務経験をつむ

※ 経験をつむにはできるだけデータが多い企業で働いたほうがよい データを使ったモデルがどうサービスとして使えるかも観点