softmax

可以参考:https://blog.csdn.net/qian99/article/details/78046329

第一篇博客中将损失函数定义为下面的会更加容易理解:

将   C=-\sum_{i} y_{i} \ln a_{i}      定义成:

 

   L_{i}=-\sum_{j=1}^{k} 1\left\{y_{(i)}=j\right\} \log \frac{e^{\tilde{z}_{j}}}{\sum_{l=1}^{k} e^{\dot{z}_{k}}}=-\hat{y}_{i} \ln y_{i}  

或者:   

  L=-\frac{1}{m}\left[\sum_{i=1}^{m} \sum_{j=1}^{k} 1\left\{y_{(i)}=j\right\} \log \frac{e^{z_{j}}}{\sum_{t=1}^{k} e^{z_{k}}}\right]

                 =-\frac{1}{m}\left[\sum_{i=1}^{m} \hat{y}_{i} \log \frac{e^{z_{i}}}{\sum_{t=1}^{k} e^{z_{k}}}\right]=-\frac{1}{m}\left[\sum_{i=1}^{m} \hat{y}_{i} \log y_{i}\right]

关于损失函数的求导问题:

损失函数的求导目标是  :        

                                                   \frac{\partial C}{\partial z_{i}}=\sum_{j}\left(\frac{\partial C_{j}}{\partial a_{j}} \frac{\partial a_{j}}{\partial z_{i}}\right)

那么求导出来就是(复合函数求导):

                                                 \frac{\partial C_{j}}{\partial a_{j}}=\frac{\partial\left(-y_{j} \ln a_{j}\right)}{\partial a_{j}}=-y_{j} \frac{1}{a_{j}}

 

由于有些朋友对于之前的写法有些疑惑,所以我这里修改了一下,这里为什么是 aj 而不是ai,这里要看一下softmax的公式了,因为softmax公式的特性,它的分母包含了所有神经元的输出,所以,对于不等于i的其他输出里面,也包含着Zi,Zi是Zk中去除Zj的那些部分,意思Zk = Zi+Zj,  所以要考虑 i == j 和 i != j的两种情况:

如果 i==j  :

\frac{\partial a_{i}}{\partial z_{i}}=\frac{\partial\left(\frac{e^{z_{i}}}{\sum_{k} e^{*_{k}}}\right)}{\partial z_{i}}=\frac{\sum_{k} e^{z_{k}} e^{z_{i}}-\left(e^{z_{i}}\right)^{2}}{\left(\sum_{k} e^{z_{k}}\right)^{2}}=\left(\frac{e^{z_{i}}}{\sum_{k} e^{z_{k}}}\right)\left(1-\frac{e^{z_{i}}}{\sum_{k} e^{z_{k}}}\right)=a_{i}\left(1-a_{i}\right)

                        上式的求导时候, 这里注意的问题:\frac{\sum_{k} e^{z_{k}} e^{z_{i}}-\left(e^{z i}\right)^{2}}{\left(\sum_{k} e^{z_{k}}\right)^{2}}   ,e^{z_{i}}z_{i}的导数等于自身

                        \sum_{k} e^{z_{k}}     对z_{i} 的导数等于 e^{z_{i}},因为e^{z_{k}} 其余不属于j的部分求导会等于0

 

如果 i!=j  :

                                                  \frac{\partial a_{j}}{\partial z_{i}}=\frac{\partial\left(\frac{e^{z} j}{\sum_{k} e^{z_{k}}}\right)}{\partial z_{i}}=-e^{z_{j}}\left(\frac{1}{\sum_{k} e^{z_{k}}}\right)^{2} e^{z_{i}}=-a_{i} a_{j}

                                      e^{z} j 对 z_{i}求导等于0,   \sum_{k} e^{z_{k}}z_{i}求导等于e^{z_{i}}

 

ok,接下来我们只需要把上面的组合起来:

                                \frac{\partial C}{\partial z_{i}}=\sum_{j}\left(\frac{\partial C_{j}}{\partial a_{j}} \frac{\partial a_{j}}{\partial z_{i}}\right)=\sum_{j \neq i}\left(\frac{\partial C_{j}}{\partial a_{j}} \frac{\partial a_{j}}{\partial z_{i}}\right)+\sum_{i=j}\left(\frac{\partial C_{j}}{\partial a_{j}} \frac{\partial a_{j}}{\partial z_{i}}\right)

                              =\sum_{j \neq i}-y_{j} \frac{1}{a_{j}}\left(-a_{i} a_{j}\right)+\left(-y_{i} \frac{1}{a_{i}}\right)\left(a_{i}\left(1-a_{i}\right)\right)

                             =\sum_{j \neq i} a_{i} y_{j}+\left(-y_{i}\left(1-a_{i}\right)\right)

                           =\sum_{j \neq i} a_{i} y_{j}+a_{i} y_{i}-y_{i}

                                   

                           =a_{i} \sum_{j} y_{j}-y_{i}

                 这个梯度等于:                                                 \frac{\partial C}{\partial z_{i}}=a_{i}-y_{i}

另外一篇博客也可以参考https://www.cnblogs.com/zongfa/p/8971213.html

你可能感兴趣的:(机器学习)