データサイエンティストコースの第2ストリームの開始に備えて、数週間前に投稿した翻訳の第2部。 Aheadは別の興味深い資料であり、公開レッスンです。
それまでの間、モデルのジャングルにさらに入りました。
神経翻訳モデル
シーケンスからシーケンスへのモデルのコアは、
tensorflow/tensorflow/python/ops/seq2seq.py
関数によって作成されますが、
models/tutorials/rnn/translate/seq2seq_model.py
翻訳モデルで使用されるいくつかのトリックがまだあります言及する価値があります。
サンプリングされたソフトマックスと出力投影
上記のように、サンプリングされたsoftmaxを使用して、大規模な出力ディクショナリを処理する必要があります。 それからデコードするには、出力の投影を追跡する必要があります。 サンプリングされた
seq2seq_model.py
損失と出力予測の両方が、
seq2seq_model.py
次のコードによって生成されます。
if num_samples > 0 and num_samples < self.target_vocab_size: w_t = tf.get_variable("proj_w", [self.target_vocab_size, size], dtype=dtype) w = tf.transpose(w_t) b = tf.get_variable("proj_b", [self.target_vocab_size], dtype=dtype) output_projection = (w, b) def sampled_loss(labels, inputs): labels = tf.reshape(labels, [-1, 1]) # We need to compute the sampled_softmax_loss using 32bit floats to # avoid numerical instabilities. local_w_t = tf.cast(w_t, tf.float32) local_b = tf.cast(b, tf.float32) local_inputs = tf.cast(inputs, tf.float32) return tf.cast( tf.nn.sampled_softmax_loss( weights=local_w_t, biases=local_b, labels=labels, inputs=local_inputs, num_sampled=num_samples, num_classes=self.target_vocab_size), dtype)
最初に、サンプル数(デフォルトでは512)がターゲットディクショナリサイズより小さい場合にのみ、サンプリングされたソフトマックスを作成することに注意してください。 512より小さい辞書の場合は、標準のソフトマックス損失を使用することをお勧めします。
次に、出力の投影を作成します。 これは、重みの行列と変位ベクトルで構成されるペアです。 使用すると、rnnセルは、target_vocab_sizeによるトレーニングサンプルの数ではなく、
size
によるトレーニングサンプルの数の形状ベクトルを返します。 ロジットを復元するには、それを重み行列で乗算し、オフセットを追加する必要があります。これは
seq2seq_model.py
124〜126行目で発生します。
if output_projection is not None: for b in xrange(len(buckets)): self.outputs[b] = [tf.matmul(output, output_projection[0]) + output_projection[1] for ...]
バケツとパディング
サンプリングされたソフトマックスに加えて、当社の翻訳モデルはバケット化も使用します。これは、さまざまな長さの文を効率的に管理できる方法です。 まず、問題を説明します。 英語からフランス語に翻訳する場合、入り口に異なる長さL1の英語の文があり、出口に異なる長さL2のフランス語の文があります。 英語の文は
encoder_inputs
として送信され、フランス語の文は
decoder_inputs
(GOシンボルプレフィックス付き)として表示されるため、英語とフランス語の文の長さの各ペア(L1、L2 + 1)に対してseq2seqモデルを作成する必要があります。 その結果、多くの同様のサブグラフで構成される巨大なグラフが得られます。 一方、各文に特別なPAD文字を「埋め込む」ことができます。 そして、「パックされた」長さのたった1つのseq2seqモデルが必要です。 しかし、このようなモデルは短い文章では効果がありません。多くの役に立たないPAD文字をエンコードおよびデコードする必要があります。
長さのペアごとにグラフを作成し、単一の長さに詰めることの間の妥協案として、特定の数のバケットを使用して、各文を上のグループの長さに詰めます。
translate.py
では、デフォルトで次のグループを使用します。
buckets = [(5, 10), (10, 15), (20, 25), (40, 50)]
したがって、3つのトークンを含む英語の文が入力に到着し、対応するフランス語の文が出力に6つのトークンを含む場合、それらは最初のグループに移動し、エンコーダーの入力で長さ5、デコーダーの入力で長さ10まで埋められます。 また、英語のオファーに8つのトークンがあり、対応するフランス語18にトークンがある場合、それらはグループ(10、15)に分類されず、グループ(20、25)に転送されます。つまり、英語のオファーは20トークンに、フランスのトークンは25に増加します。
デコーダー入力を作成するときに、入力に特殊な
GO
文字を追加することに注意してください。 これは
get_batch()
関数で
seq2seq_model.py
、英語の文も反転します。 入力の反転は、 Sutskever et al。、2014(pdf)の神経翻訳モデルの結果の改善に役立ちました。 最終的に理解するには、「I go」という文があることを想像してください。入力にはトークン
["I", "go", "."]
に分割され、出力には "Je vais。"、Broken into tokens
["Je", "vais", "."]
["I", "go", "."]
という文があります。
["Je", "vais", "."]
。 それらは、エンコーダー入力ビュー
[PAD PAD "." "go" "I"]
グループ(
[PAD PAD "." "go" "I"]
)に追加され
[PAD PAD "." "go" "I"]
[PAD PAD "." "go" "I"]
およびデコーダー入力
[GO "Je" "vais" "." EOS PAD PAD PAD PAD PAD]
[GO "Je" "vais" "." EOS PAD PAD PAD PAD PAD]
。
実行する
上記のモデルを訓練するには、大規模な英仏軍団が必要です。 トレーニングには、WMT'15 Webサイトの10 ^ 9のフランス語-英語隊を使用し、同じサイトのテストニュースを実際のサンプルとして使用します。 次のコマンドを実行すると、両方のデータセットが
train_dir
にロードされます。
python translate.py --data_dir [your_data_directory] --train_dir [checkpoints_directory] --en_vocab_size=40000 --fr_vocab_size=40000
トレーニングビルディングを準備するには、18GBのハードディスクスペースと数時間が必要です。 ケースが解凍され、辞書ファイルが
data_dir,
作成され、その後、ケースはトークン化され、整数識別子に変換されます。 辞書のサイズの原因となるパラメーターに注意してください。 上記の例では、最も頻繁に使用される40,000個の単語以外のすべての単語は、未知の単語を表すUNKトークンに変換されます。 したがって、辞書のサイズを変更すると、バイナリはtoken-idによって住宅を再編成します。 データ準備のトレーニングが開始された後。
translate
指定された値は、デフォルトでは非常に高くなっています。 長時間学習する大規模なモデルは良い結果を示しますが、時間がかかりすぎたり、GPUメモリが多すぎたりする可能性があります。 下の例のように、モデルをより小さく運動するように設定できます。
python translate.py --data_dir [your_data_directory] --train_dir [checkpoints_directory] --size=256 --num_layers=2 --steps_per_checkpoint=50
上記のコマンドは、2つのレイヤー(デフォルトでは3つ)でモデルをトレーニングします。各レイヤーは256ユニット(デフォルトでは1024)で、50ステップ(デフォルトでは200)ごとにチェックポイントがあります。 これらのオプションを試して、GPUに適したサイズモデルを確認してください。
トレーニング中、
steps_per_checkpoin
tバイナリの各ステップは、過去のステップに関する統計を提供します。 デフォルトのパラメーター(サイズ1024の3層)を使用すると、最初のメッセージは次のようになります。
global step 200 learning rate 0.5000 step-time 1.39 perplexity 1720.62 eval: bucket 0 perplexity 184.97 eval: bucket 1 perplexity 248.81 eval: bucket 2 perplexity 341.64 eval: bucket 3 perplexity 469.04 global step 400 learning rate 0.5000 step-time 1.38 perplexity 379.89 eval: bucket 0 perplexity 151.32 eval: bucket 1 perplexity 190.36 eval: bucket 2 perplexity 227.46 eval: bucket 3 perplexity 238.66
各ステップの所要時間は1.4秒弱で、各グループのトレーニングサンプルが複雑になり、作業サンプルが複雑になることに注意してください。 約3万ステップ後、短い文(グループ0および1)の困惑がどのように明確になるかがわかります。 トレーニングビルディングには約2200万の文が含まれ、1回の反復(トレーニングデータの1回の実行)には約34万ステップが必要で、トレーニングサンプルの数は64です。この段階で、モデルを使用して
--decode
オプションを使用して英語の文をフランス語に翻訳できます。
python translate.py --decode --data_dir [your_data_directory] --train_dir [checkpoints_directory] Reading model parameters from /tmp/translate.ckpt-340000 > Who is the president of the United States? Qui est le président des États-Unis ?
次は?
上記の例は、独自の英仏翻訳者をエンドツーエンドで作成する方法を示しています。 実行して、モデルの動作を確認します。 品質は許容範囲内ですが、理想的な翻訳モデルはデフォルトのパラメーターでは取得できません。 改善できる点をいくつか紹介します。
最初に、
basic_tokenizer
基本機能であるプリミティブトークン化を使用し
data_utils
。 より優れたトークナイザーは、WMT'15ウェブサイトで見つけることができます。 それと大きな辞書を使用すると、より良い翻訳を実現できます。
さらに、変換モデルのデフォルトパラメータは完全に設定されていません。 モデルの重みの学習速度、減衰、初期化を変更してみることができます。
seq2seq_model.py
の標準の
GradientDescentOptimizer
を
seq2seq_model.py
などのより高度なものに置き換えることもできます。 より良い結果を得るために試してみてください
最後に、上記のモデルは、翻訳だけでなく、他のシーケンス間タスクにも使用できます。 たとえば、解析ツリーを生成するなど、シーケンスをツリーに変換したい場合でも、このモデルは、 Vinyals&Kaiser et al。、2014(pdf)に示されているように、最新の結果を生成できます。 そのため、翻訳者だけでなく、パーサー、チャットボット、またはその他の必要なプログラムも作成できます。 実験!
以上です!
ここであなたのコメントや質問を待っているか、オープンレッスンで彼らの先生に尋ねることを勧めます。