深度学习-从感知器到LSTM(目的是处理序列问题)

2019-01-19  本文已影响26人  吕不韦

目的是将LSTM用在分词和词性标注任务,这一篇的目的是LSTM,但从感知器开始写起,希望能把这个流程中的主要知识点展示出来。由于水平有限,所以涉及大量公式的地方都会是从我看过的资料中截图过来,我会在文末放出文章的链接,供参考。
感知器——基础的全连接网络——线性单元到线性模型——梯度下降——神经网络和反向传播算法——循环神经网络——LSTM——LSTM-CRF

1.感知器(Perception)

“感知器”一词出自于20世纪50年代中期到60年代中期人们对一种分类学习机模型的称呼,它是属于有关动物和机器学习的仿生学领域中的问题。当时的一些研究者认为感知器是一种学习机的强有力模型,后来发现估计过高了,但发展感知器的一些相关概念仍然沿用下来。
感知器算法实质上是一种赏罚过程:
–对正确分类的模式则“赏”,实际上是“不罚”,即权向量不变。
–对错误分类的模式则“罚”,使w(k)加上一个正比于xk的分量。
–当用全部模式样本训练过一轮以后,只要有一个模式是判别错误的,则需要进行下一轮迭代,即用全部模式样本再训练一次。
–如此不断反复直到全部模式样本进行训练都能得到正确的分类结果为止。



一个感知器有如下组成部分:



可以用感知器实现and、or这些简单的布尔运算,感知器还可以拟合任何的线性函数,任何线性分类或线性回归问题都可以用感知器来解决。布尔运算可以看作是二分类问题,即给定一个输入,输出0(属于分类0)或1(属于分类1)。但是感知器不能实现异或运算,异或运算不是线性的,你无法用一条直线把分类0和分类1分开。
感知器的训练

总的来说是先随机给个权值,然后利用训练集反复训练权值,最后得到能够正确分类所有样例的权向量。
具体算法过程如下:
w是权重,b是偏置项,t是实际值,y是预测值
<p>
1.初始化权向量w=(w0,w1,…,wn),将权向量的每个值赋一个随机值或者都赋值为0
2.对于每个训练样例,首先计算其预测值,实际值减去预测值与学习率相乘,再根据上方公式来调整权重,没处理一个样本就调整一次权重值,经过多轮迭代后(即全部的训练数据被反复处理多轮),就可以训练出感知器的权重,使之实现目标函数。



其中:


2.线性单元到线性模型和梯度下降

上文介绍的感知器算法它的阶跃函数输出是0或1,他只能处理分类问题,不能处理线性不可分的数据,也就是不能在线性不可分的数据上收敛,为了解决这个问题,我们使用一个可导的线性函数来替代感知器的阶跃函数,这种感知器就叫做线性单元。线性单元在面对线性不可分的数据集时,会收敛到一个最佳的近似上。
这样使用线性单元替代感知器的阶跃函数后,线性单元将会返回一个实数值而不是0或1,因此说线性单元用来解决回归问题而不是分类问题。

线性模型

f(x)=ω1x1+ω2x2+...+ωdxd+b;(b为偏置单元)这就是一个线性模型基本的表达式,每个属性x都有一个自己的权重w,我们用向量形式表示:
f(x)=ωTx+b;其中ω=(ω1;ω2;...;ωd),ω和b是学习得到的,确定后模型就确定了。
接下来我们要知道这个模型该怎么训练,也就是参数w都该去什么值,这里引入监督学习和无监督学习,无监督学习是只有x没有y,全靠模型总结出x的规律。
而监督学习是说我们既有x又有y,我们先提供大量的训练样本(既有x又有y),我们用这样的数据去训练模型,让他从已知的数据中学习到其中x与y的关系,就是确定w的值,最后确定整体模型。
接下来我们考虑监督学习的训练算法——梯度下降。
当前的线性模型中在已知数据中由x求得y1,这里的y1是模型给出的预测值,我们还有x的实际值y,这里y和y1我们希望越接近越好,我们用y1和y的差的平方的1/2来表示他们的接近程度:



这里的e是单个样本的误差,训练数据中有很多样本,我们可以用训练数据中所有样本的误差的和来表示模型的误差E,也就是



这里用和式表示:

其中

我们希望误差越小越好,也就是E越小越好,对于特定的训练集来说,x和y都是已知的,所以我们要求的参数就是w。

E(w)就是我们的优化目标,称之为目标函数(Loos Function)
梯度下降算法

