从RNN到GPT
目录
简介
RNN
LSTM与GRU
Attention机制
word2vec与Word Embedding编码(词嵌入编码)
seq2seq模型
Transformer模型
GPT与BERT
简介
最近在学习GPT模型的同时梳理出一条知识脉络,现将此知识脉络涉及的每一个环节整理出来,一是对一些涉及的细节进行分析研究,二是对一些背后的数学原理进行详细的数学推导。本文的知识脉络如下图:
下面本文先从RNN开始推导。
RNN
定义
与DNN和CNN相比,循环神经网络(RNN)是以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network) 。
其研究始于20世纪80-90年代,并在21世纪初发展为深度学习(deep learning)算法之一,其代表模型为双向循环神经网络(Bidirectional RNN, Bi-RNN)和长短期记忆网络(Long Short-Term Memory networks,LSTM)。
结构
RNN 不同于传统神经网络的感知机的最大特征就是跟时间挂上钩,即包含了一个循环的网络,就是下一时间的结果不仅受下一时间的输入的影响,也受上一时间输出的影响,进一步地说就是信息具有持久的影响力。放在实际中也很容易理解,人们在看到新的信息的时候产生的看法或者判断,不仅仅是对当前信息的反应,先前的经验、思想也参与这次信息的推断。人类的大脑不是一张白纸,是包含许多先验信息的,即思想的存在性、持久性是显然的。
所以,考虑上面说所的,我们进行时序上判断时,会有一个当前的输入数据,先验的经验和思想,这一变量用上一时刻的隐状态来代表。当前正确的推断。另外我们用来指代当前的输出,用来指代损失函数。那么RNN的结构如下图:
图中红色的圈是一个隐藏层,为了生成隐藏状态:
此表达式的含义是,当前t时刻的思想和状态(隐状态)来自当前的输入和上一时刻的思想和状态(隐状态)。其中为激活函数,原始模型的激活函数为tanh函数,也正是这个激活函数的原因导致了RNN的一大问题,梯度消失和梯度爆炸。至于为什么使用激活函数,原因和CNN与DNN一致,如果不使用激活函数,一堆线性矩阵相乘永远是线性模型,不可能得到非线性模型。
有了隐状态(当前的思想和状态)就可以给出当前的输出:
有了模型的输出,距离模型预测还有一步,一般在处理多分类问题时,还会有一个Softmax的操作,将映射成预测值。
所以最后的损失函数:
有了损失函数,那么我们就可以用优化算法求解RNN中的参数:W、U、V、b、c。
上面就是RNN的结构,RNN的结构涉及到神经网络模型的几个概念,下面对损失函数L、Softmax、激活函数f一一展开。
在此之前,为了下面推导的方便,我们先将分类分布函数表达成指数分布族表达式。
分类分布函数的指数分布族表达式
给定参数,对于统计变量x,如果其概率密度可以写成如下表达式:
其中:为已知函数。
那么该概率分布属于指数分布族。
如果使用当作参数,其概率密度也可以表达成:
其中T(x)表示分布的充分统计量。是自然参数,是负责归一化的log配分函数。
那么该概率分布属于指数分布族。
常见的正太分布,伯努利分布,多项式分布都属于指数分布族。
下面将分类分布()推导成上面指数族表达式。
首先指出的是, 分布是多项式分布的特殊形式,即多项式分布在n=1下的形式。
若事件为基本空间的一个分割,即:
又若:
为表示事件的发生与否,使用下列随机变量
其中为示性函数,事件发生,则值为1,事件不发生,则值为0。
则
称随机变量 的上述分布为k维分布。
下面将分布函数推导成指数族分布表达式的形式。
对于服从分布的随机变量 ,其分布概率如下:
所以:
则:
则:
则:
令:
则:
令:
所以:
所以是一个指数族分布。
损失函数L
对于一个K分类问题P,有数据集, 有K个类别,且 是one-hot编码, 。那么的联合分布如下:
所以:
其中:
极大似然估计
上面推导出了的联合分布。现在使用极大似然估计计算。因为极大似然等价极大对数释然。所以有:
上公式等价于最小化负对数释然,定义为:
习惯上,将以上公式中的定义为多分类问题的损失函数,即对数损失函数。此损失函数又称为交叉熵损失函数,具体原因如下。
交叉熵损失函数
下面接着负对数释然继续推导:
所以:
其中,是数据集D中j类别的频率(概率)。
根据熵的定义,
所以,对数损失函数又叫交叉熵损失函数。
如果在多分类问题中损失函数使用交叉熵损失函数,那么由模型输出到类别概率的映射函数必然是SoftMax函数。
SoftMax函数
下面我们推导,为什么使用交叉熵损失函数后,最后的模型输出到类别概率的映射函数是SoftMax函数。
在上面的推导中,有
所以:
所以:
所以:
所以:
所以:
所以:
所以:
所以,事件发生的概率为:
这刚好是softmax的表达式。
这里我们讨论下的物理意义,的物理意义来源 softmax回归模型。 softmax回归模型中使用线性模型去拟合。
有:
所以,一般在处理多分类问题时,还会有一个Softmax的操作,使用Softmax函数将模型的输出值映射成预测概率。softmax回归与逻辑回归相当于没有隐藏层只有输入输出层的一层神经网络,输出层一个使用logistic函数,一个使用softmax函数。
激活函数
在神经网络中,激活函数的作用是将神经元的输出映射到一个非线性的范围内。如果没有激活函数,神经网络的输出将是一组线性组合,其表达能力非常有限。
为了解决神经网络有较好的非线性表达能力,那么我们引入的激活函数必须满足以下几点:
1、可微性:激活函数必须是可微的,这是为了方便使用反向传播算法来计算网络中参数的梯度,从而进行训练。但在某些点不可微也是可以的。
2、非线性:激活函数必须是非线性的,这是为了让神经网络可以学习到非线性函数和复杂的决策边界。如果激活函数是线性的,那么整个神经网络就等价于单个线性变换,无法学习到更复杂的模式。
3、单调性:激活函数应该是单调的,这是为了保证网络的输出随着输入的增加而单调地增加或减少,使得模型更容易训练和收敛。
4、输出范围:激活函数的输出值应该在一定范围内,通常是0到1或-1到1。这是为了使得神经网络的输出具有可解释性,例如可以表示为概率值或标签类别。但不是绝对的,因为某些特定的激活函数不在这一范围内。
5、计算效率:激活函数的计算应该是高效的,这是为了使得神经网络的训练和推理速度更快。
最长使用的激活函数是sigmod函数、tanh函数、ReLU函数以及上面介绍的softmax函数。
sigmod激活函数
sigmod激活函数的数学表达式为:
对于一个神经网络,若某一层使用sigmod激活函数激活,那么此层的最终输出为:
所以从上面的公式我们也可以看出,逻辑回归其实就是只有输入层和输出层,没有隐藏层的简单神经网络。
tanh激活函数
tanh激活函数的数学表达式为:
由表达式看出,tanh激活函数的取值范围比sigmod激活函数大一倍,且其导数也比sigmod激活函数的导数大,即使用tanh激活函数在使用梯度下降优化参数时,收敛的速度更快。
ReLU激活函数
ReLU激活函数的数学表达式为:
此函数与上面两个函数相比求导更容易,且导数在x>0时是一个常数,更不容易发生梯度消失和梯度爆炸。它看起来像一个线性函数,但实际上是一个非线性函数,可以学习数据中的复杂关系 。ReLU出现了,是深度学习革命中为数不多的里程碑之一 。但其因为在零点不可导,一开始时被大家摈弃,认为其性质很差,但是在2000年后,ReLU激活函数再次被提出,证明了在多数情况下其效果要明显好于其他激活函数,且其行为和生物的神经元反应行为也是较贴合。
三个激活函数的图像如下:
梯度消失和梯度爆炸
在bp反向传播算法最优化求解参数时,一般会使用梯度下降算法,在RNN中梯度的系数会有一部分是,f为激活函数。
可以看到,若使用sigmod激活函数和tanh激活函数, 当N很大时, 很容易趋于0(导数小于1时),或者很容易趋于无穷大(导数大于1时)。
当其趋于0时,梯度就趋于0,这种现象叫做梯度消失,当其趋于无穷大时,梯度就趋于无穷大,这种现象叫做梯度爆炸。
所以当使用sigmod激活函数或者tanh激活函数时,RNN处理很长的时序序列时,会发生梯度消失和梯度爆炸的问题。
ReLU激活函数的导数只有两个值,0和1.所以偏导累乘时,不会有消失和爆炸的现象,但是 还有一项,很多个相乘也会出现梯度消失和梯度爆炸的现象。所以单单使用ReLU激活函数不能很好的解决梯度爆炸的问题。如果我们给的初始W为E,那么就可以很好的解决梯度消失和梯度爆炸的现象。
使用ReLU激活函数的RNN,若初始参数W=E,那么在多数情况下训练的效果和LSTM相当。
为了彻底解决梯度消失和梯度爆炸的问题,在RNN的基础上构建出了模型LSTM。