深層学習day3 Section7:Attention Mechanism

要点まとめ

seq2seq では最終的なthroughout vectorが固定長であるため、長い文章になると意味を正しく表現できない問題がある。文章の長さに応じて出力するベクトル長が変化する仕組みが必要となる。 そのため Attention Mechanismが発明され、どの単語が重要なのかを判断して中間層を更新する仕組みがある。このことで、固定長ベクトルでもより適切な表現を中間層として保持することが可能になっている。

実装演習

実装演習なし

確認テスト等考察

RNN:Recurrent Neural Networkは時系列データを扱うために、時間軸で情報を関連付ける仕組みを持ったNN。

word2vec:単語をone-hot-vectorではなく、embedded表現とすることで、より小さなサイズで自然言語を扱えるようにする表現方法。

seq2seq:embedded表現のベクトルを入力として内部の隠れ層を更新するEncoderと、隠れ層から一文を作成するDecoderとからなる、自然言語用のネットワーク。

Attention:seq2seqで隠れ層の更新を行う際に、各単語の重要度・関連度により更新量に重みを付けることで、固定長ベクトルでもより適切な内部表現を作成する仕組み。

追加演習

ぜろつく②の8章 Attentionの実装を実施。 Attentionを適用することで、2回のEPOCHで十分なAccuracyを得ることができる。 f:id:yui-gen-ron:20211230025536p:plain

深層学習day3 Section6:word2vec


要点まとめ

単語を機械学習が扱えるベクトルに変換するときに、one-hot-vectorだと単語の数だけの要素数になってしまい、数万という要素数になってしまう。これを、embedding表現にすることで要素数が数百のベクトルで表現するようにする手法をword2vecという。

word2vecを用いてサイズの小さなベクトルに変換することで、事前言語を現実的な計算速度で扱えるようになった。

実装演習

なし

確認テスト等考察

単語を個別の単語として扱うone-hot-vectorではなく、単語を意味として扱うembedding表現とすることで、より小さなサイズで自然言語で表現することを可能にしている。

追加演習

ぜろつく②の3章でCBOWの実装を実施。

f:id:yui-gen-ron:20211230004557p:plain
CBOW

深層学習day3 Section5:seq2seq


要点まとめ

seq2seqとは機械翻訳等に用いられる自然言語用のネットワーク。 2つのネットワークから成り、1つ目は入力から隠れ層のベクトル表現に変換する。(Encoder)

2つ目は隠れ層のベクトル表現を別の表現に変換する。(Decoder)

Encoder RNN

自然言語機械翻訳への入力するためには、文章を単語で区切りone-hotベクトルで表現すると単語の数(1万~数10万)程度になるが、あまりに大きすぎる。これを小さな情報量で表現するために、embedding表現という 意味を表現する数百程度のベクトルで表現する。

実際の学習ではembedding表現のベクトルを入力として隠れ層を更新していき、最後の入力で更新された後の隠れ層をfinal stateとしてとっておく。final state がthroughout vectorと呼ばれ、入力した文の意味を表すベクトルとなる。

単語をembedding表現に変換する方法は人間がラベル付けを行うのではなく、機械学習で行う。 googleが開発したBERTというものがあり、MLM(Masked Language Model)という、ある文の一部の単語を推測するようなモデルを学習させることでemgedding表現への変換を教師なし学習で行うことができる。

Decoder RNN

Encoderが作成した隠れ層から別の文章を生成する機能のこと。

HRED

seq2seqは入力一文、出力一文の応答しかできないという問題があり、前後の文脈は関係がなかった。 seq2seqの入力に対して得られた隠れ層を次の入力の隠れ層に引き継ぐことで、過去の発話を加味した応答ができることを期待したもの。しかし、応答がワンパターンで短くなりがちという欠点があった。

VHRED

VHREDはHREDに対して、VAEの潜在変数の概念を導入したもの。 平均0分散1の情報になる。

オートエンコーダー

元々画像認識で用いられたもので、入力画像をより小さい情報zに変換するエンコーダーと、元の画像に戻すデコーダーを教師なし学習させるもの。zに次元削減する機能といえる。

実装演習

講義ビデオ中に無し。

確認テスト等考察

1が双方向RNN、2がseq2seq、3が構文木、4がLSTMを指している。

追加演習

ゼロつく2の7章にある、seq2seqを写経実施。

f:id:yui-gen-ron:20211229005047p:plain

深層学習day3 Section4:双方向RNN

