社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

【深度学习】基础知识--Transformer(上)

机器学习初学者 • 3 年前 • 341 次点击  
作者:华校专

作者信息:

华校专,曾任阿里巴巴资深算法工程师、智易科技首席算法研究员,现任腾讯高级研究员,《Python 大战机器学习》的作者。

编者按:

算法工程师必备系列更新啦!继上次推出了算法工程师必备的数学基础后,小编继续整理了必要的机器学习知识,全部以干货的内容呈现,哪里不会学哪里,老板再也不用担心你的基础问题!

Transformer

一、Transformer

  1. Transformer 是一种新的、基于 attention 机制来实现的特征提取器,可用于代替 CNNRNN 来提取序列的特征。

    Transformer 首次由论文 《Attention Is All You Need》 提出,在该论文中 Transformer 用于 encoder - decoder 架构。事实上 Transformer 可以单独应用于 encoder 或者单独应用于 decoder

  2. Transformer 相比较 LSTM 等循环神经网络模型的优点:

  • 可以直接捕获序列中的长距离依赖关系。
  • 模型并行度高,使得训练时间大幅度降低。

1.1 结构

  1. 论文中的 Transformer 架构包含了 encoderdecoder 两部分,其架构如下图所示。

  • Transformer 包含一个编码器 encoder 和一个解码器 decoder

  • 编码器 encoder 包含一组 6 个相同的层 Layer ,每层包含两个子层 SubLayer

  • 第一个子层是一个多头自注意力 multi-head self-attention 层,第二个子层是一个简单的全连接层。

  • 每个子层都使用残差直连,并且残差直连之后跟随一个layer normalization:LN 。假设子层的输入为 ,则经过 LN 之后整体的输出为: 。为了 Add 直连,论文将内部所有层的输入、输出的向量维度设置为 d_{model} = 512 维。

  • 解码器 decoder 也包含一组 6 个相同的层 Layer,但是每层包含三个子层 SubLayer

  • 第一个子层也是一个多头自注意力 multi-head self-attention 层。但是,在计算位置 i 的 self-attention 时屏蔽掉了位置 i 之后的序列值,这意味着:位置 i 的 attention 只能依赖于它之前的结果,不能依赖它之后的结果。因此,这种 self-attention 也被称作 masked self-attention

  • 第二个子层是一个多头注意力multi-head attention 层,用于捕获 decoder output encoder output 之间的 attention

  • 第三个子层是一个简单的全连接层。

  • encoder 一样:

  • 每个子层都使用残差直连,并且残差直连之后跟随一个layer normalization:LN

  • decoder 所有层的输入、输出的向量维度也是 维。




