神经网络结构设计

Mat*_*teo 10 artificial-intelligence backpropagation neural-network

我正在玩神经网络试图根据你需要解决的问题来理解设计架构的最佳实践.

我生成了一个由单个凸区域组成的非常简单的数据集,如下所示:

在此输入图像描述

当我使用L = 1或L = 2隐藏层(加上输出层)的架构时,一切正常,但是当我添加第三个隐藏层(L = 3)时,我的性能下降到略好于机会.

我知道你添加到网络中的复杂性越多(要学习的权重和参数的数量),你越倾向于过度拟合数据,但我认为这不是我问题的本质,原因有两个:

  • 我在训练集上的表现也是60%左右(而过度拟合通常意味着你的训练误差非常低,测试误差很大),
  • 而且我有大量的数据示例(不要看那个只有我上传的玩具人物的数字).

任何人都可以帮助我理解为什么添加一个额外的隐藏层会让我在这么简单的任务中失败?

这是我的表现图像作为所用图层数量的函数:

在此输入图像描述

补充部分评论如下:

  • 我正在使用sigmoid函数,假设值介于0和1之间, L(s) = 1 / 1 + exp(-s)
  • 我正在使用早期停止(在40000次反向提升之后)作为停止学习的标准.我知道这不是停止的最佳方式,但我认为这对于这样一个简单的分类任务是可以的,如果你认为这是我不融合的主要原因II可能会实现一些更好的标准.

lmj*_*ns3 11

至少在它的表面上,这似乎是所谓的"消失梯度"问题的情况.

激活功能

你的神经元根据logistic sigmoid函数激活,f(x)= 1 /(1 + e ^ -x):

乙状结肠功能

经常使用此激活函数,因为它具有几个不错的属性.其中一个很好的特性是f(x)的导数可以使用函数本身的值进行计算表达,如f'(x)= f(x)(1 - f(x)).此函数对于x接近零具有非零值,但很快变为零,因为| x | 变大:

sigmoid一阶导数

梯度下降

在具有逻辑激活的前馈神经网络中,误差通常使用一阶导数作为学习信号向后传播通过网络.网络中权重的通常更新与该权重乘以当前权重值乘以逻辑函数导数的误差成正比.

delta_w(w) ~= w * f'(err(w)) * err(w)
Run Code Online (Sandbox Code Playgroud)

作为三个可能非常小的值的乘积,如果网络中的权重落在逻辑函数的导数的"中间"区域之外,则这种网络中的一阶导数可以非常快速地变小.此外,这种快速消失的衍生物通过添加更多层而变得更加恶化,因为层中的错误被"分裂"并分区到层中的每个单元.反过来,这进一步减少了低于该层的层的梯度.

在具有多于两个隐藏层的网络中,这可能成为训练网络的严重问题,因为一阶梯度信息将使您相信权重无法有效地改变.

但是,有一些解决方案可以提供帮助!我能想到的涉及改变你的学习方法,使用比一阶梯度下降更复杂的东西,通常包含一些二阶导数信息.

动量

使用某些二阶信息近似的最简单解决方案是在网络参数更新中包含动量项.而不是使用以下更新参数:

w_new = w_old - learning_rate * delta_w(w_old)
Run Code Online (Sandbox Code Playgroud)

纳入动量术语:

w_dir_new = mu * w_dir_old - learning_rate * delta_w(w_old)
w_new = w_old + w_dir_new
Run Code Online (Sandbox Code Playgroud)

直觉上,您希望使用来自过去衍生工具的信息来帮助确定您是否要完全遵循新的衍生工具(您可以通过设置mu = 0来完成),或者继续朝着您前一次更新的方向前进,进行调整通过新的梯度信息(通过设置mu> 0).

通过使用"Nesterov的Accelerated Gradient",您实际上可以获得更好的效果:

w_dir_new = mu * w_dir_old - learning_rate * delta_w(w_old + mu * w_dir_old)
w_new = w_old + w_dir_new
Run Code Online (Sandbox Code Playgroud)

我认为这里的想法是,不是计算"旧"参数值的导数,而是将其计算为w"新"设置,w如果你继续按照标准动量项移动那里.在这里阅读更多神经网络背景(PDF).

黑森州免费

将二阶梯度信息合并到神经网络训练算法中的教科书方法是使用牛顿法计算目标函数关于参数的一阶二阶导数.然而,称为Hessian矩阵的二阶导数通常非常大并且计算成本过高.

在过去的几年中,一些聪明的研究表明了一种在特定搜索方向上只计算Hessian值的方法,而不是计算整个Hessian.然后,您可以使用此过程来识别比一阶梯度更好的参数更新.

您可以通过阅读研究论文(PDF)或查看示例实现来了解更多相关信息.

其他

还有许多其他优化方法可用于此任务 - 共轭梯度(PDF - 绝对值得一读),Levenberg-Marquardt(PDF),L-BFGS - 但是我从研究文献中看到的,动量和无Hessian方法似乎是最常见的方法.