在单层中具有多个激活函数类型的神经元是否有意义?

Does having multiple activation function type neurons in a single layer make sense?

我想知道是否存在任何情况或需要将具有不同激活函数的多种类型的神经元混合在一个层中,如果是这样,如何使用 tensorflow Estimator 框架实现它。

我能想到这样的配置可能有用的简单示例。
考虑尝试训练一个神经网络,该网络可以预测坐标值为 (x, y) 的任何给定 2D 点是否位于给定圆的内部或外部,该圆的中心和半径也定义在相同的 2D 简单space.

假设我们的圆心位于 (0.5, 0.5),半径定义为 0.5。
我们训练的策略可能是这样的:先随机生成很多点,然后判断每个点是在圆内还是圆外,这样我们就可以将这些随机生成的坐标集作为特征和结果inside/outside判断每一个作为其对应的标签。

通过验证下面的公式即可轻松判断:
(x-0.5)^2 + (y-0.5)^2 < r^2
这可以转换如下:
x^2 - x +y^2 - y + 0.5 < r^2

现在,看看最后一个公式,如果神经网络本身可以自动获得 x^2 和 y^2 等值,那么训练显然会变得有效,只需从其给出的特征值中获取 ( x, y). 为此,我想到了在标准 ReLU 神经元中混合以 f(x)=x^2 作为激活函数的神经元。

老实说,我已经使用 tensorflow Estimator 框架完成了这个问题的几个测试实现,并且在其中一个中我看到将 x^2 和 y^2 作为附加特征(总共 4 个特征值) 与 2 个特征的情况相比应该有助于有效的训练收敛,但使用 f(x)=x^2 激活函数的解决方案对我来说似乎更聪明。

这就是我在这里提出问题的方式。
希望我能听到任何意见。

谢谢。

特征工程(除了 x 之外还给 x^2 作为输入)仍然是解决许多领域中 ML 问题的很大一部分。我从来不喜欢通过对中间层应用不同的激活来进行特征工程的人。通常它总是作为输入的一部分完成 pre-processing.

如果你想尝试一下。我相信在 TensorFlow 中没有特别支持在一个层中具有多个激活函数。但是,您应该可以很容易地自己实现它。

这里是一个示例,以 round-robin 方式将不同的激活函数应用于沿第一维的张量的每个切片(对于第一维较大的张量非常慢)。您或许可以做一些更智能的切片。

def make_activator(activations):
    def activator(t):
        slices = tf.unstack(t)
        activated = []
        for s, act in zip(slices, itertools.cycle(activations)):
            activated.append(act(s))
        return tf.stack(activated)
    return activator

然后您可以在图层中像这样使用它:

tf.layers.dense(..., activation=make_activator([tf.nn.relu, tf.square]))

您也可以只添加 "parallel layers",每个都具有不同的激活,然后合并(例如求和)或连接它们的输出,然后再将其提供给下一层。