前沿AI:Tensor2Tensor | Google 開發者大會 2018

"Tensor2Tensor: 組織世界上的模型和數據"。本場演講嘉賓是Laurence Moroney。python

回顧Tensorflow

首先回顧一下Tensorflow:算法

Tensorflow能夠運行在任何地方。tf.data能夠幫你構建出高效的數據輸入管道,tf.layerstf.keras.Model能夠快速幫你構建出神經網絡,而td.estimatorDistributionStrategy能夠幫你快速構建分佈式訓練。網絡

Tensor2Tensor

可是,對於前沿AI來講,這些是不夠的。例如在圖像識別、文本翻譯和文本分析等領域,不少人並無足夠的知識和經驗來掌握這些最佳實踐,他們很難享受到最新的AI研究成果。Tensor2Tensor就是爲了給社區一個良好的共享平臺而來的。機器學習

Tensor2Tensor順帶着一些數據集和模型及其超參數發佈:分佈式

咱們經過各類調研和研究,發現這些超參數的設置對於對應的模型和數據集,性能是最好的。若是沒有Tensor2Tensor,你們只能經過本身調整參數,不斷地試驗,效率十分低下。這就是Tensor2Tensor的設計初衷。工具

爲了更夠更好地開箱即用,Tensor2Tensor給你們準備好了配套的工具,好比超參數集的設置,GPU或者TPU的分佈式訓練,這些在Tensor2Tensor裏面都有提供。性能

Tensor2Tensor開源

Tensor2Tensor徹底開源在GitHub:學習

Tensor2Tensor緊跟學術前沿

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來幫助他們的研究。

Meet t2t-trainer

接下來讓咱們瞭解一下 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
複製代碼

這裏主要有如下三個參數:

  • --problem:問題或者任務
  • --model:選用的模型
  • --hparams_set:超參數集

超參數集很好解釋,對於模型中的超參數,咱們改變某些參數,就能夠構建一套新的超參數集。

如下是幾個很常見的例子。

文本摘要

文本摘要任務是從一段長文本中提取出關鍵信息。

你能夠這樣作:

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提供了不少十分方便的工具,可是若是我想要更加精細的控制,該怎麼作呢?

Datasets 數據集

首先,不少人想要控制的就是數據集。好比不少人不想用Tensor2Tensor裏面的數據集,而僅僅使用其中的一部分,那麼我該怎麼作呢?

首先,咱們建立出對應的problem,而後指定一個數據目錄data_dir,而後生成數據。

如今,咱們有了這個數據,那麼你就能夠進行你想要的任何操做,這樣就實現了數據集的更精細的控制。

用Keras實現模型

還有一部分人想用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包含如下內容:

  • Datasets 數據集
  • Models 模型
  • Scripts 腳本

接下來,主要從如下方面改進咱們的工做:

謝謝你們! 閱讀更多 Google 開發者大會 2018 技術乾貨

相關文章
相關標籤/搜索