文章目录
一、机器翻译及相关技术
1.数据预处理步骤
- 数据清洗:把无用字符串清除替换掉
- 进行分词,把数据集按需要隔开
- 建立词典:
(1)统计词汇,进行去重并返回一个元组
(2)通过这个元组进行从大到小的排序
(3)选择是否使用特殊标识符,常用的特殊标识符有:
- pad:对短样本进行填充作用
- bos:标识句子的开始
- eos:标识句子的结尾
- unk:标识无法辨认的字符,一般都要加这个
(4)判断刚排序好的词汇词频是否大于自己规定的最小词频,是就取出来加入一个新的tokens列表
(5)建立一个idx_to_token的列表,可以通过下标索引找到字符;建立一个token_to_idx的字典,可以通过字符索引找到下标。
4.载入数据集时判断新输入的字符列表里的字符能否与词典进行匹配,不能匹配就标识unk
判断是否到达自己设定的最大字符数,如果大于这个数,就截取前面最大字符数的数量,后面舍弃;如果小于这个数,就用特殊标识符进行填充。
5.生成数据生成器
2.Encoder-Decoder
2.1 基本模型
- encoder:输入到隐藏状态
- decoder:隐藏状态到输出
encoder输出的隐含状态Ht就是语义编码,语义编码作为decoder的输入隐含状态
2.2 Sequence to Sequence模型
Decoder的输出还需要通过一层Dense层,先把所有词汇转变成词向量后进行计算,在所有词汇表中找到得分最高的那个作为Decoder的字符输出,这个字符输出在预测时又做为下一层的输入。
关于这里的损失函数计算,由于之前用词汇填充到一样的大小进行输入计算,而有效的字符只有未填充的部分,所以在计算损失函数的时候,利用有效长度把无效部分都设为0或-1从而不被损失函数计算。
2.3 Beam Search
如果Dense层都取得分最高的那个字符,只是当时的局部最优解。基于这种情况,提出了维特比算法:选择整体分数最高的句子(搜索空间太大) 集束搜索。
在集束搜索中,可以定义每次取得分最高的n个字符,又由这n个字符找出共n个字符的最优解。
二、注意力机制与Seq2seq模型
1.传统Seq2seq模型的缺点
在seq2seq中,解码器在各个时间步依赖相同的背景变量(context vector)来获取输⼊序列信息。
当编码器为循环神经⽹络时,背景变量来⾃它最终时间步的隐藏状态。将源序列输入信息以循环单位状态编码,然后将其传递给解码器以生成目标序列。
然而这种结构存在着问题,尤其是RNN机制实际中存在长程梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息,所以随着所需翻译句子的长度的增加,这种结构的效果会显著下降。
与此同时,解码的目标词语可能只与原输入的部分词语有关,而并不是与所有的输入有关。所以这里引入了注意力机制的概念。
2.引入注意力机制的Seq2seq模型
将注意机制添加到sequence to sequence 模型中,以显式地使用权重聚合states。下图展示encoding 和decoding的模型结构,在时间步为t的时候。此刻attention layer保存着encodering看到的所有信息——即encoding的每一步输出。在decoding阶段,解码器的时刻的隐藏状态被当作query,encoder的每个时间步的hidden states作为key和value进行attention聚合. Attetion model的输出当作成上下文信息context vector,并与解码器输入Dt拼接起来一起送到解码器:
简而言之,就是除Decoder的第一个输入隐含状态由Encoder的最后一个隐含状态来作为输入外;其余的都把Decoder每个时间步的隐含状态当作query,把Encoder的每个时间步的隐含状态当作key和value进行attention聚合,生成的输出当作上下文信息去跟解码器每个时间步的输入进行拼接成一个新的输入。
3.注意力机制的框架
不同的attetion layer的区别在于score函数的选择,接下来是两个常用的注意层Dot-product Attention 和 Multilayer Perceptron Attention。
3.1 点积注意力(Dot-product Attention )
3.2 多层感知机注意力(Multilayer Perceptron Attention)
4.习题解释
三、Transformer
为了整合CNN和RNN的优势,[Vaswani et al., 2017] 创新性地使用注意力机制设计了Transformer模型。该模型利用attention机制实现了并行化捕捉序列依赖,并且同时处理序列的每个位置的tokens,上述优势使得Transformer模型在性能优异的同时大大减少了训练时间。
Transformer同样基于编码器-解码器架构,其区别主要在于以下三点:
- Transformer blocks:将seq2seq模型重的循环网络替换为了Transformer Blocks,该模块包含一个多头注意力层(Multi-head Attention Layers)以及两个position-wise feed-forward networks(FFN)。对于解码器来说,另一个多头注意力层被用于接受编码器的隐藏状态。
- Add and norm:多头注意力层和前馈网络的输出被送到两个“add and norm”层进行处理,该层包含残差结构以及层归一化。
- Position encoding:由于自注意力层并没有区分元素的顺序,所以一个位置编码层被用于向序列元素里添加位置信息。
1.自注意力
计算自注意力的第一步就是从每个编码器的输入向量(每个单词的词向量)中生成三个向量。也就是说对于每个单词,我们创造一个查询向量、一个键向量和一个值向量。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。
X1与WQ权重矩阵相乘得到q1, 就是与这个单词相关的查询向量。最终使得输入序列的每个单词的创建一个查询向量、一个键向量和一个值向量。
计算自注意力的第二步是计算得分。假设我们在为这个例子中的第一个词“Thinking”计算自注意力向量,我们需要拿输入句子中的每个单词对“Thinking”打分。这些分数决定了在编码单词“Thinking”的过程中有多重视句子的其它部分。
这些分数是通过打分单词(所有输入句子的单词)的键向量与“Thinking”的查询向量相点积来计算的。所以如果我们是处理位置最靠前的词的自注意力的话,第一个分数是q1和k1的点积,第二个分数是q1和k2的点积。
第三步和第四步是将分数除以8(8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值),然后通过softmax传递结果。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。
这个softmax分数决定了每个单词对编码当下位置(“Thinking”)的贡献。显然,已经在这个位置上的单词将获得最高的softmax分数,但有时关注另一个与当前单词相关的单词也会有帮助。
第五步是将每个值向量乘以softmax分数(这是为了准备之后将它们求和)。这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001这样的小数)。
第六步是对加权值向量求和(译注:自注意力的另一种解释就是在编码某个单词时,就是将所有单词的表示(值向量)进行加权求和,而权重是通过该词的表示(键向量)与被编码词表示(查询向量)的点积并通过softmax得到。),然后即得到自注意力层在该位置的输出(在我们的例子中是对于第一个单词)。
通过矩阵计算自注意力层的输出:
2.多头注意力
1.它扩展了模型专注于不同位置的能力
2.它给出了注意力层的多个“表示子空间”(representation subspaces)
多头注意力层包含h个并行的自注意力层,每一个这种层被成为一个head。对每个头来说,在进行注意力计算之前,我们会将query、key和value用三个现行层进行映射,这个注意力头的输出将会被拼接之后输入最后一个线性层进行整合。
3.位置编码
为了解决对模型的描述缺少了一种理解输入单词顺序这个问题,Transformer为每个输入的词嵌入添加了一个向量。这些向量遵循模型学习到的特定模式,这有助于确定每个单词的位置,或序列中不同单词之间的距离。
4.残差模块
Transformer还有一个重要的相加归一化层,它可以平滑地整合输入和其他层的输出,因此我们在每个多头注意力层和FFN层后面都添加一个含残差连接的Layer Norm层。这里 Layer Norm 与Batch Norm很相似,唯一的区别在于Batch Norm是对于batch size这个维度进行计算均值和方差的,而Layer Norm则是对最后一维进行计算。层归一化可以防止层内的数值变化过大,从而有利于加快训练速度并且提高泛化性能。
5.编码器
编码器包含一个多头注意力层,一个position-wise FFN,和两个 Add and Norm层。对于attention模型以及FFN模型,我们的输出维度都是与embedding维度一致的,这也是由于残差连接天生的特性导致的,因为我们要将前一层的输出与原始输入相加并归一化。
编码器通过处理输入序列开启工作。顶端编码器的输出之后会变转化为一个包含向量K(键向量)和V(值向量)的注意力向量集 。这些向量将被每个解码器用于自身的“编码-解码注意力层”,而这些层可以帮助解码器关注输入序列哪些位置合适
6.解码器
与编码器部分相类似,解码器同样是使用了add and norm机制,用残差和层归一化将各个子层的输出相连。
在完成编码阶段后,则开始解码阶段。解码阶段的每个步骤都会输出一个输出序列(在这个例子里,是英语翻译的句子)的元素
接下来的步骤重复了这个过程,直到到达一个特殊的终止符号,它表示transformer的解码器已经完成了它的输出。每个步骤的输出在下一个时间步被提供给底端解码器,并且就像编码器之前做的那样,这些解码器会输出它们的解码结果 。另外,就像我们对编码器的输入所做的那样,我们会嵌入并添加位置编码给那些解码器,来表示每个单词的位置。
而那些解码器中的自注意力层表现的模式与编码器不同:在解码器中,自注意力层只被允许处理输出序列中更靠前的那些位置。在softmax步骤前,它会把后面的位置给隐去(把它们设为-inf)。
这个“编码-解码注意力层”工作方式基本就像多头自注意力层一样,只不过它是通过在它下面的层来创造查询矩阵,并且从编码器的输出中取得键/值矩阵。
7.习题理解