0

这是一个比较奇怪的问题。

A 有一个完美运行的反向传播代码,如下所示:

安BP

现在,当我进行批量学习时,即使它只涉及一个简单的标量函数逼近,我也会得到错误的结果。

训练后,网络为所有输入模式产生几乎相同的输出。

到目前为止,我已经尝试过:

  1. 引入偏差权重
  2. 尝试更新和不更新输入权重
  3. 改组批量学习中的模式
  4. 尝试在每个模式后更新并累积
  5. 以不同的可能方式初始化权重
  6. 仔细检查代码 10 次
  7. 按模式数量归一化累积更新
  8. 尝试了不同的层,神经元数量
  9. 尝试了不同的激活函数
  10. 尝试了不同的学习率
  11. 尝试了从 50 到 10000 的不同时期数
  12. 试图规范化数据

我注意到,在对一个模式进行大量反向传播之后,网络会为大量输入产生几乎相同的输出。

当我尝试逼近一个函数时,我总是得到一条线(几乎是一条线)。像这样:

ANN拟合

相关问题:神经网络总是为任何输入产生相同/相似的输出 而添加偏置神经元的建议并没有解决我的问题。

我发现了一个类似的帖子:

When ANNs have trouble learning they often just learn to output the
average output values, regardless of the inputs. I don't know if this 
is the case or why it would be happening with such a simple NN.

这足够详细地描述了我的情况。但是如何处理呢?

我得出的结论是,我遇到的情况是有权利的。真的,对于每个网络配置,一个人可能只是“切断”到输出层的所有连接。这确实是可能的,例如,通过将所有隐藏权重设置为接近零或将偏差设置为一些疯狂的值,以使隐藏层过饱和并使输出独立于输入。之后,我们可以自由地调整输出层,使其能够独立于输入再现输出。在批量学习中,发生的情况是梯度被平均化,网络只再现了目标的平均值。输入不扮演任何角色。

4

1 回答 1

1

我的回答不能完全准确,因为您还没有发布功能perceptron(...)和内容backpropagation(...)

但是从我的猜测来看,你在一个数据上训练你的网络多次,然后在一个循环中完全训练另一个for data in training_data,这导致你的网络只会记住最后一个。相反,尝试在每个数据上训练你的网络一次,然后再重复多次(反转嵌套循环的顺序)

换句话说,for I = 1:number of patterns循环应该在backpropagation(...)函数的循环内,所以这个函数应该包含两个循环。


示例(在 C# 中):

这是反向传播函数的一些部分,我在这里对其进行了简化。在每次更新权重和偏差时,整个网络都会“传播”。可在此 URL 找到以下代码:https ://visualstudiomagazine.com/articles/2015/04/01/back-propagation-using-c.aspx

public double[] Train(double[][] trainData, int maxEpochs, double learnRate, double momentum)
{
    //...
    Shuffle(sequence); // visit each training data in random order
    for (int ii = 0; ii < trainData.Length; ++ii)
    {
        //...
        ComputeOutputs(xValues); // copy xValues in, compute outputs 
        //...
        // Find new weights and biases
        // Update weights and biases
        //...
    } // each training item
}

也许不起作用的只是您想在此评论之后(Batch learn例如)用辅助for循环将所有内容附上以进行多个学习时期:

%--------------------------------------------------------------------------
%% Get all updates
于 2015-05-02T05:24:13.827 回答