神经网络回归

机器算法验证 回归 多重回归 神经网络
2022-03-27 06:11:19

我试图创建一个用于回归的神经网络。为了测试这个概念,我通过以下方式创建了一个数据集:

x1 = random('Normal',0,5,500,1);
x2 = random('Normal',0,5,500,1);
y = x1 + 2*x2;
X = [x1 x2];

所以 x1 和 x2 是均值为 0,标准差为 5 的随机数向量。

因此,神经网络有 2 个输入,隐藏层中的 2 或 3 个单元和一个输出单元。在隐藏层单元中,我实现了 sigmoid 激活函数和输出层线性函数:

h(y) = 1*k20 + a1*k21+ a2*k22 + a3*k23

对于隐藏层的输出,计算方式如下:

a1 = sigmoid(1*k10 + x1*k11 + x2*k12)
(and similarly a2 = sigmoid(1*l10 + x1*l11 + x2*l12)

编辑:反向传播算法的实现方式如下:

Delta_1=0;
Delta_2=0;

for t=1:m
    currentSampleSize = sampleSize(t,:);
    for i = 1 : currentSampleSize
        % Step 1
        a_1 = X(t,:)';
        z_2 = Theta1*a_1;
        a_2 = sigmoid(z_2);
        a_2 = [1; a_2];
        z_3 = Theta2*a_2;
        a_3 = z_3;

        % Step 2
        delta_3 = (a_3 - y_new(t,:)');

        % Step 3
        grad = m^(-1) * X' * (a_3-y);
        delta_2 = Theta2'*delta_3.*[1;sigmoidGradient(z_2)];
        delta_2 = delta_2(2:end);

        %Step 4
        Delta_2 = Delta_2 + delta_3*a_2';
        Delta_1 = Delta_1 + delta_2*a_1';
    end
end

Theta1_grad = Delta_1/m;
Theta2_grad = Delta_2/m;

reg_1 = lambda/m.*Theta1(:,2:end);
reg_2 = lambda/m.*Theta2(:,2:end);

Theta1_grad(:,2:end) = Theta1_grad(:,2:end) + reg_1;
Theta2_grad(:,2:end) = Theta2_grad(:,2:end) + reg_2;

由于预测不准确,我想知道可以做些什么来提高回归性能。我试图改变隐藏层神经元数量和不同正则化参数值的组合,但性能不够好。

如果有人能描述回归问题的适当神经网络设计,我将非常感激——哪些激活函数最合适,以及如何诊断训练和测试错误以选择最佳隐藏单元数量。

2个回答

除非您限制输入的范围,否则 sigmoid 可能会给您带来问题。您甚至无法学习该功能y=x如果你在中间有一个 sigmoid。

如果您的范围有限,则输入隐藏的权重可以缩放输入值,以便它们在图形的部分命中 sigmoid,该部分看起来像一条线,即 0 附近的部分:

带圆圈的线性部分的 Sigmoid

一旦你有了线性行为,隐藏的输出权重就可以重新缩放这些值。训练过程将为您处理所有这些 - 但要测试这个假设,您可以使用输入值进行训练(和验证)[1,1].

你知道网络的功能是什么样的吗?如果你绘制(x1,x2)y,它看起来像飞机吗?至少部分?

您还可以尝试使用更多数据进行训练,并查看图表是否更接近x1+2x2.

假设您自己编写了实现,您的反向传播算法中可能只是有一个错误。一些错误可能非常微妙,并且使算法部分工作而性能不佳。您可以尝试在您的实现中添加一些梯度检查代码来验证计算的梯度。这是 Andrew Ng 关于如何做到这一点的精彩视频:

http://www.youtube.com/watch?v=12a9fsLyFes

请注意,我假设您在训练集而不是测试集上表现不佳。您应该能够在训练集上获得近乎完美的结果,此时您的实现可能是正确的,您可以通过添加正则化等方式开始处理过度拟合。我会禁用正则化,直到达到这一点。

附带说明一下,由于您的数据集在输入和输出之间具有线性关系,因此您可能会在没有隐藏神经元(即单层感知器)的情况下获得更好的结果,但是 MLP 也应该可以工作,而且您然后可以在非线性数据集上对其进行测试。