梯度:
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度(比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。对于在点(x0,y0)的具体梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),如果是3个参数的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此类推。),梯度是一个向量,指向函数值上升最快的方向,梯度的反方向就是函数值下降最快的方向了,我们每次沿着梯度相反方向去修改x的值,当然就能走到函数的最小值附近。
需要注意的是梯度求得的并不一定是最小值,只能保障会走到最小值附近,这是因为我们每次移动的步长不会那么恰到好处,有可能最后一次迭代走远了越过了最小值那个点。步长的选择是门手艺,如果选择小了,那么就会迭代很多轮才能走到最小值附近;如果选择大了,那可能就会越过最小值很远,收敛不到一个好的点上。
梯度下降的相关概念:
1.步长:步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度,调大调小是门技术活
2.特征:每一个x代表一个特征,y代表输出
3.假设函数:我们针对数据假设的线性模型
4.损失函数:即E,用来评估模型
这里直接给出梯度下降算法的公式:



接下来我们进行推倒:
函数的梯度的定义就是它相对于各个变量的偏导数,于是有:



和的导数等于导数的和,所以我们可以先把求和符号里面的导数求出来,然后再把它们加在一起就行了,也就是

把求和符号里面的导数求出来:

我们知道,y是与w无关的常数,下面我们根据链式求导法则来求导:

我们分别计算上式等号右边的两个偏导数:

代入上面的公式得
最后:
批量梯度下降

这是批量梯度下降公式,每次训练都需要所有的值带入才可以求得一个梯度(注意加和的存在),因此一次更新的的幅度是挺大的,如果数据量很大,那么每次更新参数都需要所有数据参与,可以想想工作量很大,所以我们引入随机梯度下降。

随机梯度下降

这是随机梯度下降的公式,注意丢掉了加和,这意味着我们不需要每次更新参数都将所有数据进行计算,随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,对于最优化问题,凸问题,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。但是相比于批量梯度,这样的方法更快,更快收敛,虽然不是全局最优,但很多时候是我们可以接受的,所以这个方法用的也比上面的多。

小结

一个机器学习算法往往只需要两部分:
1.模型从输入特征x预测输入y的那个函数H(x)
2.目标函数去最小(最大)值时所对应的参数值,就是模型的参数的最优值,很多时候我们只能获得目标函数的局部最小(最大)值,因此也只能得到模型参数的局部最优值
接下来,用优化算法去求取目标函数的最小(最大)值,梯度下降算法就是一个优化算法,针对同一个目标函数,不同的优化算法会推导出不同的训练规则。
在机器学习中,往往算法并不是关键,真正的关键之处在于选特征,选特征需要我们人类对问题的深刻理解、经验和思考,而神经网络算法的一个优势,就在于它能够自动学习到应该提取什么特征,从而使算法不再那么依赖人类。

神经网络和反向传播算法

神经元

神经元和感知器本质上是一样的,只不过我们说感知器的时候,它的激活函数是阶跃函数;而当我们说神经元时,激活函数往往选择为sigmoid函数或tanh函数。如下图所示:



计算一个神经元的输出的方法和计算一个感知器的输出是一样的。
假设神经元的输入是向量x,权重向量是w(偏置项是b),激活函数是sigmoid函数,则其输出y:



sigmoid函数是一个非线性函数,值域是(0,1)。函数图像如下图所示:

可以看到,sigmoid函数的导数非常有趣,它可以用sigmoid函数自身来表示。这样,一旦计算出sigmoid函数的值,计算它的导数的值就非常方便。

神经网络

圆圈表示神经元,+1节点表示偏置节点,也就是截距项,最左边的一层是输入层,最右的一层叫做输出层,中间所有的节点叫做隐藏层,同一层的神经元没有链接,第N层的每个神经元和第N-1层的所有神经元相连(这就是full connected的含义),第N-1层神经元的输出就是第N层神经元的输入,每个连接都有一个权值。
上面这些规则定义了全连接神经网络的结构。事实上还存在很多其它结构的神经网络,比如卷积神经网络(CNN)、循环神经网络(RNN),他们都具有不同的连接规则。

神经网络的输出

神经网络实际上就是一个输入向量x到输出向量y的函数,即:



根据输入计算神经网络的输出,需要首先将输入向量x的每个元素的值赋给神经网络的输入层的对应神经元,然后根据上式依次向前计算每一层的每个神经元的值,直到最后一层输出层的所有神经元的值计算完毕。最后,将输出层每个神经元的值串在一起就得到了输出向量。
上图的简单神经网络可以用下式来表达:



