Tensor2Tensor
Tensor2Tensor,或简称 T2T,是一个深度学习模型和数据集的库,旨在让深度学习更容易访问并 加速机器学习研究。
T2T 由Google Brain 团队的研究人员和工程师以及用户社区开发。现在它已被弃用——我们会保持其运行并欢迎 bug 修复,但鼓励用户使用继任库 Trax。
快速开始
这个iPython笔记本 解释了 T2T 并在你的浏览器中运行,使用 Google 提供的免费 VM,不需要安装。或者,以下是一条命令版本,安装 T2T,下载 MNIST,训练模型并评价它:
pip install tensor2tensor && t2t-trainer \
--generate_data \
--data_dir=~/t2t_data \
--output_dir=~/t2t_train/mnist \
--problem=image_mnist \
--model=shake_shake \
--hparams_set=shake_shake_quick \
--train_steps=1000 \
--eval_steps=100
目录
推荐的数据集和模型
以下列出了一些可以使用 T2T 解决的任务,当你在适当的问题上训练合适的模型时。我们在下面给出了问题和模型,并推荐了一个我们知道在我们的设置中效果良好的超参数设置。我们通常在云 TPU 或 8-GPU 机器上运行;如果你在不同的设置上运行,可能需要修改超参数。
数学语言理解
对于评估涉及加、减和乘的数学表达式,包括正负小数的字符级求值,并将不同数字分配给符号变量,使用
- MLU 数据集:
--problem=algorithmic_math_two_variables
你可以尝试使用不同的 transformer 模型和超参数来解决问题,详见论文:
- 标准 transformer:
--model=transformer
--hparams_set=transformer_tiny
- 通用 transformer:
--model=universal_transformer
--hparams_set=universal_transformer_tiny
- 自适应通用 transformer:
--model=universal_transformer
--hparams_set=adaptive_universal_transformer_tiny
故事、问题和答案
对于基于故事的问答,使用
- bAbi 数据集:
--problem=babi_qa_concat_task1_1k
你可以从[1,20]范围内选择 bAbi 任务,并从 1k 或 10k 的子集中选择。要将所有任务的测试数据合并到一个测试集中,使用
--problem=babi_qa_concat_all_tasks_10k
图像分类
对于图像分类,我们有许多标准数据集:
- 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,即,
使用 --model=resnet --hparams_set=resnet_50
或
--model=xception --hparams_set=xception_base
。
在 ImageNet 上,Resnet 应该能达到 76%以上的 top-1 准确率。
对于 CIFAR 和 MNIST,我们建议尝试 shake-shake 模型:
--model=shake_shake --hparams_set=shakeshake_big
。
这个设置训练 --train_steps=700000
应该可以接近 97% 的 CIFAR-10 准确率。
图像生成
对于(无)条件图像生成,我们有许多标准数据集:
- CelebA:
--problem=img2img_celeba
用于图像到图像翻译,即,从 8x8 超分辨率到 32x32。 - CelebA-HQ:
--problem=image_celeba256_rev
用于下采样的 256x256。 - CIFAR-10:
--problem=image_cifar10_plain_gen_rev
用于类别条件的 32x32 生成。 - LSUN Bedrooms:
--problem=image_lsun_bedrooms_rev
- MS-COCO:
--problem=image_text_ms_coco_rev
用于文本到图像生成。 - 小 ImageNet(一个大型数据集):
--problem=image_imagenet32_gen_rev
用于 32x32 或--problem=image_imagenet64_gen_rev
用于 64x64。
我们建议使用 Image Transformer,即, --model=imagetransformer
,或使用离散混合逻辑斯蒂模型的 Image Transformer Plus,即 --model=imagetransformerpp
,或变分自编码器,即,--model=transformer_ae
。
对于 CIFAR-10,使用 --hparams_set=imagetransformer_cifar10_base
或 --hparams_set=imagetransformer_cifar10_base_dmol
产生 2.90 bits per dimension。对于 Imagenet-32,使用 --hparams_set=imagetransformer_imagenet32_base
产生 3.77 bits per dimension。
语言建模
对于语言建模,我们在 T2T 中有这些数据集:
- PTB(一个小型数据集):
--problem=languagemodel_ptb10k
用于 词级建模和--problem=languagemodel_ptb_characters
用于字符级建模。 - LM1B(一个十亿词语料库):
--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
并进行少量的训练步骤(例如,--train_steps=2000
)。
语音识别
对于语音到文本,我们在 T2T 中有这些数据集:
-
Librispeech(美式英语):
--problem=librispeech
为 全套数据集和--problem=librispeech_clean
为一个较小但经过良好过滤的部分。 -
Mozilla Common Voice(美式英语):
--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=translate_enes_wmt32k
你可以通过在问题名称后附加 _rev
来获取相反方向的翻译,例如,对于德语-英语使用
--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
设置。对于非常好的结果或较大的数据集(例如,对于英语-法语),尝试大模型
使用 --hparams_set=transformer_big
。
请参阅这个示例 了解翻译如何运行。
基础
演练
这是一个使用 Transformer 模型从《注意力即一切你需要》在 WMT 数据上训练一个好的英语到德语翻译模型的演练。
pip install tensor2tensor
# 查看有哪些问题、模型和超参数集可用。
# 可以轻松地在它们之间切换(并添加新的)。
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
# 生成数据
t2t-datagen \
--data_dir=$DATA_DIR \
--tmp_dir=$TMP_DIR \
--problem=$PROBLEM
# 训练
# * 如果内存不足,添加 --hparams='batch_size=1024'。
t2t-trainer \
--data_dir=$DATA_DIR \
--problem=$PROBLEM \
--model=$MODEL \
--hparams_set=$HPARAMS \
--output_dir=$TRAIN_DIR
# 解码
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
# 查看翻译结果
cat translation.en
# 评估 BLEU 分数
# 注意:在论文中报告这个 BLEU 分数,而不是内部 approx_bleu 指标。
t2t-bleu --translation=translation.en --reference=ref-translation.de
安装
# 假定已安装 tensorflow 或 tensorflow-gpu
pip install tensor2tensor
# 安装包含 tensorflow-gpu 需求
pip install tensor2tensor[tensorflow_gpu]
# 安装包含 tensorflow(cpu)需求
pip install tensor2tensor[tensorflow]
二进制文件:
# 数据生成器
t2t-datagen
# 训练器
t2t-trainer --registry_help
库使用:
python -c "from tensor2tensor.models.transformer import Transformer"
特征
- 内置许多最前沿和基础的模型,并且可以轻松添加新模型(打开一个 issue 或 pull request!)。
- 各种模态的数据集-文本、音频、图像-可用于生成和使用,并且可以轻松添加新的数据集(为公开数据集打开一个 issue 或 pull request!)。
- 模型可以与任何数据集和输入模式(甚至多个)一起使用;所有模态特定的处理(例如对文本标记的嵌入查找)通过
bottom
和top
转换来完成,这些转换在模型的每个特征中被指定。 - 支持多 GPU 机器和同步(1 主,多个工作者)和异步(通过参数服务器同步的独立工作者)分布式训练。
- 通过命令行标志轻松在数据集和模型之间切换,使用数据生成脚本
t2t-datagen
和训练脚本t2t-trainer
。 - 在 Google Cloud ML 和 Cloud TPUs 上训练。
T2T 概述
问题
问题由输入和目标等特征以及每个特征的模态(例如符号、图像、音频)和词汇表等元数据组成。问题特征由一个数据集给出,这个数据集存储为 TFRecord
文件,其中包含 tensorflow.Example
协议缓冲区。所有问题都在 all_problems.py
中导入,或通过 @registry.register_problem
注册。运行 t2t-datagen
查看可用问题列表并下载它们。
模型
T2TModel
s 定义了核心的张量到张量的计算。它们对每个输入和输出应用一个默认的转换,以便模型可以处理无模态的张量(例如,输入的嵌入;以及输出的线性变换以生成类别softmax的logits)。所有模型都位于 models
子包 中,继承自 T2TModel
,并通过 @registry.register_model
注册。
超参数集
超参数集 编码在 HParams
对象中,并通过 @registry.register_hparams
注册。每个模型和问题都有一个 HParams
。在 common_hparams.py
中定义了一组基本的超参数,并且超参数集函数可以组合其他超参数集函数。
训练器
训练器 二进制文件是训练、评估和推理的入口点。用户可以通过使用 --model
、--problem
和 --hparams_set
标志轻松切换问题、模型和超参数集。可以使用 --hparams
标志覆盖特定的超参数。--schedule
和相关的标志控制本地和分布式训练/评估(分布式训练文档)。
添加您的组件
T2T 的组件使用中央注册机制进行注册,使得通过命令行标志轻松添加新组件和轻松切换。通过在 t2t-trainer
中指定 --t2t_usr_dir
标志,您可以在不编辑 T2T 代码库的情况下添加自己的组件。
您可以为模型、超参数集、模态和问题执行此操作。如果您的组件可能对其他人有用,请提交 pull request。
请参阅 example_usr_dir
,以获取示例用户目录。
添加数据集
要添加新的数据集,请继承 Problem
并通过 @registry.register_problem
注册。参见 TranslateEndeWmt8k
了解示例。另请参阅 数据生成器 README。
在 FloydHub 上运行
单击这个按钮以在 FloydHub 上打开一个 Workspace。您可以使用该工作区在完全配置的云GPU机器上开发和测试代码。
Tensor2Tensor 已经预安装在环境中,您只需打开一个 终端 并运行代码即可。
# 在工作区的终端中使用此命令测试快速入门
t2t-trainer \
--generate_data \
--data_dir=./t2t_data \
--output_dir=./t2t_train/mnist \
--problem=image_mnist \
--model=shake_shake \
--hparams_set=shake_shake_quick \
--train_steps=1000 \
--eval_steps=100
注意:确保遵守 FloydHub 服务条款。
论文
引用 Tensor2Tensor 时,请引用 这篇论文。
@article{tensor2tensor,
author = {Ashish Vaswani and Samy Bengio and Eugene Brevdo and
Francois Chollet and Aidan N. Gomez and Stephan Gouws and Llion Jones and
\L{}ukasz Kaiser and Nal Kalchbrenner and Niki Parmar and Ryan Sepassi and
Noam Shazeer and Jakob Uszkoreit},
title = {Tensor2Tensor for Neural Machine Translation},
journal = {CoRR},
volume = {abs/1803.07416},
year = {2018},
url = {http://arxiv.org/abs/1803.07416},
}
Tensor2Tensor 被用来开发了许多最先进的模型和深度学习方法。在这里我们列出了一些从一开始就基于 T2T 的论文,并从其特性和架构中受益,这些特性和架构在 介绍 T2T 的 Google Research Blog 博客文章 中有描述。
- 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
- Universal Transformers
- Attending to Mathematical Language with Transformers
- The Evolved Transformer
- Model-Based Reinforcement Learning for Atari
- VideoFlow: A Flow-Based Generative Model for Video
注意:这不是一个官方的 Google 产品。