吴恩达机器学习-反向传播法-直观理解与推导

本文详细解释了吴恩达机器学习课程中反向传播算法的原理,通过公式推导展示了如何计算损失函数的导数,以及如何利用误差δ简化梯度下降过程,重点在于输出层和隐藏层的误差计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近正在学习吴恩达机器学习神经网络的反向传播算法,主要通过反向传播来求解损失函数的导出来降低梯度下降的复杂性。学到这里发现感觉难以能够理解其中的思想,甚至视频也反复看了好多遍,因此也网上找了一些资料进行参考和学习,在这里整理一下子的思路,推导一下涉及到的公式。

课程中的结论 

下面的公式是是课程中得出来的结论,也告诉了我们如何用这是公式求解梯度,但并未告诉其由来。

正向传播法递推公式

下面是正向传播的公式,比较好理解,因此不在赘述

a^{(1)}=x^{(1)}

z^{(2)}=\Theta ^{(1)}\times a^{(1)}

a^{(2)}=g(z^{(2)})

....... 

输出层的误差公式

通过下面的公式可以计算出最后一层的误差值

\delta ^{(L)}_{j}=y^{(i)}-a^{(L)}_j

隐藏层的误差公式

通过下面公式依次向前递推每个神精元的随时函数

\delta ^{(l)}=( (\Theta ^{(l)})^T \times \delta ^{(l+1)})\cdot a^{(l)}\cdot (1-a^{(l)})

损失函数的导数公式

通过下面公式对损失函数进行求导

\frac{\partial J}{\partial \Theta ^{(l)}_{ij} }=\delta ^{(l+1)}_i.a^{(l)}_j

梯度下降公式

D ^{(l)}_{ij}=\frac{1}m{}\cdot \Delta ^{(l)}_{ij} + \lambda \Theta ^{(l)}_{ij} (j\neq 0) \\ D ^{(l)}_{ij}=\frac{1}m{}\cdot \Delta ^{(l)}_{ij} (j= 0)

为什么不直接求导

我们先看一下具体的代价函数

J(\Theta)=-\frac{1}{m}[\sum_{i=1}^m \sum_{k=1}^K y^{(i)}log(h_\Theta (x^{(i)})_k)+(1-y^{(i)})log(1-h_\Theta (x^{(i)})_k)]+\frac{1}{2m}\sum_{l=1}^{L-1} \sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}} (\Theta ^{(l)}_{ij})^2

可以知道假设函数并不简单,是整个神经元组成的网络,因此求导过程十分复杂,而且交由程序计算梯度时计算量也十分庞大,效率极低。

反向传播法

接下来我们到了正题,我们需要找到一个方便的方法来进行梯度下降,这时候我们将损失函数的导数公式进行变形

\frac{\partial J}{\partial \Theta ^{(l)}_{ij}}=\frac{\partial J}{\partial z^{(l+1)}_i}.\frac{\partial z^{(l+1)}_i}{\partial \Theta ^{(l)}_{ij}}=\frac{\partial J}{\partial z^{(l+1)}_i}.a^{(l)}_j

\frac{\partial J}{\partial z^{l+1}_i}  这个偏微分的含义就是 l+1 层的输入对输出产生的影响大小,我们先记它为\delta ^{(l+1)}_i

深入理解“误差δ”

通过这个 \delta 可以代替计算 l 层相关 \Theta 的损失函数偏导数 ,也就是计算  l+1  层这个 \delta 来计算  l  层的梯度 。另外通过 \delta 的定义我们知道是某一个神经元输入对最终神经网络输出的影响大小,然而代价函数中的 h(\Theta ),展开来是一个非常复杂的解构,但是也能够知道当前层\delta 会受到下一层 \delta 的影响。有兴趣的同学可以展开来看一下。有了上面思路,我们就能够很好的反向传输法的原理了,如图

反向传播法与正向传播时倒过来的,其中\delta ^{(L)}代表最后一层的误差,依次往前传递,这里除了最后一层的误差是真实存在的,其他神经元的误差实际上并不真实存在,所以这边的是广义上的误差,其中\delta ^{(l)}代表是l层的第个神经元所产生的误差。其中定义为:

\delta ^{(l)}_{i}=\frac{\partial J}{\partial z^{(l)}_i}

推导输出层的δ

在不考虑正则项的情况下,我们先推导 L 层(也就是输出层)的"误差":

\delta ^{(L)}_{j} =\frac{\partial J}{\partial z^{(L)}_j} =\frac{\partial J}{\partial a^{(L)}_j}.\frac{\partial a^{(L)}_j}{\partial z^{(L)}_j} \\=\frac{\partial (-\frac{1}{m}[\sum_{i=1}^m \sum_{k=1}^K y^{(i)}log(h_\Theta (x^{(i)})_k)+(1-y^{(i)})log(1-h_\Theta (x^{(i)})_k)])}{\partial a^{(L)}_j}.g'(z^{(L)}_j) \\

