2014-04-07 36 views
1

我刚开始学习神经网络,看看它们是否对我有用。带有1个隐藏层的神经网络无法学习棋盘功能?

我下载这个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) 

回答

0

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

特别是,如果你有N个隐藏节点,其中N是训练样本数则总是能够完全了解你的训练集(它可以简单地记住所有输入putput对)。

然而有没有保证关于这些对象的普遍化,既没有对小型网络的学习保证。神经网络不是“普遍的答案”,它们很难正确处理。

再回到你的问题,你的功能是相当琐碎,没有上述顾虑有应用在这里,这样的功能可以通过非常基本的网络很容易地学习。它看起来像以下两个方面一个是问题:

  • 执行错误
  • 在神经元(和/或偏差项)
+0

1)你的意思是什么缺乏正确的激活功能“缺乏正确的激活功能“?激活函数总是一些S形(1 /(1-exp(x)),tanh(x)),它们看起来都非常相似。我使用哪个sigmoid有什么关系? 2)在代码中http://code.activestate.com/recipes/578148-simple-back-propagation-neural-network-in-python-s/是隐藏层上的偏置项(如果我理解正确)。通用逼近定理是否足够?或者我必须但也偏向输入和/或输出层? –

+0

1. Sim are就够了。是的,对隐藏层的偏见就足够了。这导致了实施问题 – lejlot