要点まとめ

双方向RNNとは過去の情報だけではなく、未来の情報も用いて精度を向上させるモデルのこと。 実用例としては文章の推敲や機械翻訳などがある。 機械翻訳等は未来の情報も用いることで、前後の文脈から意味を出力することが可能になる。

過去からの情報s_{t}は、一つ過去の情報s_{t-1}と現在の情報x_{t}とから計算される。 未来からの情報s'_{t}は、一つ未来の情報s'_{t+1}と現在の情報x_{t}とから計算される。

実装演習

実装演習がないので、演習チャレンジについて記述。

確認テスト等考察

なし

追加演習

なし

深層学習day3 Section3:GRU

要点まとめ

LTSMでは演算負荷が大きく、学習時間がかかってしまうのが問題だった。

GRU (Gated Recurrent Unit)は演算量を削減して改善したもの。

数式

入力x(t)対する重みW、前回の出力h(t-1)に対する重みUを用いて、

リセットゲートの出力

 \displaystyle{
r(t) = W_{r}x(t)+U_{r} \cdot h(t-1)+b_{h}(t)
}

活性化関数f()を通すと、

 \displaystyle{
h(t) = f(W_{r}x(t)+U_{r} \cdot h(t-1)+b_{h}(t))
}

また、更新ゲートの出力は、

 \displaystyle{
z(t)=W_{z}x(t)+U_{z}\cdot h(t-1)+b_{z}(t)
}

これらから、次の出力を計算する。

 \displaystyle{
z(t)\cdot h(t-1) + (1-z(t))\cdot h(t)
}

実装演習

predict_wordを流して確認。 f:id:yui-gen-ron:20211228023201p:plain

確認テスト等考察

LSTMは部品の数が多い。その背景として、CECが記憶機能だけで学習機能を持たない。そのため入力ゲートや出力ゲートなどの機能を使用する必要があり、演算量を増加させていた。

深層学習day3 Section1:再帰型ニューラルネットワークの概念

要点まとめ

RNNの概要

再帰ニューラルネットワーク (RNN=Recurrent Neural Network)とは、時系列データのように時間的な繋がりを持つデータを扱うためのネットワーク。

時系列データの代表例としては、音声データ・テキストデータ等がある。

通常のNNでは入力→中間層→出力という構成だが、中間層への入力に対して一つ前の時系列データの中間層からを入力とすることで、時間軸の繋がりを持つ構成にしたものをRNNという。

RNNの数学的な記述


\displaystyle
u^{t} = \boldsymbol{W}_{(in)}\boldsymbol{x}^{t} + \boldsymbol{W}\boldsymbol{z}^{t-1} + b


\displaystyle
z^{t} = f(\boldsymbol{W}_{(in)}\boldsymbol{x}^{t} + \boldsymbol{W}\boldsymbol{z}^{t-1} + b)


\displaystyle
v^{t} = \boldsymbol{W}_{(out)}\boldsymbol{z}^{t} + c


\displaystyle
y^{t} = g(\boldsymbol{W}_{(out)}\boldsymbol{z}^{t}+c)

u^{t}は活性化関数を通す前、活性化関数を通したものをz^{t} という中間層となる。

出力側も同様に、活性化関数を通す前をv^{t}、活性化関数を通した後の出力をy^{t}としている。

誤差逆伝播の記述

