2

我一直在玩TensorFlow并制作了一个通用的全连接模型。

在我应用的每一层

sigmoid(WX + B)

众所周知,效果很好。

然后我开始弄乱在每一层应用的函数,发现函数如

sigmoid(U(X^2) + WX + B)

优化后也能正常工作。

改变这个内部功能有什么作用?是否有一个函数式应用程序可以改变内部函数来改进模型的学习,或者任何结合输入和一些权重的函数无论正在学习什么数据都具有相同的学习能力?

我知道神经网络的许多其他模型(例如卷积网络、循环网络、残差网络等),所以我不是在寻找不同类型网络的解释(当然,除非是某种类型的网络直接应用我正在谈论的内容)。主要对简单的全连接场景感兴趣。

4

2 回答 2

1

所以基本上在考虑你的问题时有三个重要因素:

  1. 计算复杂性和稳定性:计算您的函数(理论上)应该花费更多时间,因为至少需要另外两个操作。我认为在这种情况下这不是问题,但是例如比较sigmoid需要计算两者exp和除法的位置比计算成本要高得多relu——这就是为什么relu变得如此受欢迎的原因之一。此外 - 由于平方函数发散得非常快并且饱和度sigmoid是众所周知的问题 - 您可能还会因梯度消失和计算上溢/下溢而遭受更严重的痛苦。
  2. 参数个数:第二种方法的每个单元都有一个附加的设置参数。如果您的模型很小 - 这不是一个大问题 - 但只要神经网络用于真正的记忆和耗时的任务 - 这可能是第二次激活的一个巨大缺点。这也是为什么一个非常简单的函数更适合在深度学习中使用的部分原因。
  3. 表达能力——这是你的第二个功能真正可以提供帮助的地方。不仅因为这square使您的功能更加复杂。这也是因为实际上您的函数是渐近钟形的,这可以使它更好地捕获本地依赖项。这可能是两者的一个巨大缺点,sigmoid因为relu这两个函数都使每个单元都对您的预测产生全局影响,而钟形函数倾向于支持更多的局部依赖性,而不影响位于感兴趣区域之外的数据点. 在实践中——通常这个问题是通过应用一个非常深和宽的拓扑来解决的——在一个巨大的数据集的情况下——通常是平衡单个单元的影响。
于 2017-05-16T10:08:18.677 回答
1

理论上,这两种方法具有完全相同的潜力,并且可以达到任何连续的目标函数,给定足够的层数和训练时间/数据。使用sigmoid(U(X^2) + WX + B)使每一层更智能,但也更难学习(尤其是在没有过拟合的情况下),所以如果你使用它,你应该在你的网络中放置更少的层以避免过拟合。

总的来说,在第一种方法或层数较少的第二种方法之间进行选择主要基于经验:在您的问题上,一种方法可能比另一种方法效果更好,但理论上不可能知道哪种方法。如果您的目标函数几乎是多项式,则第二种解决方案可能更好。在其他情况下,如果您不想训练具有不同网络大小的两个版本,我会选择第一个解决方案,原因如下:

  • 涉及更多的线性函数,这使计算梯度更容易,因此可能更快
  • 最近几年的研究似乎表明,在实践中,深层网络通常比具有更大层的浅层网络更好(尽管并非在所有情况下)
  • 这是常见的做法

就总运行时间而言,我不知道哪个会更好(考虑到您使用第二个选项使用更少的层)。

于 2017-05-16T08:23:01.043 回答