【翻译】面向自然语言处理的深度学习(一)

讲解: Mike Lewis

编辑:
Jiayu Qiu, Yuhong Zhu, Lyuang Fu, Ian Leefmans ,2020年4月20日

翻译:
Yibing Ran, 2020年12月30日
原文阅读

概述

  • 近年来取得了惊人的进步:
    • 对于某些语言,人们更喜欢机器翻译而不是人工翻译
    • 在许多问答数据集上的超人性能、
    • 语言模型生成流畅的段落(如Radford等,2019)
  • 最每个任务所需要的最小专业技术,可以用相当通用的模型实现

语言模型

  • 语言模型为文本分配概率:\(p(x_0,\cdots,x_n)\)
  • 有许多可能的句子,因此我们不能仅仅训练一个分类器
  • 最为流行的方法是使用链式法则对分布进行分解:

\[p(x_0,\cdots,x_n)=p(x_0)p(x_1|x_0) \cdots p(x_n|x_{n-1}) \]

神经语言模型

我们把文本输入到神经网络,神经网络将所有上下文映射为一个向量,这个向量表示下一个单词。我们有一个大的词嵌入矩阵,该词嵌入矩阵包含模型可能输出的每个单词的向量。然后我们通过背景向量和每个单词向量的点积计算相似度。我们将得到预测下一个词的概率,然后通过最大化似然训练这个模型。这里关键的细节是我们不直接处理单词,而是处理子词或字符。

\[p(x_n|x_{0,\cdots,n-1})= softmax(Ef(x_{0,\cdots,n-1})) \]

(注:原文为$p(x_0|x_{0,\cdots,n-1}) $,应该是笔误)

图-1: 神经语言模型

卷积语言模型

  • 第一个神经网络语言模型
  • 每个单词以向量形式嵌入,是一个指向嵌入矩阵的查找表,如此,无论单词在什么上下文中出现,它将得到相同的向量
  • 在每个时间步使用相同的前馈神经网络
  • 不幸的是,固定长度的历史意味着它将只能以有界上下文为条件
  • 这些模型确有非常快的特点
图-2: 卷积语言模型

循环神经网络模型

  • 这是直到前几年最为流行的方法
  • 概念简单明了:每个时间步都维护一些状态(从上一个时间步接收到的),这些状态表示到目前为止我们所读到的内容。这将与当前正在读的单词结合起来,并在以后的状态下使用。然后我们按照我们需要的时间步骤重复这个过程。
  • 使用无界的上下文:原理上,一本书的标题会影响书中最后一个字的隐藏状态。
  • 弊端:
    • 整个文档读取的历史在每个时间步都被压缩成一个固定大小的向量,这是该模型的瓶颈。
    • 梯度在长上下文中消失
    • 不可能在时间步上并行化,所以训练很慢
图-3 循环语言模型

Transformer语言模型

  • 在自然语言处理中使用的最新模型
  • 革命性的点球Revolutionized penalty
  • 三大主要阶段
    • 输入阶段
    • \(N\times\)不同参数的transformer块(编码层)
    • 输出阶段
  • 示例:在原论文中的6个变换器模组(编码层)
图-4 Transformer语言模型

子层由标记为“Add&Norm”的框连接,这里“Add”意味着这是一个残差连接,有助于阻止梯度消失,这里“Norm”表示层的归一化normalization。

图-5 编码层
图-5 编码层
应该注意的是,transformer在时间步中共享权重。

多头注意力

图-6 多头注意力
对于我们试图预测的单词,我们计算称为$\lfloor查询\rceil$的值,对于前面所有用于预测的单词,我们称其为$\lfloor键\rceil$(k)。$\lfloor查询\rceil$是关于上下文的信息,例如前面的形容词。$\lfloor键\rceil$是就像一个标签,包含关于当前单词的信息,比如是否是一个形容词。一旦计算出$\lfloor查询\rceil$q,我们可以推导出前面单词的分布($p_i$):

\[p_i = softmax(q,k_i) \]

然后,我们还为前面单词计算被称为值(v)的量。值表示单词的内容。
一旦我们有了这些值,我们就可以通过最大化注意力分布来计算隐藏状态:

\[h_i = \sum_i{p_i v_i} \]