用矩阵表示神经网络如下:


反向传播算法

现在,我们需要知道一个神经网络的每个连接上的权值是如何得到的。我们可以说神经网络是一个模型,那么这些权值就是模型的参数,也就是模型要学习的东西。然而,一个神经网络的连接方式、网络的层数、每层的节点数这些参数,则不是学习出来的,而是人为事先设置的。对于这些人为设置的参数,我们称之为超参数(Hyper-Parameters)。
按照机器学习的通用套路,我们先确定神经网络的目标函数,然后用随机梯度下降优化算法去求目标函数最小值时的参数值。
我们取网络所有输出层节点的误差平方和作为目标函数:



Ed表示d节点的误差。
然后我们用上文提到的梯度下降算法对目标函数进行优化:



随机梯度下降算法也就是需要求出误差E对于每个权重我、的偏导数(也就是梯度)。




至此,我们已经推导出了反向传播算法。需要注意的是,我们刚刚推导出的训练规则是根据激活函数是sigmoid函数、平方和误差、全连接网络、随机梯度下降优化算法。如果激活函数不同、误差计算方式不同、网络连接结构不同、优化算法不同,则具体的训练规则也会不一样。但是无论怎样,训练规则的推导方式都是一样的,应用链式求导法则进行推导即可。

循环神经网络

下图是一个简单的循环神经网络如,它由输入层、一个隐藏层和一个输出层组成:



循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。
如果我们把上面的图展开,循环神经网络也可以画成下面这个样子:




循环神经网络的隐藏层不仅取决于当前的输入x,还取决于上一个时刻隐藏层的输出,这个处理目的是为了解决时间序列问题,比如分词、词性标注这些语言模型,一句话不仅取决于当前的输入,还与前后的数据有关系,但循环神经网络只与前一刻的输入建立了联系,下一刻的数据没有建立联系,所以我们还需要双向的循环神经网络,充分考虑序列的前后时刻,
双向循环神经网络


循环神经网络的训练是很复杂的,但它的基础还是反向传播,因为我不做技术开发,所以这篇文章不涉及双向循环神经网络的训练算法。

LSTM

双向的循环神经网络训练的具体技术不涉及,它的缺点是很难处理长距离的依赖,隐藏层太深后,网络就会损失长距离的信息,训练过程中容易出现梯度消失和梯度爆炸问题,所以引入了LSTM。
长短时记忆网络的思路比较简单。原始RNN的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。那么,假如我们再增加一个状态,即c,让它来保存长期的状态,那么问题不就解决了么?如下图所示:



新增加的状态c,称为单元状态(cell state)。我们把上图按照时间维度展开:



上图仅仅是一个示意图,我们可以看出,在t时刻,LSTM的输入有三个:当前时刻网络的输入值x、上一时刻LSTM的输出值H、以及上一时刻的单元状态;LSTM的输出有两个:当前时刻LSTM输出值h、和当前时刻的单元状态c。
LSTM的关键,就是怎样控制长期状态c。在这里,LSTM的思路是使用三个控制开关。第一个开关,负责控制继续保存长期状态c;第二个开关,负责控制把即时状态输入到长期状态c;第三个开关,负责控制是否把长期状态c作为当前的LSTM的输出。三个开关的作用如下图所示:

接下来,我们要描述一下,输出h和单元状态c的具体计算方法。

长短时记忆网络的前向计算(该部分强烈推荐看第二个引用资料)
前面描述的开关是怎样在算法中实现的呢?这就用到了门(gate)的概念。门实际上就是一层全连接层,它的输入是一个向量,输出是一个0到1之间的实数向量。假设W是门的权重向量,b是偏置项,那么门可以表示为:






以上就是LSTM的前向计算。
反向传播同样不会涉及。

引用材料

1.https://www.cnblogs.com/huadongw/p/4106720.html
2.https://www.zybuluo.com/hanbingtao/note/433855
3.https://blog.csdn.net/u011974639/article/details/77102663
4.https://www.cnblogs.com/pinard/p/5970503.html
5.https://blog.csdn.net/lilyth_lilyth/article/details/8973972
6.https://www.cnblogs.com/maybe2030/p/5089753.html
7.https://www.zhihu.com/question/264189719
8.http://ufldl.stanford.edu/wiki/index.php/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C
9.https://zhuanlan.zhihu.com/p/33594517

上一篇下一篇

猜你喜欢

热点阅读