Python神经网络编程——内容在整理

1.神经网络的概念

       如图所示,是一个全连接的三层神经网络(Input、Hidden、Output)。可以简单的认为,神经网络是一个黑盒子,我们通过输入,最终得到想要的输出。

       但是盒子内如何运算,就涉及到神经网络的设计和调整,这里先给出整体概念(我们通过给出输入,通过层与层之间的权重计算,得到第一次输出,将这个输出和预期值或者叫正确值进行比较得到误差;通过误差,反向修正层之间的权重,不断靠近正确答案,以求最后可以输入后,经过修正后的权重运算,直接得到正确的输出。这是大致的工作流程)。

理念就是让能够接近正确答案的权重能够起到更大作用(这里稍微解释一下,初始的权重矩阵是随机的,也就意味着第一轮结果大概率是不对的。那么就有两种可能,比正确答案大了/小了,就会产生误差,误差反向传播影响权重矩阵,进行修正;比如,如果误差为正(预期-输出),说明网络算的小了,就把误差分回去,往大了修正权重,以求靠近正确结果

这里面还牵扯到很多问题,下面慢慢展开。

①矩阵运算:我们可以很直观的看到, 权重的运算是网络的绝大部分工作,所以这一块要采用方便快捷的方式,以实现编码。

 

 上面两张图就给出了权重运算转化为矩阵运算的过程,并不困难。

②S函数:S函数的出现也是基于要优化结果的理念,类比生物上的神经系统。我们希望只有有用的输入可以造成结果,比如听到的声音有噪声,我们需要设置一个阈值,只有超过了阈值,才产生警觉或者其他反应。

 

 我们可以从上面两个张图上看出,S函数就是个比较平滑的阶跃函数,输入小则会被更进一步缩小,输入大则影响会被放大;并且值域为(0,1),方便数学计算

我们通过在每次的权重运算之后,将值代入S函数,对值进行进一步处理,确保有用的部分能更大程度上影响结果。

 ③有了上面两个知识,我们就可以求得网络的输出

 

 

 

其中,W是权重矩阵,X是将运算后结果带进S函数的结果,O是输出矩阵

④简单的权重的更新 

我们首先想到的是,可以将(预期值-输出值)得到的E(误差)进行等比例均分,依然符合我们试图让有用的部分更加有效的影响最终结果的想法。Input和Hidden之间没有预期值,可以将Eoutput均分后,给到Hidden节点,作为节点处的误差,继续反向均分。

 

这是上面提到的误差反向传播的具体运算。 

 我们可以大胆认为,error矩阵中的具体值,只是影响了权重矩阵像最后答案靠拢的速率,只要他还是能够体现权重大的对结果影响更大,他就是可行的,所以可以进一步简化矩阵

这样误差的方向传播,就成了权重运算的反向运算,所以和权重矩阵互为转置矩阵。

 

 ⑤到这里,我们回头看一下,我们的误差的反馈值是通过比例进行分配的,这个返回的误差的修正效果,就是我们试错的步长。好比我们在条直线上,想要到达一个固定的点,反复的在这个点两侧左右横跳。那么怎么保证我们最后能到达那个点呢,毕竟直线上有无数个点;或者我们能直接算出最好的误差反向传播矩阵吗?这两个问题都有可能会导致我们的运算没有尽头,得不到最终结果,这也是之前深度学习的困境。

⑥梯度下降

       梯度下降法给我 们带来一种能力,即我们不必完全理解复杂的函数,从数学上对函数进行求解,就可以找到最小值。如果函数非常困难,我们不能用代数轻松找到 最小值,我们就可以使用这个方法来代替代数方法。

       当然,由于我们依然采用 步进的方式接近答案,一点一点地改进所在的位置,因此这可能无法给出 精确解。但是,这比得不到答案要好。

 我们这样理解上图,图中是一个非常复杂的函数,我们要找他的最低点。这时,我们可以通过他的导数值来判断(就像求极小值),斜率为正则说明极小值应该在左边,坐标左移。但我们也看到,极小值不是最小值,可能有多个。解决这个问题我们就只能,从不同的位置开始寻找,会找到一个最低的点。转换到神经网络,就是要换不同输入进行多次训练。

但是我们还有步长要考虑,上面的按比例的方法就是因为步长的不确定性,导致可能会出现运算太多的情况。 我们从表中可以了解到,如果直接相减,那我们观察多个输出节点就会无法判断;如果取绝对值,那当我们在V行山谷时,会来回跳跃;所以我们用平方,好处有三

当然也可以设计其他的选择,以达到特定的效果,这里只是举例论证梯度下降的可行性。

 

 

当我们进行误差的反向运算时,只有与权重Wj,k相连的节点的误差才收到他影响,所以可以简化为 

展开运算

 

 

已知公式 

 的情况下可得

 

 

当我们把上面的式子回推一层,第一部分我们写为ej,第二部分括号里面回推一层,Oj变成输入(因为只有三层) 

 

得到隐藏层到输入层的误差回推大小。 

 

 

我们注意这个斜率和回退方向是相反的,所以取反后相加(比如,斜率为正,则要左移,就应该把输入变小,所以是减去);这里的α称为学习因子,作为人为调节步长的工具。

至此原理部分全部完成,包括正向运算和权重修正两个部分。

代码示例

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值