什么是神经网络?
大多数关于神经网络的介绍性文章在描述它们时都会提到大脑类比。在不深入研究大脑类比的情况下,我发现简单地将神经网络描述为将给定的输入映射到期望的输出的数学函数就更容易了。
神经网络由以下组件组成:
· 输入层, x
· 任意数量的隐藏层
· 输出层, ŷ
· 每一层之间的权重和偏差,W和b
· 对于每一个隐藏的层选择激活函数,σ。在本教程中,我们将使用Sigmoid激活函数。
下图显示了一个2层神经网络(注意,当计算神经网络中的层数时,输入层通常被排除在外。)
用Python创建一个神经网络类很容易。
神经网络训练
一个简单的两层神经网络的输出ŷ :
你可能会注意到,在上面的方程中,权重W和偏差b是唯一影响输出ŷ的变量。
当然,权重和偏差的正确值决定了预测的强度。从输入数据中微调权重和偏差的过程称为训练神经网络。
训练过程的每一次迭代由以下步骤组成:
· 计算预测输出ŷ,被称为前馈
· 更新权重和偏差,称为反向传播
下面的顺序图说明了这个过程。
前馈
正如我们在上面的序列图中所看到的,前馈只是简单的演算,对于一个基本的2层神经网络,神经网络的输出是:
让我们在python代码中添加一个前馈函数来做到这一点。注意,为了简单起见,我们假设偏差为0。
然而,我们仍然需要一种方法来评估我们预测的准确度。
损失函数
有许多可用的损失函数,问题的性质决定了对损失函数的选择。在本教程中,我们将使用一个简单的平方和误差作为我们的损失函数。
也就是说,平方和误差只是每个预测值与实际值之间的差额之和。差是平方的,所以我们测量了差的绝对值。
我们在训练的目标是找到最好的一组权重和偏差,以尽量减少损失函数。
反向传播
现在我们已经测量了我们预测的误差(损失),我们需要找到一种方法传播错误返回,并更新我们的权重和偏差。
为了知道适当的数量来调整权重和偏差,我们需要知道损失函数与权重和偏差的导数。
回想一下微积分,函数的导数就是函数的斜率。
如果我们有导数,我们可以简单地通过增加/减少权值和偏差来更新权重和偏差(参见上面的图表)。这被称为梯度下降。
但是,由于损失函数方程不包含权值和偏差,因此不能直接计算损失函数相对于权值和偏差的导数。因此,我们需要链规则来帮助我们计算。
计算损失函数相对权重的导数的链规则。请注意,为了简单起见,我们只显示了假设为1层神经网络的偏导数。
让我们将反向传播函数添加到python代码中。为了更深入地理解微积分和链规则在反向传播中的应用,我强烈推荐3Blue1Brown编写的本教程。
总结
现在我们有了完整的python代码来进行前馈和反向传播,让我们在一个例子中应用我们的神经网络,看看它做得有多好。
我们的神经网络应该学习理想的权重集来表示这个函数。请注意,仅仅通过检查就可以计算出权重,这对我们来说并不简单。
让我们训练1500次迭代的神经网络,看看会发生什么。看看下面的每一个迭代图,我们可以清楚地看到损失。单调地向最小方向递减。这与我们前面讨论过的梯度下降算法是一致的。
让我们看一下从神经网络经过1500次迭代的最后的预测(输出)。
我们做到了!我们的前馈和反向传播算法成功地训练了神经网络,预测结果收敛于真值。
注意,预测值和实际值之间有细微的差别。这是可取的,因为它可以防止过度拟合。
幸运的是,我们的旅程还没有结束。还有很多神经网络和深度学习。例如:
· 除了Sigmoid函数以外,我们还能使用其他激活函数吗?
· 使用学习率神经网络训练
· 使用卷积用于图像分类任务
从零开始写自己的神经网络可以学到很多的东西。虽然像TensorFlow和Keras这样的深度学习库使得在不完全了解神经网络内部工作原理的情况下很容易构建深网,但我发现对神经网络有更深入的理解对于未来成为优秀的数据科学家是非常重要的。
原文标题《How to build your own Neural Network from scratch in Python》
作者:James Loy
译者:lemon
不代表云加社区观点,更多详情请查看原文链接