zoukankan      html  css  js  c++  java
  • softMax层反向传播公式推导加实现(未加Loss层)

    softMax层反向传播图如图所示,这里我们将图中-ti/yi的反向传播泛化为Li,方便我们的推导。

    这里我们规定S=exp(a1)+...+exp(an) , yi=exp(ai)/S

    • "乘"节点

      有两个分支,对于向上的分支:Li*exp(ai) 然后将所有分支相加: ∑Li*exp(ai)

      对于向下分支:Li/S

    • "除"节点

      对除法求导后乘上前面传递过来的梯度:

      ​ (-1/S^2)∑Li*exp(ai)

    • "加”节点

      加法直接传递过去

    • “exp”节点

      y=exp(x) -> y'=exp(x) 从而:

      对于上面的分支:

      ​ (-1/S^2)*exp(ai)*∑Lj*exp(aj)=exp(ai)/S*∑(Lj*exp(aj)/S)=yi*∑(Lj*yj)

      下面的分支(对应之前的乘节点):

      ​ Li*exp(ai)/S=Li*yi

      将两个分支结果相加:

      dxi= Li*yi+yi*∑(Lj*yj)

    代码实现为:

    class Softmax:
        def __init__(self):
            self.params, self.grads = [], []
            self.out = None
    
        def forward(self, x):
            self.out = softmax(x)
            return self.out
    
        def backward(self, dout): #?
            dx = self.out * dout
            sumdx = np.sum(dx, axis=1, keepdims=True)
            dx -= self.out * sumdx
            return dx
    
    Don't aim for success if you really want it.Just stick to what you love and believe in.And it will come naturally.
  • 相关阅读:
    odoo action方法
    linux命令
    删除方法odoo
    odoo权限
    odoo方法
    odoo自动更新表中数据
    odoo
    odoo之recoed.append()方法
    odoo明细表汇总数据
    假期周进度报告1
  • 原文地址:https://www.cnblogs.com/wryy/p/15428446.html
Copyright © 2011-2022 走看看