TensorFlow : Tensor2Tensor (翻訳)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 07/11/2018 (v1.6.6)
* Tensor2Tensor は 2017 年 6 月に v1.0 が公開されましたが、1 年が経過して現在では v1.6.6 まで更新されていますので、ドキュメントを再翻訳します。
* 本ページは、github の tensorflow/tensor2tensor の README.md – “Tensor2Tensor” を翻訳した上で適宜、補足説明したものです:
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
Tensor2Tensor, あるいは短縮して T2T は、深層学習をより利用しやすくて ML 研究を加速化するために設計された深層学習モデルとデータセットのライブラリです。T2T は Google Brain チームとユーザ・コミュニティ内の研究者と技術者により実際に使用されて保守されています。
提案されるデータセットとモデル
以下に、(適切な問題上で適切なモデルを訓練するとき) T2T で解決できる多くのタスクをリストアップします。問題とモデルを与えて (私達のセットアップで) 上手く動作することが分かっているハイパーパラメータの設定を提案します。私達は通常は Cloud TPU か 8-GPU マシン上で実行します ; 異なるセットアップ上で実行する場合にはハイパーパラメータを変更する必要があるかもしれません。
画像分類
画像分類については、多くの標準的なデータセットを持ちます :
- ImageNet (巨大データセット): –problem=image_imagenet, またはリスケールされたバージョンの一つ (image_imagenet224, image_imagenet64, image_imagenet32)
- CIFAR-10: –problem=image_cifar10 (またはデータ増強を無効にするために –problem=image_cifar10_plain)
- CIFAR-100: –problem=image_cifar100
- MNIST: –problem=image_mnist
ImageNet については、ResNet か Xception を使用することを提案します、i.e. use –model=resnet –hparams_set=resnet_50 または –model=xception –hparams_set=xception_base です。Resnet は ImageNet 上で 76% top-1 精度以上に到達するはずです。
CIFAR と MNIST については、shake-shake モデルを試すことを提案します: –model=shake_shake –hparams_set=shakeshake_big です。–train_steps=700000 で訓練されたこの設定は CIFAR-10 上で 97% 近い精度を生成するはずです。
言語モデリング
言語モデリングについては、T2T でこれらのデータセットを持ちます :
- PTB (小さいデータセット): 単語レベル・モデリングのための –problem=languagemodel_ptb10k と文字レベル・モデリングのための –problem=languagemodel_ptb_characters
- LM1B (10 億単語の語彙): 部分語レベル・モデリングのための –problem=languagemodel_lm1b32k と文字レベル・モデリングのための –problem=languagemodel_lm1b_characters
このタスク上では –model=transformer で始め、そして PTB のために –hparams_set=transformer_small を使用して LM1B のために –hparams_set=transformer_base を使用することを提案します。
センチメント解析
センテンスのセンチメントを認識するタスクのためには、次を使用してください :
- IMDB データセット: –problem=sentiment_imdb
ここでは –model=transformer_encoder を使用することを提案します、そしてそれは小さいデータセットですので、–hparams_set=transformer_tiny を試して少ないステップ (e.g., –train_steps=2000) のために訓練してください。
スピーチ認識
スピーチ-to-テキストのためには、T2T でこれらのデータセットを持ちます :
- Librispeech (US English): セット全体のための –problem=librispeech そしてより小さいけれども素晴らしくフィルタされたパートのための –problem=librispeech_clean
- Mozilla Common Voice (US English): セット全体のための –problem=common_voice そして品質チェックされたサブセットのための –problem=common_voice_clean
要約
より長いテキストをより短いテキストに要約するためには、これらのデータセットを持ちます :
- 数センテンスに要約された CNN/DailyMail 記事: –problem=summarize_cnn_dailymail32k
このタスクのためには –model=transformer と –hparams_set=transformer_prepend を使用することを提案します。これは良い ROUGE スコアを生成します。
翻訳
T2T には多くの翻訳データセットがあります :
- 英独: –problem=translate_ende_wmt32k
- 英仏: –problem=translate_enfr_wmt32k
- 英語-チェコ語: –problem=translate_encs_wmt32k
- 英中: –problem=translate_enzh_wmt32k
- 英越 (英語-ベトナム語): –problem=translate_envi_iwslt32k
problem 名に _rev を付加することで他の方向の翻訳を得ることができます、e.g., 独英のためには –problem=translate_ende_wmt32k_rev を使用します (t2t-datagen –problem=translate_ende_wmt32k で元データをダウンロードする必要が依然としてあることに注意してください)。
総ての翻訳問題に対して、Transformer モデルを試すことを提案します : –model=transformer。まずは基本設定 –hparams_set=transformer_base を試すのがベストです。8 GPU 上で 300K ステップ訓練するとき、英独データセット上でこれはおよそ 28 の BLEU スコアに達するはずで、これは最先端に近いです。シングル GPU 上で訓練する場合には、–hparams_set=transformer_base_single_gpu 設定を試してください。非常に良い結果やより巨大なデータセット (e.g., 英仏) のためには、–hparams_set=transformer_big で大きなモデルを試してください。
基本
ウォークスルー
WMT データ上で Attention Is All You Need からの Transformer モデルを使用して良い英独翻訳モデルを訓練するウォークスルーがここにあります :
pip install tensor2tensor # See what problems, models, and hyperparameter sets are available. # You can easily swap between them (and add new ones). t2t-trainer --registry_help PROBLEM=translate_ende_wmt32k MODEL=transformer HPARAMS=transformer_base_single_gpu DATA_DIR=$HOME/t2t_data TMP_DIR=/tmp/t2t_datagen TRAIN_DIR=$HOME/t2t_train/$PROBLEM/$MODEL-$HPARAMS mkdir -p $DATA_DIR $TMP_DIR $TRAIN_DIR # Generate data t2t-datagen \ --data_dir=$DATA_DIR \ --tmp_dir=$TMP_DIR \ --problem=$PROBLEM # Train # * If you run out of memory, add --hparams='batch_size=1024'. t2t-trainer \ --data_dir=$DATA_DIR \ --problem=$PROBLEM \ --model=$MODEL \ --hparams_set=$HPARAMS \ --output_dir=$TRAIN_DIR # Decode DECODE_FILE=$DATA_DIR/decode_this.txt echo "Hello world" >> $DECODE_FILE echo "Goodbye world" >> $DECODE_FILE echo -e 'Hallo Welt\nAuf Wiedersehen Welt' > ref-translation.de BEAM_SIZE=4 ALPHA=0.6 t2t-decoder \ --data_dir=$DATA_DIR \ --problem=$PROBLEM \ --model=$MODEL \ --hparams_set=$HPARAMS \ --output_dir=$TRAIN_DIR \ --decode_hparams="beam_size=$BEAM_SIZE,alpha=$ALPHA" \ --decode_from_file=$DECODE_FILE \ --decode_to_file=translation.en # See the translations cat translation.en # Evaluate the BLEU score # Note: Report this BLEU score in papers, not the internal approx_bleu metric. t2t-bleu --translation=translation.en --reference=ref-translation.de
インストール
# Assumes tensorflow or tensorflow-gpu installed pip install tensor2tensor # Installs with tensorflow-gpu requirement pip install tensor2tensor[tensorflow_gpu] # Installs with tensorflow (cpu) requirement pip install tensor2tensor[tensorflow]
バイナリ :
# Data generator t2t-datagen # Trainer t2t-trainer --registry_help
ライブラリ使用方法 :
python -c "from tensor2tensor.models.transformer import Transformer"
特徴
- 多くの最先端で基準となるモデルが組み込まれていて新しいモデルは簡単に追加できます (issue をオープンするかプルリクエストしてください!)
- 様式 – テキスト、音声、画像 – に渡る多くのデータセットが生成と使用のために利用可能で、新しいものも簡単に追加できます。
- モデルは任意のデータセットと入力モードで使用できます (あるいは複数でさえも) ; 総ての様式特定の処理 (e.g. テキスト・トークンのための埋め込み検索) は Modality オブジェクトで成され、これはデータセット/タスク仕様で特徴毎に指定されます。
- マルチ GPU マシンと同期 (1 マスター、多数ワーカー) と非同期 (パラメータ・サーバを通して同期する独立的なワーカー) 分散訓練 のサポート。
- データ生成スクリプト t2t-datagen と訓練スクリプト t2t-trainer でコマンドライン・フラグによるデータセットとモデル内の容易なスワップ。
- Google Cloud ML と Cloud TPUs 上の訓練。
T2T 概要
データセット
Datasets は tensorflow.Example protocol buffers で TFRecord ファイル上に総て標準化されています。総てのデータセットは データ generator で登録されて生成され、多くの一般的なシークエンス・データセットは生成と使用のために既に利用可能です。
問題と様式
Problems はデータセットとタスクのための訓練時のハイパーパラメータを主として入力と出力様式 (e.g. シンボル、画像、音声、ラベル) と (利用可能であれば) 語彙を設定することにより定義します。総ての problems は problem_hparams.py で定義されるか、@registry.register_problem で登録されます (総ての利用可能な problems のリストを見るためには t2t-datagen を実行してください)。Modalities (様式) は modality.py で定義され、models が様式独立な tensor を扱えるように入力と出力データ型を抽象化します。
モデル
T2TModel は、入出力様式やタスク独立に、中心的な tensor-to-tensor 変換を定義します。Models は密 tensor を取って密 tensor を生成します、それから最後のステップでタスク依存の様式で変換されるかもしれません (e.g. クラスに渡る softmax のためのロジットを生成するために最後の線形変換を通して供給等)。総てのモデルは models サブパッケージ でインポートされ、(t2t_model.py で定義された) T2TModel から継承されて @registry.register_model で登録されます。
ハイパーパラメータ・セット
Hyperparameter セット は @registry.register_hparams のコードで定義されて登録され、tf.contrib.training.HParams オブジェクトでエンコードされます。HParams は problem 仕様と model の両者で利用可能です。hyperparameter の基本セットは common_hparams.py で定義されて hyperparameter セット関数は他の hyperparameter セット関数を構成できます。
トレーナー
trainer バイナリは訓練、評価、そして推論のための主要なエントリポイントです。ユーザは –model, –problem と –hparams_set フラグを使用して problems, models, そして hyperparameter セット間で容易に切り替えることができます。特定の hyperparameters は –hparams フラグでオーバーライド可能です。–schedule と関連フラグはローカルと分散訓練/評価を制御します (distributed training ドキュメント)。
貴方自身のコンポーネントを追加する
T2T のコンポーネントは、新しいものを容易に追加してコマンドライン・フラグでそれらの中で容易に交換することを可能にする、中心的な登録メカニズムを使用して登録されます。t2t-trainer で –t2t_usr_dir フラグを指定することにより T2T コードベースを編集することなしに貴方自身のコンポーネントを追加することができます。
models, hyperparameter sets, modalities と problems に対してそのようにできます。サンプルのユーザ・ディレクトリについては example_usr_dir を見てください。
データセットを追加する
新しいデータセットを追加するためには、Problem をサブクラス化してそれを @registry.register_problem で登録してください。サンプルのためには TranslateEndeWmt8k を見てください。
また data generators README も見てください。
ペーパー
(訳注: citation 表記については 原文 を確認してください。)
Tensor2Tensor は多くの最先端技術のモデルと深層学習メソッドを開発するために使用されました。ここでは、最初から T2T に基づいて、T2T を紹介する Google Research ブログ記事 で説明されている方法でその特徴とアーキテクチャから恩恵を受けた幾つかのペーパーをリストアップします。
- Attention Is All You Need
- Depthwise Separable Convolutions for Neural Machine Translation
- One Model To Learn Them All
- Discrete Autoencoders for Sequence Models
- Generating Wikipedia by Summarizing Long Sequences
- Image Transformer
- Training Tips for the Transformer Model
- Self-Attention with Relative Position Representations
- Fast Decoding in Sequence Models using Discrete Latent Variables
- Adafactor: Adaptive Learning Rates with Sublinear Memory Cost
Note:これは公式 Google プロダクトではありません。
以上