【问题标题】:Neural network with 1 hidden layer cannot learn checkerboard function?具有 1 个隐藏层的神经网络无法学习棋盘功能?
【发布时间】:2014-04-07 08:10:21
【问题描述】:

我刚刚开始学习神经网络,看看它们是否对我有用。

我下载了这个simple python code of 3 layer feed forward neural network

我刚刚将学习模式修改为棋盘格而不是 XOR,并且隐藏层中的节点数为 10。如果我理解 universal approximation theorem 这个 3 层网络(一个隐藏层)应该能够从 R2 学习任何功能到R包括我的棋盘功能。 ...但事实并非如此。

怎么了?

  • 我理解通用逼近定理是错误的 - 也许函数应该是单调的或凸的? (该区域应该是线性可分的?)。
  • 我需要一个其他层(2 个隐藏层)来近似这种非对流、非线性可分函数?
  • 网络只是陷入了某个局部最小值? (但我不这么认为?我试了几次,初始权重是随机的,但结果是一样的)
  • 隐藏层10个节点不够用?我尝试了不同的数字 - 5 几乎相同。 30 则没有

是否有任何通用方法可以修改优化(学习)方案以确保收敛到任何可以根据通用逼近定理在理论上由给定网络描述的函数?

是否有任何通用测试可以告诉我,如果我的网络(具有给定的拓扑、层数和节点数)能够描述给定的功能,是否只是被困在某个局部最小值中?

这是隐藏层有 10 个神经元的结果:

 train it with some patterns 
error 3.14902
error 1.37104
error 1.35305
error 1.30453
error 1.28329
error 1.27599
error 1.27275
error 1.27108
error 1.27014
error 1.26957
 test it 
([0.0, 0.0], '->', [0.019645293674000152])
([0.0, 0.5], '->', [0.5981006916165954])
([0.0, 1.0], '->', [0.5673621981298169])
([0.5, 0.0], '->', [0.5801274708105488])
([0.5, 0.5], '->', [0.5475774428347904])
([0.5, 1.0], '->', [0.5054692523873793])
([1.0, 0.0], '->', [0.5269586801603834])
([1.0, 0.5], '->', [0.48368767897171666])
([1.0, 1.0], '->', [0.43916379836698244])

这是测试运行的定义(只是我修改的部分代码):

def demo():
    # Teach network checkerboard function
    pat = [
        [ [0.0,0.0], [0.0] ],
        [ [0.0,0.5], [1.0] ],
        [ [0.0,1.0], [0.0] ],

        [ [0.5,0.0], [1.0] ],
        [ [0.5,0.5], [0.0] ],
        [ [0.5,1.0], [1.0] ],

        [ [1.0,0.0], [0.0] ],
        [ [1.0,0.5], [1.0] ],
        [ [1.0,1.0], [0.0] ]
        ]

    # create a network with two input, 10 hidden, and one output nodes
    n = NN(2, 10, 1)
    print " train it with some patterns "
    n.train(pat)
    print " test it "
    n.test(pat)

【问题讨论】:

    标签: python neural-network backpropagation feed-forward


    【解决方案1】:

    通用逼近定理表明任何连续函数都可以用一个隐藏层任意逼近。它不需要任何类型的数据可分离性,我们谈论的是任意函数。

    特别是,如果您有 N 个隐藏节点,其中 N 是训练样本的数量,那么始终可以完美地学习您的训练集(它可以简单地记住所有输入-输入对)。

    然而,没有保证此类对象的泛化,也没有关于较小网络的学习保证。神经网络不是“通用答案”,它们很难正确处理。

    回到你的问题,你的功能很简单,上面的问题在这里都没有应用,这样的功能可以通过非常基本的网络轻松学习。问题似乎是以下两个方面之一:

    • 实现错误
    • 神经元中缺乏正确的激活函数(和/或偏置项)

    【讨论】:

    • 1) “缺乏正确的激活函数”是什么意思?激活函数总是一些看起来非常相似的 sigmoids ( 1/(1-exp(x)), tanh(x) )。我使用哪个 sigmoid 有关系吗? 2)在代码code.activestate.com/recipes/… 中是隐藏层上的偏差项(如果我理解正确的话)。通用逼近定理是否足够?还是我必须将术语也偏向输入和/或输出层?
    • 1. Simgoids就足够了。 2. 是的,隐藏层的偏差就足够了。这就导致了实现问题
    猜你喜欢
    • 2021-08-12
    • 2016-04-15
    • 2016-05-25
    • 2014-07-24
    • 2012-07-04
    • 2020-01-16
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多