softmax loss

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

Cross Entropy

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

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

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

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

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

Backward

要反向,先前向:)

Softmax

先来看下\(y\)的计算:

\[\begin{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,结合\ref{eq:def_loss}的定义,并令

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

\begin{eqnarray}
\frac{\partial}{\partial x_{i,h}}loss & = & \frac{\partial p_i}{\partial x_{i,h}}\frac{\partial}{\partial p_i}loss\nonumber\
& =& -\frac{1}{p_i}\frac{\partial}{\partial x_{i,h}}p_i\label{eq:backdef}
\end{eqnarray}

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

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

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

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

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

\begin{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*。\]

posted @ 2017-06-05 15:42  rotxin  阅读(484)  评论(0编辑  收藏  举报