【发布时间】: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