"Tensor2Tensor: 组织世界上的模型和数据"。本场演讲嘉宾是Laurence Moroney。python
首先回顾一下Tensorflow:算法
Tensorflow能够运行在任何地方。tf.data
能够帮你构建出高效的数据输入管道,tf.layers
和tf.keras.Model
能够快速帮你构建出神经网络,而td.estimator
和DistributionStrategy
能够帮你快速构建分布式训练。网络
可是,对于前沿AI来讲,这些是不够的。例如在图像识别、文本翻译和文本分析等领域,不少人并无足够的知识和经验来掌握这些最佳实践,他们很难享受到最新的AI研究成果。Tensor2Tensor就是为了给社区一个良好的共享平台而来的。机器学习
Tensor2Tensor顺带着一些数据集和模型及其超参数发布:分布式
咱们经过各类调研和研究,发现这些超参数的设置对于对应的模型和数据集,性能是最好的。若是没有Tensor2Tensor,你们只能经过本身调整参数,不断地试验,效率十分低下。这就是Tensor2Tensor的设计初衷。工具
为了更够更好地开箱即用,Tensor2Tensor给你们准备好了配套的工具,好比超参数集的设置,GPU或者TPU的分布式训练,这些在Tensor2Tensor里面都有提供。性能
Tensor2Tensor彻底开源在GitHub:学习
Tensor2Tensor紧跟学术前沿。优化
有一个颇有趣的例子,有一我的在推特上发推:spa
这个推主的意思是: AMSGrad算法是目前最新的SGD优化算法。
而后,另外一个用户回复到:
意思是:这再也不是最新的SGD优化算法了,最新的是三个星期前就被实现进Tensor2Tensor里面的AdaFactor算法。
而后,这我的很快就被Google录用了。笑:-D
固然,Laurence还放了一张AdaFactor算法的伪代码截图,有兴趣的同窗能够深刻了解一下:
另外,Tensor2Tensor也实现了Transformer模型:
Transformer模型是Google 2017年的论文《Attention is all you need》提出的全新的模型,抛弃传统的CNN和RNN,仅仅使用注意力机制,就到了最当时最顶尖的水平。这个模型普遍应用于NLP领域,例如机器翻译,问答系统,文本摘要和语音识别等等方向。
目前,有不少人参与到咱们的Tensor2Tensor项目中来:
咱们十分鼓励研究人员使用Tensor2Tensor来帮助他们的研究。
接下来让咱们了解一下 t2t-trainer,这是Tensor2Tensor提供的一个工具,这个工具可让不理解代码的人员也能用机器学习来完成一些事情。
使用Tensor2Tensor,你只须要定义少许的几个参数,就能够完成你的任务。
pip install tensor2tensor & t2t-trainer \
--problem=$PROBLEM \
--model=$MODEL \
--hparams_set=$HPARAMS \
--generate_data \
--data_dir=$DATA_DIR \
--output_dir=$TRAIN_DIR \
--train_steps=$TRAIN_STEPS \
--eval_steps=$EVAL_STEPS
复制代码
这里主要有如下三个参数:
超参数集很好解释,对于模型中的超参数,咱们改变某些参数,就能够构建一套新的超参数集。
如下是几个很常见的例子。
文本摘要任务是从一段长文本中提取出关键信息。
你能够这样作:
pip install tensor2tensor & t2t-trainer \
--problem=summarize_cnn_dailymail32k \
--model=transformer \
--hparams_set=transformer_big \
--generate_data \
--data_dir=$DATA_DIR \
--output_dir=$TRAIN_DIR \
--train_steps=$TRAIN_STEPS \
--eval_steps=$EVAL_STEPS
复制代码
仅仅这样几行命令,训练结束后你就能够得到一个至关不错的文本摘要模型!
你仅需这样几行命令:
pip install tensor2tensor & t2t-trainer \
--problem=image_cifar10 \
--model=shake_shake \
--hparams_set=shake_shake_big \
--generate_data \
--data_dir=$DATA_DIR \
--output_dir=$TRAIN_DIR \
--train_steps=$TRAIN_STEPS \
--eval_steps=$EVAL_STEPS
复制代码
这里选用的模型和参数集所训练出来的模型,在一年前是效果最好的模型!
要实现一个en-de(英语-德语)的翻译模型,你只须要:
pip install tensor2tensor & t2t-trainer \
--problem=translate_ende_wmt32k \
--model=transformer \
--hparams_set=transformer_big \
--generate_data \
--data_dir=$DATA_DIR \
--output_dir=$TRAIN_DIR \
--train_steps=$TRAIN_STEPS \
--eval_steps=$EVAL_STEPS
复制代码
达到的效果:
>29 BLEU
,当前的最佳效果!若是你想实现一个语音识别模型,你只须要如下几行命令:
pip install tensor2tensor & t2t-trainer \
--problem=librispeech \
--model=tranformer \
--hparams_set=transformer_librispeech \
--generate_data \
--data_dir=$DATA_DIR \
--output_dir=$TRAIN_DIR \
--train_steps=$TRAIN_STEPS \
--eval_steps=$EVAL_STEPS
复制代码
达到的效果:
<7.5 WER
,这近乎是最佳结果!pip install tensor2tensor & t2t-trainer \
--problem=librispeech \
--model=tranformer \
--hparams_set=transformer_librispeech \
--generate_data \
--data_dir=$DATA_DIR \
--output_dir=$TRAIN_DIR \
--train_steps=$TRAIN_STEPS \
--eval_steps=$EVAL_STEPS
复制代码
达到的效果:
~2.92 bits/dim
,当前最佳对于大量的数据,想要在普通笔记本上面训练是不太现实的。咱们须要规模化的训练。好比使用GPU甚至云端的机器集群。 Tensor2Tensor能够很好地支持这种规模化的训练。
在多GPU的环境下,你只须要:
t2t-trainer \
--worker_gpu=8 \
--problem=translate_ende_wmt32k \
--model=transformer \
--hparams_set=transformer_big \
--generate_data \
--data_dir=$DATA_DIR \
--output_dir=$TRAIN_DIR \
--train_steps=$TRAIN_STEPS \
--eval_steps=$EVAL_STEPS
复制代码
仅仅增长了一行--worker_gpu=8
,你的模型就能够在8个GPU的机器上并行训练!
在Cloud TPU环境里,你只须要:
t2t-trainer \
--use_tpu --cloud_tpu_name=$TPU_NAME \
--problem=translate_ende_wmt32k \
--model=transformer \
--hparams_set=transformer_big \
--generate_data \
--data_dir=$DATA_DIR \
--output_dir=$TRAIN_DIR \
--train_steps=$TRAIN_STEPS \
--eval_steps=$EVAL_STEPS
复制代码
在具备超参数调整的Cloud ML引擎里,你只须要:
t2t-trainer \
--cloud_mlengine --worker_gpu=8 \
--autotune --autotune_maximize \
--autotune_objective='metrics/neg_log_perplexity' \
--autotune_max_trails=100 \
--autotune_parallel_trials=20 \
--hparams_range=transformer_base_range \
--problem=translate_ende_wmt32k \
--model=transformer \
--hparams_set=transformer_big \
--generate_data \
--data_dir=$DATA_DIR \
--output_dir=$TRAIN_DIR \
--train_steps=$TRAIN_STEPS \
--eval_steps=$EVAL_STEPS
复制代码
Tensor2Tensor提供了不少十分方便的工具,可是若是我想要更加精细的控制,该怎么作呢?
首先,不少人想要控制的就是数据集。好比不少人不想用Tensor2Tensor里面的数据集,而仅仅使用其中的一部分,那么我该怎么作呢?
首先,咱们建立出对应的problem
,而后指定一个数据目录data_dir
,而后生成数据。
如今,咱们有了这个数据,那么你就能够进行你想要的任何操做,这样就实现了数据集的更精细的控制。
还有一部分人想用Keras layers来实现模型。
Tensor2Tensor已经实现了不少模型,若是有人想在这基础之上,构建更好地模型,它们须要这样作(举个例子):
# 选择超参数
hparams = registry.hparams('bytenet_base')
# 实例化模型
model = tensor2tensor.models.byte_net.ByteNet(hparams,mode='train')
# 调用模型
features = {'inputs':embedded_inputs,'targets':embedded_targets}
outputs,_ = model(feature)
复制代码
首先获取超参数,而且构建出模型,而后经过调用,就能够得到输出。
演讲者说的内容和标题彷佛有点牵强,这里没有看出来和keras有什么直接关系。
要实现本身的数据集和模型,你能够这样作:
Problem
或者它的子类来建立自定义的数据集T2TModel
来实现本身的模型目前,咱们的Tensor2Tensor包含如下内容:
接下来,主要从如下方面改进咱们的工做: