深入理解 transformer

1. 背景知识

        注意力是一种概念,有助于提高神经机器翻译应用的性能。在本文中,我们将讨论 Transformer——一种使用注意力来提高这些模型训练速度的模型。Transformer 在特定任务中优于 Google 神经机器翻译模型。然而,最大的好处来自于 Transformer 如何适应并行化。事实上,Google Cloud 建议使用 Transformer 作为参考模型来使用他们的 Cloud TPU 产品。因此,让我们尝试分解该模型并查看其如何工作。

Transformer 模型是在论文《Attention is All You Need[1]》中提出的,该论文介绍了 Transformer 架构,并展示了它在神经机器翻译任务上的卓越性能

Google 开源了一个基于 TensorFlow 的 Tensor2Tensor[2]的第三方库,提供了多种模型的实现,包括 Transformer

哈佛大学 NLP 组提供了使用 PyTorch 实现的 Transformer 模型代码,对其进行了解读Transformer[3]

2.深层次理解

        首先将 Transformer 理解成一个黑盒子,黑盒子的功能是翻译,你输入一个语句,它对你的输入进行翻译操作。

主要包含两部分:Encoders 和 Decoders

        编码组件是一组堆叠的编码器,解码组件是具有相同数量的解码器的堆叠。

对于每一个 Encoder,他们结构都是相同的,但是权值不共享。每一层都包括两部分:自监督+全连接,

        Self-attention 的输入会被传入一个全连接的前馈神经网络,每个 encoder 的前馈神经网络的参数都是相同的,但是作用相互独立。Decoder 部分也有相同的层级结构,但是中间多了一个 Encoder-Decoder-Attention 层,帮助专注于对应的那个语句。(与Seq2Seq[4]模型类似)

3. 通过实例理解 Tensor

首先首先使用一个embedding[5]使得输入的单词成为向量,

列表的大小和词向量的维度大小都是可以设置的超参数,一般设置训练数据集中最长的句子的长度。这个例子是把每个单词编码为 512 维的向量。

可以看到,x1,x2,x3 输入后通过 self-attention,分别得到 z1,z2,z3,其实 z1,z2,z3 这 3 个是通过 x1,x2,x3 一起合作产生的。

econder

每一个 Encoder 接收一个 512 维的向量 x 作为输入,然后传递 Self-Attention,产生一个等量的 512 维的 z,再经过全连接神经网络,输出的 r 也是 512 维,然后传递给下一个 encoder

4. 高层次理解 Self-Attention

假设输入:

The animal didn't cross the street because it was too tired

这句话中的“it”指的是什么?它指的是街道还是动物?模型处理“它”这个词时,自我注意允许它将“它”与“动物”联系起来

Self-Attention 的细节
  • 第一步:Q,K,V 计算

        每个单词,创建一个 Query 向量、一个 Key 向量和一个 Value 向量。这些向量通过词嵌入乘以训练过程中创建 3 个训练矩阵而产生。 输入的向量维度是 512 维,新向量的维度 64 维。新向量的维度根据实际情况自己确定。 Multiplying x1 by the WQ weight matrix produces q1

  • 第二步:点乘

q1 和 k1 点乘,q1 和 k2 点乘,

  • 第三步、第四步:

将点乘的结果除以 sqrt(dk)。这个里面向量是 64,开方是 8,那么就是除以 8,然后进行 Softmax 的操作

  • 第五步、第六步:

将 Values 和 Softmax 的值相乘得到 v1,v2,对当前词的关注度不变,对不相关的的进行降低。累加加权的向量得到 z1

Self-Attention 矩阵乘法

第一步是去计算 Query,Key 和 Value 矩阵。X 是 x1 和 x2 一起转化为的矩阵。

然后一下子就操作得到后面的 Z

Multi-headed 完善
  • 扩展了模型关注不同位置的能力

  • 提供投影到不同的子空间 subspace

通过 multi-headed attention,我们为每个“header”都独立维护一套 Q/K/V 的权值矩阵。使用 8 个时间点去计算权值矩阵,得到 8 个不同的矩阵 z

把这 8 个矩阵链接在一起,然后再与矩阵 Wo 相乘

整体过程

