0. 前言
1. 从 Logistic Regression 中理解反向传播
2. 两层神经网络中单个样本的反向传播
3. 两层神经网络中多个样本的反向传播
如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~
花书+吴恩达深度学习(一)前馈神经网络(多层感知机 MLP)
花书+吴恩达深度学习(二)非线性激活函数(ReLU, maxout, sigmoid, tanh)
花书+吴恩达深度学习(三)反向传播算法 Back Propagation
花书+吴恩达深度学习(四)多分类 softmax
在神经网络中,通过前向传播,将线性拟合和非线性激活的计算结果传递至最后一层 。
然后通过反向传播,从最后一层进行梯度计算,每一层使用到了后面一层的计算结果对各自的参数进行修改,直到输入层。
本篇文章通过几个例子层层递进,理解反向传播算法。
如下图所示,为单个样本通过 LR 单元:
其中,样本有两个特征,前向传播通过线性单元和非线性激活函数 sigmoid ,得出结果,然后计算损失函数。
损失函数采用:
在反向传播中,首先对最后一层的输出计算梯度:
其次,对倒数第二层的输出计算梯度:
然后,求出了对 的梯度之后,可以计算对参数的梯度:
最后,就可以使用梯度下降的方法对参数进行修改。
在每一层计算梯度的过程中,都使用到了后面一层的计算结果,可以看成是梯度的计算从后面不断的往前面传递的反向传播。
在 logistic regression 的例子中,可以看成是一个神经元的反向传播。
现在,我们构建一个两层多个神经元的神经网络:
我们对其进行向量化,单个样本表示为 ,维度
。
第一层网络中,参数权重表示为 ,维度
,每一行表示每一个神经元,每一列表示对应上层输入的每个特征。
参数截距表示为 ,维度
,每一行表示每一个神经元,输出
,维度
,每一行表示每一个神经元的输出。
第二层网络中,参数权重表示为 ,维度
,参数截距表示为
,维度
,输出
,维度
,最终输出。
输出层的激活函数仍然采用合适的 sigmoid 函数。
前向传播表示为:
反向传播中,所有对应变量梯度的维度,与对应变量的维度是相同的。
首先,对第二层网络的 求梯度:
解释:因 的维度
,单个样本,所以与上一个例子最后一层的梯度求解相同。
然后,求出了 后,可对参数进行梯度求解:
解释:上述链式求导的第二项中,可分解为对函数 求导,则分别为
,用向量表示,则为
。
接着,对第一层网络求解梯度:
解释:上述链式求导的第二项中,可分解为对函数 求导,则分别为
,用向量表示,则为
。
表示元素对应相乘(点乘)。可验算,
与
维度相同。
然后,就可以对参数进行梯度求解:
最后,就可使用梯度下降法,对网络中的每个神经元进行更新。
在上述例子中,仅使用了一个样本,少数的神经元,进行计算。
现在,我们构建一个两层更多个神经元,对多个样本进行计算的神经网络:
单个样本表示为 ,维度
。
第一层网络中,参数权重表示为 ,维度
,每一行表示每一个神经元,每一列表示对应上层输入的每个特征。
参数截距表示为 ,维度
,每一行表示每一个神经元,输出
,维度
,每一行表示每一个神经元的输出。
第二层网络中,参数权重表示为 ,维度
,参数截距表示为
,维度
,输出
,维度
,最终输出。
输出层的激活函数仍然采用合适的 sigmoid 函数。
反向传播与上述例子相似,只是在求解参数梯度处有变化。
首先,对第二层网络的 求梯度:
解释:与上述例子不同之处在于,这里表示的是一个 的行向量,对应每一个样本。
然后,求出了 后,可对参数进行梯度求解:
解释: 的维度为
,
的维度为
,
的维度为
,从矩阵乘法的角度,可理解为将
的每个样本组成的行向量乘以
中的每个样本的某一个特征组成的列向量,得到
的一个值,因对每个样本都做了一次计算然后求和,所以需要取平均。在
中,因为
,而
的维度为
,
的维度为
,执行了一次广播操作(自动复制了
份,使得维度表示为
),所以需要对每一行求和再取平均(
在 python 总表示按照行求和)。
接着,对第一层网络求解梯度:
然后,就可以对参数进行梯度求解:
最后,就可使用梯度下降法,对网络中的每个神经元进行更新。
如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~