首先,神经网络是什么?人脑由几千亿由突触相互链接的细胞(神经元)组成。突触传入足够的兴奋就会引发神经元的兴奋。这个过程被称为“思考”。python
咱们能够在计算机上写一个神经网络来模拟这个过程。不须要在生物分子水平模拟人脑,只需模拟更高层级的规则。咱们使用矩阵(二维数据表格)这一数学工具,而且为了简单明了,只模拟一个有3个输入和一个输出的神经元。网络
咱们将训练神经元解决下面的问题。前四个例子被称做训练集。你可能发现了,输出老是等于输入中最左列的值。因此‘?’应该是1。app
可是如何使咱们的神经元回答正确呢?赋予每一个输入一个权重,能够是一个正的或负的数字。拥有较大正(或负)权重的输入将决定神经元的输出。首先设置每一个权重的初始值为一个随机数字,而后开始训练过程:dom
最终权重将会变为符合训练集的一个最优解。若是使用神经元考虑这种规律的一个新情形,它将会给出一个很棒的预测。函数
这个过程就是BP。工具
你可能会想,计算神经元输出的公式是什么?首先,计算神经元输入的加权和,即测试
接着使之规范化,结果在0,1之间。为此使用一个数学函数--Sigmoid函数:spa
Sigmoid函数的图形是一条“S”状的曲线。3d
把第一个方程代入第二个,计算神经元输出的最终公式为:code
咱们在训练时不断调整权重。可是怎么调整呢?可使用“Error Weighted Derivative”公式:
为何使用这个公式?首先,咱们想使调整和偏差的大小成比例。其次,乘以输入(0或1),若是输入是0,权重就不会调整。最后,乘以Sigmoid曲线的斜率(图4)。
Sigmoid曲线的斜率能够经过求导获得:
把第二个等式代入第一个等式里,获得调整权重的最终公式:
虽然咱们没有使用神经网络库,可是将导入Python数学库numpy里的4个方法。分别是:
“.T”方法用于矩阵转置(行变列)。因此,计算机这样存储数字:
我对每一行源代码都添加了注释来解释全部内容。注意在每次迭代时,咱们同时处理全部训练集数据。因此变量都是矩阵(二维数据表格)。下面是一个用Python写地完整的示例代码。
运行后你应该看到这样的结果:
咱们作到了!咱们用Python构建了一个简单的神经网络!
首先神经网络对本身赋予随机权重,而后使用训练集训练本身。接着,它考虑一种新的情形[1, 0, 0]而且预测了0.99993704。正确答案是1。很是接近!