目录
1️⃣ Transformer介绍
从时序模型来看,传统的RNN,GRU,LSTM,Seq2Seq等 存在一个问题,就是不能并行计算。
Transformer结构可以解决这个问题。该结构在2017
发表的论文《Attention is All you Need》 中被提出,之后用于Bert,GPT2,GPT3等模型中。
Transformer完全基于注意力机制,没有使用RNN,CNN等结构
2️⃣ 原理介绍
我们首先来看一个基于Transformer的中译英的整体架构:
Transformer由编码器和解码器构成,编码器中有6个encoder block;解码器中有6个decoder block。Transformer 的工作流程大体如下:
第一步:词嵌入+位置编码
首先将原始输入序列转换为固定维度的向量表示,即 词Embedding。此外由于Transformer没有使用RNN结构,没有序列顺序,因此通过引入位置编码,得到 位置Embedding 提供位置信息。
然后我们将词Embedding与位置Embedding相加得到每个单词的 单词表示 x 。然后所有 单词表示x 组成下图中蓝色矩阵被称为“表示矩阵X”,其中每一行是一个 单词表示 x 。 表示矩阵X 的维度为 n × d n×d n×d,其中n是单词个数,d是 单词表示x 的维度(论文中是512)
第二步:编码器
将 表示矩阵X 输入编码器中,经过6个encoder block得到 编码矩阵C 。C和维度和X的维度一样
第三步:解码器
解码器接受编码器的输出 编码矩阵C 和 表示矩阵X。解码器根据翻译过的单词1~i翻译单词 i+1。在翻译单词 i+1 的时候需要通过 Mask (掩盖) 操作遮盖住 表示矩阵X 中 i+1及其之后的单词。
例如,首先输入翻译开始符 “<Begin>”,掩盖 表示矩阵X 中的"I have a cat",预测第一个单词 “I”;然后输入 “<Begin>” 和单词 “I”,掩盖 表示矩阵X 中的"have a cat",预测单词 “have”。
上面介绍了一个大致的流程,现在我们来详细介绍其中的细节。
1.输入数据准备
Transformer 中 单词表示x 由 词Embedding 和位置 Embedding (Positional Encoding)相加得到
1.1 词嵌入
原始输入序列被转化为固定维度的向量表示,这一步通过词嵌入(如 Word2Vec、GloVe)或模型自学的嵌入向量完成
1.2 位置编码(Positional Encoding)
Transformer 不采用 RNN 的结构,没有单词的顺序信息,而这部分信息对于 NLP 来说非常重要。因此通过引入位置编码,得到 位置Embedding 来提供位置信息,位置Embedding用PE表示:
P E ( p o s , 2 i ) = sin ( p o s 1000 0 2 i d ) , P E ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i d ) PE_{(pos,2i)}=\sin\left(\frac{pos}{10000^{\frac{2i}d}}\right),\quad PE_{(pos,2i+1)}=\cos\left(\frac{pos}{10000^{\frac{2i}d}}\right) PE(pos,2i)=sin(10000d2ipos),PE(pos,2i+1)=cos(10000d2ipos)
其中, p o s pos pos 是单词在句子中的位置(从 0 开始计数), d d d是表示PE的维度 (与词 Embedding一样); i i i 是维度索引(从 0 到 ⌊ d / 2 ⌋ − 1 \lfloor d/2 \rfloor - 1 ⌊d/2⌋−1)
将词Embedding与位置Embedding相加得到每个单词的 单词表示 x
举个例子:
假设我们有一个中文句子:“我 爱 学习 人工智能”,共 4 个单词。我们将为这个句子计算位置编码,并展示如何将其与词嵌入结合。
- 参数设定
假设词嵌入的维度 d = 4 d = 4 d=4(为了简化计算,通常实际中 d d d 较大,如 512)。
句子长度为 4,因此 p o s = 0 , 1 , 2 , 3 pos = 0, 1, 2, 3 pos=0,1,2,3(对应“我”、“爱”、“学习”、“人工智能”)。
位置编码的维度与词嵌入相同,因此 P E PE PE是一个 4×4 的矩阵(4 个位置,每个位置有 4 维)。- 计算位置编码
我们逐一计算每个位置 p o s pos pos 的位置编码向量 P E ( p o s ) PE_{(pos)} PE(pos)。由于 d = 4 d = 4 d=4,维度索引 i i i 取值为 0 , 1 0, 1 0,1【i的取值范围是 0 到 ⌊ d / 2 ⌋ − 1 \lfloor d/2 \rfloor - 1 ⌊d/2⌋−1】。
公式:
对于 i = 0 i = 0 i=0,计算维度 0 和 1:
P E ( p o s , 0 ) = sin ( p o s 1000 0 0 4 ) = sin ( p o s ) , P E ( p o s , 1 ) = cos ( p o s 1000 0 0 4 ) = cos ( p o s ) PE_{(pos, 0)} = \sin\left(\frac{pos}{10000^{\frac{0}{4}}}\right) = \sin(pos), \quad PE_{(pos, 1)} = \cos\left(\frac{pos}{10000^{\frac{0}{4}}}\right) = \cos(pos) PE(pos,0)=sin(1000040pos)=sin(pos),PE(pos,1)=cos(1000040pos)=cos(pos)
(因为 1000 0 0 / 4 = 1000 0 0 = 1 10000^{0/4} = 10000^0 = 1 100000/4=100000=1)
对于 i = 1 i = 1 i=1,计算维度 2 和 3:
P E ( p o s , 2 ) = sin ( p o s 1000 0 2 4 ) = sin ( p o s 1000 0 0.5 ) , P E ( p o s , 3 ) = cos ( p o s 1000 0 2 4 ) = cos ( p o s 1000 0 0.5 ) PE_{(pos, 2)} = \sin\left(\frac{pos}{10000^{\frac{2}{4}}}\right) = \sin\left(\frac{pos}{10000^{0.5}}\right), \quad PE_{(pos, 3)} = \cos\left(\frac{pos}{10000^{\frac{2}{4}}}\right) = \cos\left(\frac{pos}{10000^{0.5}}\right) PE(pos,2)=sin(100004