はじめに
今回の記事は、前回に引き続き、私が受講しているE資格 JDLA認定プログラムの「ラビットチャレンジ」のレポート記事です。
今回のテーマは深層学習です。
講座ではDay1〜Day4まで分かれており、今回はDay3(後半)に取り組みます。
Day3は主に、RNNでの自然言語処理について扱います。
確認テスト、実装演習も併せて載せていきます。
Seq2Seq(Sequence to Sequence)
Seq2Seqは、自然言語処理用のネットワークで、自然言語処理(機械対話や翻訳)に用いられます。
RNNを用いたEncoder-Decoderモデルの1つです。
入力された文章を隠れ層を通して意味を理解し、その文脈をもとに、新たな隠れそうで他の言語で出力する。
文脈を読み取るのをエンコーダー、出力するのはデコーダーと呼びます。
一問一答しかできないという課題があります。
Encoder RNN
Encoderは文の意味を集約します。ユーザーがインプットしたテキストデータを単語のトークンに区切って渡す構造です。
Talking
文章を単語等のトークンごとに分割し、さらにトークンごとのIDに分割します。
Embedding
IDからそのトークンを表す分散表現ベクトルに変換します。
Encoder RNN
ベクトルを順にRNNに入力します。
処理の流れ
単語分散表現ベクトル1を入力して隠れ層の値を得ます。
次の単語分散表現ベクトル2と単語分散表現ベクトル1の隠れ層の値を入力して隠れ層の値を得ます。
上記を繰り返して最後の単語分散表現ベクトルと前までの隠れ層の値から得た隠れ層の値をFinal state(Thought vector)とします。
Thought vectorは入力した分の意味を表すベクトルで、これがDecoderへの入力となります。
Decoder RNN
処理の流れ
Encoder RNNのThought vectorから各トークンの生成確率を出力していきます。
生成確率に基づいてトークンをランダムに選びます。
選ばれたトークンの単語分散表現ベクトルを次の入力とします。
上記を繰り返して得られたトークンを文字列に戻すことで文章を生成します。
DecoderはEncoderの逆のことをしているイメージです。
HRED(A Hierarchical Recurrent Encoder-Decoder)
Seq2Seq + Context RNNの構造です。
過去の発話から次の発話を生成します。
前の単語の流れ(文脈)を元に応答するため、Seq2Seqより人間ぽい応答になります。
課題は以下のようなものが挙げられます。
- 会話の流れのような多様性がなく、同じ発話に対して同じような発話がされる
- 短く情報量に乏しい発話(うん、そうだね、…etc)をしがち
Context RNN
Encoderのまとめた各文章の系列をまとめて、それまでの会話コンテキスト全体を表すベクトルに変換します。
つまり、文脈をベクトルにします。
VHRED(Latent Variable Hierarchical Recurrent Encoder-Decoder)
HREDにVAEの洗潜在変数の概念を追加したものです。
これによって、特に多様性の面でHREDの課題を解決しています。
オートエンコーダ(Auto Encoder)
オートエンコーダとは、教師なし学習の1つです。
例えば入力した画像と同じ画像を出力します。
Encoder:入力データから潜在変数\(z\)に変換するニューラルネットワーク
Decoder:潜在変数\(z\)から元画像を復元するニューラルネットワーク
出力した画像の潜在変数\(z\)が入力画像より小さくなっていれば次元削減とみなすことができます。
その他、ノイズ除去や異常検知にも使われます。
VAE(Variational Autoencoder)
通常のオートエンコーダーの場合、何かしら潜在変数\(z\)にデータを押し込めているものの、その構造がどのような状態かわかりません。
VAEはこの潜在変数zに確率分布\(z\)〜\(N(0,1)\)を仮定したものです。
確認テスト
- Seq2Seqについて説明しているものはどれか。
1.時刻に関して順方向と逆方向のRNNを構成し、それら2つの中間層表現を特徴量として利用するものである。
2.RNNを用いたEncoder-Decoderモデルの一種であり、機械翻訳などのモデルに使われる。
3.構文木などの木構造に対して、隣接単語から表現ベクトル(フレーズ)を作るという演算をを再帰的に行い(重みは共通)、文全体の表現ベクトルを得るニューラルネットワークである。
4.RNNの一種であり、単純なRNNにおいて問題となる勾配消失問題をCECとゲートの概念を導入することで解決したものである。
⇨2
- Seq2SeqとHRED、HREDとVHREDの違いを簡潔に述べよ。
Seq2SeqとHRED:Seq2Seqは一問一答しかできないが、HREDは\(n−1\)の発話から文脈に応じた回答ができます。
HREDとVHRED:HREDは発話に多様性がなく情報量に乏しいですが、VHREDはそれらの課題を解決し、多様性ある発話ができます。
- VAEに関する下記の説明文中の空欄にて当てはまる言葉を答えよ。
自己符号化器の潜在変数に_____を導入したもの。
⇨確率分布\(z\)〜\(N(0,1)\)
Encoder 実装演習
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
Word2vec
RNNでは、単語のような可変長の文字列をNNに与えることはできないため、固定長形式で単語を表す必要があります。
そこで、分布仮説から単語を固定長のベクトル化(単語分散表現ベクトル)するソフトウェアのWord2vecがあります。
学習データからボキャブラリーを作成し、各単語をone-hotベクトルにして入力して単語分散表現を得ます。
大規模データの分散表現の学習が、現実的な計算速度とメモリ量で実現可能となりました。
ボキャブラリ × 任意の単語のベクトル表現(単語の変換表)を機械学習で学習することで、計算速度を向上できます。
分散表現では、CBOW(Continuous Bag-of-Words)もしくはSkip-gramというNNが用いられます。
CBOW(Continuous Bag-of-Words)
前後の単語から対象の単語を予測するNNで、学習に要する時間がSkip-gramより短くなります。
Skip-gram
ある単語から前後の単語を予測するNNで、CBOWよりも学習時間がかかりますが、精度が高いです。
Attention Mechanism
Seq2Seqは文章の単語数に関わらず常に固定次元ベクトルで入力しなければならないため、長い文章への対応が難しいです。
(Seq2Seqでは2単語でも、100単語でも、固定次元ベクトルの中に入力しなければなりません。)
decoderの入力はencoderの最後の状態を入力とするため、最初の方の情報がうまく埋め込まれません。
この問題の解決策として、文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく仕組みが必要です。
そこで、Attention Mechanismは、入力と出力のどの単語が関連しているか関連度を学習する仕組みで、
関連度を学習することで関連度が高い部分を抽出して効率的に処理が行なうことができます。
確認テスト
- RNNとWord2vec、Seq2SeqとSeq2Seq+Attentionの違いを簡潔に述べよ。
RNN、Word2vec:
RNNはボキャブラリー×ボキャブラリー数だけの重みが必要ですが、Word2vecはボキャブラリー数×単語ベクトルの次元数だけの重みのみが必要となる点。
Seq2Seq、Seq2Seq+Attention:
Seq2Seqは長い文章に対して対応が難しいですが、Attentionを取り入れることで、入力と出力の関連度に基づくため長い文章にも対応できる点。