自然語(yǔ)言處理在過(guò)去一年取得了很大進(jìn)步,,但直接關(guān)注 NLP 或序列建模的框架還很少。本文介紹了谷歌開源的 Lingvo,,它是一種建立在 TensorFlow 上的序列建??蚣堋T摽蚣苤攸c(diǎn)關(guān)注協(xié)作實(shí)現(xiàn)與共享代碼庫(kù),,能極大提升代碼復(fù)用與研究迭代速度,NLP 的今年就靠你了~
Lingvo 是世界語(yǔ)(Esperanto)中的一個(gè)單詞,,它表示「語(yǔ)言」的意思,。這一命名展示了 Lingvo 框架的根源:它是由 TensorFlow 開發(fā)的通用深度學(xué)習(xí)框架,它重點(diǎn)關(guān)注自然語(yǔ)言處理相關(guān)的序列建模方法,,包括機(jī)器翻譯,、語(yǔ)音識(shí)別和語(yǔ)音合成等。
項(xiàng)目地址:https://github.com/tensorflow/lingvo
在谷歌內(nèi)部,,Lingvo 框架非常有吸引力,,使用它的研究人員越來(lái)越多。目前,,有數(shù)十篇獲得 SOTA 結(jié)果的論文都通過(guò) Lingvo 框架得到了最優(yōu)的復(fù)現(xiàn),,當(dāng)然開源后將會(huì)有越來(lái)越多的新實(shí)現(xiàn)。從傳統(tǒng)的 RNN 序列模型到目前流行的 Transformer,,再到包含變分自編碼器模塊的前沿模型,,Lingvo 支持的序列建模架構(gòu)非常多。
為了支持研究社區(qū)并鼓勵(lì)復(fù)現(xiàn)研究論文,,谷歌開源了這項(xiàng)框架,。他們表示以后谷歌發(fā)布的一些序列建模新研究也會(huì)嘗試采用 Lingvo 框架,它的便捷性將提升 NLP 研究的速度,。
Lingvo 主要支持大量研究團(tuán)體在一個(gè)共享代碼庫(kù)中從事語(yǔ)音和自然語(yǔ)言處理相關(guān)問(wèn)題的研究,。它的設(shè)計(jì)原則如下:
單個(gè)代碼塊應(yīng)該精細(xì)且模塊化,它們會(huì)使用相同的接口,,同時(shí)也容易擴(kuò)展,;
實(shí)驗(yàn)應(yīng)該是共享的、可比較的,、可復(fù)現(xiàn)的,、可理解的和正確的;
性能應(yīng)該可以高效地?cái)U(kuò)展到生產(chǎn)規(guī)模的數(shù)據(jù)集,或擁有數(shù)百個(gè)加速器的分布式訓(xùn)練系統(tǒng),;
當(dāng)模型從研究轉(zhuǎn)向產(chǎn)品時(shí)應(yīng)該盡可能共享代碼,。
圖 1:Lingvo 框架整體結(jié)構(gòu),它展示了模型如何進(jìn)行實(shí)例化,、訓(xùn)練,、評(píng)估和部署。
Lingvo 是在考慮協(xié)作研究的基礎(chǔ)上構(gòu)建的,,它主要通過(guò)在不同任務(wù)之間共享公共層的實(shí)現(xiàn),,從而提升代碼的復(fù)用程度。此外,,所有層都實(shí)現(xiàn)了相同的公共接口,,并以相同的方式布局代碼結(jié)構(gòu)。這不僅會(huì)產(chǎn)生更簡(jiǎn)潔和易讀的代碼,,同時(shí)其它任務(wù)上的改良也可以便捷地應(yīng)用到我們的任務(wù)上,。實(shí)現(xiàn)這種一致性代碼確實(shí)會(huì)有更多的成本,例如更加規(guī)范和模板化的代碼,。但是 Lingvo 也在嘗試減少這種成本,,以確保更快地迭代研究成果。
協(xié)作的另一個(gè)方面是共享可復(fù)現(xiàn)的結(jié)果,。Lingvo 為檢查模型超參數(shù)配置提供了集中的地址,,這不僅可以記錄重要的實(shí)驗(yàn),同時(shí)通過(guò)訓(xùn)練相同的模型,,其它研究者可以更輕松地復(fù)現(xiàn)我們的研究成果,。
def Task(cls):
p = model.AsrModel.Params()
p.name = 'librispeech'
# Initialize encoder params.
ep = p.encoder
# Data consists 240 dimensional frames (80 x 3 frames), which we
# re-interpret as individual 80 dimensional frames. See also,
# LibrispeechCommonAsrInputParams.
ep.input_shape = [None, None, 80, 1]
ep.lstm_cell_size = 1024
ep.num_lstm_layers = 4
ep.conv_filter_shapes = [(3, 3, 1, 32), (3, 3, 32, 32)]
ep.conv_filter_strides = [(2, 2), (2, 2)]
ep.cnn_tpl.params_init = py_utils.WeightInit.Gaussian(0.001)
# Disable conv LSTM layers.
ep.num_conv_lstm_layers = 0
# Initialize decoder params.
dp = p.decoder
dp.rnn_cell_dim = 1024
dp.rnn_layers = 2
dp.source_dim = 2048
# Use functional while based unrolling.
dp.use_while_loop_based_unrolling = False
tp = p.train
tp.learning_rate = 2.5e-4
tp.lr_schedule = lr_schedule.ContinuousLearningRateSchedule.Params().Set(
start_step=50000, half_life_steps=100000, min=0.01)
# Setting p.eval.samples_per_summary to a large value ensures that dev,
# devother, test, testother are evaluated completely (since num_samples for
# each of these sets is less than 5000), while train summaries will be
# computed on 5000 examples.
p.eval.samples_per_summary = 5000
p.eval.decoder_samples_per_summary = 0
# Use variational weight noise to prevent overfitting.
p.vn.global_vn = True
p.train.vn_std = 0.075
p.train.vn_start_step = 20000
return p
代碼1:Lingvo 中的任務(wù)配置示例。每個(gè)實(shí)驗(yàn)的超參數(shù)都是在其所屬的類中配置的,,與構(gòu)建網(wǎng)絡(luò)和檢查版本控制的代碼不同,。
雖然 Lingvo 一開始重點(diǎn)關(guān)注 NLP,但它本質(zhì)上非常靈活,。用于圖像分割和點(diǎn)云分類任務(wù)的模型已經(jīng)使用該框架成功實(shí)現(xiàn),。它還支持知識(shí)蒸餾、GAN 和多任務(wù)模型,。同時(shí),,該框架沒(méi)有因?yàn)楸憬荻鵂奚俣龋哂袃?yōu)化的輸入流程和快速的分布式訓(xùn)練,。最后,,Lingvo 還著眼于生產(chǎn)化,甚至有一條明確的路徑來(lái)將模型移植到移動(dòng)端,。
論文:Lingvo: a Modular and Scalable Framework for Sequence-to-Sequence Modeling
論文地址:https://arxiv.org/abs/1902.08295
摘要:Lingvo 是一個(gè)能夠?yàn)閰f(xié)作式深度學(xué)習(xí)研究提供完整解決方案的 Tensorflow 框架,,尤其關(guān)注序列到序列模型,。Lingvo 模型由模塊化構(gòu)件組成,這些構(gòu)件靈活且易于擴(kuò)展,,實(shí)驗(yàn)配置集中且可定制,。分布式訓(xùn)練和量化推理直接在框架內(nèi)得到支持,框架內(nèi)包含大量 utilities,、輔助函數(shù)和最新研究思想的現(xiàn)有實(shí)現(xiàn),。過(guò)去兩年里,Lingvo 已被數(shù)十個(gè)研究人員在 20 篇論文中協(xié)作使用,。本文作為對(duì)框架各個(gè)部分的介紹,,概述了 Lingvo 的基本設(shè)計(jì),同時(shí)還提供了展示框架能力的高級(jí)功能示例,。