BPTT(Back Propergation Through Time)の式は前記のRNNの式を微分を用いるが、かなり複雑。

 
\newcommand{\partialdiff}[2] {\frac{\partial {#1}}{\partial{#2}}}
\displaystyle
\partialdiff{\boldsymbol{E}}{\boldsymbol{W}_{(in)}} = \partialdiff{\boldsymbol{E}}{u^{t}}[\partialdiff{u^{t}}{\boldsymbol{W}_{(in)}}]^T = \delta^{t}[x^{t}]^T \\
\displaystyle
\partialdiff{\boldsymbol{E}}{\boldsymbol{W}_{(out)}} = \partialdiff{\boldsymbol{E}}{v^{t}}[\partialdiff{v^{t}}{\boldsymbol{W}_{(out)}}]^T = \delta^{out,t}[z^{t}]^T \\
\displaystyle
\partialdiff{\boldsymbol{E}}{\boldsymbol{W}} = \partialdiff{\boldsymbol{E}}{u^{t}}[\partialdiff{u^{t}}{\boldsymbol{W}}]^T = \delta^{t}[z^{t-1}]^T \\
\displaystyle
\partialdiff{\boldsymbol{E}}{b} = \partialdiff{\boldsymbol{E}}{u^{t}}\partialdiff{u^{t}}{b} = \delta^{t} \\
\displaystyle
\partialdiff{\boldsymbol{E}}{c} = \partialdiff{\boldsymbol{E}}{v^{t}}\partialdiff{v^{t}}{c} = \delta^{out,t}

パラメータの更新式は

 \displaystyle{
\boldsymbol{W}^{t+1}_{(in)} = \boldsymbol{W}^{t}_{(in)} - \epsilon \partialdiff{\boldsymbol{E}}{\boldsymbol{W}_{(in)}} =  \boldsymbol{W}^{t}_{(in)} - \epsilon \sum^{T_{t}}_{z=0} {\delta}^{t-z}[\boldsymbol{x}^{t-z}]^{T} \\
\boldsymbol{W}^{t+1}_{(out)} = \boldsymbol{W}^{t}_{(out)} - \epsilon \partialdiff{\boldsymbol{E}}{\boldsymbol{W}_{(out)}} =  \boldsymbol{W}^{t}_{(out)} - \epsilon {\delta}^{out,t}[\boldsymbol{z}^{t}]^{T} \\
\boldsymbol{W}^{t+1} = \boldsymbol{W}^{t} - \epsilon \partialdiff{\boldsymbol{E}}{\boldsymbol{W}} =  \boldsymbol{W}^{t} - \epsilon \sum^{T_{t}}_{z=0} {\delta}^{t-z}[\boldsymbol{z}^{t-z-1}]^{T} \\
b^{t+1} = b^{t} - \epsilon \partialdiff{\boldsymbol{E}}{b} = b^{t} - \epsilon \sum^{T_{t}}_{z=0} \delta^{t-z} \\
c^{t+1} = c^{t} - \epsilon \partialdiff{\boldsymbol{E}}{c} = c^{t} - \epsilon \delta^{out,t}
}

実装演習

バイナリ加算についてのRNNの結果を確認。

f:id:yui-gen-ron:20211227023511p:plain
バイナリ加算
f:id:yui-gen-ron:20211227023531p:plain
lossの変化

確認テスト等考察

現在の中間層への、前の中間層からの入力にも重みがあるのがRNNの特徴である。

深層学習day3 Section2:LSTM

要点まとめ

RNNは時系列を遡るほど勾配が消失していき、長い時系列の学習が困難である。特に活性化関数にシグモイド関数を用いると、シグモイド関数微分の最大値が0.25なので、勾配消失問題が発生しやすくなる。

LSTM(Long Short Term Memory)は、勾配消失問題を発生しにくいようにした学習器である。

勾配消失や勾配爆発が起きないようにするためには、時間をいくら遡っても勾配が1であれば勾配は消失も爆発もしなくなる。 数式で表現すると、

 \displaystyle{
\newcommand{\partialdiff}[2] {\frac{\partial {#1}}{\partial{#2}}}
\delta^{t-z-1} = \delta^{t-z}{Wf'(u^{t-z-1})} = 1 \\
\partialdiff{E}{c^{t-1}} = \partialdiff{E}{c^{t}} \partialdiff{c^{t}}{c^{t-1}} = \partialdiff{E}{c^{t}} \partialdiff{}{c^{t-1}}\{a^{t}-c^{t-1}\}=\partialdiff{E}{c^{t}}
}

CEC

Constant Error Carousel. 過去の入力層や中間層を全て記憶するための部品。 重みが一律であるため、学習機能は存在しない。

入力ゲートと出力ゲート

入力ゲートは入力層からの入力に対して重みW_{i}を掛けたものと、前回の出力値に対して重みU_{i}を掛けたものを用いて、CECに対して出力には重みV_{i}を掛けて出力する。 出力ゲートも同様に入力層からの入力に対して重みW_{o}を掛けたものと、前回の出力値に対して重みU_{o}を掛けたものを用いて出力する。

忘却ゲート

過去の情報を不要になったタイミングで情報を忘却する機能。

覗き穴結合

入力ゲートや出力ゲートに対してもCECの情報を用いたら良いのではないかということで、試みられたがあまり効果が無かった。

実装演習

f:id:yui-gen-ron:20211228023201p:plain

確認テスト等考察

シグモイド関数微分の最大値は0.25。 これは、シグモイド関数微分sigmoid(x)(1-sigmoid(x))を考えると明らか。

追加演習