神经网络算法与Python(五):准备一个神经网络

参考

Python神经网络编程(Tariq Rashid著)

梯度下降法实现

在上一节,我们已经简单初步地介绍了梯度下降法在神经网络中的基本思想(即通过误差的变化率指导权重更新的步长,当然实际情况里,我们还需要考虑学习率,即再乘以一个参数)。

那么在算法中如何利用这一原理呢,显然在算法实现上的核心问题在于如何求取误差变化率。一提到变化率,导数自然是当仁不让的选择。问题到这里变得已经非常地细节了。

我们不妨站在一个高点看我们当前的进度。想象,现在我们依照一般的层次模型建立了一个神经网络,并且选取S函数作为每个神经元的激活函数,随机选取了一些数作为各个传递链的权重。

接下来,我们关心如何通过通过已知输入输出指导我们更新各个传递链的函数。最终,我们确定了使用反向传播误差的方法,这样原本我们只有输出层有误差(即输出层的每个神经元的误差都已经),在反向传播法(通过传递链的权重前馈误差)的帮助下,整个神经网络的每一层的每一个神经元都一个误差值(在一组输入输出下)。

至此,问题变成了,每个神经元应该如何通过误差更新传递链权重。显然,每个神经元的误差是由其所有与之连接的传递链的权重决定的。那么每条输入链的权重都对该神经元有影响,而我们实际上需要做的是更新每一条链的权重,因此我们在求导的时候实际上求得是偏导数。即该神经元的误差对某一条连接该神经元的输入链的权重求偏导数。
公式
上面所示的公式,即某一个神经元的误差E=tk-ok对其连接的某一条输入链的权重Wj,k求偏导的结果。oj为该条传递链输入这一神经元的值,也就是节点k的输入,求和结果是该神经元接受到的输入也就是ok。
总结表达式
传入进神经网络节点k的第i条传递链的学习幅度的表达式如上,等于该节点的误差Ek乘以该节点的输出Ok(1-Ok)再乘以该节点第i条链的输入Oi’。
所以不同链的权重改变值实际上只跟最后一项有关。

在矩阵表达式中,可以写作I+=-EO(1-O)矩阵乘Oi’
注意在,Numpy中 * 符号表示点乘 numpy.dot才是矩阵乘

准备数据

从上文的公式计算出的值(即误差对于某条链的变化率)乘以我们所选取的学习率L即可获得该条链权重所期待的调整量。在这一繁琐的过程中,矩阵和计算机可以帮我们很快更新出所以链的新权重。

下面,我们关心如何合适地为我们的神经网络选择合适的输入与初始权重。观察下图的S函数:
S函数
我们会发现,S函数只有在(-1,1)这个区间内斜率比较大。由于我们选择的是梯度下降法,我们希望输入值作用于S函数斜率变化较大的区间内,这样才有利于帮助我们的神经网络进行学习。

所以一旦我们选择S函数作为激活函数,我们应该尽可能使得输入数据的范围在(-1,1)的区间内。同样地,观察S函数的输出,我们会发现如果我们选择的输入在(-1,1)区间内那么我们的输出则不会超过1。所以一般,我们使用的输出目标值在(0.01到0.99)因为0.0与正负1.0过于理想所以一般不选择。

由于输入输出的值都比较小,因此我们在设置初始权重时也不应该设置过于大的值以免导致网络饱和(即激活函数过于平坦),所以一般也会选择在-1.0到1.0之间。

为了保持输入的基本特征,数学家经过严谨地计算得到的规则是权重应该是在改神经元传入链的总数的平方根并取倒数下取样。如某一神经元有三条输入链,那么其初始权重的范围应该是负三分之根号三到正三分之根号三这个区间内为宜。当然很多细节在实际操作过程中都应该随情况而定,比如激活函数的选取。

至此,一个神经网络的构架,原理,数据的选择都已经被讨论完毕,接下来我们可以试着使用Python建立一个真正的神经网络。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值