机器人编程让程序员再次火热,身价也水涨船高。
首先我们来测试一下,可以发现调整训练集之后,输出的结果虽然有变化,但仍然是一个非常接近1的数。
运行完整代码看看具体的权重值,可见第三列的权重值极小接近于0,而第一、二列的权重值绝对值相当。所以我们的这个单细胞神经网络,并没有“学会”期望的逻辑关系。
这是因为,“第一列与第三列同时为1->1,否则->0”是一个非线性关系。与上一篇的“输入=第一列”不同,后者是高度线性的(不能再线性了)。要解决更复杂的非线性问题,就需要把多个神经元连接起来,真正形成“网络”。
在Milo的原文中,他也提出了一个非常类似的问题,就是“异或”。进群:960410445 即可获取教程合集
机器人编程让程序员再次火热,身价也水涨船高。
首先我们来测试一下,可以发现调整训练集之后,输出的结果虽然有变化,但仍然是一个非常接近1的数。
运行完整代码看看具体的权重值,可见第三列的权重值极小接近于0,而第一、二列的权重值绝对值相当。所以我们的这个单细胞神经网络,并没有“学会”期望的逻辑关系。
这是因为,“第一列与第三列同时为1->1,否则->0”是一个非线性关系。与上一篇的“输入=第一列”不同,后者是高度线性的(不能再线性了)。要解决更复杂的非线性问题,就需要把多个神经元连接起来,真正形成“网络”。
在Milo的原文中,他也提出了一个非常类似的问题,就是“异或”。
正文
下表的?处应该是什么?
训练集与新形势
经过观察可以发现,第三列是无关的,而前两列成“异或”关系——相等为0,相异为1。所以正确答案应为0。
对于单个神经元来说,这样的线性关系太复杂了,输入-输出之间没有一对一的映射关系。所以我们必须加入一个含4个神经元的隐藏层(Layer 1),这一层使得神经网络能够思考输入的组合问题。
蓝线代表神经突触,图来自https://github.com/miloharper/visualise-neural-network
由图可见,Layer 1的输出给了Layer 2,如此神经网络就可以学习Layer 1的输出和训练集的输出之间的关系。在学习过程中,这些关系会随着两层的权重调整而加强。
实际上,图像识别的原理就很相似。一个像素点和苹果之间并没有直接关系,但是像素点组合起来,就和苹果发生了关系。
往神经网络中加更多的层,使其思考状态组合,这就是“深度学习”。首先放出代码,之后我会进一步详解。
jinqun:960410445
两层神经网络
运行
跟上一版代码最大的不同在于,这次有多层。当神经网络计算第二层的误差时,这个误差会被反向传播回第一层,并影响权重值的调整。这就是反向传播算法(Back Propagation)。
点击运行键,观察输出结果,这次的输出会比较多,主要看最后的预测结果。我们得到了0.0078876,这与正确答案0非常接近了。
虽然看起来很轻松,其实计算机在背后执行了大量的矩阵运算,而且这个过程不是很容易可视化。在下一篇文章中,我将把我们的神经网络的神经元和突触都做个可视化,让我们看看她究竟是如何思考的。
后记
现在我们已经有了一个可以思考非线性关系的神经网络,那么回到开头的那个问题,能否识别出“第一列与第三列同时为1->1,否则->0”的关系呢?
请将相应的代码替换为:
新训练集
training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1],[1,1,0],[0,1,0],[0,0,0]])
training_set_outputs = array([[0, 1, 1, 0,0,0,0]]).T
同时也不要忘记调整
hidden_state, output = neural_network.think(array([1, 1, 0]))
里的测试样本(array([1,1,0]))。重新点击运行,观察我们现在的神经网络能否解决问题
正文
下表的?处应该是什么?
训练集与新形势
经过观察可以发现,第三列是无关的,而前两列成“异或”关系——相等为0,相异为1。所以正确答案应为0。
对于单个神经元来说,这样的线性关系太复杂了,输入-输出之间没有一对一的映射关系。所以我们必须加入一个含4个神经元的隐藏层(Layer 1),这一层使得神经网络能够思考输入的组合问题。
蓝线代表神经突触,图来自https://github.com/miloharper/visualise-neural-network
由图可见,Layer 1的输出给了Layer 2,如此神经网络就可以学习Layer 1的输出和训练集的输出之间的关系。在学习过程中,这些关系会随着两层的权重调整而加强。
实际上,图像识别的原理就很相似。一个像素点和苹果之间并没有直接关系,但是像素点组合起来,就和苹果发生了关系。
往神经网络中加更多的层,使其思考状态组合,这就是“深度学习”。首先放出代码,之后我会进一步详解。
jinqun:960410445
两层神经网络
运行
跟上一版代码最大的不同在于,这次有多层。当神经网络计算第二层的误差时,这个误差会被反向传播回第一层,并影响权重值的调整。这就是反向传播算法(Back Propagation)。
点击运行键,观察输出结果,这次的输出会比较多,主要看最后的预测结果。我们得到了0.0078876,这与正确答案0非常接近了。
虽然看起来很轻松,其实计算机在背后执行了大量的矩阵运算,而且这个过程不是很容易可视化。在下一篇文章中,我将把我们的神经网络的神经元和突触都做个可视化,让我们看看她究竟是如何思考的。
后记
现在我们已经有了一个可以思考非线性关系的神经网络,那么回到开头的那个问题,能否识别出“第一列与第三列同时为1->1,否则->0”的关系呢?
请将相应的代码替换为:
新训练集
training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1],[1,1,0],[0,1,0],[0,0,0]])
training_set_outputs = array([[0, 1, 1, 0,0,0,0]]).T
同时也不要忘记调整
hidden_state, output = neural_network.think(array([1, 1, 0]))
里的测试样本(array([1,1,0]))。重新点击运行,观察我们现在的神经网络能否解决问题
网友评论