【问题标题】:Different weight functions for neurons神经元的不同权重函数
【发布时间】:2017-10-15 04:35:46
【问题描述】:
我一直在TensorFlow 中玩耍并制作了一个通用的全连接模型。
在我应用的每一层
sigmoid(WX + B)
众所周知,效果很好。
然后我开始搞乱在每一层应用的函数,发现函数如
sigmoid(U(X^2) + WX + B)
优化后也能正常工作。
改变这个内部函数有什么作用?是否有一个函数式应用程序可以改变内部函数来改进模型的学习,或者任何结合输入和某些权重的函数无论学习什么数据都具有相同的学习能力?
我知道许多其他神经网络模型(例如卷积网络、循环网络、残差网络等),所以我不是在寻找不同类型网络的解释(当然,除非是某种类型网络直接应用我正在谈论的内容)。主要对简单的全连接场景感兴趣。
【问题讨论】:
标签:
machine-learning
tensorflow
neural-network
keras
activation-function
【解决方案1】:
理论上,这两种方法具有完全相同的潜力,并且可以达到任何连续的目标函数,给定足够的层和训练时间/数据。使用sigmoid(U(X^2) + WX + B) 会使每一层变得更智能,但也更难学习(尤其是在没有过拟合的情况下),所以如果你使用它,你应该在网络中放更少的层以避免过拟合。
总的来说,在第一种方法或层数较少的第二种方法之间进行选择主要基于经验:在您的问题上,一种方法可能比另一种更好,但理论上不可能知道哪种方法。如果您的目标函数几乎是多项式,则第二种解决方案可能更好。在其他情况下,如果您不想同时训练具有不同网络规模的两个版本,我会选择第一个解决方案,原因如下:
- 涉及的线性函数更多,可以更轻松地计算梯度,因此可能更快
- 最近几年的研究似乎表明,在实践中,深层网络通常比具有更大层数的浅层网络更好(尽管并非在所有情况下)
- 这是惯例
就总运行时间而言,我不知道哪个会更好(考虑到您使用第二个选项使用的层数更少)。
【解决方案2】:
所以基本上考虑你的问题有三个重要因素:
-
计算复杂性和稳定性:计算您的函数(理论上)应该花费更多时间,因为至少需要另外两个操作。我认为在这种情况下这不是问题,但例如
sigmoid 的比较,您需要同时计算 exp 和除法比计算 relu 更昂贵 - 这是 relu 如此受欢迎的原因之一。此外 - 由于平方函数的发散速度非常快,sigmoid 的饱和度是众所周知的问题 - 您可能还会因梯度消失和计算上溢/下溢而遭受更严重的痛苦。
-
参数数量:在第二种方法中每个单元都有一个附加的设置参数。如果您的模型很小 - 这不是一个大问题 - 但只要神经网络用于真正的记忆和耗时的任务 - 这可能是第二次激活的一个巨大缺点。这也是为什么一个非常简单的函数更适合用于深度学习的部分原因。
-
表达能力 - 这是您的第二个功能真正可以提供帮助的地方。不仅因为
square 使您的功能更加复杂。这也是因为实际上您的函数是渐近的钟形,这可以使它更好地捕获本地依赖项。这可能是 sigmoid 和 relu 的一个巨大缺点,因为这两个函数都使每个单元都对您的预测产生全局影响,而 钟形 函数往往更倾向于局部兴趣区域之外的数据点的依赖关系。在实践中——通常这个问题是通过应用一个非常深和宽的拓扑来解决的——在一个巨大的数据集的情况下——通常是平衡单个单元的影响。