学习一个深度学习模型,我们首先需要从理论的角度理解它的构架,进而理解代码。
Transformer背景
首先我们知道,神经网络有一个巨大的家族,其中的CNN(卷积神经网络)源于视觉研究,目标是让机器自动学习图像特征,而RNN的出现是源于对记忆和序列建模的需求,目标是处理自然语言、语音等时序数据。循环神经网络(RNN)的关键思想是:不仅考虑当前输入,它还会记住之前的输入信息,把历史信息通过隐藏状态(hidden state)传递到下一步,从而实现“记忆”。所以,RNN可以用于自然语言处理(机器翻译、文本生成),语音处理(语音识别),时间序列预测(天气预测)等。
在RNN之前,语言模型主要是采用N-Gram,即预测当前词是什么的时候,我们只假设它和前面的N个词相关。显然这个模型并不靠谱,因为有时候关键信息藏在几句话之前。所以RNN出现了,它理论上可以向前/前后看任意多词:

双向循环神经网络结构
因此,RNN一定程度解决了N-Gram无法处理的问题(RNN详解见循环神经网络)。但是RNN也存在自己的不足:
1. RNN在处理长序列问题的时候,反向传播梯度会变得极小或极大,造成梯度消失或梯度爆炸
2. RNN难以捕捉长距离的依赖关系
3. RNN必须逐步处理输入,无法并行计算,训练速度缓慢
针对以上问题,科学家们想到了通过引入单元状态(cell state)的方法(长短时记忆网络)。LSTM的输入包括:当前时刻的输入值,上一时刻LSTM的输出值
,以及上一时刻的单元状态
。LSTM的输出包括:当前时刻输出值
,和当前时刻单元状态
。LSTM的关键就是怎样控制长期状态
。它引入了三个状态开关,即三个门:
1. 遗忘门:它决定了上一个时刻的单元状态有多少保留到当前时刻单元状态
2. 输入门:它决定当前时刻网络输入有多少保留到单元状态
3. 输出门:它控制单元状态有多少输出到LSTM的当前输出值

LSTM的前向计算
这样,遗忘门的控制可以保留很早期的信息,输入门的控制又可以避免当前无关紧要的信息进入记忆,输出门的控制又可以保证输出结果中包含早期的记忆。LSTM的引入使RNN能保留长期的依赖信息,缓解了梯度消失/爆炸的问题。后来在LSTM的基础上还发展出了GRU,Seq2Seq架构。但是,这些模型并没有本质上解决长距离依赖和训练效率低的问题。直到Transformer的出现。
(LSTM详解见长短时记忆网络(LSTM))
Transformer前言
一、独热编码(One-Hot Encoding)
计算机只能处理0/1编码,所以在面对文字的时候,我们需要一个词表来表示词(Token),即通过0/1将词表示为高维度稀疏向量(维度高,但大部分元素是0)。但是这样表示出来的句子无法包含上下文信息,词与词之间完全没有关系。因此在此基础上,我们引入了词嵌入。
二、词嵌入
所谓词嵌入,就是为词表中的每个词分配一个词向量,将其映射到语义空间中。这里语义空间维度表示词向量的维度,语义空间维度越高,语义表达能力就越强。词向量的每个值都是浮点数,词向量之间的距离也和词的语义距离有关。例如,我们可以将“红苹果”表示为 [0.13, 0.16, -0.89, 0.9] ,“青苹果”表示为 [0.12, 0.17, -0.88, 0.9] ,两者十分相似。常见的语义空间维度包括512(Transformer),12288(GPT3)。
三、嵌入矩阵
假设我们通

最低0.47元/天 解锁文章
1110

被折叠的 条评论
为什么被折叠?



