如何用9行Python代码编写一个简易神经网络
学习工智能时,我给自己定了一个目标--用Python写一个简单的神经网络。 为了确保真得理解它,我要求自己不使用任何神经网络库,从写起。 多亏了AndrewTrask写得一篇精彩的博客,我做到了!下面贴出那九行代码:
在这篇文章中,我将解释我是如何做得,以便你可以写出你自己的。 我将会提供一个点的但是更完美的源代码。
首先,神经网络是什么?脑由几千亿由突触相互连接的细胞(神经元)组成。 突触传入足够的兴奋就会引起神经元的兴奋。 这个过程称为“思考”。
我们可以在计算机上写一个神经网络来模拟这个过程。 不需要在生物分子水平模拟脑,只需模拟更高层级的规则。 我们使用矩阵(二维数据表格)这一数学工具,并且为了简单明了,只模拟一个有3个输入和一个输出的神经元。
我们将训练神经元解决下面的问题。 前四个例子称作训练集。 你规律了吗?‘?’是0还是1?
你可能了,输出总是等于输入中最左列的值。 所以‘?’应该是1。
训练过程
但是如何使我们的神经元回答正确呢?赋予每个输入一个权重,可以是一个正的或负的数字。 拥有较大正(或负)权重的输入将决定神经元的输出。 首先设置每个权重的初始值为一个随机数字,然后开始训练过程:
取一个训练样本的输入,使用权重调整它们,通过一个特殊的公式计算神经元的输出。
计算误差,即神经元的输出与训练样本中的期待输出之间的差值。
根据误差略微地调整权重。
重复这个过程1万次。
最终权重将会变为符合训练集的一个最优解。 如果使用神经元考虑这种规律的一个新情形,它将会给出一个很棒的预测。
这个过程就是backpropagation。
计算神经元输出的公式
你可能会想,计算神经元输出的公式是什么?首先,计算神经元输入的加权和,即
接着使之规范化,结果在0,1之间。 为此使用一个数学函数--Sigmoid函数:
Sigmoid函数的图形是一条“S”状的曲线。
把第一个方程代入第二个,计算神经元输出的最终公式为:
你可能注意到了,为了简单,我们没有引入最低兴奋阈值。
调整权重的公式
我们在训练时不断调整权重。 但是怎么调整呢?可以使用“ErrorWeightedDerivative”公式:
为什么使用这个公式?首先,我们想使调整和误差的大小成比例。 其次,乘以输入(0或1),如果输入是0,权重就不会调整。 最后,乘以Sigmoid曲线的斜率(图4)。 为了理解最后一条,考虑这些:
我们使用Sigmoid曲线计算神经元的输出
如果输出是一个大的正(或负)数,这意味着神经元采用这种(或另一种)方式
从图四可以看出,在较大数值处,Sigmoid曲线斜率小
如果神经元认为当前权重是正确的,就不会对它进行很大调整。 乘以Sigmoid曲线斜率便可以实现这一点
Sigmoid曲线的斜率可以通过求导得到:
把第二个等式代入第一个等式里,得到调整权重的最终公式:
当然有其他公式,它们可以使神经元学习得更快,但是这个公式的优点是非常简单。
构造Python代码
虽然我们没有使用神经网络库,但是将导入Python数学库numpy里的4个方法。 分别是:
exp--自然指数
array--创建矩阵
dot--进行矩阵乘法
random--产生随机数
比如,我们可以使用array()方法表示前面展示的训练集:
“.T”方法用于矩阵转置(行变列)。 所以,计算机这样存储数字:
我觉得我们可以开始构建更优美的源代码了。 给出这个源代码后,我会做一个总结。
我对每一行源代码都添加了注释来解释所有。 注意在每次迭代时,我们同时处理所有训练集数据。 所以变量都是矩阵(二维数据表格)。 下面是一个用Python写地完整的示例代码。
我们做到了!我们用Python构建了一个简单的神经网络!
首先神经网络对自己赋予随机权重,然后使用训练集训练自己。 接着,它考虑一种新的情形[1,0,0]并且预测了0.99993704。 正确答是1。 非常接近!
传统计算机程序通常不会学习。 而神经网络却能自己学习,适应并对新情形做出反应,这是多么神奇,就像类一样。
想做预测数据,希望通过算法来得到结果。 有可能需要matlab或者python的机器学习(machinelearning)等
你想通过训练来预测数据,一般可以通过BP工神经网络来实现。
工神经网络是由若干个神经元相互连接组成一个比较大的并行互联的网络,其结构为拓扑结构。
实现步骤:1、输入和输出数据;2、创建网络;3、划分训练,测试和验证数据的比例设定;4、训练网络;5、根据训练结果,预测未来数据
下图为用BP神经网络预测某地铁线路(14月至17月)客流量图
无需深度学习框架,如何从零开始用Python构建神经网络
无需依赖深度学习框架,从零开始用Python构建神经网络是一种实用且深入理解深度学习的途径。 作者JamesLoy以自己的学习经验为基础,为你揭示了构建神经网络的全过程,包括神经网络的定义、损失函数、前向传播、反向传播和梯度下降算法。 这个教程适合所有希望掌握深度学习运作原理的初学者。
动机源于对深度学习的深入探索,作者选择不借助Tensorflow等库,直接从基础出发。 通过本文,你将学习到如何定义一个简单的数学函数来表示神经网络,以及如何通过2层神经网络的结构来理解其工作原理。 在训练神经网络的过程中,权重和偏置的调整是关键,通过前向传播计算预测值,损失函数评估预测与真实值的差距,然后利用反向传播和梯度下降更新参数。
本文详细介绍了前向传播和反向传播的Python实现,包括误差平方和作为损失函数,以及链式法则在计算权重偏导数中的应用。 通过实际示例,你可以看到神经网络在迭代训练后的预测结果,以及它如何逐步接近真实值。
尽管使用现成框架可以快速构建深度学习模型,但理解神经网络的内部机对于数据科学家的成至关重要。 继续学习的方向包括但不限于更复杂的网络结构、优化算法和深度学习的高级应用。 希望本文能帮助你踏出构建神经网络的第一步,进一步探索这个域的无限可能。