八度反向传播实现问题

Posted

技术标签:

【中文标题】八度反向传播实现问题【英文标题】:Octave backpropagation implementation issues 【发布时间】:2013-02-28 14:34:22 【问题描述】:

我编写了一个代码来实现我遇到的问题的最速下降反向传播。我正在使用Machine CPU dataset 并将输入和输出缩放到范围 [0 1]

matlab/octave中的代码如下:

最速下降反向传播

%SGD = Steepest Gradient Decent

function weights = nnSGDTrain (X, y, nhid_units, gamma, max_epoch, X_test, y_test)

  iput_units = columns (X);
  oput_units = columns (y);
  n = rows (X);

  W2 = rand (nhid_units + 1, oput_units);
  W1 = rand (iput_units + 1, nhid_units);

  train_rmse = zeros (1, max_epoch);
  test_rmse  = zeros (1, max_epoch);

  for (epoch = 1:max_epoch)

    delW2 = zeros (nhid_units + 1, oput_units)'; 
    delW1 = zeros (iput_units + 1, nhid_units)';

    for (i = 1:rows(X))

      o1 = sigmoid ([X(i,:), 1] * W1); %1xn+1 * n+1xk = 1xk
      o2 = sigmoid ([o1, 1] * W2); %1xk+1 * k+1xm = 1xm

      D2 = o2 .* (1 - o2);
      D1 = o1 .* (1 - o1);
      e = (y_test(i,:) - o2)';

      delta2 = diag (D2) * e; %mxm * mx1 = mx1
      delta1 = diag (D1) * W2(1:(end-1),:) * delta2;  %kxm * mx1 = kx1

      delW2 = delW2 + (delta2 * [o1 1]); %mx1 * 1xk+1 = mxk+1  %already transposed
      delW1 = delW1 + (delta1 * [X(i, :) 1]); %kx1 * 1xn+1 = k*n+1  %already transposed

    end

    delW2 = gamma .* delW2 ./ n;
    delW1 = gamma .* delW1 ./ n;

    W2 = W2 + delW2';
    W1 = W1 + delW1';

    [dummy train_rmse(epoch)] = nnPredict (X, y, nhid_units, [W1(:);W2(:)]);
    [dummy test_rmse(epoch)] = nnPredict (X_test, y_test, nhid_units, [W1(:);W2(:)]);
    printf ('Epoch: %d\tTrain Error: %f\tTest Error: %f\n', epoch, train_rmse(epoch), test_rmse(epoch));
    fflush (stdout);

  end

  weights = [W1(:);W2(:)];
%    plot (1:max_epoch, test_rmse, 1);
%    hold on;
  plot (1:max_epoch, train_rmse(1:end), 2);
%    hold off;
end

预测

%Now SFNN Only

function [o1 rmse] = nnPredict (X, y, nhid_units, weights)

  iput_units = columns (X);
  oput_units = columns (y);
  n = rows (X);

  W1 = reshape (weights(1:((iput_units + 1) * nhid_units),1), iput_units + 1, nhid_units);
  W2 = reshape (weights((((iput_units + 1) * nhid_units) + 1):end,1), nhid_units + 1, oput_units);

  o1 = sigmoid ([X ones(n,1)] * W1); %nxiput_units+1 * iput_units+1xnhid_units = nxnhid_units
  o2 = sigmoid ([o1 ones(n,1)] * W2); %nxnhid_units+1 * nhid_units+1xoput_units = nxoput_units

  rmse = RMSE (y, o2);
end

RMSE 函数

function rmse = RMSE (a1, a2)
  rmse = sqrt (sum (sum ((a1 - a2).^2))/rows(a1));
end

我还使用 R RSNNS 包 mlp 训练了相同的数据集,训练集(前 100 个示例)的 RMSE 约为 0.03 。但在我的实现中,我无法达到低于 0.14 的 RMSE。有时错误会随着更高的学习率而增长,并且没有任何学习率能让我的 RMSE 低于 0.14。另外我参考的一篇论文报告说,火车组的 RMSE 约为 0.03

我想知道代码的问题在哪里。我已关注 Raul Rojas 的书,并确认一切正常。

【问题讨论】:

【参考方案1】:

在反向传播代码中

  e = (y_test(i,:) - o2)';

不正确,因为o2 是训练集的输出,我发现与测试集y_test 的一个示例不同。该行应如下所示:

  e = (y(i,:) - o2)';

它正确地找到了当前模型的预测输出与对应示例的目标输出之间的差异。

我花了 3 天时间才找到这个,我很幸运找到了这个阻止我进行进一步修改的该死的错误。

【讨论】:

为您的神经网络实现 SGD 干杯。很高兴有一些东西可以参考……还有一些我可以用来标记为重复的东西。 @rayryeng ,请确保在使用之前进行更正,如本答案所示。

以上是关于八度反向传播实现问题的主要内容,如果未能解决你的问题,请参考以下文章

神经网络入门——16实现一个反向传播

实现一个反向传播人工神经网络

读懂反向传播算法(bp算法)

如何从头开始调试反向传播实现?

一步一步教你反向传播的样例

LSTM 反向传播梯度检查的问题