【问题标题】:Backpropagation for a simple neural network giving unusual results简单神经网络的反向传播给出不寻常的结果
【发布时间】:2016-07-29 08:23:03
【问题描述】:

几天前,我尝试将我今年在人工智能讲座中学到的关于神经网络的知识付诸实践。我试着做一个简单的,只有 2 个神经元,可以复制它的输入信号。这是网络的小图,我的计算:http://imgur.com/a/RixAH(对不起法语的 cmets,它们并不重要)

奇怪的是它确实收敛了,但是对于一个简单的二进制输入信号,当信号为 0 时,网络有效地发送 ~0,但是当它为 1 时,它发送 ~0.5,我不明白为什么.另外,我必须将学习率设置得相当高(~100)才能让它工作,我也不知道为什么。

这是我用来测试网络的java代码:

public class Main
{
    final static double R = 100;

public static void main(String[] args)
{
    double w1 = Math.random(), w2 = Math.random();

    for (int iter = 1; iter <= 100; iter++)
    {
        int x;

        if (Math.random() >= 0.5)
        {
            x = 1;
        }
        else
        {
            x = 0;
        }

        double p1 = x * w1;
        double y = 1 / (1 + Math.exp(-p1));

        double p2 = y * w2;
        double z = 1 / (1 + Math.exp(-p2));

        double P = -0.5 * Math.pow(x - z, 2);

        double dP1 = (x - z) * z * (1 - z) * w2 * y * (1 - y) * x;
        double dP2 = (x - z) * z * (1 - z) * y;

        w1 += R * dP1;
        w2 += R * dP2;

        System.out.println("x = " + x + ", z = " + z + ", P = " + P);
    }
}

}

你知道问题出在哪里吗?

谢谢。

LeChocdesGitans

编辑:

我终于设法让它工作了(我听从了你对网络配置的建议)。估计还有一个实现错误,因为我改变网络布局后并没有直接起作用,但是我从头再来,现在我可以做一些很有趣的事情,比如字符识别,效果很好,与我的应用程序的基本程度相比。

再次感谢您的建议!

【问题讨论】:

  • 我很好奇,你为什么选择使用两层,每层一个神经元?
  • 好吧,因为我在机器学习方面没有太多经验,所以我只是使用了我在麻省理工学院的一个关于神经网络的视频中看到的设置。你认为什么是最好的?
  • 一个具有两个感知器的层的设置作为玩具示例更具功能性和“现实性”。
  • 好的,我有空就试试,看看有什么不同。感谢您的建议!
  • 这与您的问题没有直接关系(不幸的是,我目前无法测试),但最好尝试模拟现实示例,而您使用的不是。从一个可以在纸上验证然后扩展的玩具示例开始也是非常有用的。例如,我建议实现经典的 x-or 分类任务:mind.ilstu.edu/curriculum/artificial_neural_net/…

标签: machine-learning neural-network backpropagation


【解决方案1】:

正如 rpd 所说,您的主要问题是您正在训练两个连续的层。从数学上讲,这意味着应用于节点 1 的所有校正都必须通过节点 2 过滤。是的,您可以应用链式规则、贝叶斯定理或其他等效过滤,但这总是存在实现错误的风险。

从您描述的效果来看,您几乎可以肯定在您的实施中存在错误。最大的线索是你必须将你的学习率提高到任何合理的值以上才能获得勉强可以接受的结果。请记住,这是识别小步的比例因子。值 100 表示您正在对正确调整进行最佳当前估计,然后再进行 100 次。如果您的算法的其余部分是正确的,则超过 1.0 的学习率是有意尝试在没有收敛的情况下剧烈振荡。

如果您已跟踪中间值,请发布更新顺序;如果没有,那么你应该使用那个调试步骤。

但是,您应该首先将隐藏的神经元并联,而不是串联。一方面,函数的卷积只是浪费步骤。另一方面,应通过相同的过程(并行)更新权重。结果应该收敛于不同的权重,这些权重很容易归一化为 1.0(例如,通过 SoftMax 操作)。单层反向传播是一种低阶计算:使用简单的线性过程(欧拉方法)调试过程,然后再尝试使用您设置的三次(或更差)误差函数更快地收敛。


我对您的笔记和算法进行了一些研究,并获得了一些观察结果。

  • 您在笔记的第一行删除了一个负号:如果 P(x, z) = -1/2 (x-z)^2,则导数为 -(x-z) 或 z-x。在算法中进行这种更改在一定程度上有助于收敛。

  • 串联神经元的卷积一般是有缺陷的;这可以简单地简化为具有单个隐藏神经元的模型。

【讨论】:

    猜你喜欢
    • 2016-08-17
    • 2018-05-17
    • 2017-08-13
    • 2015-03-03
    • 2012-02-21
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多