关于反向传播

本文的θ\thetaθwww都表示权重,σ\sigmaσhΘh_{\Theta}hΘggg都表示激活函数。

神经网络的代价函数:

J(Θ)=−1m[∑i=1m∑k=1Kyk(i)log⁡(hΘ(x(i)))k+(1−yk(i))log⁡(1−(hΘ(x(i)))k)]+λ2m∑l=1L−1∑i=1sl∑j=1sl+1(Θji(l))2 \begin{aligned} J(\Theta)=&-\frac{1}{m}\left[\sum_{i=1}^{m} \sum_{k=1}^{K} y_{k}^{(i)} \log \left(h_{\Theta}\left(x^{(i)}\right)\right)_{k}+\left(1-y_{k}^{(i)}\right) \log \left(1-\left(h_{\Theta}\left(x^{(i)}\right)\right)_{k}\right)\right] \\ &+\frac{\lambda}{2 m} \sum_{l=1}^{L-1} \sum_{i=1}^{s_{l}} \sum_{j=1}^{s_{l+1}}\left(\Theta_{j i}^{(l)}\right)^{2} \end{aligned} J(Θ)=m1[i=1mk=1Kyk(i)log(hΘ(x(i)))k+(1yk(i))log(1(hΘ(x(i)))k)]+2mλl=1L1i=1slj=1sl+1(Θji(l))2

目标:

min⁡ΘJ(Θ) \min _{\Theta} J(\Theta) ΘminJ(Θ)

需要计算:

J(Θ) J(\Theta) J(Θ)

∂∂Θij(l)J(Θ) \frac{\partial}{\partial \Theta_{i j}^{(l)}} J(\Theta) Θij(l)J(Θ)

假设只有一个训练样本(x,y),

神经网络结构如图:

在这里插入图片描述

它的前向传播过程如下:
a(1)=xz(2)=Θ(1)a(1)a(2)=g(z(2))( add a0(2))z(3)=Θ(2)a(2)a(3)=g(z(3))( add a0(3))z(4)=Θ(3)a(3)a(4)=hΘ(x)=g(z(4)) \begin{array}{l}{a^{(1)}=x} \\ {z^{(2)}=\Theta^{(1)} a^{(1)}} \\ {a^{(2)}=g\left(z^{(2)}\right)\left(\text { add } a_{0}^{(2)}\right)} \\ {z^{(3)}=\Theta^{(2)} a^{(2)}} \\ {a^{(3)}=g\left(z^{(3)}\right)\left(\text { add } a_{0}^{(3)}\right)} \\ {z^{(4)}=\Theta^{(3)} a^{(3)}} \\ {a^{(4)}=h_{\Theta}(x)=g\left(z^{(4)}\right)}\end{array} a(1)=xz(2)=Θ(1)a(1)a(2)=g(z(2))( add a0(2))z(3)=Θ(2)a(2)a(3)=g(z(3))( add a0(3))z(4)=Θ(3)a(3)a(4)=hΘ(x)=g(z(4))

反向传播

δj(l)\delta_{j}^{(l)}δj(l) 表示L层j节点处的误差。
对上述一个4层的网络,
反向传播过程中,误差沿着反向传播如下,(公式推导见附录):
δj(4)=aj(4)−yj \delta_{j}^{(4)}=a_{j}^{(4)}-y_{j} δj(4)=aj(4)yj

δ(3)=(Θ(3))Tδ(4)⋅∗g′(z(3))δ(2)=(Θ(2))Tδ(3)⋅∗g′(z(2)) \begin{array}{l}{\delta^{(3)}=\left(\Theta^{(3)}\right)^{T} \delta^{(4)} \cdot * g^{\prime}\left(z^{(3)}\right)} \\ {\delta^{(2)}=\left(\Theta^{(2)}\right)^{T} \delta^{(3)} \cdot * g^{\prime}\left(z^{(2)}\right)}\end{array} δ(3)=(Θ(3))Tδ(4)g(z(3))δ(2)=(Θ(2))Tδ(3)g(z(2))

其中,g′(z)=a⋅∗(1−a)g^{\prime}\left(z^{}\right)=a^{} \cdot *\left(1-a^{}\right)g(z)=a(1a)
表示sigmoid函数的导数。

