- 直接计算梯度
- 需要计算Loss对每个参数的偏微分
- 当参数很多时计算量太大
- Chain Rule 链式法则
- \(y=g(x),z=h(y),\frac{dz}{dx}=\frac{dz}{dy}\frac{dy}{dx}\)
- \(x=g(s),y=h(s),z=k(x,y),\frac{dz}{ds}=\frac{\partial z}{\partial x}\frac{dx}{ds}+\frac{\partial z}{\partial y}\frac{dy}{ds}\)
- Backpropagation
- 如果要计算梯度的一个分量\(\frac{\partial L(\theta)}{\partial w}=\sum_{n=1}^N\frac{\partial C^n(\theta)}{\partial w}\)
- 对于求和式中的每一项\(\frac{\partial C}{\partial w}\),可以表示为\(\frac{\partial z}{\partial w}\frac{\partial C}{\partial z}\),分别计算出这两项就可以了
- Forward pass
- 方向从Input Layer到Output Layer
- 计算\(\frac{\partial z}{\partial w}\)
- Backward pass
- 方向从Output Layer到Input Layer
- 计算\(\frac{\partial C}{\partial z}\)
- \(z=w_1x_1+w_2x_2+b\)
- Forward pass
- 对于线性函数\(z=w_1x_1+w_2x_2+b\),计算\(\frac{\partial z}{\partial w}\)较简单,就是weight相对应的输入\(x\)
- \(\partial z/\partial w_1=x_1,\partial z/\partial w_2=x_2\)
- Backward pass
- 设Sigmoid函数的输出\(\sigma(z)=a\)
- 根据链式法则,\(\frac{dC}{dz}=\frac{da}{dz}\frac{dC}{da}\)
- \(a=\sigma(z)\),\(\frac{dC}{dz}\)就是Sigmoid的微分\(\sigma‘(z)\)
- \(\frac{dC}{da}\)又可以根据链式法则改写为\(\frac{dz‘}{da}\frac{dC}{dz‘}+\frac{dz‘‘}{da}\frac{dC}{dz‘‘}\)
- \(z‘\)和\(z‘‘\)分别是以\(a\)为输入之一的后面两个Neuron的\(z\)
- 其中\(\frac{dz‘}{da}\)和\(\frac{dz‘‘}{da}\)两项已经在Forward pass中算出,设为\(w_3\)和\(w_4\)
- 只需要计算\(\frac{dC}{dz‘}\)和\(\frac{dC}{dz‘‘}\)两项就可以算出梯度
- 每个Neuron的微分都依赖于后面Neuron的微分,这个问题是递归的
- Base Case就是Output Layer,先计算出Output Layer的微分,然后“自底向上”计算出其他Neuron的微分
- Output Layer
- \(\frac{\partial C}{\partial z‘}=\frac{\partial y_1}{\partial z‘}\frac{\partial C}{\partial y_1}\)
- 根据Sigmoid函数和Cross Entropy的定义就可以算出相应的微分
- Not Output Layer
- 对于每个Neuron,将Forward pass计算出的\(\frac{\partial z}{\partial w}\)和Backward pass计算出的\(\frac{\partial C}{\partial z}\)相乘就得到了梯度中的一项\(\frac{\partial C}{\partial w}\),类似计算其他项就可以得到梯度
【李宏毅机器学习】7. 反向传播
原文:https://www.cnblogs.com/huzheyu/p/lihongyi-ml-7.html