因为  K\neq j  时候的导数项不存在,因此可以将第二个Σ符号去除,变为下式

=\frac{\partial (-\frac{1}{m}\sum_{i=1}^m [y^{(i)}log(h_\Theta (x^{(i)})_j)+(1-y^{(i)})log(1-h_\Theta (x^{(i)})_j)])}{\partial a^{(L)}_j}.g'(z^{(L)}_j) \\ =-\frac{1}{m}\sum_{i=1}^m [\frac{y^{(i)}}{h_\Theta (x^{(i)})_j}.\frac{\partial h_\Theta (x^{(i)})_j}{\partial a^{(L)_j}}-\frac{1-y^{(i)}}{1-h_\Theta (x^{(i)})_j}.\frac{\partial h_\Theta (x^{(i)})_j}{\partial a^{(L)_j}}].g'(z^{(L)}_j)

因为 L 是最后一层,a^{(L)}_j 就是最终输出,因此a^{(L)}_j=\frac{1}{1-e^{-z^{(L)}_j}}=h_\Theta (x^{(i)})_j ,也就是 \frac{\partial h_\Theta (x^{(i)})_j}{\partial a^{(L)}_j}=1,继续推导得到:

\\ =-\frac{1}{m}\sum_{i=1}^m [\frac{y^{(i)}}{a^{(L)}_j}-\frac{1-y^{(i)}}{1-a^{(L)}_j}].g'(z^{(L)}_j) \\ =(\frac{y^{(i)}}{a^{(L)}_j}-\frac{1-y^{(i)}}{1-a^{(L)}_j}).g'(z^{(L)}_j) \\

我们来展开一下 g'(z^{(l)}_j)

g'(z^{(l)}_j) = (\frac{1}{1+e^{(-z^{(l)}_j)}})' \\=\frac{1}{1+e^{(-z^{(l)}_j)}}.\frac{e^{(-z^{(l)}_j)}}{1+e^{(-z^{(l)}_j)}}\\ =\frac{1}{1+e^{(-z^{(l)}_j)}}.(\frac{e^{(-z^{(l)}_j)+1}}{1+e^{(-z^{(l)}_j)}}-\frac{1}{1+e^{(-z^{(l)}_j)}})\\=a^{(l)}_j.(1-a^{(l)}_j)

最终可得输出层的δ:

\delta ^{(L)}_{j}=(\frac{1-y^{(i)}}{a^{(L)}_j}-\frac{y^{(i)}}{1-a^{(L)}_j}).g'(z^{(L)}_j) \\ =(\frac{y^{(i)}}{a^{(L)}_j}-\frac{1-y^{(i)}}{1-a^{(L)}_j}).a^{(L)}_j.(1-a^{(L)}_j)\\=y^{(i)}-a^{(L)}_j

推导隐藏层的δ

推导隐藏层的δ,这里可以直接使用上一次的δ来计算。

\delta ^{(l)}_{j}=\frac{\partial J}{\partial z^{(l)}_j} \\ =\frac{\partial J}{\partial a^{(l)}_j}.\frac{\partial a^{(l)}_j}{\partial z^{(l)}_j}\\ =\sum_{k=1}^{K}(\frac{\partial J}{\partial z^{(l+1)}_k}.\frac{\partial z^{(l+1)}_k}{\partial a^{(l)}_j}).g'(z^{(l)}_j) \\ =\sum_{k=1}^{K}(\delta ^{(l+1)}_k.\Theta ^{(l)}_{kj}).g'(z^{(l)}_j) \\

这是计算l层某个δ的公式:

\delta ^{(l)}_{j} =( (\Theta ^{(l)})^T_{j}\times\delta ^{(l+1)}).g'(z^{(l)}_j)=(\delta ^{(l+1)}\times (\Theta ^{(l)})^T_{j}).a^{(l)}_j.(1-a^{(l)}_j)

这是计算计算l层δ向量的公式:

\delta ^{(l)} =( (\Theta ^{(l)})^T\times \delta ^{(l+1)}).g'(z^{(l)})=(\delta ^{(l+1)}\times (\Theta ^{(l)})^T)\cdot a^{(l)}.(1-a^{(l)})

结尾

这就是课程结论中的公式,个人理解和推导规程都在这边了。

具体过程应该算比较详细了,其他的公式应该也就很轻松的就能知道的。

通过这种方式计算梯度的好出就是可以简化程序的计算量。

如果有推导错误或者理解错误的地方,还请各位同学见谅,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值