突然又开始怀疑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,结合
ef{eq:def_loss}的定义,并令
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}
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}
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}
egin{equation}label{eq:conclusion}
frac{partial}{partial x_{i,h}}loss =y_{i,h}-delta (l_i-h)
end{equation}