trybeetle

take it slow!!

DeepLearning.ai course5振り返り


Posted on Sept. 2, 2018, 10:28 p.m.



DeepLearning.aiのコース(Sequence Models)では、Sequence Modelについて学びます。


week 1

week 1では、様々なRNN(Recurrent Neural Network)のモデルについて学びます。


RNNモデルの種類

RNNモデルには大別すると下記の種類があります。

  • many to many (Tx = Ty)
  • many to many (Tx != Ty)
  • one to many
  • many to one

tの値(RNNセルの個数)が多くなればなるほど、vanishing gradientの問題を引き起こします。
例えば、word levelのlanguage modelの場合、文が長くなればなるほど、最初辺りに登場するwordは、最後辺りに登場するwordに影響を与えづらいため、文頭と文末でかみ合わなくなってしまいます。
その問題を防ぐために、重要度に応じて、t個めのセル計算の結果をキャッシュ保持するLSTMやGRUといった対策があります。


また、word levelのlanguage modelの場合、文の中のt個めのwordを求めるとき、1 ~ (t-1)個めまでの言葉だけで決まるのではなく、t+1 ~ Tx個めまでの言葉からも影響されます。そのため、forward propagationのの際にbidirectionalな方法を用います。


LSTM(Long Short Term Memory)

LSTMは、vanishing gradient対策として用いられます。重要度に応じて、t個めのセル計算の結果をキャッシュ保持する様になっています。cell stateとしてcを設定し、キャッシュ情報としてセル計算の結果をほじします。3つのゲート(update, forget, output)を使用します。

$$\Gamma_f^{\langle t \rangle} = \sigma(W_f[a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_f) $$ $$\Gamma_u^{\langle t \rangle} = \sigma(W_u[a^{\langle t-1 \rangle}, x^{\{t\}}] + b_u) $$ $$ \tilde{c}^{\langle t \rangle} = \tanh(W_c[a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_c) $$ $$ c^{\langle t \rangle} = \Gamma_f^{\langle t \rangle}* c^{\langle t-1 \rangle} + \Gamma_u^{\langle t \rangle} *\tilde{c}^{\langle t \rangle} $$ $$ \Gamma_o^{\langle t \rangle}= \sigma(W_o[a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_o) $$ $$ a^{\langle t \rangle} = \Gamma_o^{\langle t \rangle}* \tanh(c^{\langle t \rangle}) $$

また、LSTMのbackpropでは、aやcで微分する際に気を付けます。
aでは、output側へ渡される値と次のLSTMセルに渡される値を加算して扱う必要があります。cも同様に、aを計算するために渡される値と次のLSTMセルに渡される値を加算して扱う必要があります




week 2

week 2では、Word embeddingを使用したNatural Language Processingについて学びます。


word embedding

word embeddingとは、単語がどのような性質を持っているかを示す方法です。embedding matrixとvocabularyリストからなっており、求めたい単語のword embeddingは下記の様に求めます。

word embeddingをトレーニングする方法として、word2vecやGloVeがあります。

また、word embeddingを使用することで、training datasetには登場していないwordでも、embedding matrixに内包されている場合は、predict実行時に求めることができます。そのため、少ないtraining setで済みます。


similarity

2つのword vector (u, v) がある場合、similarityは下記の様に求められます。

$$\text{CosineSimilarity(u, v)} = \frac {u . v} {||u||_2 ||v||_2} = cos(\theta) $$


word2vec

word2vecで、embedding matrixをトレーニングし求めることができます。word2vecには、skip-gram と negative samplingの方法があります。

skip-gramの流れとして

  • 例文からcontent(c)を定め、cから前後10単語以内の単語をランダムに選択しtarget(t)とする
  • cのword vectorをsoftmaxにかけると、tのword vectorが求まる。(これをy_hatとする。)
  • tのwordvectorと↑で求めたy_hatのloss functionを計算する。
  • 上記の処理をiter回数繰り返し、embedding matrixのparameterを最適化し、求める。

$$ O_c \rightarrow E \rightarrow e_c \rightarrow softmax \rightarrow \hat{y} $$ $$ softmax: p(t|c) = \frac{e^{θ_t^T e_c}}{\sum_{k=1}^{10000} e^{θ_j^T e_c}} $$ $$ Loss: L(\hat{y},y) = - \sum_{i=1}^{10000} y_i log{\hat{y}_i} $$

skip-gramはcomputational costが高いので、negative samplingという方法があります。これは、iteration毎にword vectorをsoftmaxで求めるのではなく、小規模のbinary classificationを繰り返す方法です。

negative samplingの流れとして

  • 例文からcontext(c)を設定し、cから前後10単語以内の単語をランダムに選択しword(t)とする
  • 上記はpositiveとなるものを設定
  • 他にnegativeとする4つのwordをvocaburalyの中からrandomに選択(sampling数は2-20の間で選択)
  • 上記のcとtをimput(x)とし、yをtがcのtargetであるか否かのbinary classificationとする
  • 最初のpositiveとなるもの以外は、例えy=1となるような組み合わせであってもy=0とする。
  • cのword vectorをsigmoid関数にかけ、y_hatを求める。
  • negative samplingでふったyとsigmoidで求めたy_hatをloss functionを計算する。
  • 上記の処理をiter回数繰り返し、embedding matrixのparameterを最適化し、求める。

$$ O_c \rightarrow E \rightarrow e_c \rightarrow sigmoid \rightarrow \hat{y} $$ $$ p(y|c,t) = \sigma{(θ_t^T e_c)} $$ $$ Loss: L(\hat{y},y) = - \sum_{w \in 10000} y_i log{\hat{y}_i} $$


GloVe

GloVe algolithmで embedding matrixをトレーニングする場合は、下記の様にします。

$$ x_{ij} = \text{# of times that i appear in context of j} $$ $$ minimize: \sum_{i=1}^{10000} \sum_{j=1}^{10000} f(x_{ij}) (θ_i^T e_j + b_i + b_j - logx_{ij})^2 $$ $$ x_{ij}=0 \text{の場合は、}f(x_{ij})=0 \text{とする。} $$


model

word embeddingを使用したRNNモデルとして、下記の様なsentiment classificationの形があります。




week 3

week 3では、Sequence to Sequenceモデルについて学びます。
many to many (Tx != Ty)の問題を解決するためには、Beam searchを使う方法や、Attention modelを使う方法があります。


Beam search

出力されるy(1) ~ y(t)までのそれぞれのprobabilityの最大化ではなく、y(1) ~ y(t)をまとめて最大化します。

例えば、y(1)を出力する際に、y(1)となる候補を3つ記憶(B=10)しておき、y(2)を求める際には、その3つの値をinputとして、y(2)の候補も3つ求めます。候補から外れたネットワークはキャッシュから削除します。
計算量としては、B=10のため10倍になりますが、最適な文章をより見つけやすくなります。Productionでは、B=100などと設定している様です。


beam searchに対して、error analysisも有効です。


Attention Model

流れとしては、以下の様になります。

  • bidirectional RNNでa(t')の値を求めます。
  • a(t')とパラメータalphaを掛けて、c(t)の値を求めます。
    ※alphaとは、y(t)がa(t')にどれだけ引っ張られるかの重みづけです。
  • 求めたc(t)から、通常どおり、LSTMのRNNを実行し、y(t)を求めます。

Category:ML
Tag: ML python
Sept. 2, 2018, 10:28 p.m.

Comments