そして、改訂されたデータサイエンティストコース用に新しいストリームが再びオープンしました。別の優れた教師 、更新に基づいたわずかに洗練されたプログラムです。 さて、いつものように、興味深い公開レッスンと興味深い資料のコレクション。 今日は、Tensor Flowからseq2seqモデルの分析を開始します。
行こう
RNNチュートリアルで既に説明したように(この記事を読む前にこれをよく理解することをお勧めします)、言語をモデル化するためにリカレントニューラルネットワークを教えることができます。 そして、興味深い質問が生じます。意味のある回答を生成するために特定のデータでネットワークをトレーニングすることは可能ですか? たとえば、英語からフランス語に翻訳するニューラルネットワークを教えることができますか? できることがわかりました。
このガイドでは、このようなエンドツーエンドシステムを作成およびトレーニングする方法を示します。 Tensor FlowコアリポジトリとTensorFlowモデルリポジトリをGitHubからコピーします 。 次に、翻訳プログラムを開始して開始できます。
cd models/tutorials/rnn/translate python translate.py --data_dir [your_data_directory]
彼女はWMT'15 Webサイトから英語からフランス語への翻訳用のデータをダウンロードし、トレーニングとトレーニングの準備をします。 これには、ハードドライブに約20GBが必要であり、ダウンロードと準備にかなりの時間がかかるため、すぐにプロセスを開始して、このチュートリアルを読み続けることができます。
マニュアルは次のファイルにアクセスします。
ファイル | 何が入っているの? |
---|---|
テンソルフロー/テンソルフロー/ python / ops / seq2seq.py | シーケンス間モデルを作成するためのライブラリ |
モデル/チュートリアル/ rnn /翻訳/ seq2seq_model.py | シーケンス間ニューラル翻訳モデル |
モデル/チュートリアル/ rnn / translate / data_utils.py | 翻訳データを準備するためのヘルパー関数 |
モデル/チュートリアル/ rnn / translate / translate.py | 翻訳モデルをトレーニングして実行するバイナリ |
シーケンス間の基本
Cho et al。、2014 ( pdf ) が提示する基本的なシーケンス間モデルは、2つのリカレントニューラルネットワーク(RNN)で構成されています。入力データを処理するエンコーダー(エンコーダー)と、データを生成するデコーダー(デコーダー)出力。 基本的なアーキテクチャは次のとおりです。
上の図の各長方形は、RNN内のセル、通常はGRUセル(制御された繰り返しブロック)、またはLSTMセル(長期短期メモリ)を表します(詳細については、 RNNチュートリアルをご覧ください)。 エンコーダーとデコーダーは、共通の重みを持つか、より頻繁に異なるパラメーターのセットを使用できます。 多層セルは、 Sutskever et al。、2014 ( pdf )の翻訳など、シーケンス間モデルで使用されています。
上記の基本モデルでは、各入力は固定サイズの状態ベクトルにエンコードされる必要があります。これは、これがデコーダーに送信される唯一のものであるためです。 デコーダが入力データにより直接アクセスできるようにするために、 Bahdanau et al。、2014 ( pdf )に注意メカニズムが導入されました 。 アテンションメカニズムの詳細は説明しません(このため、ここでの作業に慣れることができます)。 デコーダーが各デコードステップで入力データを調べることができると言うだけで十分です。 LSTMセルとデコーダーのアテンションメカニズムを備えた多層シーケンスツーシーケンスネットワークは次のとおりです。
TensorFlowライブラリseq2seq
上記からわかるように、異なるシーケンス間モデルがあります。 それらはすべて異なるRNNセルを使用できますが、それらはすべてエンコーダー入力データとデコーダー入力データを受け入れます。 これは、TensorFlow seq2seqライブラリインターフェイスの基本です(tensorflow / tensorflow / python / ops / seq2seq.py)。 この基本的なRNN、コーデック、シーケンス間モデルは次のように機能します。
outputs, states = basic_rnn_seq2seq(encoder_inputs, decoder_inputs, cell)
上記の呼び出しでは、
encoder_inputs
は、上の図の文字A、B、Cに対応するエンコーダー入力データを表すテンソルのリストです。 同様に、
decoder_inputs
はデコーダー入力データを表すテンソルです。 最初の写真のGO、W、X、Y、Z。
cell
引数は、モデルで使用されるセルを決定する
tf.contrib.rnn.RNNCell
クラスのインスタンスです。
GRUCell
や
LSTMCell
などの既存のセルを使用するか、
GRUCell
セルを作成できます。 さらに、
tf.contrib.rnn
は、多層セルを作成し、セルの入出力に例外を追加したり、その他の変換を行うためのシェルを提供します。 例については、 RNNチュートリアルをご覧ください。
basic_rnn_seq2seq
の呼び出しは、
basic_rnn_seq2seq
と
states
2つの引数を返します。 これらは両方とも、
decoder_inputs
と同じ長さのテンソルのリストを表します。
outputs
は、各タイムステップのデコーダー出力データに対応します。最初の画像では、W、X、Y、Z、EOSです。 返される
states
は、各タイムステップでのデコーダーの内部状態を表します。
シーケンス間モデルを使用する多くのアプリケーションでは、時間tでのデコーダー出力は時間t + 1でデコーダーへの入力に送信されます。 テスト中、シーケンスのデコード中に、新しいシーケンスが作成されます。 一方、トレーニング中は、デコーダーが以前に誤っていた場合でも、各タイムステップで正しい入力データをデコーダーに送信するのが一般的です。
seq2seq.py
関数は、
feed_previous
引数で両方のモードをサポートします。 たとえば、ネストされたRNNモデルの次の使用を検討してください。
outputs, states = embedding_rnn_seq2seq( encoder_inputs, decoder_inputs, cell, num_encoder_symbols, num_decoder_symbols, embedding_size, output_projection=None, feed_previous=False)
embedding_rnn_seq2seq
モデルでは、すべての入力データ(
encoder_inputs
と
decoder_inputs
両方)は離散値を反映する整数テンソルです。 それらは密な表現に埋め込まれます(添付方法の詳細については、 ベクトル表現ガイドを参照してください)が、これらの添付ファイルを作成するには、個別の文字の最大数を指定する必要があります:エンコーダー側の
num_decoder_symbols
とデコーダー側の
num_decoder_symbols
。
上記の呼び出しでは、
feed_previous
をFalseに設定します。 これは、デコーダーが提供されている形式で
decoder_inputs
テンソルを使用することを意味します。
feed_previous
をTrueに設定すると、デコーダーは最初の
decoder_inputs
要素のみを使用します。 リストの他のすべてのテンソルは無視され、代わりにデコーダー出力の以前の値が使用されます。 これは、翻訳モデルの翻訳をデコードするために使用されますが、トレーニング中に使用して、モデルのエラーに対する安定性を向上させることもできます。 およそBengio et al。、2015 ( pdf )のように。
上記で使用される別の重要な引数は
output_projection
です。 明確化しないと、埋め込みモデルの結論は、生成された各シンボルの対数を表すため、num_decoder_symbolsごとのトレーニングサンプルの数のテンソルになります。 大きな
num_decoder_symbols
などの大きな出力ディクショナリを含むモデルをトレーニングする場合、これらの大きなテンソルの保存は実用的ではなくなります。 代わりに、
output_projection
を使用して大きなテンソルに後で投影される小さなテンソルを返すことをお
output_projection
ます。 これにより、 ジャンらによって説明されているように、サンプリングされたソフトマックス損失でseq2seqモデルを使用できます。 al。、2014 ( pdf )。
basic_rnn_seq2seq
および
embedding_rnn_seq2seq
加えて、
basic_rnn_seq2seq
にはさらにいくつかのシーケンス間モデルが
seq2seq.py
ます。 それらに注意してください。 それらはすべて同様のインターフェースを備えているため、詳細については掘り下げません。 以下の翻訳モデルでは、
embedding_attention_seq2seq
を使用します。
継続する。