zoukankan      html  css  js  c++  java
  • softmax loss

    突然又开始怀疑mxnet的softmax(如果有上次的话,应该是在寒假的时候)...总觉得example/numpy-ops/中的backward不对劲——太简单了吧,没有看见cross-entropy的影子啊(doc上说会在后向的时候加入cross-entropy)。查了一番,发现src/operator里面的实现也是如此。有些坐不住了,自己动手了,在这记一笔。

    Cross Entropy

    衡量两个分布的度量,和KL有点关系(也和VMP有点关系,大家都是概率族嘛),(cross~entropy:)

    [egin{equation}label{eq:cross_entropy} s(p,q)= E_p[-ln q] end{equation} ]

    使用的时候,(p)label,所以实际loss

    [egin{equation}label{eq:def_loss} loss =- sum_{i=1}^{b}ln y_{i,l_i} end{equation} ]

    (l)label向量,(y)softmax的输出。

    Backward

    要反向,先前向:)

    Softmax

    先来看下(y)的计算:

    [egin{equation} label{eq:softmax} y_{i,j} = frac{e^{x_{i,j}}}{sum_{k=1}^{c}e^{x_{i,k}}} end{equation} ]

    (c:~channel),忽略数值stability问题。

    Backward

    于是可以开始传播了。
    假定要计算(x_{i,h})gradient,结合 ef{eq:def_loss}的定义,并令

    [egin{equation}label{eq:def_p_i} p_i=y_{i,l_i} end{equation} $$: ]

    egin{eqnarray}
    frac{partial}{partial x_{i,h}}loss & = & frac{partial p_i}{partial x_{i,h}}frac{partial}{partial p_i}loss onumber
    & =& -frac{1}{p_i}frac{partial}{partial x_{i,h}}p_ilabel{eq:backdef}
    end{eqnarray}

    [然后看 ef{eq:backdef}中,微分部分的计算: ]

    egin{eqnarray}
    frac{partial}{partial x_{i,h}}p_i & = & frac{partial}{partial x_{i,h}}frac{e^{x_{i,l_i}}}{sum_{k=1}^{c}e^{x_{i,k}}} onumber
    & =& -frac{e^{x_{i,l_i}}e^{x_{i,h}}}{left( sum_{k=1}^{c}e^{x_{i,h}} ight)^2} + frac{e^{x_{i,h}}}{sum_{k=1}{c}e^{x_{i,k}}}delta (l_i-h) label{eq:partial}
    end{eqnarray}

    [# Conclusion 综合 ef{eq:backdef}和 ef{eq:partial}和 ef{eq:def_p_i}就是结论: ]

    egin{eqnarray}
    frac{partial}{partial x_{i,h}}loss & =& -left( -frac{e^{x_{i,h}}}{sum_{k=1}^{c}e^{x_{i,k}}}p_i + frac{x_{i,h}}{sum_{k=1}^{c}e^{x_{i,k}}}delta (l_i-h) ight)frac{1}{p_i}label{eq:conclusion_1}
    end{eqnarray}

    [一个细节是 ef{eq:conclusion_1}中$x_{i,h}delta (l_i-h)=x_{i,l_i}delta (l_i-h)$,于是,结合 ef{eq:softmax}, ef{eq:conclusion_1}可以化简: ]

    egin{equation}label{eq:conclusion}
    frac{partial}{partial x_{i,h}}loss =y_{i,h}-delta (l_i-h)
    end{equation}

    [其中,$y_{i,h}$是$x_{i,h}$对应的*softmax*输出,$l_i$是*label*向量的$i^{th}$分量。 看来是没问题的。 # BTW 顺带翻看了*normlization option*中的*batch*相关操作,其实现功能是将计算的*grad*进行$1/batchSize$因子的缩放,因而*doc*建议在新版中使用更大的*lr*。]

  • 相关阅读:
    php7 安装xhprof
    通过explain分析SQL
    将本地代码上传到github
    SVM支持向量机分类算法
    sklearn之reshape(-1,1)
    sklearn之决策树和随机森林对iris的处理比较
    sklearn总结
    面向对象之类的继承
    面向对象之静态方法、类方法
    面向对象之类的私有属性和方法
  • 原文地址:https://www.cnblogs.com/chenyliang/p/6943473.html
Copyright © 2011-2022 走看看