序列处理
我们时常期望能够基于已有的向量序列对接下来的向量进行预测、从序列中提取信息或从头生成一个新的序列。例如,我们可能期望预测一段文本接下来可能出现的字符,或是将一种语言翻译为另外一种。我们形式化一个序列如下:
其中
因此可以将输入视为一个矩阵:
其中
自回归模型与隐变量自回归模型
根据直觉,我们很容易设计出一个基于全连结层的模型:
即利用序列的前几项来预测序列的下一项。但实际上,由于预测误差的存在,
其中的
实际上,简单的自回归模型只能使用有限的几项来预测下一项,这导致在前面的项的信息完全被忽略了。基于此,人们引入了隐变量的概念。
隐变量可以视作对前面序列的总结,我们从前往后读取每一项后,都会用一个全连结层来更新隐变量,最后用隐变量来预测序列的下一项:
循环神经网络
循环神经网络(RNN)基于隐变量自回归模型,在普通的全连接层的基础上加入了隐变量,实现了对整个输入序列信息的利用。
设输入
截断
由于RNN的每一次输出都依赖前一步的隐变量,而每次隐变量更新都会用到
截断可分为两种策略:随机截断和定长截断。定长截断即在向后传播指定步数后即结束,而随机截断则根据特定算法在一个随机的步数后结束。通常,我们使用定长截断来进行反向传播。
token,vocabulary与tokenize
对于一个文本序列,通常我们需要先确定我们在什么层面上进行处理,例如在语音识别中我们可能需要在字符层面上处理,而在翻译任务中则可能在词语层面上处理。
区分不同层面的是该层面中字符串的最小单元,称之为 Token。我们为每个 Token 分配一个编号,并建立一张 Token 到原始最小单元的表,称为 Vocabulary ,记作
独热编码和嵌入层
如果直接将token视为神经网络的输入和输出,那么很小的扰动都可能使得输出的token的编号发生改变,并且神经网络处理的应该是数值变量而非分类变量,因此我们需要将token转化为一个向量。
独热编码是一个实现这一目的的简单方法,它将 token 映射为一个维度为词表大小
即一个只有第
独热编码只区分了不同的token,而嵌入层 (Embedding) 则更进一步根据语义调整了向量间的距离。嵌入层使用token经独热编码后的向量与一个矩阵相乘,得到不同token语义化的向量:
在输出时,可将输出向量应用softmax层视为各个token的概率。
门,LSTM与GRU
朴素的 RNN 的隐变量使我们可以保存序列前端的信息,但受限于隐变量的大小,保存的信息量是有限的。然而,可能并非序列中所有的信息都对未来同等重要,例如对于一个删去冠词的英文语句我们通常也能正确理解。同时,基于此,人们发明了可以选择性记忆的长短期储存器(LSTM),并改进成为门控循环单元(GRU)。
LSTM和GRU都基于 "门" 的概念。具体来说,门可以表示为
LSTM由三种门控制:遗忘门,输入门和输出门。此外,相比于RNN,LSTM额外引入了隐变量
具体来说,LSTM在接受每个输入时,首先会更新各个门的隐变量值:
其中
然后,LSTM使用上一个隐状态和输入产生候选记忆,并使用输入门和遗忘门来更新记忆:
其中
最后,使用输出门决定使用哪些记忆参与输出:
而GRU将LSTM中的遗忘门和输出门整合为更新门,控制哪些记忆应该被更新,并取消了记忆隐变量
更新门和重置门的计算与LSTM类似:
其中
然后计算候选隐状态:
最后使用更新门更新隐状态:
深度循环神经网络
将隐状态作为输入,并输入到另一个RNN中,称为深度循环神经网络。显然,相比于单层RNN,深度循环神经网络可以保存更多信息,并具有更高的灵活性:
seq2seq任务、Encoder-Decoder架构
有时我们不希望预测序列的下一项,而希望根据已有序列生成一个新的序列。例如,我们可能希望将文字从一种语言翻译到另外一种。这种从序列生成新序列的任务称为seq2seq
通常,生成新序列时需要源序列的全部信息,因此人们提出了编解码器架构:
编码器将输入序列整合为一个状态,然后解码器从一个起始token开始,将输出再输入到自身,解码出整个序列。一般情况下,我们需要一些特殊的token来标识序列的开始和结束。
注意力机制
目前为止我们的RNN都是在被动的选择记忆进行输出,但在特定的上下文中,某些记忆可能对输出对其他记忆更重要,这提示我们根据上下文"查询"过去的记忆。因此,人们提出了注意力机制。
注意力机制可以看作一个字典,其中有若干键值对,记作
其中
其中,
多头注意力
在一族序列中,注意力可能有多个维度。而多头注意力通过将原有的查询和键值对通过全连接层进行变换,输入到多个注意力层中,并将各个注意力层的输出进行线性组合,从而增大了注意力机制提取信息的能力:
自注意力与位置编码
在序列处理中,我们可以将序列中的每一项
但单纯应用自注意力没有意义,因为单独的
对于输入
位置编码来源于数字的二进制表示。在二进制中,在数字增大的过程中,随着位数
000 001 010 011 100 101 110 111
而在位置编码中,
此外,位置编码还可以通过线性组合表达出相对位置。
残差连接和层归一化
在深度学习中,为了缓解梯度爆炸和梯度消失,可以使用残差连接。
残差连接将输入和原始输出相加作为新的输出,这样实际上有:
而层归一化将输出向量在各个维度之间进行归一化,可以避免每一层的输出发生协变量偏移而导致性能下降:
其中
Transformer
Transformer 是完全基于注意力机制的Seq2Seq网络,使用Encoder-Decoder结构并包含多个相似的编解码器:
在transformer中,输入首先经过嵌入层转化并注入位置编码,然后进入
解码器与编码器类似,不同的是为了防止训练时作为训练数据的目标序列中后面的向量被前面的所使用而违背因果关系,加入了掩蔽多头注意力层对后面的向量进行屏蔽。
在运行时,编码器的输出被应用到每一层解码器中,以便解码器同时参考上一层提取的信息和原始的序列数据。同时,这一设计也缓解了梯度爆炸和梯度消失。
Comments NOTHING