0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

深層学習 Day 3 - Section 5 Seq2Seq のまとめ

Last updated at Posted at 2020-11-20

この記事は個人的なお勉強用のメモです。

このお勉強の位置

深層学習 Day 3

Section 1 再帰型ニューラルネットワークの概念
Section 2 LSTM
Section 3 GRU
Section 4 双方向RNN
Section 5 Seq2Seq ← これ
Section 6 Word2vec
Section 7 Attention Mechanism

講義

Seq2seq

Encoder-Decoderモデルの一種。

用途
・機械対話
・機械翻訳

Encoder RNN

  1. テキストデータをトークンに区切る。(「食べた」「刺身」「大丈夫」「でしたか」)
  2. トークンを入力としてRNNに与えて重みを掛けて次々と渡していく。

Taking :文章をトークン分割し、トークンごとのIDに分割
Embedding :IDから、そのトークンを表す分散ベクトルに変換
Encoder RNN:ベクトルを順番にRNNに入力

Encoder RNNは主にRNNとして処理するが、普通のRNNと違う点
・データは出力しない。
・隠れ状態(hidden state)の最後の隠れ状態(final state)を出力する。
 through vectorとも。
 このfinal stateに、入力した文章の意味が詰まっているということか。

Decoder RNN

デコード時の処理(学習時の処理ではない。事前に学習しておく)

  1. Encoder RNNのfinal stateをDecoder RNNのinitial stateにする。
    次に出力される候補の単語ごとに確率が出力される。
    (出力される可能性の高い単語は、確率が高い)
  2. Sampling:生成確率に基づいてトークンをランダムに選ぶ。
  3. Embedding:2で選ばれたトークンをEmbeddingしてDecoder RNNの次の入力にする。
  4. Detokenize:1~3を繰り返し、2で得られたトークンを文字列に直す。

Decoder RNNの入力:Encoder RNNによって出力されるfinal state
Decoder RNNの出力:予測された文章

演習チャレンジ

def encode(words, E, W, U, b):
  hidden_size = W.shape[0]
  h = np.zeros(hidden_size)
  for w in words:
    e = E.dot(w)
    h = _activation(W.dot(e) + U.dot(h) + b)
  return h

h:hidden state
  return 時の h は final state
vocab_size:語彙数、文字の種類

行列の形状を元に正解を導いた。
b の形状 (h,)
W.dot(e) の形状は b の形状と同じ (h,)
W の形状は (h,h) であることから、e の形状は (h,)
E の形状は (h,v)、また、w の形状は (v,) であることから、
これらを掛けた e (h,) の形状になるには
E.dot(w) しかない。

メモ
一次元のベクトルは、(h,) のように表現する。

ただし、これはソースコード内のコメントを頼ったためであり、正攻法ではない。
本来なら解説にあるように本来行いたい処理を考慮して正解を導く必要がある。

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

w が one-hot ベクトルのとき、E.dot(w) を計算すると、E の特定の列だけを抜き出せる。

HRED

Seq2seqの課題
一問一答しかできない。
人間っぽさが出せない。

HREDとは

Hierarchical Recurrent Encoder-Decoder
過去のn-1の発話から次の発話を生成。

システム:インコかわいいよね
ユーザー:うん
システム:インコかわいいのわかる

Seq2seq + Context RNN

Context RNN:
Encoderのまとめた各文章の系列をまとめて、
これまでの会話コンテキスト全体を表すベクトルに
変換する構造

HREDの課題

・会話の流れがない。
・短いよくある答えを選びやすい。

VHRED

Latent Variable Hierarchical. Recurrent Encoder-Decoder
HREDの課題を解決
HREDに、VAEの潜在変数の概念を追加

正直なところ、講義だけでは全く理解できない。
こちらのページを参照、ということか。

DeepLearning における会話モデル: Seq2Seq から VHRED まで
https://qiita.com/halhorn/items/646d323ac457715866d4

VAE

オートエンコーダ

  • 教師なし学習
  • 例:画像を読み込むと同じような画像を出力する
  • 次元削減できる(無意味な特徴量が削除される)
  • Encoder によって潜在変数 z が作成される
  • Decoder は潜在変数 z を参照する

VAE

Variational Autoencoder、変分自己符号化器
読み方は、バエ?

潜在変数 z に確率分布 z~N(0,1) を仮定したもの。
これにより、文脈に応じて確率的に応答ができるようになる。

実装演習

なし。

確認テスト

Seq2seqの説明

(1)は双方向RNNの説明
(2)はSeq2seqの説明
(3)未学習
(4)LSTMやGRU

Seq2seq,HRED,VHREDの違い

Seq2seq:一問一答ができる。
HRED:文脈を理解して会話できる。同じ回答。
VHRED:HREDに加えて、異なる回答ができる。

VAEの説明

自己符号化器(オートエンコーダ)の潜在変数に
確率分布を導入したもの。

修了テスト~練習問題~

Seq2seqの問題は無い。
代わりにone-hotベクトルを含めた行列の計算を復習。

one-hotベクトルを使った行列の掛け算
one-hotベクトルを c 、重み行列を W とすると

・c.dot(W) は、W の特定の行を抜き出すという意味
・W.dot(c) は、W の特定の列を抜き出すという意味

1次元ベクトルは掛ける側(右から掛ける、左から掛ける)によって、
行ベクトルであったり列ベクトルであったりと変換するのか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?