背景
几年来我一直对神经网络感兴趣并阅读它们,但直到最近我才开始测试它们。
为了好玩和增加我的理解,我尝试在 .Net 中从头开始编写一个类库。对于测试,我尝试了一些简单的函数,例如生成与输入相同的输出,使用 MNIST 数据集,以及一些二进制函数(两个输入 OR、AND 和 XOR,有两个输出:一个为真,一个为错误的)。
当我使用sigmoid函数作为激活函数时,一切似乎都很好,但是,在阅读了 ReLUs 之后,我决定切换到速度。
问题
我目前的问题是,当我切换到使用 ReLU 时,我发现我无法训练任何复杂的网络(从 2 个内部节点到 100x100 节点的网格进行测试)以正确地用作 XOR 门.
我在这里看到两种可能性:
我的实现是错误的。(这很令人沮丧,因为我已经以各种方式多次重写了代码,但我仍然得到相同的结果)。
除了训练更快或更慢之外,在给定特定激活函数的情况下,还有一些问题是无法解决的。(有趣的想法,但我不知道这是不是真的)。
我倾向于认为上面的 1) 是正确的。但是,考虑到我投入的时间量,如果我能在我花更多时间进行实施之前明确排除 2),那就太好了。
更多细节
对于 XOR 网络,我尝试使用两个输入(0 表示假,1 表示真)和使用四个输入(每一对,一个信号真,一个假,每个“位”输入)。我还尝试使用 1 个输出(其中 1(实际上,>0.9)对应于真,0(或 <0.1)对应于假),以及两个输出(一个表示真,另一个表示假)。
每个训练时期,我针对一组 4 个输入运行.
我发现前三个收敛到正确答案,但最终输入 (11) 收敛到 1,即使我用期望值 0 训练它。