1.16 准备数据
在本节中,我们要思考如何最好地准备训练数据,初始随机权重,甚至设计输出值,给训练过程一个成功的机会。
你没有看错!并不是所有使用神经网络的尝试都能够成功,这有许多原因。一些问题可以通过改进训练数据、初始权重、设计良好的输出方案来解决。让我们逐个讨论。
1.16.1 输入
仔细观察下图的S激活函数。你可以发现,如果输入变大,激活函数就会变得非常平坦。
由于我们使用梯度学习新的权重,因此一个平坦的激活函数会出问题。
回头仔细观察关于权重变化的表达式。权重的改变取决于激活函数的梯度。小梯度意味着限制神经网络学习的能力。这就是所谓的饱和神经网络。这意味着,我们应该尽量保持小的输入。
有趣的是,这个表达式也取决于输入信号(oj ),因此,我们也不应该让输入信号太小。当计算机处理非常小或非常大的数字时,可能会丧失精度,因此,使用非常小的值也会出现问题。
一个好的建议是重新调整输入值,将其范围控制在0.0到1.0。输入0会将oj 设置为0,这样权重更新表达式就会等于0,从而造成学习能力的丧失,因此在某些情况下,我们会将此输入加上一个小小的偏移,如0.01,避免输入0带来麻烦。
1.16.2 输出
神经网络的输出是最后一层节点弹出的信号。如果我们使用的激活函数不能生成大于1的值,那么尝试将训练目标值设置为比较大的值就有点愚蠢了。请记住,逻辑函数甚至不能取到1.0,只能接近1.0。数学家称之为渐近于1.0。
下图清楚地表明,逻辑激活函数的输出值根本不可能大于1.0、小于0。
如果我们将目标值设置在这些不可能达到的范围,训练网络将会驱使更大的权重,以获得越来越大的输出,而这些输出实际上是不可能由激活函数生成的。这使得网络饱和,因此我们知道这种情况是很糟糕的。
因此,我们应该重新调整目标值,匹配激活函数的可能输出,注意避开激活函数不可能达到的值。
虽然,常见的使用范围为0.0~1.0,但是由于0.0和1.0这两个数也不可能是目标值,并且有驱动产生过大的权重的风险,因此一些人也使用0.01~0.99的范围。
1.16.3 随机初始权重
与输入和输出一样,同样的道理也适用于初始权重的设置。由于大的初始权重会造成大的信号传递给激活函数,导致网络饱和,从而降低网络学习到更好的权重的能力,因此应该避免大的初始权重值。
我们可以从-1.0~+1.0之间随机均匀地选择初始权重。比起使用非常大的范围,比如说-1000~+1000,这是一个好得多的思路。
我们能做得更好吗?也许吧。
对于给定特定形状的网络以及特定的激活函数,数学家和计算机科学家曾进行过数学计算,制定出了经验法则,设置了随机初始权重。这是非常“特定的”!无论如何,让我们继续前进吧。
在此处,我们不纠结于计算细节,但是,其核心思想是,如果很多信号进入一个节点(这也是在神经网络中出现的情况),并且这些信号的表现已经不错了,不会太大,也不会分布得奇奇怪怪,那么在对这些信号进行组合并应用激活函数时,权重应该支持保持这些表现良好的信号。换句话说,我们不希望权重破坏了精心调整输入信号的努力。数学家所得到的经验规则是,我们可以在一个节点传入链接数量平方根倒数的大致范围内随机采样,初始化权重。因此,如果每个节点具有3条传入链接,那么初始权重的范围应该在从 到 ,即±0.577之间。如果每个节点具有100条传入链接,那么权重的范围应该在 至 ,即±0.1之间。
直觉上说,这是有意义的。一些过大的初始权重将会在偏置方向上偏置激活函数,非常大的权重将会使激活函数饱和。一个节点的传入链接越多,就有越多的信号被叠加在一起。因此,如果链接更多,那么减小权重的范围,这个经验法则是有道理的。
如果你已经熟悉从概率分布中进行采样的思想,那么这一经验法则实际上讲的是,从均值为0、标准方差等于节点传入链接数量平方根倒数的正态分布中进行采样。但是,由于经验法则所假设的一些事情,如可替代的激活函数tanh()、输入信号的特定分布等,可能不是真的,因此,我们不必太担心要精确正确地理解这个法则。
下图总结了简单的方法和比较复杂的正态分布方法。
不管你做什么,禁止将初始权重设定为相同的恒定值,特别是禁止将初始权重设定为0。要不然,事情会变得很糟糕。
如果这样做,那么在网络中的每个节点都将接收到相同的信号值,每个输出节点的输出值也是相同的,在这种情况下,如果我们在网络中通过反向传播误差更新权重,误差必定得到平分。你还记得误差按权重比例进行分割吧!那么,这将导致同等量的权重更新,再次出现另一组值相等的权重。由于正确训练的网络应该具有不等的权重(对于几乎所有的问题,这是极有可能的情况),那么由于这种对称性,你将永远得不到这种网络,因此这是一种很糟糕的情况。
由于0权重,输入信号归零,取决于输入信号的权重更新函数也因此归零,这种情况更糟糕。网络完全丧失了更新权重的能力。
你还可以做许多其他的事情,对如何准备输入数据、设置权重、组织所需的输出进行优化。在本书中,以上的思想很容易理解,也可以得到一个相当好的效果,因此,我们就此打住。
关键点
· 如果输入、输出和初始权重数据的准备与网络设计和实际求解的问题不匹配,那么神经网络并不能很好地工作。
· 一个常见的问题是饱和。在这个时候,大信号(这有时候是由大权重带来的)导致了应用在信号上的激活函数的斜率变得非常平缓。这降低了神经网络学习到更好权重的能力。
· 另一个问题是零值信号或零值权重。这也可以使网络丧失学习更好权重的能力。
· 内部链接的权重应该是随机的,值较小,但要避免零值。如果节点的传入链接较多,有一些人会使用相对复杂的规则,如减小这些权重的大小。
· 输入应该调整到较小值,但不能为零。一个常见的范围为0.01~0.99,或-1.0~1.0,使用哪个范围,取决于是否匹配了问题。
· 输出应该在激活函数能够生成的值的范围内。逻辑S函数是不可能生成小于等于0或大于等于1的值。将训练目标值设置在有效的范围之外,将会驱使产生越来越大的权重,导致网络饱和。一个合适的范围为0.01~0.99。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论