我们用多个不同的\(\lfloor查询\rceil\)\(\lfloor值\rceil\)\(\lfloor键\rceil\)并行计算相同的东西。理由是我们想使用不同的东西预测下一个词。例如,当我们预测单词“unicorns”时,使用前面三个单词“These”、“horned”、“silver-white”。我们通过“horned”和“silver-white”知道它是一个独角兽。然而,我们通过“These”知道它是复数。因此,我们可能想要使用这三个词来知道下一个单词应该是什么。多头注意力是一种让每一个单词看到前面多个单词的方法。

多头注意力的一大优点就是它具有很强的并行性。与循环神经网络不同的是,它一次计算多头注意力模块的所有头和所有时间步。一次计算所有时间步的一个问题是,它还可以看到未来的单词,而我们只希望它以其前面的单词为条件。一个解决办法就是所谓的自我注意遮掩。掩码是一个下三角元素为0,上三角元素为负无穷的上三角矩阵。在注意模块的输出中添加这个掩码的效果是,左边的每一个单词都比右边的单词有更高的注意分数,所以在实践中模型只关注前面的单词。掩码的应用在语言模型中非常关键,因为这使得它在数学上正确,然而,在文本编码器中,双向上下文可能会有帮助。

使得transformer语言模型工作的一个细节是向输入中添加位置嵌入。在语言中,一些像顺序这样的属性对解释是非常重要的。这里使用的技术是学习不同时间步长的独立嵌入,并将这些添加到输入中,所以现在的输入是词向量和位置向量的总和。这将顺序信息。

图-7 Transformer结构

为什么这个模型这么好:

  1. 它给出了每个单词对之间的直接联系。每个单词可以直接访问前面单词的隐层状态,减轻了梯度消失。它很容易学习非常昂贵的的函数。
  2. 所有时间步并行
  3. 自我注意力是二次的(所有时间步可以注意所有其他),(破除了?)极限最大序列长度。

一些技巧(特别是对于多头注意力和位置编码)和解码语言模型

技巧1:大量使用层归一化稳定训练是很有帮助的

  • 对于transformer很重要

技巧2:热启动+反平方根训练计划

  • 使用学习率计划:为了使transformer工作的更好,你必须使你的学习率从0到第1千步线性地衰减

技巧3:小心初始化

  • 对于像机器翻译这样的任务很有用

技巧4:平滑标签

  • 对于机器翻译这样的任务很有帮助

以下是上述几种方法的结果。在这些测试中,右边的指标是困惑度(perplexity,ppl)(ppl越低越好)。

图-8 模型性能比较
可以看到,引入transformer后,性能得到了很大的改善。

Transformer语言模型一些重要的事实

  • 最小的inductive bias
  • 所有单词直接连接,这将减轻梯度消失
  • 所有时间步并行计算
  • 自我注意力是二次的(所有时间步可以注意所有其他),(破除了?)极限最大序列长度。
图-9 Transformer vs.循环神经网络

Transformer很容易放大

  1. 无限的训练数据,甚至远远超过你需要的
  2. 2019年,GPT-2使用了20亿个参数
  3. 最近的模型在2020年使用了170亿个参数

解码语言模型

我们现在可以在文本上训练概率分布——现在我们可以得到指数级的多种可能输出,所以我们不能计算最大的(输出可能)。无论你对第一个单词做出什么选择,都会影响到其他所有的决定。因此,在此基础上,引入贪心解码如下。

贪心解码行不通

我们在每一个时间步都使用最有可能的单词。但是,这并不能保证给出最有可能的序列,因为如果您必须在某个点上执行这一步,那么您就无法回溯搜索以撤消以前的任何会话。

穷举搜索也不可能

它需要计算所有可能的序列因为复杂度为\(O(V^T)\),这太昂贵了。

理解问题和答案

  1. 与单头注意力相比,多都注意力模型的好处是什么?
    • 要预测下一个单词,你需要观察多个独立的内容,换句话说,在试图理解预测下一个单词所需的上下文时,可以将注意力放在之前的多个单词,。
  2. Transformer如何解决CNN和RNN的信息瓶颈?
    • 注意力模型允许所有单词之间的直接连接,允许每个单词以之前的所有单词为条件,有效地消除了这个瓶颈。
  3. Transformer与RNN在利用GPU并行化方面有何不同?
    • Transformer中多头注意力模块是高度可并行的,然而RNN不是的,因此不能够充分利用GPU技术。事实上Transformer在一次前馈过程中计算所有时间步。
posted @ 2020-12-30 22:42  CliffRyan  阅读(402)  评论(0编辑  收藏  举报