随意找两个不同的 attention header 的情况(8 列,取下下图的 2,3 列),看一下关注点会有什么区别:

两个时间戳上面,发现 it 最关注两个:animal 和 tire,将所有注意力都添加到图片上,可能不那么容易理解其中含义

5.使用位置编码

输入序列还要考虑单词的顺序的问题,transformer 为每个输入单词的词嵌入了一个新的位置向量。

为了让模型知道单词的顺序信息,将位置编码的向量信息直接进行规则产生。比如嵌入的维度是 4,实际编码效果如下:

编码规则

比如 20 个单词,每个单词编码为 512 维度。一共 20 行,那么每一行就表示一个词向量,包含 512 个值,每个值在-1 到 1 之间。可视化显示:

中心位置一分为 2,主要是一半是正弦生成,一半是余弦生成。对上述 Transformer2Transformer Here’s the code to generate it[6]

import numpy as np
import matplotlib.pyplot as plt


# https://github.com/jalammar/jalammar.github.io/blob/master/notebookes/transformer/transformer_positional_encoding_graph.ipynb
# Code from https://www.tensorflow.org/tutorials/text/transformer
def get_angles(pos, i, d_model):
  angle_rates = 1 / np.power(10000, (2 * (i//2)) / np.float32(d_model))
  return pos * angle_rates
def positional_encoding(position, d_model):
  angle_rads = get_angles(np.arange(position)[:, np.newaxis],
                          np.arange(d_model)[np.newaxis, :],
                          d_model)

  # apply sin to even indices in the array; 2i
  angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2])

  # apply cos to odd indices in the array; 2i+1
  angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2])

  pos_encoding = angle_rads[np.newaxis, ...]

  return pos_encoding

tokens = 10
dimensions = 64
pos_encoding = positional_encoding(tokens, dimensions)
print (pos_encoding.shape)
plt.figure(figsize=(12,8))
plt.pcolormesh(pos_encoding[0], cmap='viridis')
plt.xlabel('Embedding Dimensions')
plt.xlim((0, dimensions))
plt.ylim((tokens,0))
plt.ylabel('Token Position')
plt.colorbar()
plt.show()
6. 残差神经网络 Residuals

layer-normalization[7]步骤

进一步可视化:

Decoder 部分是同样的,堆叠 2 个 Encoder 和 2 个 Decoder

7.Decoder

Encoder 将其转化为一组 attention 的集合(K,V)

8.Linear 和 Softmax层

线性层是一个简单的全连接神经网络,由Decoder产生的向量投影到一个更大的向量中,成为对数向量Logits.

假设实验模型的语料库一共1万个英语单词,那么Logits的矢量表示1万个小格子,每个小格子就表示了一个单词。

线性层之后是一个Softmax层,Softmax层可以通过转换将分数转换为概率,选取概率最高的作为索引,然后通过索引找到单词作为输出

9.训练总结

假设输出词汇只有“a”、“am”、“I”、“thanks”、“student”、“结束符号”,

一旦确定了输出的词汇表,就可以使用相同宽度的向量来表示词汇表中的单词,称为one-hot编码举例子以句子中的“am”为例子,one-hot编码

Loss Function

模型的参数权重是随机初始化的

模型的目标输出

训练结果输出

虽然没有那么准确,但是通过比较可以找到最大的概率值。

[8] [9]

[1] Attention is All You Need: https://arxiv.org/abs/1706.03762

[2] Tensor2Tensor: https://link.zhihu.com/?target=https%3A//github.com/tensorflow/tensor2tensor

[3] Transformer: https://link.zhihu.com/?target=http%3A//nlp.seas.harvard.edu/2018/04/03/attention.html

[4] Seq2Seq: https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

[5] embedding: https://medium.com/deeper-learning/glossary-of-deep-learning-word-embedding-f90c3cec34ca

[6] Here’s the code to generate it: https://github.com/jalammar/jalammar.github.io/blob/master/notebookes/transformer/transformer_positional_encoding_graph.ipynb

[7] layer-normalization: https://arxiv.org/abs/1607.06450

[8] https://jalammar.github.io/illustrated-transformer/: 8

[9] https://jalammar.github.io/illustrated-transformer/: 9

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值