神经网络和BP算法推导
注意:绘画太难了,因为他们画,本文中的所有插图来自基本算法饺子机类。请勿转载
1.习模型:
事实上,基本上全部的基本机器学习模型都能够概括为下面的特征:依据某个函数,将输入计算并输出。
图形化表示为下图:
当我们的g(h)为sigmoid函数时候,它就是一个逻辑回归的分类器。当g(h)是一个仅仅能取0或1值的函数时,它就是一个感知机。那么问题来了,这一类模型有明显缺陷:当模型线性不可分的时候。或者所选取得特征不完备(或者不够准确)的时候。上述分类器效果并非特别喜人。
例如以下例:
我们能够非常轻易的用一个感知机模型(感知器算法)来实现一个逻辑与(and)。逻辑或(or)和逻辑或取反的感知器模型,(感知器模型算法链接),由于上述三种模型是线性可分的。可是。假设我们用感知器模型取实现一个逻辑非异或(同样为1,不同为0),我们的训练模型的全部输出都会是错误的,该模型线性不可分。
2.神经网络引入:
我们能够构造下面模型:
(当中,A代表逻辑与,B代表逻辑或取反。C代表逻辑或)
上述模型就是一个简单的神经网络,我们通过构造了三个感知器,并将两个感知器的输出作为了还有一个感知其的输入,实现了我们想要的逻辑非异或模型,攻克了上述的线性不可分问题。
那么问题是怎么解决的呢?事实上神经网络的实质就是每一层隐藏层(除输入和输出的节点,后面介绍)的生成。都生成了新的特征,新的特征在此生成新的特征。知道最新的特征能非常好的表示该模型为止。这样就攻克了线性不可分或特征选取不足或不精确等问题的产生。(曾经曾介绍过线性不可分的实质就是特征不够)
神经网络的模型结构例如以下:
(蓝色。红色。黄色分别代表输入层,影藏层,输出层)
在此我们介绍的神经网络中的每个训练模型用的都是逻辑回归模型即g(h)是sigmoid函数。
我们能够将神经网络表演示样例如以下:
3.神经网络的预測结果(hypothesis函数)的计算和CostFunction的计算
预測结果的计算事实上与普通的逻辑回归计算没有多大差别。
仅仅是有时候须要将某几个逻辑回归的输出作为其它逻辑回归模型的输入罢了,比方上例的输出结果为:
那么CostFunction的计算又和逻辑回归的CostFunction计算有什么差别呢?
逻辑回归的CostFunction例如以下:
上述式子的本质是将预測结果和实际标注的误差用某一种函数估算,可是我们的神经网络模型有时候输出不止一个,所以,神经网络的误差估算须要将输出层全部的CostFunction相加:
k:代表第几个输出。
补充:神经网络能够解决几分类问题?
理论上,当输出单元仅仅有一个时,能够解决2分类问题,当输出单元为2时能够解决4分类问题。以此类推...
实质上。我们三个输出单元时,能够解决三分类问题([1,0,0],[0,1,0],[0,0,1]),为什么如此设计?临时留白。以后解决
ps:面试题:一个output机器,15%可能输出1。85%输出0,构造一个新的机器。使0,1输出可能性同样? 答:让output两次输出01代表0,10代表1,其余丢弃
4.神经网络的训练
这儿也同于logistic回归,所谓的训练也就是调整w的权值,让我们再一次把神经网络的CostFunction写出来!
W代表全部层的特征权值,Wij(l)代表第l层的第i个元素与第j个特征的特征权值
m代表样本个数,k代表输出单元个数
hw(x(i))k代表第i个样本在输出层的第k个样本的输出 y(i)k代表第i个样本的第k个输出
然后同于logistic回归。将全部的W更新就可以。难处在于此处的偏导数怎么求?首先得说说链式求导法则:
所以我们能够有:
接下来的问题就是有theta了,当我们要求的错误变化率是最后一层(最后一层既是输出层的前一层)且仅仅看一个输出神经元时则:
多个相加就可以
那么中间层次的神经元变化率怎样求得呢?我们须要研究l层和了+1层之间的关系,例如以下图:
第l层的第i个Z与第l层的第i个a的关系就是取了一个sigmod函数,然而第l层的第i个a与和其相应的w相乘后在加上其它的节点与其权值的乘积构成了第l+1层的Z,好拗口,好难理解啊。看下式:
大体也就是这么个情况,详细的步骤为:
1.利用前向传播算法,计算出每一个神经元的输出
2.对于输出层的每个输出。计算出其所相应的误差
3.计算出每一个神经元的错误变化率即:
4.计算CostFunction的微分,即:
5.代码:
版权声明:本文博主原创文章,博客,未经同意不得转载。