深度学习初学者一定不能错过,从零开始建立神经网络
动机:为了更好的理解深度学习,作者决定从零开始建立一个神经网络,而不是像TensorFlow这样的深度学习库。相信理解神经网络的内部工作对于任何有抱负的数据科学家来说都是很重要的。
什么是神经网络?
大多数介绍神经网络的文章在描述它们时会涉及到大脑类比,在不深入研究大脑类比的情况下,将神经网络简单描述为将固定数值映射到期望输出的数学函数理解起来更容易。
神经网络由以下部分组成:
输入层,x
任意数量的隐藏层
输出层,ŷ
每层W和B之间的一组权重和偏差
为每个隐藏层选择激活函数σ。在本教程中,我们将使用Sigmoid激活函数。
下图显示了2层神经网络的体系结构(请注意,在计算神经网络中的层数时通常会排除输入层)
用Python创建一个神经网络类很容易。
神经网络训练
简单的2层神经网络的输出是:
您可能会注意到,在上面的等式中,权重W和偏差b是影响ŷ的唯一变量。
当然,权重和偏差的正确度决定了预测的准确性。从输入数据中微调权重和偏差的过程称为神经网络训练。
训练过程的每次迭代包含以下步骤:
计算预测输出ŷ,称为前馈
更新权重和偏差,称为反向传播
下图为过程顺序图。
前馈
正如我们在上面的顺序图中看到的,前馈只是一个简单的演算,对于基本的2层神经网络,神经网络的输出是:
可以在python代码中添加一个前馈函数来做到这一点。简单起见,使假设偏差为0。
然而,仍然需要一种方法来评估我们预测达到什么程度,损失函数可以做到这一点。
损失函数
损失函数有很多种,问题的性质决定该选择哪种损失函数。在本教程中,作者将使用一个简单的sqaures偏差作为损失函数。
也就是说,平方和误差仅仅是每个预测值和实际值之差的平均值。因为差值被平方,所以要测量差值的绝对值。
作者的训练目标是找到最佳的权重和偏差集合,以最大限度地减少损失函数。
反向传播
现在作者已经测量了预测误差,需要找到一种方法来传播误差,并更新权重和偏差。
为了适当的调整权重和偏差,需要知道损失函数关于权重和偏差的导数。
可以从演算中得知,函数的导数就是函数的斜率。
梯度下降算法
如果有导数,可以简单地通过增加/减少更新权重和偏差(参见上图)。这被称为梯度下降。
然而,我们不能直接计算损失函数的权重和偏差,因为损失函数的方程不包含权重和偏差。因此,我们需要链式规则来计算它。
链式规则用于计算损失函数相对于权重的导数。简单起见,只显示了假设1层神经网络的偏导数
得到相对于权重的损失函数的导数(斜率),以便适当调整权重。
现在,将反向传播函数添加到Python代码中。
为了深入理解演算的应用和反向传播中的链式规则,作者强烈推荐3Blue1Brown撰写教程。
结合在一起
现在已经有了完整的python代码来做前馈和反向传播,将神经网络应用于一个例子上,来看看它的完成度。
神经网络应该学习理想的权重集合来表示这个函数。注意,通过检查来计算权重并不是不重要的。
来看看训练神经网络进行1500次迭代后会发生什么。查看下面每个迭代图的损失,可以清楚地看到损耗单调递减到最小。这与之前的梯度下降算法一致。
1500次迭代后神经网络的最终预测(输出)。
从上图可以看出前馈和后向传播算法成功地训练了神经网络,并且预测与实际值相差不大。
请注意,预测和实际值之间可以存在细微的差异。因为它可以防止过拟合,使神经网络更好地归纳看不见的数据。
下一步是什么?
幸运的是,关于神经网络和深度学习还有很多需要了解的内容。例如:
除了Sigmoid函数,还可以使用哪些激活函数?
训练神经网络时的学习率
利用卷积进行图像分类任务
最后的想法
作者从头开始学习了神经网络。
尽管TensorFlow和Keras等深度学习库可以在不完全了解神经网络的内部工作的情况下轻松构建深度网络,但有抱负的数据科学家可以更深入地了解神经网络。
这次练习对作者来说收获巨大,希望它对您也有用!