1.1.1 attention

  1. 编码器和解码器的 attention 都是采用 scaled dot attention

    设有 M 个 query 向量 、 M 个 key 向量 、 M 个 value 向量 ,其中 query 向量和 key 向量的维度为 value 向量的维度为 。经过 attention 之后,位置 m 的输出为:其中 表示位置 m 与位置 i 之间的权重:

    则有:

    令:,其中 softmax 沿着矩阵的行归一化。令:

    则有: 。即:

  • 除以 是为了降低 的数值,防止它落入到 softmax 函数的饱和区间。因为 softmax 函数的饱和区梯度几乎为 0 ,容易发生梯度消失。

  • 如果使用了 Masked attention,则有:

  • 令:

    则有:

    令:,其中 softmax 沿着矩阵的行归一化。令:

    则有: 。即:

  1. 事实上,一组多个attention 的效果要优于单个 attention,这称作multi-head attention

    给定 query 矩阵 key 矩阵 value 矩阵 multi-head attentionhead i 先通过一个线性映射然后再经过 attention,得到 head i 的输出 其中:

  • 将 M 个 query 向量 维降低到 维。

  • 将 M 个 key 向量 维降低到 维。

  • 将 M 个 value 向量 维降低到 维。将多个 head i 的输出 进行拼接,并再经过一个线性映射即可得到多头attention 的结果: 其中:

  • ahead 的数量, 是为了确保multi-head attention 前后的输入输出维度一致。

  • concate 操作在 M 个向量上进行:其中 为第 i 个 head 的第 m 个输出向量。

  • 论文中选择 。为了保证 multi-head attention 的表达空间与 single-head attention 一致,论文中选择:

  • multi-head attention 将整个 attention 空间拆分成多个 attention 子空间,其表达能力更强。

    从原理上看,multi-head 相当于在整体计算代价几乎保持不变的条件下,引入了更多的非线性从而增强了模型的表达能力。

  • 在论文中,有三种方式使用多头注意力机制:

    • encoder-decoder attentionquery 来自前一个 decoder 层的输出,keys,values 来自 encoder 的输出。其意义是:decoder 的每个位置去查询它与 encoder 的哪些位置相关,并用 encoder 的这些位置的 value 来表示。

    • encoder self-attentionquery,key,value 都来自前一层 encoder 的输出。这允许 encoder 的每个位置关注 encoder 前一层的所有位置。

    • decoder masked self-attentionquery,key,value 都来自前一层 decoder 的输出。这允许 decoder 的每个位置关注 encoder 前一层的、在该位置之前的所有位置。

    1.1.2 全连接层

    1. encoderdecoder 还包含有全连接层。对 encoder/decoder 的每个 attention 输出,全连接层通过一个 ReLU 激活函数以及一个线性映射:

    • 对于同一个 multi-head attention 的所有 M 个输出,采用相同的参数;对于不同的 multi-head attention 的输出,采用不同的参数。
    • 输入和输出的维度保持为 ,但是中间向量的维度是 2048 维,即 。这是为了扩充中间层的表示能力,从而抵抗 ReLU 带来的表达能力的下降。

    1.1.3 embedding 层

    1. 网络涉及三个 embedding 层:

    • encoder 输入 embedding 层:将 encoder 输入 token 转化为 d_{model} 维的向量。
    • decoder 输入 embedding 层:将 decoder 输入 token 转化为 d_{model} 维的向量。
    • decoder 输出 embedding 层:将 decoder 输出 token 转化为 d_{model} 维的向量。在论文中这三个 embedding 矩阵是共享的,并且论文中在 embedding 层将该矩阵乘以一个常量 \sqrt{d_{model}} 来放大每个权重。

    1.1.4 position embedding

    1. attention 的计算公式 可以看到:调整输入的顺序对 attention 的结果没有任何影响。即:attention 的输出中不包含任何顺序信息。

      事实上输入的顺序对于很多任务是非常重要的,比如 我喜欢喝牛奶,而不喜欢喝咖啡我喜欢喝咖啡,而不喜欢喝牛奶 的语义完全不同。

    2. 论文通过将位置编码添加到 encoderdecoder 底部的输入 embedding 来解决问题。即有:

      其中 为位置 i 的position embedding  attention 权重与位置有关。

      对于同一个输入序列如果打乱序列顺序,则不同 tokenattention 权重发生改变使得 attention 的结果不同。

    3. 位置编码有两种选择:

    • 可以作为参数来学习,即:将 encoder 的每个输入的位置embeddingdecoder 的每个输入的位置embedding 作为网络的参数,这些参数都从训练中学得。

    • 也可以人工设定固定值。论文中使用: 其中 表示位置编号, 表示向量的维度。

    • 不同的维度对应不同的波长的正弦曲线,波长从

    • 选择这样的函数是因为:不同位置之间的embedding 可以简单的相互表示。即:对于给定的偏移量k , 可以表示为 的线性函数。这意味着模型可以捕获到位置之间的相对位置关系。

  • 论文的实验表明:通过参数学习的position embedding 的效果和采用固定的position embedding 相差无几。

    另外,固定方式的 position embedding 可以在测试阶段处理那些超过训练序列长度的测试序列。

  • 1.2 Transformer vs CNN vs RNN

    1. 假设输入序列长度为 n,每个元素的维度为 。输出序列长度也为 n ,每个元素的维度也是 d :。可以从每层的计算复杂度、并行的操作数量、学习距离长度三个方面比较 TransformerCNN RNN 三个特征提取器。

    • 每层的计算复杂度:

    • 考虑到 nkeynquery 两两点乘,因此self-attention 每层计算复杂度为 O(n^2\times d)

    • 考虑到矩阵(维度为 nxn) 和输入向量相乘,因此RNN 每层计算复杂度为

    • 对于 k 个卷积核经过 n 次一维卷积,因此 CNN 每层计算复杂度为 。如果考虑深度可分离卷积,则计算复杂度下降为

    • 因此:当 时,self attention 要比 RNNCNN 快,这也是大多数常见满足的条件。

    • 时,可以使用受限 self attention,即:计算 attention时仅考虑每个输出位置附近窗口的 r 个输入。这带来两个效果:

    • 每层计算复杂度降为

    • 最长学习距离降低为 r,因此需要执行 次才能覆盖到所有输入。

    • 并行操作数量:可以通过必须串行的操作数量来描述。

    • 对于 self-attention,CNN,其串行操作数量为 ,并行度最大。

    • 对于 RNN,其串行操作数量为 ,较难并行化。

    • 最长计算路径:覆盖所有输入的操作的数量。

    • 对于self-attention,最长计算路径为 O(1);对于 self-attention stricted,最长计算路径为

    • 对于常规卷积,则需要 个卷积才能覆盖所有的输入;对于空洞卷积,则需要 才能覆盖所有的输入。

    • 对于 RNN,最长计算路径为

  • 作为额外收益,self-attention 可以产生可解释性的模型:通过检查模型中的注意力分布,可以展示与句子语法和语义结构相关的信息。

  • 1.3 实验结果

    1. 训练包含两个训练数据集:

    • WMT 2014 English - German 数据集:包含 450万句子对,每个句子通过 byte-pair encoding:BPE 编码。

    • BPE 编码首先将所有文本转换为 Unicode bytes,然后将其中出现次数较高的、连续的一组bytes用一个 token 替代。

    • 源句和翻译句共享词汇表,包含 37000个 token

    • WMT 2014 English-French 数据集:包含 3600万句子对,每个句子通过 BPE 编码。源句和翻译句共享词汇表,包含 32000个 token

  • 训练在 8 NVIDIA P100 GPU 上,相近大小的 句子对 放到一个batch 里,每个训练 batch 包含大约 25000个源 token 和 25000个 翻译 token

    • 优化器采用 Adam optimizer 。学习率为:其中

    • 训练在基础版本上执行 10 万步约12个小时,在大型版本上(更大的参数)执行 30 万步约 3.5 天。

    • 通过两种方式进行正则化:

    • dropout:

    • residual dropout:在每个子层添加到 ADD & LN 之前执行 dropout

    • embedding dropout:在 encoderdecoder 添加position embedding 之后,立即执行 dropout

    • label smoothing::训练期间使用 label smoothing。虽然这会降低模型的困惑度,因为模型学到了更大的不确定性,但是这会提高 BLEU

  • WMT 2014 English-German/ WMT 2014 English-French 翻译任务上,各种模型的效果如下图:

    • 训练参数:见后一个表的最后一行。

    • 超参数选择:使用beam size = 4 、长度惩罚因子 beam search,超参数在验证集上选择。

    • 训练代价 FLOPs :通过训练时间、训练 GPU 个数、每个 GPU 的单精度浮点计算能力三者相乘得到估计值。

    • 对于 base model,采用单个模型的最后 5 个 checkpoint 的平均(10分钟生成一个 checkpoint)。对于 big model,采用单个模型的最后 20个 checkpoint 的平均。

  • 为了评估不同参数的影响,论文在 English-German 翻译任务中采用不同的模型,评估结果是 newstest2013 验证集上得到。

    • beam search 参数同前,但是并没有采用checkpoint 平均的策略。

    • PPL 困惑度是在 word-piece 上得到的。考虑到 BPE 编码,这和 word 级别的困惑度有所出入。

    • 为空的参数表示和 base 模型一致。

    • (A) 展示了不同 attention headattention key/value dimension 的影响。为了保持模型参数不变,二者需要满足一定条件。结果表明:单头的效果要比多头模型差,但是头数太多也会导致效果下降。

    • (B) 展示了不同的 attention key 的影响。结果表明:降低 会带来性能下降。因为降低 d_k 会降低模型的 attention 矩阵 的容量,从而降低模型的整体表达能力。

    • (C) 展示了不同大小模型的影响。结果表明:模型越大,性能越好。

    • (D) 展示了 dropoutlabel smoothing 的影响。结果表明:dropoutlabel smoothing 有助于帮助缓解过拟合。

    • (E) 展示了通过学习 position embedding (而不是固定的 position embedding )的影响。结果表明:这两种 position embedding 策略的效果几乎相同。

    2.1 结构

    1. Universal Transformer 总体计算流程如下图所示:

    • Transformer 相同,它使用自注意力机制来组合来自不同位置的信息。
    • Transformer 不同,它在所有的时间步的所有位置上应用一个转换函数Transition Function
    • Transformer 不同,它的时间步不再是固定的,而是一个循环。循环的停止条件由动态停止dynamic halting 技术决定,并且每个位置的停止时间可以不同。图中:箭头表示计算的依赖关系, 表示第 t 个时间步各位置的向量表达。其中 由输入 tokenembedding 来初始化。
  • Universal Transformer 基于 BERT 结构进化而来。

    • Universal Transformerencoderdecoder 的每个 token 的表达都应用了循环操作,但是这种循环不是基于 token 的序列位置(横向),而是基于 token 的处理深度(纵向)。

    • 因此 Universal Transformer 的计算限制不受序列长度的影响,而受网络深度的影响。

    • 因此 Universal Transformer 具有可变深度,这与TransformerRNN 等具有固定深度的模型完全不同。

    • 在每个时间步,对每个 token 的表达并行的执行以下操作:

    • 通过 self-attention 机制来交换序列中所有 token 的信息。

    • 在所有时间步的所有位置上应用同一个转换函数Transition Function 。有两种转换函数:全连接、深度可分离卷积。

    • Transformer 相同,Universal Transformer 也会引入残差连接、层归一化Layer NormalizationDropout

    • Transformer 不同,Universal Transformerposition embedding 在每个时间步都发生变化,而不仅仅只有起始时设置一次。设时间步 t 时,位置 i 的 position embedding,则有:其中 表示向量的维度,m 为序列的长度。写成矩阵的形式有:

  • 编码器 encoder :给定一个长度为 m 的输入token 序列

    其中 token   的一维 embedding

    其中 分别将 query, key, value 映射成 维度, 用于调整 concate 的输出结果。

    • 整体步骤(其中 LN Layer NormalizeTransTransition Function

    • 计算 t 时刻的输入:

    • 计算self attention(考虑残差连接和层归一化):

    • 计算Transition Function

    • 然后在时刻 t ,根据 self attention 机制和 Transition Function 来并行计算

    • self attention 机制:

    • 首先根据每个 token 的 d 维 embedding,得到一个初始输入矩阵
  • 解码器和编码器的结构基本相同,有以下不同的地方:

    其中 j 为输出的位置。

    • Transformer 相同,Universal Transformer 的解码器也采用的是 masked self-attention 机制。

    • Transformer 不同,Universal Transformer 的解码器对编码器 步的输出 计算注意力,其中 query 来自解码器、key,value 来自编码器。

    • 设解码器在 步的输出为 ,则输出 token 为 y_j 的概率为:

  • Universal Transformer 的训练采用 teacher-forcing 策略。

    • 训练阶段:解码器的输入来自目标序列。由于采用 masked 机制,因此每次迭代时序列右边界右移一个位置,表示下一个预测目标。

    • 测试阶段:

    • 解码器的输入来自前一个位置的输出。

    • 首先由编码器重复执行多次,得到输入序列的编码 ;然后解码器重复执行多次,解码器每次执行会生成下一个 token

    2.2 ACT

    1. 在文本处理任务中,文本中的某些单词相比较于文本中的其它单词可能更难以理解。对于这些难以理解的单词,可能需要执行更多的处理步骤。

      Adaptive Computation Time(ACT) 技术就是通过为每个 token 计算个性化的迭代时间步来解决这个问题。

    2. Universal Transformer 中,ACT 在每个循环为每个 token 计算一个停止概率。

      一旦该 token 应该停止计算,则该 token 的状态直接向后传递,直到所有的 token 都停止计算,或者达到一个最大的迭代步阈值。

    2.3 实验结果

    1. BABI Question-Answering 数据集:包含20种不同的任务,每个任务都是根据一段文本来回答问题。该数据集的目标是:通过对每个故事中的事实 fact 进行某种类型的推理,从而衡量语言理解能力。实验结果如下所示,其中:

    • (12/20) 表示 20个任务中,失败任务(测试集错误率超过 5%)的数量。
    • 10K/1K 表示训练集的大小。
    • train single 表示针对每个任务训练一个模型;train joint 表示对所有任务共同训练一个模型。
    • 所有的模型都采用 10 轮不同初始化,并根据验证集选择最佳初始化对应的模型来输出。

  • 针对 BABI 任务的可视化分析表明:

    • 注意力分布开始时非常均匀。但是随后的步骤中,围绕每个答案所需的正确事实fact,注意力分布逐渐变得更加清晰。

    • 通过动态暂停 ACT 技术观察到:对于需要三个事实 fact 支持的问题,其平均思考时间高于只有两个事实 fact 支持的问题;对于需要两个事实 fact 支持的问题,其平均思考时间又高于只有一个事实 fact 支持的问题。

    • 平均思考时间:用一组测试样本每个 token 的平均迭代时间步来衡量。

    • 对于三个/两个/一个事实支持的问题,其平均思考时间分别为:

    • 这表明:模型根据问题所需的支持事实 fact 的数量来调整迭代时间步。

    • 通过动态暂停 ACT 技术观察到:对于需要一个事实 fact 支持的问题,其不同位置的思考时间更为均匀。对于需要两个/三个事实 fact 支持的问题,其不同位置的思考时间差距较大。尤其在三个事实支持的问题中,很多位置只迭代一到两步就停止,只有少数位置迭代更多步。这意味着:大多数位置与任务无关。下图为某个三事实支持的问题对应的 token 迭代时间步的分布。

  • 针对 BABI 任务的可视化分析表明:Universal Transformer 类似动态记忆网络dynamic memory network,它具有一个迭代注意力的过程。Universal Transformer 模型根据前一个迭代的结果(也称作记忆)来调节其注意力分布。下图为注意力权重在不同时间步上的可视化,左侧不同的颜色条表示不同 head 的注意力权重(一共4个头)。

    • 一个事实 fact 支持的问题:



    • 两个事实 fact 支持的问题:


    • 三个事实 fact 支持的问题:







    三、Transformer XL

    1. Transformer解决的核心问题是:如何将任意长度的文本序列编码成一个固定维度的隐向量。

    • 假设有无限的内存和算力,一个简单的方法是:取语料库中最长序列的长度,然后把所有较短的序列填充到最大长度作为输入。但是由于内存和算力的限制,这种方式不现实。

    • 一个可行的方案是:将整个语料库分割成固定大小的、较短的片段segment ,然后用每个片段来训练模型,而忽略之前所有片段的信息。这种模型称作 vanilla model,这也是 Transformer 的做法。

  • vanilla model 没有任何跨 segment 的信息流,这会带来两个问题:

    • 模型能够捕获的最大依赖的长度不超过 segment 的大小。假设 segment 的长度为 n ,则模型无法捕获长度超过 n 的依赖性。

    • 划分 segment 的时候未考虑句子边界或者短语的边界,这破坏了语义完整性。因此模型缺乏必要的上下文信息来预测 segment 的开头的前几个 token 和结束的尾部几个 token 。这会导致低效的优化效率和更差的泛化能力。这个问题称作上下文碎片化 context fragmentation 问题。

  • vanilla model 不仅在训练期间遇到问题,在推断期间也会遇到问题。Transformer 在推断期间反复执行推断过程,每次推断都根据前几轮输入结果和输入来预测下一个输出结果。

    • 推断期间,模型也采取与训练期相同的segment 大小,因此也会遇到上下文碎片化问题。
    • 每个新的 segment 的计算需要从头开始重新计算,计算速度较慢。


  • Transformer XL 通过引入递归机制和相对位置编码来解决上述问题。

    • 能够学到的最长依赖性的长度:Transformer XLRNN 长 80%,比Transformer 长 450%。
    • 推断速度:Transformer XLTransformer 快 1800 多倍。

    3.1 Segment-level 递归

    1. 为解决固定长度上下文的局限性,Transformer XL 引入了 Segment-level 递归机制。

    • 训练期间:Transformer XL 缓存前一个 segment 计算得到的隐状态序列,然后在下一个 segment 中重用。这种额外的输入使得网络能够利用历史中的有效信息,从而能够对长期依赖建模,并且避免了上下文碎片化。

    • 在对语料库进行分割来生成样本之后, Transformer XL 要求对样本不能进行混洗。因为一旦混洗就会破坏 segment 的先后顺序。

    • 由于需要考虑 segment 之间的先后关系,因此训练期间要将连续的一组 segment 分别放置在连续的一组 batchment 中。这样可以在尽可能满足 segment 先后关系的条件下提高数据并行度。



    • 推断期间:Transformer XL 缓存前一个 segment 计算得到的隐状态序列,使得后续需要用到这些隐状态时直接使用而不必重新计算,加快了推断速度。实验表明,Transformer XL 的推断速度是传统 Transformer 的 1800 倍。



  • segment 长度为 n ,第 segment 的输入为 token 序列: ;第 segment 的输入为: 。假设网络有 L 层,第 l 层网络每个位置的输出隐状态分别为

    其中 为 d 维列向量。令:考虑 Segment-level 递归机制,则 的第 l 层各位置的隐向量为:

    其中 SG 表示冻结参数(不用计算梯度),concate 表示沿位置拼接:

    其中 分别为 query,key,value 转换矩阵。

    其中 Transformer-Layer 为常规的 Transformer 层。

    • 计算
    • 计算 query,key,value 向量:
    • 拼接 的第 l-1 层的隐向量序列 和 的第 l-1 层的隐向量序列:
  • 与标准 Transformer 不同,这里计算 key 向量和 value 向量时使用了扩展上下文,其中 缓存了前一个 segment 的状态。

    这种在前后两个 segment 之间共享状态的方式构成了 segment-level 的递归,因此上下文信息可以跨 segment 流动。

  • 是在 中被使用的,这不仅跨了一个段,也垮了一层。这显著的区别于其它的 RNN 语言模型。

    正因为如此, Transformer XL 最大依赖长度扩展到了

    下图中,每个位置的 context 都是它左下方的4个位置。



  • 5.Transformer XL 的训练方式类似于 BPTT,但是与 BPTT 不同的是:Transformer XL 缓存了上一个 segment 的多组隐向量。

    理论上不仅可以缓存前一个 segment ,也可以缓存前面 m 个 segment

    3.2 相对位置编码

    1. 采用 segment-level 递归机制之后存在一个问题:如何保持位置信息的一致性。令:

      可见 都采用了同样的位置编码,因此模型没有任何信息来区分一个token 是位于 segment   还是 segment  

    • segment 长度为 n 。
    • segment 的输入为 token 序列: ,对应的 token embedding 矩阵为
    • segment 的输入为: , 对应的 token embedding 矩阵为
    • position embedding矩阵为 。则有:
  • 令:

    Transformerattention score (不考虑 softmax 归一化,以及除以 )为:

    它表示 query ikey j 的相关性。

    • 第一项刻画了位置 i 的 token 和位置 j 的 token 的相关性。
    • 第二项刻画了位置 i 的 token 和位置 j 的 position 的相关性。
    • 第三项刻画了位置 i 的 position 和位置 j 的 token 的相关性。
    • 第四项刻画了位置 i 的 position 和位置 j 的 position 的相关性。
    • 为第 i 个位置的 tokenembedding (对应于 token embedding 矩阵 的第 i 行 )
    • 为第 i 个位置的 position embedding (对应于 position embedding 矩阵 的第 i 行 )
    • 为第 i 个位置的 token + position embedding
    • 分别为 query, key, value 向量
  • Transformer XL 引入相对位置编码。位置 j 相对于位置 i 的距离为 b=j-i,则位置 j 相对于位置 i 的 relative position embedding 为:

    Transformer XL 中使用的最大相对距离,令相对位置编码矩阵为:

    Transformer XL 修改 attention score 为:

    • 将第二、四项中的绝对位置编码 修改为相对位置编码 。其中的相对位置是:key 相对于 query 的位置。

    • 通过参数 来代替 。这表示对于位置 j 的 key token,同一个 query 在不同位置上无影响。因为这种影响被剥离到第二项中。

    • 通过参数 来代替 。这表示对 key 相对于 value 的相对位置 i-j ,同一个 query 在不同位置上无影响。因为这种影响被剥离到第二项中。

    • 通过 来生成不同的 key 向量。修改后的attention score 各项的意义为:

    • 第一项刻画了基于内容的 attention

    • 第二项刻画了内容相对于每个相对位置的 bias

    • 第三项刻画了内容的全局的 bias

    • 第四项刻画了位置的全局 bias

    3.3 实验结果

    1. Transformer XL 验证了 word-level 语言模型(以困惑度 PPL 为指标),以及 char-level 语言模型(以 bpc:Bit per Character 为指标) 。其中包含以下数据集:

    • WikiText-103 数据集:最大的word-level 语言模型 benchmark,包含 2.8万篇文章总计103M 训练 token ,平均每篇文章 3.6K token 。

    • 由于文章的平均 token 数量较大,因此这会考验模型的长期依赖建模能力。

    • 训练期间 attention length = 384,推断期间 attention length = 1600

      attention length 也等于 segment 长度


    • enwik8 数据集:包含 100M 字节的未经处理的 wiki 文本。结果表明:12层的 Transformer XL 的表现超过了 12层的 Transformer



    • text8 数据集:包含 100M 字节的、经过处理的 wiki 文本。处理方式为:大写字母改小写、移除 a~z 之外的所有字符。



    • One Billion Word 数据集:数据集的句子已经被混洗过,因此该数据集无法验证序列的长期依赖。因而该数据集用于测试模型的短期依赖。结果表明:Transformer XL 对短期依赖的建模效果也非常好。



    • Penn Treebank 数据集:包含 1M token,用于验证模型在小数据集上的表现。结果表明:transformer XL 在小数据集上效果也非常好。



  • WikiText-103 数据集上验证 segment-level 递归、相对位置编码的作用,验证结果如下。其中:

    • 结果划分为三个部分,分别为 128M 参数的 Transformer-XL128M 参数的 Transformer151M 参数的 Transformer-XL

    • 最后四列的意义:

    • PPL init 表示推断期间使用与训练时相同的 attention length

    • PPL best 表示推断期间使用最佳长度的attention length (通过超参数搜索得到)

    • Attn Len 给出了推断期间使用的最佳attention length

    • Full Loss/ Half Loss 表示计算当前 segment 中所有位置的损失,还是计算后一半位置的损失

    • 结果表明:相对位置编码非常重要对于 Transformer XL 非常重要,而绝对位置编码只有在 Half Loss 中工作良好。因为 Half Loss 只考虑当前 segment 后一半位置的损失,因此受到前一个 segment 的绝对位置编码的影响比较小。

    • 随着 attention length 的增加,模型的困惑度下降。

    • 尽管每个 segment 训练期间的长度是 128,但推断期间可以推广到 640 。



    此外,由于 Transformer XL 采取了缓存前一个 segment 的状态的策略,因此会消耗更多的内存。下图给出在相同 GPU 内存的约束条件下的比较结果。

    结果表明:即使 Transformer XL 由于内存约束而不得不使用一个较小的 backprop len ,其最终效果仍然超越 Transformer 。




  • 为了证明 Transformer XL 能够解决上下文碎片问题,作者在 One Billion Word 数据集上做了实验。

    因为该数据集的句子经过混洗,导致不需要对长期依赖建模。因此效果的提升一定是由于模型能够解决上下文碎片,而不是由于模型捕捉到更长的上下文。





  •  

     Logic 

    OR

    http://www.huaxiaozhuan.com/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/chapters/7_Transformer.html


    往期精彩 回顾









    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/135971
     
    341 次点击