Google Article
Lingvo:用于序列建模的 TensorFlow 框架
2019 年 2 月 22 日
作者 Jonathan Shen

Lingvo 是 国际语言世界语 中的“语言”一词。这个名称暗示了 Lingvo 框架的根源 — 它被开发为使用 TensorFlow 的通用深度学习框架,专注于与语言相关的任务(如机器翻译、语音识别和语音合成)的序列模型。

在内部,此框架获得了关注并且使用它的研究人员数量激增。因此,现在有 数十篇发表的论文包含使用 Lingvo 取得的最先进成果,并且还会有更多成果。支持的架构范围从传统的 RNN 序列模型到 Transformer 模型,以及包括 VAE 组件的模型。为了表示我们对研究社区的支持并鼓励再现研究成果的工作,我们开源了此框架,并开始发布论文中使用的模型。
图 1:Lingvo 框架概览,勾勒了如何实例化、训练和导出模型以进行评估和服务。
Lingvo 的构建考虑到了协作研究,并通过跨不同任务共享常用层的实现来促进代码重用。此外,所有层都实现相同的常见界面,并且采用相同的方式布局。这不仅产生了更加简洁、更容易理解的代码,还使将其他人对不同任务所做的改进应用于你的任务变得极其简单。强制执行此一致性需要付出更多规则和样板代码的代价,但 Lingvo 尝试将此降至最低,以确保研究期间的快速迭代时间。

协作的另一个方面是共享可复现的结果。Lingvo 为已检入的模型超参数配置提供一个集中位置。这样做不仅有助于记录重要实验,还为其他人提供了一种简单的方法,即通过训练相同的模型来复现你的结果。
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
图 2:Lingvo 中任务配置的一个示例。每个实验的超参数都会在其自己的类中进行配置,该类与构建网络并检入版本控制的代码分开。
虽然 Lingvo 最初重点放在 NLP 方面,但它本身非常灵活,而且已使用该框架成功实现了诸如图像分割和点云分类之类的任务的模型。还支持蒸馏、生成对抗网络 (GAN) 和多任务模型。同时,该框架没有在速度上做出妥协,而且具有经过优化的输入流水线和快速分布式训练。最后,Lingvo 在设计时考虑到了易于生成,甚至有一条明确的路径来移植模型以进行移动推理。

若要直接跳转到代码,请查看我们的 github 页面代码实验室。若要详细了解 Lingvo 或其支持的一些高级功能,请参阅我们的 论文
下一篇博文
Lingvo: A TensorFlow Framework for Sequence Modeling

由 Jonathan Shen 发表

Lingvo 是 国际语言世界语 中“语言”一词。此命名暗示了 Lingvo 框架的根源 — 它被开发为一个通用深度学习框架,使用 TensorFlow,重点关注针对机器翻译、语音识别和语音合成等语言相关任务的序列模型。

在内部,该框架获得了关注并……