人工智能学习笔记--理解深度学习中的前向传播和反向传播算法

1.背景介绍

    机器学习分为监督学习和无监督学习。监督学习是指使用算法对结构化或非结构化的有标注的数据进行解析,从数据中学习,获取数据中特定的结构模型,然后使用这些结构或者模型对未知的数据进行预测。

    机器学习在计算机视觉的落地应用,如人脸识别等,都是通过训练和预测,基于监督学习模式的深度学习应用。在训练阶段,先对数据进行自动筛选和并自动人脸特征提取,得到训练后的深度模型。在预测阶段,使用训练模型对视频图像等输入数据进行预测,如人脸检测、识别等。

   我们知道,深度学习是基于神经网络的。具体到神经网络模型,训练阶段和预测阶段是怎么分工的呢?

   在训练阶段,训练模型的算法最后都会转化为求一个目标损失函数(loss function)的最小值。梯度下降法正是为了解决这类问题。直观地说一下这个方法的思想:我们把求解损失函数最小值的过程看做“站在山坡某处去寻找山坡的最低点”。我们并不知道最低点的确切位置,“梯度下降”的策略是每次向“下坡路”的方向走一小步,经过长时间的走“下坡路”最后的停留位置也大概率在最低点附近。这个“下坡路的方向”我们选做是梯度方向的负方向,选这个方向是因为每个点的梯度负方向是在该点处函数下坡最陡的方向。沿着与梯度向量相反的方向,梯度下降最快,易于找到神经网络总损失函数的最小值。也就是通过梯度下降算法更新网络中的权重参数和偏置参数。对神经网络的优化就是对参数的优化,减少损失,直至损失收敛。为了解决优化问题,研究者发现了用梯度下降算法来优化网络中的权重和偏置参数。但是神经网络中的模型结构复杂,计算网络中的所有参数梯度不是一件容易的事情,于是又研究者进一步探索,发现可以使用反向传播算法来求得网络模型中所有参数的梯度,通过梯度下降算法对所有参数进行更新。当损失函数收敛到一定程度时结束训练,并保存训练后神经网络的参数。我们用深度学习模型文件来保存训练后的神经网络。

    保存模型后,预测阶段先加载模型,并将向量化后的数据从人工神经网络的输入层开始输入,顺着数据流动的方向在网络中进行计算,直到数据传递到输出层并输出(完成一次前向传播),就完成一次预测并得到分类结果。

一个典型的神经元模型可以用下图表示:

人工智能学习笔记--理解深度学习中的前向传播和反向传播算法_第1张图片


 

一个典型的全连接前向神经网络如下图所示:

人工智能学习笔记--理解深度学习中的前向传播和反向传播算法_第2张图片

 

2. 前馈运算-前向传播算法简介

   前向传播算法在神经网络的训练和预测阶段会被反复使用,是神经网络中最常见的算法。其计算方式很简单,只需要根据神经网络模型的数据流动方向对输入的数据进行计算,最终得到输出的结果。

     设激活函数为f,权重矩阵为W,偏置项为b,输入为A,最终输出为Y,则Y = f(WA+b),计算输出Y这个过程就是前向传播的过程。

  对于一个还没有训练好的神经网络而言,各个神经元之间的参数都是随机值,即初始化时赋的值,前向传播过程是神经网络的输入输出过程,即网络是如何根据A的值得到输出的Y值的。

  本文参考了李宏毅老师的讲义,后面的数学推导也采用李老师的表示,因此采用李宏毅老师讲义里定义的模型,表达的意思是完全一样的。

3.反馈运算-反向传播BP算法简介   

  在前向传播的数据链路上,假设神经网络中的某一个参数w权值发生了小幅度的改变,那么这个改变将影响后续激活值的输出,下一层根据激活值继续往后传递该改变。如此一层一层地往后传递,直到损失函数接收到此改变为为止。最终这个小幅度的改变影响了整个网络,犹如平静的湖面落入一个小石头,打破了整个湖面的平静。

   为了知道这个改变的幅度,我们选择从网络的最后一层(输出层)开始,利用损失函数向前求得每一层每个神经元的误差,从而获得这个参数的梯度(原始的小幅度的改变的值)。由于神经网络的结构模型复杂(多层网络进行排列堆叠),如何合理计算损失函数的梯度是一个严峻的挑战。

    假设神经网络模型参数为{w1,w2,...wn, b1,b2,...bn},那么反向传播算法的精髓是:从模型的输出层开始,通过链式求导法则,逐层从后向前求出模型中的每个参数的梯度.

   那么为什么要从后向前呢?

   我们知道,高等数学里求导的原理如下所示:

                 

即要求某个参数的导数就让这个参数微变一点点,然后求出结果相对于参数变化量的比值。

人工智能学习笔记--理解深度学习中的前向传播和反向传播算法_第3张图片

让我们再看一看上图的例子,现在假设输入向量经过正向传播后,现在要求出参数w1和w2的导数,按照上述方法计算时,对w1微扰后,需要重新计算红框内的节点;对w2微扰后,需要重新计算绿框内的节点。这两次计算中也有大量的“重复单元”即图中的蓝框,实际上神经网络的每一个参数的计算都包含着这样大量的重复单眼,那么神经网络规模一旦变大,这种算法的计算量一定爆炸,没有适用价值。

在计算梯度时前面的单元是依赖后面的单元的计算,而“从后向前”的计算顺序正好“解耦”了这种依赖关系,先算后面的单元,并且记住后面单元的梯度值,计算前面单元之就能充分利用已经计算出来的结果,避免了重复计算。

你可能感兴趣的:(人工智能学习笔记--理解深度学习中的前向传播和反向传播算法)