神经网络架构设计
Posted
技术标签:
【中文标题】神经网络架构设计【英文标题】:Neural Network Architecture Design 【发布时间】:2013-11-29 07:38:26 【问题描述】:我正在研究神经网络,试图了解根据您需要解决的问题类型设计其架构的最佳实践。
我生成了一个由单个凸区域组成的非常简单的数据集,如下所示:
当我使用 L = 1 或 L = 2 个隐藏层(加上输出层)的架构时,一切正常,但一旦我添加第三个隐藏层 (L = 3),我的性能就会下降到略微胜于机遇。
我知道你添加到网络中的复杂性(要学习的权重和参数的数量)越多,你就越倾向于过度拟合你的数据,但我相信这不是我的问题的本质,原因有两个:
我在训练集上的表现也在 60% 左右(而过拟合通常意味着您的训练误差和测试误差非常低), 而且我有非常大量的数据示例(不要看图,这只是我上传的玩具图)。谁能帮我理解为什么添加一个额外的隐藏层会给 我在这么简单的任务上性能下降?
这是我的表现作为所用层数的函数的图像:
由于评论而添加的部分:
我正在使用 sigmoid 函数,假设值介于 0 和 1 之间,L(s) = 1 / 1 + exp(-s)
我使用提前停止(40000 次反向传播后)作为停止学习的标准。我知道这不是最好的停止方法,但我认为这样一个简单的分类任务就可以了,如果你认为这是我不收敛的主要原因,我可能会实施一些更好的标准。
【问题讨论】:
你的激活函数是什么? 你如何确定训练多长时间?具有更多层的网络需要更长的时间才能收敛。 @AtillaOzgur - 感谢您的关注,我更新了问题以回答您的评论! @seaotternerd - 感谢您的关注,我更新了问题以回答您的评论! 【参考方案1】:至少从表面上看,这似乎是所谓的“梯度消失”问题。
激活函数
您的神经元根据逻辑 sigmoid 函数激活,f(x) = 1 / (1 + e^-x):
这个激活函数经常被使用,因为它有几个很好的属性。这些好的特性之一是 f(x) 的导数可以使用函数本身的值在计算上表示,如 f'(x) = f(x)(1 - f(x))。对于接近零的 x,此函数具有非零值,但随着 |x| 迅速变为零变大:
梯度下降
在具有逻辑激活的前馈神经网络中,误差通常使用一阶导数作为学习信号通过网络向后传播。网络中权重的通常更新与归因于该权重的误差乘以当前权重值乘以逻辑函数的导数成正比。
delta_w(w) ~= w * f'(err(w)) * err(w)
作为三个可能非常小的值的乘积,如果网络中的权重落在逻辑函数导数的“中间”范围之外,此类网络中的一阶导数会迅速变小。此外,添加更多层会加剧这种快速消失的导数,因为层中的错误会“分裂”并划分到层中的每个单元。这反过来又进一步降低了低于该层的梯度。
在具有两个以上隐藏层的网络中,这可能会成为训练网络的一个严重问题,因为一阶梯度信息会让您相信权重无法有效地改变。
但是,有一些解决方案可以提供帮助!我能想到的涉及改变你的学习方法以使用比一阶梯度下降更复杂的方法,通常包含一些二阶导数信息。
动量
使用一些二阶信息进行近似的最简单解决方案是在网络参数更新中包含动量项。而不是使用更新参数:
w_new = w_old - learning_rate * delta_w(w_old)
加入动量项:
w_dir_new = mu * w_dir_old - learning_rate * delta_w(w_old)
w_new = w_old + w_dir_new
直观地说,您希望使用来自过去导数的信息来帮助确定您是要完全遵循新的导数(您可以通过设置 mu = 0 来做到这一点),还是继续朝着前一个方向前进更新,由新的梯度信息调节(通过设置 mu > 0)。
使用“Nesterov 的加速梯度”实际上可以得到比这更好的效果:
w_dir_new = mu * w_dir_old - learning_rate * delta_w(w_old + mu * w_dir_old)
w_new = w_old + w_dir_new
我认为这里的想法是,不是在“旧”参数值 w
计算导数,而是在 w
的“新”设置下计算它,如果你继续并根据移动到那里一个标准的动量项。 Read more in a neural-networks context here (PDF).
无粗麻布
将二阶梯度信息纳入神经网络训练算法的教科书方法是使用牛顿法计算目标函数关于参数的一阶和二阶导数。但是,称为Hessian matrix 的二阶导数通常非常大且计算起来非常昂贵。
过去几年的一些聪明的研究表明了一种仅计算特定搜索方向上的 Hessian 值的方法,而不是计算整个 Hessian 矩阵。然后,您可以使用此过程来确定比一阶梯度更好的参数更新。
您可以通过阅读research paper (PDF) 或查看sample implementation 了解更多信息。
其他
还有许多其他优化方法可能对这项任务有用——conjugate gradient (PDF -- definitely worth a read)、Levenberg-Marquardt (PDF)、L-BFGS——但从我在研究文献中看到的情况来看,动量和无 Hessian 方法似乎是最常见的。
【讨论】:
无话可说!感谢您提供如此详细而准确的答案。还有许多有用的指针!【参考方案2】:因为收敛所需的训练迭代次数会随着神经网络复杂性的增加而增加,所以在向神经网络添加层的同时保持训练长度不变肯定会导致最终观察到这样的下降。要弄清楚这是否是对这一特定观察的解释,请尝试增加您正在使用的训练迭代次数,看看它是否有所改善。使用更智能的停止标准也是一个不错的选择,但简单地增加截止值会让您更快地得到答案。
【讨论】:
以上是关于神经网络架构设计的主要内容,如果未能解决你的问题,请参考以下文章