神经网络的反向传播公式推导

本文深入探讨了深度学习中的核心概念——代价函数及其在二分类任务中的应用,并详细解析了前向传播与反向传播算法的具体步骤,包括向量化实现方式,为读者提供了一个全面理解深度学习算法的基础。

代价函数

假设在做二分类任务,那么代价函数和logistic回归代价函数一样:J=1m∑i=1mL(y,y^)J = \frac {1}{m}\sum_{i = 1}^{m}L(y,\widehat{y})J=m1i=1mL(y,y)

前向传播的步骤

z[l]=W[l]∗a[l−1]+b[l]z^{[l]} = W^{[l]} * a^{[l - 1]} + b^{[l]}z[l]=W[l]a[l1]+b[l]
a[l]=g(z[l])a^{[l]} = g(z^{[l]})a[l]=g(z[l])

向量化的实现如下:
z[l]=W[l]∗A[l−1]+b[l]z^{[l]} = W^{[l]} * A^{[l - 1]} + b^{[l]}z[l]=W[l]A[l1]+b[l]
A[l]=g(z[l])A^{[l]} = g(z^{[l]})A[l]=g(z[l])

反向传播的步骤

输入为da[l]da^{[l]}da[l],输出为da[l−1]da^{[l - 1]}da[l1]dW[l]dW^{[l]}dW[l]db[l]db^{[l]}db[l]
(1) dz[l]=da[l]⋅g[l]‘(z[l])dz^{[l]} = da^{[l]} \cdot g^{[l]^{`}}(z^{[l]})dz[l]=da[l]g[l](z[l])
(2) dW[l]=dz[l]⋅a[l−1]dW^{[l]} = dz^{[l]} \cdot a^{[l -1]}dW[l]=dz[l]a[l1]
(3) db[l]=dz[l]db^{[l]} = dz^{[l]}db[l]=dz[l]
(4)da[l−1]=W[l]T⋅dz[l]da^{[l - 1]} = W^{[l]^{T}} \cdot dz^{[l]}da[l1]=W[l]Tdz[l]
(5)dz[l]=W[l+1]T⋅dz[l+1]⋅g[l]‘(z[l])dz^{[l]} = W^{[l + 1]^{T}} \cdot dz^{[l + 1]} \cdot g^{[l]^`}(z^{[l]})dz[l]=W[l+1]Tdz[l+1]g[l](z[l])
式子(5)由前四个式子带入得到,这 五个式子可以实现反向传播。
向量化实现过程可以写成:
(6) dZ[l]=dA[l]⋅g[l]‘(z[l])dZ^{[l]} = dA^{[l]} \cdot g^{[l]^{`}}(z^{[l]})dZ[l]=dA[l]g[l](z[l])
(7) dW[l]=1mdZ[l]⋅A[l−1]dW^{[l]} = \frac{1}{m}dZ^{[l]} \cdot A^{[l -1]}dW[l]=m1dZ[l]A[l1]
(8) db[l]=1mnp.sum(dz[l],axis=1,keepdims=True)db^{[l]} = \frac{1}{m}np.sum(dz^{[l]},axis = 1, keepdims = True)db[l]=m1np.sum(dz[l],axis=1,keepdims=True)
(9) dA[l−1]=W[l]T⋅dZ[l]dA^{[l - 1]} = W^{[l]^{T}} \cdot dZ^{[l]}dA[l1]=W[l]TdZ[l]

参考资料中未提及卷积神经网络反向传播公式的具体内容。不过,卷积神经网络反向传播是一个复杂的过程,其公式推导涉及到多个方面,比如卷积层、池化层等不同层的反向传播公式有所不同。 一般来说,对于卷积层,设输入特征图为 $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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值