如何在回归神经网络中选择激活函数?

机器算法验证 回归 机器学习 神经网络
2022-03-22 13:55:22

关于将前馈神经网络应用于回归的一些基础知识,我遇到了困难。具体来说,假设我有一个输入变量xR4以及从未知函数生成的数据

f(x)=c1x12+c2x2x3+c3x4
我的目标是学习f从样品(x,y). 我应该如何选择网络的层?我在这里读到,大多数网络都可以使用单个非线性隐藏层。但是我应该在那个层使用哪个激活函数?我尝试了整流器和 sigmoid,但都没有给出有希望的结果。

当我选择常量时|c1|,|c2||c3|, st 的值f(x)主要由线性相关决定x4,而不是从没有隐藏层的线性网络中获得令人满意的结果:

合身

但是作为|c1||c2|增长,预测误差变大,我认为原因是线性层无法捕获数据中的非线性:

半合身

不合适

1个回答

好吧,我仍然对以下方面的指南经验法则感兴趣:n样品(x,y),如何选择回归神经网络的隐藏层?欢迎提出建议、评论和回答!

不过,在我的问题中,我陈述了一种特殊情况。尽管具有示范性质,但我认为应该从以下角度来处理隐藏层的选择:关系中的非线性xy可以通过两个概念的组合来捕捉:

  1. 单变量多项式(例如wmxm++w0x0)
  2. 特征的“和”连接(如xixk)

让我放下两个旁注:

  1. 是的,这两个概念的组合称为多元多项式,但为了简单起见,我不想在这里处理它们。
  2. 我认为,这是一个合理的问题:我们如何真正知道这两个概念涉及未知机制,它产生yx? 好吧,我们不知道。但我们可以猜测也许 kernel-PCA 会告诉我们。

总之,我实现了“和”层和多项式层。我正在使用Lasagne框架以及scikit-neuralnetwork

执行

多项式层每个输入特征(即前一层的神经元)映射到m+1自己的神经元。这些神经元是wmxm++w0x0.

class PolynomialLayer(lasagne.layers.Layer):
    def __init__(self, incoming, deg, **kwargs):
        super(PolynomialLayer, self).__init__(incoming, **kwargs)
        self.deg = deg

    def get_output_for(self, input, **kwargs):
        monomials = [input ** i for i in range(self.deg + 1)]
        return T.concatenate(monomials, axis=1)

    def get_output_shape_for(self, input_shape):
        return (input_shape[0], input_shape[1] * (self.deg + 1))

和”层将前一层的所有不同的、无序的特征对连接到神经元中,并重复该层的每个特征。

class AndLayer(lasagne.layers.Layer):
    def __init__(self, incoming, **kwargs):
        super(AndLayer, self).__init__(incoming, **kwargs)

    def get_output_for(self, input, **kwargs):
        results = [input]
        for i in range(self.input_shape[1]):
            for k in range(i + 1, self.input_shape[1]):
                results.append((input[:, i] * input[:, k]).dimshuffle((0, 'x')))
        return T.concatenate(results, axis=1)

    def get_output_shape_for(self, input_shape):
        return (input_shape[0], ((input_shape[1] ** 2) + input_shape[1]) / 2)

评估

另一个问题出现了:两个隐藏层应该按什么顺序排列?

第一个网络

这是网络布局:

 input layer | polyn. layer | "and" layer
-------------|--------------|-------------
  4 neurons  |  12 neurons  |  78 neurons

这是压倒性的结果:

第一个网络

使用的学习算法是随机梯度下降(SGD),学习率为2103. SGD 算法是框架的默认值。

第二网络

我们交换隐藏层的替代网络布局如下所示:

 input layer | "and" layer | polyn. layer
-------------|-------------|--------------
  4 neurons  |  14 neurons |  42 neurons

使用与以前相同的学习率,此布局的训练失败并导致均方根(RMS) 误差约为8.3109. 将学习率降低到1103,至少 SGD 算法正确收敛:

第二网络

但是,RMS 误差比第一个布局要高得多。这表明,尽管它在神经元数量方面的复杂性较低,但第二种布局在某种程度上对学习率参数更敏感。我仍然想知道,这是从哪里来的:非常欢迎解释!可能与反向传播的性质有关吗?