这里的δj(l)\delta_{j}^{(l)}δj(l)其实就是代价函数对zj(l)z_{j}^{(l)}zj(l)的偏导,可以对代价函数公式求偏导即可得证。
δj(l)=∂∂zj(l)cost⁡(i)\delta_{j}^{(l)}=\frac{\partial}{\partial z_{j}^{(l)}} \operatorname{cost}(\mathrm{i})δj(l)=zj(l)cost(i)
其中,单个样品的代价函数表示如下:
cost⁡(i)=y(i)log⁡hΘ(x(i))+(1−y(i))log⁡hΘ(x(i))\operatorname{cost}(\mathrm{i})=y^{(i)} \log h_{\Theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log h_{\Theta}\left(x^{(i)}\right)cost(i)=y(i)loghΘ(x(i))+(1y(i))loghΘ(x(i))
其中,hΘ(x(i))=ah_{\Theta}\left(x^{(i)}\right)=ahΘ(x(i))=a,表示每一层的输出,hΘh_{\Theta}hΘ就是sigmoid激活函数,与前文的g()一样。

误差函数对权重 θij(l)\theta_{i j}^{(l)}θij(l)的导数如下:
∂∂θij(l)J(Θ)=aj(l)δi(l+1) \frac{{\partial}}{{\partial} \theta_{i j}^{(l)}} J(\Theta)=a_{j}^{(l)} \delta_{i}^{(l+1)} θij(l)J(Θ)=aj(l)δi(l+1)

这个式子忽略正则项,λ\lambdaλ为0.

对多个样本如何进行反向传播算法?

对训练集 {(x(1),y(1)),…,(x(m),y(m))}\left\{\left(x^{(1)}, y^{(1)}\right), \ldots,\left(x^{(m)}, y^{(m)}\right)\right\}{(x(1),y(1)),,(x(m),y(m))}
训练过程如下:
首先,置△ij(l)=0( for all l,i,j)\triangle_{i j}^{(l)}=0(\text { for all } l, i, j)ij(l)=0( for all l,i,j)

接着,遍历训练集:

For i=1i=1i=1 to mmm
{
a(1)=x(i)a^{(1)}=x^{(i)}a(1)=x(i)
通过前向传播计算 a(l)a^{(l)}a(l) for l=2,3,…,Ll=2,3, \ldots, Ll=2,3,,L
使用 y(i),y^{(i)},y(i), 计算误差 δ(L)=a(L)−y(i)\delta^{(L)}=a^{(L)}-y^{(i)}δ(L)=a(L)y(i)
通过反向传播计算每一层的误差, δ(L−1),δ(L−2),…,δ(2)\delta^{(L-1)}, \delta^{(L-2)}, \ldots, \delta^{(2)}δ(L1),δ(L2),,δ(2)
△ij(l):=△ij(l)+aj(l)δi(l+1)\triangle_{i j}^{(l)} :=\triangle_{i j}^{(l)}+a_{j}^{(l)} \delta_{i}^{(l+1)}ij(l):=ij(l)+aj(l)δi(l+1)
}
计算完之后,跳出循环,计算下式:
Dij(l):=1m△ij(l)+λΘij(l) if j≠0Dij(l):=1m△ij(l) if j=0 \begin{array}{ll}{D_{i j}^{(l)} :=\frac{1}{m} \triangle_{i j}^{(l)}+\lambda \Theta_{i j}^{(l)} \text { if } j \neq 0} \\ {D_{i j}^{(l)} :=\frac{1}{m} \triangle_{i j}^{(l)}} & {\text { if } j=0}\end{array} Dij(l):=m1ij(l)+λΘij(l) if j̸=0Dij(l):=m1ij(l) if j=0
就可以得到偏导数:
∂∂Θij(l)J(Θ)=Dij(l) \frac{\partial}{\partial \Theta_{i j}^{(l)}} J(\Theta)=D_{i j}^{(l)} Θij(l)J(Θ)=Dij(l)

参考自:吴恩达机器学习视频

下面整理一下反向传播的过程:

第一步:输入训练集;
第二步:对于训练集中的每个样本x,设置输入层(Input layer)对应的激活值a1a^{1}a1
第三步:前向传播:

zl=wlal−1+bl,al=σ(zl)z^{l}=w^{l} a^{l-1}+b^{l}, a^{l}=\sigma\left(z^{l}\right)zl=wlal1+bl,al=σ(zl)

第四步: 计算输出层产生的错误:

δL=∇aC⊙σ′(zL)\delta^{L}=\nabla_{a} C \odot \sigma^{\prime}\left(z^{L}\right)δL=aCσ(zL)
也可以表示为:δL=aj−yj\delta^{L}=a_{j}-y_{j}δL=ajyj

第五步: 反向传播计算每一层的错误:

δl=((wl+1)Tδl+1)⊙σ′(zl)\delta^{l}=\left(\left(w^{l+1}\right)^{T} \delta^{l+1}\right) \odot \sigma^{\prime}\left(z^{l}\right)δl=((wl+1)Tδl+1)σ(zl)

第六步: 使用梯度下降(gradient descent),训练参数:

wl→wl−ηm∑xδx,l(ax,l−1)Tw^{l} \rightarrow w^{l}-\frac{\eta}{m} \sum_{x} \delta^{x, l}\left(a^{x, l-1}\right)^{T}wlwlmηxδx,l(ax,l1)T
bl→bl−ηm∑xδx,lb^{l} \rightarrow b^{l}-\frac{\eta}{m} \sum_{x} \delta^{x, l}blblmηxδx,l

附录

符号说明:
wjklw_{j k}^{l}wjkl表示第l-1层的第k个神经元连接到第l层的第j个神经元之间的权重;
bjlb_{j}^{l}bjl表示第l层的第j个神经元的偏置;
zjlz_{j}^{l}zjl表示第l层的第j个神经元的输入,即:
zjl=∑kwjklakl−1+bjlz_{j}^{l}=\sum_{k} w_{j k}^{l} a_{k}^{l-1}+b_{j}^{l}zjl=kwjklakl1+bjl
ajla_{j}^{l}ajl表示第l层第j个神经元的输出,即:
ajl=σ(∑kwjklakl−1+bjl)a_{j}^{l}=\sigma\left(\sum_{k} w_{j k}^{l} a_{k}^{l-1}+b_{j}^{l}\right)ajl=σ(kwjklakl1+bjl)
σ\sigmaσ表示激活函数。(本文激活函数用不同的符号都表示过,但其实是一样的,从很多地方整理而来,懒得去改了)
⊙\odot表示Hadamard乘积,用于矩阵或向量之间点对点的乘法运算.

误差的推导:

δl=((wl+1)Tδl+1)⊙σ′(zl)\delta^{l}=\left(\left(w^{l+1}\right)^{T} \delta^{l+1}\right) \odot \sigma^{\prime}\left(z^{l}\right)δl=((wl+1)Tδl+1)σ(zl)
推导过程:
∵δjl=∂C∂zjl=∑k∂C∂zkl+1⋅∂zkl+1∂ajl⋅∂ajl∂zjl\because \delta_{j}^{l}=\frac{\partial C}{\partial z_{j}^{l}}=\sum_{k} \frac{\partial C}{\partial z_{k}^{l+1}} \cdot \frac{\partial z_{k}^{l+1}}{\partial a_{j}^{l}} \cdot \frac{\partial a_{j}^{l}}{\partial z_{j}^{l}}δjl=zjlC=kzkl+1Cajlzkl+1zjlajl
=∑kδkl+1⋅∂(wkjl+1ajl+bkl+1)∂ajl⋅σ′(zjl)=\sum_{k} \delta_{k}^{l+1} \cdot \frac{\partial\left(w_{k j}^{l+1} a_{j}^{l}+b_{k}^{l+1}\right)}{\partial a_{j}^{l}} \cdot \sigma^{\prime}\left(z_{j}^{l}\right)=kδkl+1ajl(wkjl+1ajl+bkl+1)σ(zjl)
=∑kδkl+1⋅wkjl+1⋅σ′(zjl)=\sum_{k} \delta_{k}^{l+1} \cdot w_{k j}^{l+1} \cdot \sigma^{\prime}\left(z_{j}^{l}\right)=kδkl+1wkjl+1σ(zjl)
∴δl=((wl+1)Tδl+1)⊙σ′(zl)\therefore \delta^{l}=\left(\left(w^{l+1}\right)^{T} \delta^{l+1}\right) \odot \sigma^{\prime}\left(z^{l}\right)δl=((wl+1)Tδl+1)σ(zl)

权重导数的推导:

∂C∂wjkl=akl−1δjl\frac{\partial C}{\partial w_{j k}^{l}}=a_{k}^{l-1} \delta_{j}^{l}wjklC=akl1δjl
推导过程:
∂C∂wjkl=∂C∂zjl⋅∂zjl∂wjkl=δjl⋅∂(wjklakl−1+bjl)∂wjkl=akl−1δjl\frac{\partial C}{\partial w_{j k}^{l}}=\frac{\partial C}{\partial z_{j}^{l}} \cdot \frac{\partial z_{j}^{l}}{\partial w_{j k}^{l}}=\delta_{j}^{l} \cdot \frac{\partial\left(w_{j k}^{l} a_{k}^{l-1}+b_{j}^{l}\right)}{\partial w_{j k}^{l}}=a_{k}^{l-1} \delta_{j}^{l}wjklC=zjlCwjklzjl=δjlwjkl(wjklakl1+bjl)=akl1δjl

偏置导数的推导:

∂C∂bjl=δjl\frac{\partial C}{\partial b_{j}^{l}}=\delta_{j}^{l}bjlC=δjl
推导过程:
∂C∂bjl=∂C∂zjl⋅∂zjl∂bjl=δjl⋅∂(wjklakl−1+bjl)∂bjl=δjl\frac{\partial C}{\partial b_{j}^{l}}=\frac{\partial C}{\partial z_{j}^{l}} \cdot \frac{\partial z_{j}^{l}}{\partial b_{j}^{l}}=\delta_{j}^{l} \cdot \frac{\partial\left(w_{j k}^{l} a_{k}^{l-1}+b_{j}^{l}\right)}{\partial b_{j}^{l}}=\delta_{j}^{l}bjlC=zjlCbjlzjl=δjlbjl(wjklakl1+bjl)=δjl

<think>好的,我现在需要帮助用户解答关于“局部反向传播算法”的问题。首先,我需要理解用户的问题到底是什么。用户提到了“局部反向传播的概念或实现方法”,并关联了机器学习、深度学习等标签。根据提供的引用内容,系统里关于反向传播的资料较多,但直接提到“局部反向传播”的似乎没有。因此,我需要先确定“局部反向传播”具体指的是什么。 可能的解释有几个方向:一是可能用户指的是反向传播中的局部梯度计算,即每个神经元在反向传播过程中计算局部梯度,然后链式法则传递;二是可能指分布式训练中的局部参数更新,比如在联邦学习或分布式系统中,每个节点进行局部反向传播后再聚合;三是可能指某些优化算法中局部近似的反向传播,如随机梯度下降的变种。 接下来,我需要根据现有引用内容来验证这些可能性。引用[4]提到反向传播的基本步骤是前向传播和反向传播,其中反向传播通过计算梯度逐层更新权重。这涉及到每个神经元的局部梯度计算,符合第一种解释。引用[5]讨论了梯度下降的变种如AdaGrad,可能涉及不同参数的局部学习率调整,但和“局部反向传播”概念可能相关但不直接。 用户的问题可能需要将“局部”理解为计算过程中的局部梯度部分,也就是每个神经元或层的梯度计算。因此,在回答中需要解释标准反向传播中的局部梯度,以及如何通过链式法则累积这些局部梯度来更新权重。此外,可能还需要提到分布式训练中的局部更新方法,如模型并行或数据并行中的局部反向传播步骤。 另外,用户可能对实现方法感兴趣,比如如何在代码中实现局部梯度的计算,或者如何在分布式系统中实现局部反向传播。需要结合引用中的信息,例如引用[4]中的前向和反向传播步骤,以及引用[5]中的优化算法,来构建回答的结构。 需要注意的是,系统提供的引用中没有直接提到“局部反向传播”这个术语,因此可能需要根据已有的知识进行合理推测和解释,同时确保不误导用户。在回答中需要明确说明可能的两种解释,并分别阐述其概念和实现方法,同时引用相关的引用内容来支持解释,例如引用[4]关于反向传播的基本步骤,引用[5]关于梯度下降的变种。 最后,生成相关问题时要围绕用户的问题展开,可能涉及局部反向传播的应用、与传统反向传播的区别、优化方法等,确保问题具有针对性和延伸性,帮助用户进一步探索该主题。</think>### 局部反向传播算法解析 #### 1. 局部反向传播的概念 局部反向传播通常指**在神经网络的特定层或子网络中进行梯度计算和权重更新**,而非全局网络的完整反向传播。其核心思想是通过局部优化降低计算复杂度或适应特定训练场景[^4]。 - **局部性**:在分布式训练中,不同设备可能仅负责部分网络层的反向传播(模型并行)[^2]。 - **梯度隔离**:某些场景下(如联邦学习),为保护数据隐私,仅允许局部梯度计算,避免全局梯度暴露[^5]。 #### 2. 实现方法 **(1) 分层局部反向传播** 将网络划分为多个子模块,独立计算各模块的梯度: ```python # 示例:两阶段局部反向传播 def local_backward(layer_output, loss_grad): # 计算当前层梯度 layer_grad = compute_local_gradient(layer_output, loss_grad) # 仅更新当前层参数 update_parameters(layer_grad) # 传递梯度到前一层 return propagate_gradient(layer_grad) ``` **(2) 分布式局部更新** 在联邦学习中,每个客户端执行局部反向传播并上传参数更新,服务器聚合全局模型: $$ \theta_{global} = \sum_{i=1}^N \frac{|\mathcal{D}_i|}{|\mathcal{D}|} \theta_{local}^{(i)} $$ 其中,$\theta_{local}^{(i)}$为第$i$个客户端的局部参数。 #### 3. 与传统反向传播的对比 | **特性** | 传统反向传播 | 局部反向传播 | |----------------|---------------------|--------------------------| | 计算范围 | 全局网络 | 子网络或单层 | | 通信开销 | 低(集中式计算) | 高(分布式场景需同步) | | 典型应用 | 单机训练 | 联邦学习、边缘计算[^3] | #### 4. 优化意义 - **计算效率**:减少单次迭代的计算量,适用于大模型训练[^2] - **隐私保护**:避免原始梯度传输,符合GDPR等数据合规要求 - **灵活性**:支持异构硬件协同训练(如手机、服务器联合训练)[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值