Perceptron学会了始终只复制一种模式

时间:2015-04-30 17:01:28

标签: machine-learning neural-network backpropagation perceptron gradient-descent

这是一个奇怪的问题。

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

ANN BP

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

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

此刻我尝试过:

  1. 引入偏差量
  2. 尝试使用和不使用输入权重更新
  3. 在批量学习中改组模式
  4. 尝试在每个模式之后更新并累积
  5. 以不同方式初始化权重
  6. 仔细检查代码10次
  7. 按照模式数量标准化累积更新
  8. 尝试了不同的图层,神经元数
  9. 尝试了不同的激活功能
  10. 尝试不同的学习率
  11. 尝试了不同数量的纪元,从50到10000
  12. 尝试规范化数据
  13. 我注意到,在针对一种模式进行一系列反向传播后,网络为各种输入产生几乎相同的输出。

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

    ANN fit

    相关问题:Neural Network Always Produces Same/Similar Outputs for Any Input 并且添加偏见神经元的建议并没有解决我的问题。

    我发现了一个帖子:

    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.
    

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

    这是实际代码(在Matlab中):

    init_weights

    ANN_perc

    back_prop

    batch_learn

    test_case1

    test_case2

    我得出结论,我遇到的情况有权成为。实际上,对于每个网络配置,人们可能只是“切断”到输出层的所有连接。这实际上是可行的,例如,通过将所有隐藏权重设置为接近零或将偏差设置为某些疯狂值,以使过度饱和隐藏层并使输出独立于输入。之后,我们可以自由调整输出层,这样就可以独立于输入再现输出。在批量学习中,会发生的是梯度得到平均值,而净值只能再现目标的均值。输入不起任何作用。

1 个答案:

答案 0 :(得分:1)

我的回答不能完全准确,因为您尚未发布函数perceptron(...)backpropagation(...)的内容。

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

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

示例(在C#中):

以下是反向传播函数的一些部分,我在这里进行了简化。在权重和偏差的每次更新时,整个网络被“传播”。可以在以下网址找到以下代码: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