"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包含如下內容:
接下來,主要從如下方面改進咱們的工做: