目前网络上关于反向传播算法的教程已经很多,那我们还有必要再写一份教程吗?答案是‘需要’。
为什么这么说呢?我们教员Sanjeev最近要给本科生上一门人工智能的课,尽管网上有很多反向传播算法的教程,但他却找不到一份令他满意的教程,因此我们决定自己写一份关于反向传播算法的教程,介绍一下反向传播算法的历史背景、原理、以及一些最新研究成果。
一、什么是反向传播算法?
反向传播算法是训练神经网络的经典算法。在20世纪70年代到80年代被多次重新定义。它的一些算法思想来自于60年代的控制理论。
在输入数据固定的情况下、反向传播算法利用神经网络的输出敏感度来快速计算出神经网络中的各种超参数。尤其重要的是,它计算输出f对所有的参数w的偏微分,即如下所示:∂f/∂wi,f代表神经元的输出,wi是函数f的第i个参数。参数wi代表网络的中边的权重或者神经元的阈值,神经元的激活函数具体细节并不重要,它可以是非线性函数Sigmoid或RELU。这样就可以得到f相对于网络参数的梯度∇f ,有了这个梯度,我们就可以使用梯度下降法对网络进行训练,即每次沿着梯度的负方向(−∇f)移动一小步,不断重复,直到网络输出误差最小。
在神经网络训练过程中,我们需要注意的是,反向传播算法不仅需要准确计算梯度。还需要使用一些小技巧对我们的网络进行训练。理解反向传播算法可以帮助我们理解那些在神经网络训练过程中使用的小技巧。
如果你觉得这篇文章看起来稍微还有些吃力,或者想要系统地学习人工智能,那么推荐你去看床长人工智能教程。非常棒的大神之作,教程不仅通俗易懂,而且很风趣幽默。点击这里可以查看教程。
反向传播算法之所以重要,是因为它的效率高。假设对一个节点求偏导需要的时间为单位时间,运算时间呈线性关系,那么网络的时间复杂度如下式所示:O(Network Size)=O(V+E),V为节点数、E为连接边数。这里我们唯一需要用的计算方法就是链式法则,但应用链式法则会增加我们二次计算的时间,由于有成千上万的参数需要二次计算,所以效率就不会很高。为了提高反向传播算法的效率,我们通过高度并行的向量,利用GPU进行计算。