ラビットチャレンジ - 深層学習 Day3 Section5 Seq2Seq

# 0．概要
本記事は日本ディープラーニング協会認定の講座プログラムである「ラビット・チャレンジ」が提供している科目の1つである深層学習のレポートである。
記事タイトルに記載のとおり、Day3 Section5 Seq2Seqについて以下にまとめる。

# 1．Seq2Seq(Sequence to Sequence)
RNNを用いたEncoder-Decoderモデルの1つ。

機械対話や機械翻訳等に使用されている。
例えば機械翻訳の場合、Encoderに日本語を入力し、Decoderの出力で英語を得る等といった形となる。

一問一答しかできないという課題がある。
文脈もなくただ応答するというイメージ。

参考：
https://blog.octopt.com/sequence-to-sequence/?utm_source=rss&utm_medium=rss&utm_campaign=sequence-to-sequence
https://qiita.com/halhorn/items/646d323ac457715866d4

## 1.1．Encoder RNN

### 1.1.1．Taking
文章を単語等のトークンごとに分割し、さらにトークンごとのIDに分割する。

### 1.1.2．Embedding
IDからそのトークンを表す分散表現ベクトルに変換する。

### 1.1.3．Encoder RNN
ベクトルを順にRNNに入力する。

### 1.1.4．処理の流れ
単語分散表現ベクトル1を入力して隠れ層の値を得る。
↓
次の単語分散表現ベクトル2と単語分散表現ベクトル1の隠れ層の値を入力して隠れ層の値を得る。
↓
上記を繰り返して最後の単語分散表現ベクトルと前までの隠れ層の値から得た隠れ層の値をFinal state(Thought vector)とする。

Thought vectorは入力した分の意味を表すベクトルであり、これがDecoderへの入力となる。

## 1.2．Decoder RNN

### 1.2.1．処理の流れ
Encoder RNNのThought vectorから各トークンの生成確率を出力していく。
↓
生成確率に基づいてトークンをランダムに選ぶ。
↓
選ばれたトークンの単語分散表現ベクトルを次の入力とする。
↓
上記を繰り返して得られたトークンを文字列に戻すことで文章を生成する。

DecoderはEncoderの逆のことをしているイメージ。

# 2．HRED(A Hierarchical Recurrent Encoder-Decoder)
過去$n-1$の発話から次の発話を生成する。
前の単語の流れ(文脈)を元に応答するためSeq2Seqより人間ぽい応答になる。

多様性がなく、同じ発話に対して同じような発話がされるという課題、短く情報量に乏しい発話(うん...etc)をしがちという課題がある。

参考：http://khide-en.hatenablog.com/entry/2018/02/25/150000

## 2.1．HREDの構造
Seq2SeqとContext RNNを組み合わせた構造。

### 2.1.1．Context RNN
Encoderのまとめた各文章の系列をまとめて、それまでの会話コンテキスト全体を表すベクトルに変換する。
つまり、文脈をベクトルにする。

## 2.2．VHRED(Latent Variable Hierarchical Recurrent Encoder-Decoder)
HREDにVAEの洗潜在変数の概念を追加したもの。
これによってHREDの課題を解決している(特に多様性)。

参考：https://qiita.com/halhorn/items/646d323ac457715866d4#vhred

# 3．オートエンコーダ(Auto Encoder)
教師なし学習の1つ。自己符号化器とも呼ぶ。
例えば入力した画像と同じ画像を出力する。

Encoder：入力データから潜在変数$z$に変換するニューラルネットワーク
Decoder：潜在変数$z$から元画像を復元するニューラルネットワーク

出力した画像の潜在変数$z$が入力画像より小さくなっていれば次元削減とみなすことができる。
その他、ノイズ除去や異常検知にも使われる。

参考：https://products.sint.co.jp/aisia/blog/vol1-21

## 3.1．VAE(Variational Autoencoder)
通常のオートエンコーダの場合、潜在変数$z$の中身はブラックボックスになっている。

VAEは潜在変数$z$に確率分布$z$～$N(0,1)$を仮定したもの。

参考：https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24

# 4．確認テスト

## 4.1．確認テスト1
Seq2Seqについて説明しているものはどれか。

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

回答：2

1：双方向RNN
3：Recursive Neural Network
4：LSTM

Recursive Neural Networkは初めて目にしたのでまた別途調べてみようと思う。

## 4.2．確認テスト2
Seq2SeqとHRED、HREDとVHREDの違いを簡潔に述べよ。

回答：
Seq2SeqとHRED：Seq2Seqは一問一答しかできないが、HREDは$n-1$の発話から文脈に応じた回答ができる。
HREDとVHRED：HREDは発話に多様性がなく情報量に乏しいが、VHREDはそれらの課題を解決し、多様性ある発話ができる。

## 4.3．確認テスト3
VAEに関する下記の説明文中の空欄にて当てはまる言葉を答えよ。

> 自己符号化器の潜在変数に_____を導入したもの。

回答：確率分布$z$～$N(0,1)$

# 5．演習チャレンジ

## 5.1．Encoder

```Python:
def encode(words, E, W, U, b):
  # words：文。各単語はone-hotベクトル
  # 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
```

内積を取って特徴量に変換する。

# X．ラビットチャレンジとは
ラビットチャレンジとは、日本ディープラーニング協会認定の講座プログラムの1つ。
E資格を受験するためにはこのラビットチャレンジ等、いずれかの講座プログラムを修了しなければならない。

ラビットチャレンジの特徴は「現場で潰しが効くディープラーニング講座」の通学講座録画ビデオを編集した教材を使用した自習スタイルであるという点。
サポートは他の講座より少なく、受け身ではなく自主的に学んでいく姿勢でなければ進められないが、その分、他の講座に比べると安価であり、手が出しやすい。
ある程度知識がある人、自力で頑張るぞというガッツのある人向けではないかと感じる。

![bnr_jdla.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389699/bce66671-a2f5-a7f9-de6f-3f87e15c253b.png)