反向传播算法——矩阵向量形式递推公式——ReLU传递函数
反向传播算法
来源于https://udlbook.github.io/udlbook/,我不明白初始不从x0\boldsymbol{x}_0x0开始,而是从z0\boldsymbol{z}_0z0开始,不知道怎么想的。
考虑一个深度神经网络f(xi,ϕ)f(\boldsymbol{x}_i, \boldsymbol{\phi})f(xi,ϕ),它接受输入xi\boldsymbol{x}_ixi,具有MMM个隐藏层和 ReLU 激活函数,并且有单独的损失项Li=L(yi,f(xi,ϕ))L_i = L(\boldsymbol{y}_i,f(\boldsymbol{x}_i, \boldsymbol{\phi}))Li=L(yi,f(xi,ϕ))。反向传播的目标是计算关于偏差bℓ\boldsymbol{b}_\ellbℓ和权重Wℓ\boldsymbol{W}_\ellWℓ的导数∂Li∂bℓ\frac{\partial L_i}{\partial \boldsymbol{b}_\ell}∂bℓ∂Li和∂Li∂Wℓ\frac{\partial L_i}{\partial \boldsymbol{W}_\ell}∂Wℓ∂Li。
前向传递: 计算并存储以下量:
z0=b0+W0xxℓ=φ(zℓ−1)ℓ=1,2,⋯ ,Mzℓ=bℓ+Wℓxℓ.ℓ=1,2,⋯ ,M \begin{aligned} \boldsymbol{z}_0 &= \boldsymbol{b}_0 + \boldsymbol{W}_0 \boldsymbol{x} \\ \boldsymbol{x}_\ell &=\boldsymbol{\varphi}(\boldsymbol{z}_{\ell-1}) & \ell = 1, 2, \cdots, M \\ \boldsymbol{z}_\ell &= \boldsymbol{b}_\ell + \boldsymbol{W}_\ell \boldsymbol{x}_\ell. & \ell = 1, 2, \cdots, M \end{aligned} z0xℓzℓ=b0+W0x=φ(zℓ−1)=bℓ+Wℓxℓ.ℓ=1,2,⋯,Mℓ=1,2,⋯,M
反向传递: 从损失函数LdL_dLd关于网络输出zM\boldsymbol{z}_MzM的导数∂Ld∂zM\frac{\partial L_d}{\partial \boldsymbol{z}_M}∂zM∂Ld开始,并在网络中反向工作:
∂Ld∂bℓ=∂Ld∂zℓℓ=M,M−1,⋯ ,1∂Ld∂Wℓ=∂Ld∂zℓxℓ⊤ℓ=M,M−1,⋯ ,1∂Ld∂zℓ−1=I(zℓ−1>0)⊙(Wℓ⊤∂Ld∂zℓ),ℓ=M,M−1,⋯ ,1 \begin{aligned} \frac{\partial L_d}{\partial \boldsymbol{b}_\ell} &= \frac{\partial L_d}{\partial \boldsymbol{z}_\ell} & \ell = M, M-1, \cdots, 1\\ \frac{\partial L_d}{\partial \boldsymbol{W}_\ell} &= \frac{\partial L_d}{\partial \boldsymbol{z}_\ell} \boldsymbol{x}_\ell^{\top} & \ell = M, M-1, \cdots, 1 \\ \frac{\partial L_d}{\partial \boldsymbol{z}_{\ell-1}} &= {I}(\boldsymbol{z}_{\ell-1} > 0) \odot \left( \boldsymbol{W}_\ell^{\top} \frac{\partial L_d}{\partial \boldsymbol{z}_\ell} \right), & \ell = M, M-1, \cdots, 1 \end{aligned} ∂bℓ∂Ld∂Wℓ∂Ld∂zℓ−1∂Ld=∂zℓ∂Ld=∂zℓ∂Ldxℓ⊤=I(zℓ−1>0)⊙(Wℓ⊤∂zℓ∂Ld),ℓ=M,M−1,⋯,1ℓ=M,M−1,⋯,1ℓ=M,M−1,⋯,1
其中⊙\odot⊙表示逐点乘法,而I(zℓ−1>0){I}(\boldsymbol{z}_{\ell-1} > 0)I(zℓ−1>0)是一个向量,其中在zℓ−1\boldsymbol{z}_{\ell-1}zℓ−1大于零的位置包含一,在其他位置包含零。
最后,计算关于第一组偏差和权重的导数:
∂Ld∂b0=∂Ld∂z0∂Ld∂W0=∂Ld∂z0x⊤ \begin{aligned} \frac{\partial L_d}{\partial \boldsymbol{b}_0} &= \frac{\partial L_d}{\partial \boldsymbol{z}_0} \\ \frac{\partial L_d}{\partial \boldsymbol{W}_0} &= \frac{\partial L_d}{\partial \boldsymbol{z}_0} \boldsymbol{x}^{\top} \end{aligned} ∂b0∂Ld∂W0∂Ld=∂z0∂Ld=∂z0∂Ldx⊤
为批次中的每个训练样本计算这些导数,并将它们相加以获取用于 SGD 更新的梯度。
请注意,反向传播算法非常高效;前向和反向传递中最耗计算的步骤是矩阵乘法(分别由W\boldsymbol{W}W和W⊤\boldsymbol{W}^{\top}W⊤进行),这只需要加法和乘法。然而,它不是内存高效的;前向传递中的中间值必须全部存储,这可能会限制可以训练的模型的大小。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)