我试图创建一个用于回归的神经网络。为了测试这个概念,我通过以下方式创建了一个数据集:
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;
由于预测不准确,我想知道可以做些什么来提高回归性能。我试图改变隐藏层神经元数量和不同正则化参数值的组合,但性能不够好。
如果有人能描述回归问题的适当神经网络设计,我将非常感激——哪些激活函数最合适,以及如何诊断训练和测试错误以选择最佳隐藏单元数量。
