神经网络梯度反向传播公式

本文详细解析了三层神经网络的反向传播过程,包括输出层无激活函数,中间层使用tanh激活函数的场景。阐述了损失函数的定义及其在权重更新中的作用,并逐步推导了梯度计算公式。

考虑三层网络:
图片来自网络
输出层没有激活函数,只有中间层有:
y=Wout⋅tanh(Win⋅x)y = W_{out}\cdot tanh(W_{in}\cdot x)y=Wouttanh(Winx)
对其做拆分:
y=Wout⋅Ay = W_{out}\cdot Ay=WoutA
A=tanh(Z)A = tanh(Z)A=tanh(Z)
Z=Win⋅xZ = W_{in}\cdot xZ=Winx
其中,A 代表 activation,即通过激活函数后的值。

损失函数 Loss:
L=12∣∣y−yˉ∣∣2L = \frac{1}{2} ||y-\bar{y}||^2L=21yyˉ2

δy=y−yˉ\delta y= y-\bar{y}δy=yyˉ
δWout=δy⋅AT\delta W_{out} =\delta y \cdot A^TδWout=δyAT
δA=WoutT⋅δy\delta A = W_{out}^T \cdot \delta yδA=WoutTδy
δZ=δA⊙tanh′(Z)=δA⊙(1−tanh2(Z))\delta Z = \delta A \odot tanh'(Z) = \delta A \odot \big(1-tanh^2(Z)\big)δZ=δAtanh(Z)=δA(1tanh2(Z))
δWin=δZ⋅xT\delta W_{in} = \delta Z \cdot x^TδWin=δZxT
其中 ⊙\odot 表示矩阵对应元素相乘。

参考资料中未提及卷积神经网络反向传播公式的具体内容。不过,卷积神经网络反向传播是一个复杂的过程,其公式推导涉及到多个方面,比如卷积层、池化层等不同层的反向传播公式有所不同。 一般来说,对于卷积层,设输入特征图为 $X$,卷积核为 $W$,输出特征图为 $Y$,误差项为 $\delta$ 。在反向传播时,关于卷积核的梯度 $\frac{\partial L}{\partial W}$ 、关于输入特征图的梯度 $\frac{\partial L}{\partial X}$ 的推导较为关键。以简单的二维卷积为例,在全卷积的情况下,$\frac{\partial L}{\partial W}$ 的计算可以通过输入特征图 $X$ 和误差项 $\delta$ 的卷积得到;$\frac{\partial L}{\partial X}$ 的计算则需要将误差项 $\delta$ 与卷积核 $W$ 进行旋转180度后的卷积。 对于池化层,常见的有最大池化和平均池化。以最大池化为例,在反向传播时,会将误差项 $\delta$ 传递到前向传播时最大值所在的位置,其余位置为 0。 以下是一个简单的Python伪代码示例,用于说明卷积层反向传播的大致过程: ```python import numpy as np def conv_backward(dZ, cache): """ 卷积层的反向传播 :param dZ: 误差项 :param cache: 缓存,包含输入、卷积核等信息 :return: 关于输入的梯度、关于卷积核的梯度 """ (A_prev, W, b, hparameters) = cache (m, n_H_prev, n_W_prev, n_C_prev) = A_prev.shape (f, f, n_C_prev, n_C) = W.shape (m, n_H, n_W, n_C) = dZ.shape stride = hparameters['stride'] pad = hparameters['pad'] dA_prev = np.zeros((m, n_H_prev, n_W_prev, n_C_prev)) dW = np.zeros((f, f, n_C_prev, n_C)) db = np.zeros((1, 1, 1, n_C)) A_prev_pad = np.pad(A_prev, ((0, 0), (pad, pad), (pad, pad), (0, 0)), mode='constant', constant_values=0) dA_prev_pad = np.pad(dA_prev, ((0, 0), (pad, pad), (pad, pad), (0, 0)), mode='constant', constant_values=0) for i in range(m): a_prev_pad = A_prev_pad[i] da_prev_pad = dA_prev_pad[i] for h in range(n_H): for w in range(n_W): for c in range(n_C): vert_start = h * stride vert_end = vert_start + f horiz_start = w * stride horiz_end = horiz_start + f a_slice = a_prev_pad[vert_start:vert_end, horiz_start:horiz_end, :] da_prev_pad[vert_start:vert_end, horiz_start:horiz_end, :] += W[:, :, :, c] * dZ[i, h, w, c] dW[:, :, :, c] += a_slice * dZ[i, h, w, c] db[:, :, :, c] += dZ[i, h, w, c] dA_prev[i, :, :, :] = da_prev_pad[pad:-pad, pad:-pad, :] return dA_prev, dW, db ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值