"Tensor2Tensor: 組織世界上的模型和資料"。本場演講嘉賓是Laurence Moroney。
回顧Tensorflow
首先回顧一下Tensorflow:
Tensorflow可以執行在任何地方。tf.data
可以幫你構建出高效的資料輸入管道,tf.layers
和tf.keras.Model
可以快速幫你構建出神經網路,而td.estimator
和DistributionStrategy
可以幫你快速構建分散式訓練。
Tensor2Tensor
但是,對於前沿AI來說,這些是不夠的。例如在影象識別、文字翻譯和文字分析等領域,很多人並沒有足夠的知識和經驗來掌握這些最佳實踐,他們很難享受到最新的AI研究成果。Tensor2Tensor就是為了給社群一個良好的共享平臺而來的。
Tensor2Tensor順帶著一些資料集和模型及其超引數釋出:
我們通過各種調研和研究,發現這些超引數的設定對於對應的模型和資料集,效能是最好的。如果沒有Tensor2Tensor,大家只能通過自己調整引數,不斷地試驗,效率十分低下。這就是Tensor2Tensor的設計初衷。
為了更夠更好地開箱即用,Tensor2Tensor給大家準備好了配套的工具,比如超引數集的設定,GPU或者TPU的分散式訓練,這些在Tensor2Tensor裡面都有提供。
Tensor2Tensor開源
Tensor2Tensor完全開源在GitHub:
Tensor2Tensor緊跟學術前沿
Tensor2Tensor緊跟學術前沿。
有一個很有趣的例子,有一個人在推特上發推:
這個推主的意思是: 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 指令碼
接下來,主要從以下方面改進我們的工作: