softmax loss
突然又开始怀疑mxnet的softmax(如果有上次的话,应该是在寒假的时候)...总觉得example/numpy-ops/中的backward不对劲——太简单了吧,没有看见cross-entropy的影子啊(doc上说会在后向的时候加入cross-entropy)。查了一番,发现src/operator里面的实现也是如此。有些坐不住了,自己动手了,在这记一笔。
Cross Entropy
衡量两个分布的度量,和KL有点关系(也和VMP有点关系,大家都是概率族嘛),\(cross~entropy:\)
使用的时候,\(p\)为label,所以实际loss是
\(l\)是label向量,\(y\)是softmax的输出。
Backward
要反向,先前向:)
Softmax
先来看下\(y\)的计算:
\(c:~channel\),忽略数值stability问题。
Backward
于是可以开始传播了。
假定要计算\(x_{i,h}\)的gradient,结合\ref{eq:def_loss}的定义,并令
\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}
\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}
\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}
\begin{equation}\label{eq:conclusion}
\frac{\partial}{\partial x_{i,h}}loss =y_{i,h}-\delta (l_i-h)
\end{equation}