【问题标题】:Neural Net backpropagation doesn't work properly神经网络反向传播无法正常工作
【发布时间】:2013-12-17 06:21:09
【问题描述】:

最近我实现了自己的神经网络(使用不同的指南,但主要来自 here),以备将来使用(我打算将其用于我将开发的 OCR 程序)。目前我正在测试它,我遇到了这个奇怪的问题。

每当我给我的网络一个训练示例时,算法都会改变权重,从而产生所需的输出。然而,在几个训练示例之后,权重变得混乱——使得网络在某些输出上运行良好,而在其他输出上却​​出错(即使我输入训练示例的输入,完全一样)。

如果有人指导我解决这个问题,我将不胜感激,如果他们看到了。 下面是计算神经元误差和权重调整的方法-

    private static void UpdateOutputLayerDelta(NeuralNetwork Network, List<double> ExpectedOutputs)
    {
        for (int i = 0; i < Network.OutputLayer.Neurons.Count; i++)
        {
            double NeuronOutput = Network.OutputLayer.Neurons[i].Output;
            Network.OutputLayer.Neurons[i].ErrorFactor = ExpectedOutputs[i]-NeuronOutput; //calculating the error factor
            Network.OutputLayer.Neurons[i].Delta = NeuronOutput * (1 - NeuronOutput) * Network.OutputLayer.Neurons[i].ErrorFactor; //calculating the neuron's delta
        }
    }

    //step 3 method
    private static void UpdateNetworkDelta(NeuralNetwork Network)
    {
        NeuronLayer UpperLayer = Network.OutputLayer;
        for (int i = Network.HiddenLayers.Count - 1; i >= 0; i--)
        {
            foreach (Neuron LowerLayerNeuron in Network.HiddenLayers[i].Neurons)
            {
                for (int j = 0; j < UpperLayer.Neurons.Count; j++)
                {
                    Neuron UpperLayerNeuron = UpperLayer.Neurons[j];
                    LowerLayerNeuron.ErrorFactor += UpperLayerNeuron.Delta * UpperLayerNeuron.Weights[j + 1]/*+1 because of bias*/;
                }
                LowerLayerNeuron.Delta = LowerLayerNeuron.Output * (1 - LowerLayerNeuron.Output) * LowerLayerNeuron.ErrorFactor;
            }
            UpperLayer = Network.HiddenLayers[i];
        }
    }

    //step 4 method
    private static void AdjustWeights(NeuralNetwork Network, List<double> NetworkInputs)
    {
        //Adjusting the weights of the hidden layers
        List<double> LowerLayerOutputs = new List<double>(NetworkInputs);
        for (int i = 0; i < Network.HiddenLayers.Count; i++)
        {
            foreach (Neuron UpperLayerNeuron in Network.HiddenLayers[i].Neurons)
            {
                UpperLayerNeuron.Weights[0] += -LearningRate * UpperLayerNeuron.Delta;
                for (int j = 1; j < UpperLayerNeuron.Weights.Count; j++)
                    UpperLayerNeuron.Weights[j] += -LearningRate * UpperLayerNeuron.Delta * LowerLayerOutputs[j - 1] /*-1 because of bias*/;
            }
            LowerLayerOutputs = Network.HiddenLayers[i].GetLayerOutputs();
        }

        //Adjusting the weight of the output layer
        foreach (Neuron OutputNeuron in Network.OutputLayer.Neurons)
        {
            OutputNeuron.Weights[0] += -LearningRate * OutputNeuron.Delta * 1; //updating the bias - TODO: change this if the bias is also changed throughout the program
            for (int j = 1; j < OutputNeuron.Weights.Count; j++)
                OutputNeuron.Weights[j] += -LearningRate * OutputNeuron.Delta * LowerLayerOutputs[j - 1];
        }
    }

学习率为0.5,神经元的激活函数为sigmoid函数。

编辑:我注意到我从未实现过计算总体误差的函数:每个训练示例的 E=0.5 * Sum(t-y)。这可能是问题吗?如果是这样,我应该如何解决?

【问题讨论】:

    标签: c# neural-network backpropagation


    【解决方案1】:

    0.5 的学习率似乎有点太大了。通常使用更接近0.010.1 的值。此外,如果训练模式以随机顺序呈现,通常有助于收敛。更多有用的提示可以在这里找到:Neural Network FAQ (comp.ai.neural archive)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-03
      • 2012-02-21
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 2013-04-26
      相关资源
      最近更新 更多