标签: 深度学习微信
SOFTMAX 长什么样子?以下图所示网络
从图的样子上看,和普通的全链接方式并没有差别,但激励函数的形式却大不同。ide
其中$i$就是节点的下标次序,而$z_i=w_i+b_i$,也就说这是一个线性分类器的输出做为天然常数$e$的指数。最有趣的是最后一层有这样的特性:
$$\sum\limits_{i = 1}^J {{\sigma _i}(z)} = 1$$
也就是说最后一层的每一个节点的输出值的加和是1。这种激励函数从物理意义上能够解释为一个样本经过网络进行分类的时候在每一个节点上输出的值都是小于等于1的,是它从属于这个分类的几率。
训练数据由训练样本和分类标签组成。以下图所,j假设有7张图,分别为飞机、汽车、轮船、猫、狗、鸟、太阳,则图像的分类标签以下表示:
$$\left[ \begin{array}{l}1 \\0 \\0 \\0 \\0 \\0 \\0 \end{array} \right]\left[ \begin{array}{l}0 \\1 \\0 \\0 \\0 \\0 \\0 \end{array} \right]\left[ \begin{array}{l}0 \\0 \\1 \\0 \\0 \\0 \\0 \end{array} \right]\left[ \begin{array}{l}0\\0 \\0 \\1 \\0 \\0 \\0 \end{array} \right]\left[ \begin{array}{l}0\\0 \\0 \\0 \\1 \\0 \\0 \end{array} \right]\left[ \begin{array}{l}0\\0 \\0 \\0 \\0 \\1 \\0 \end{array} \right]\left[ \begin{array}{l}0\\0 \\0 \\0 \\0 \\0 \\1 \end{array} \right]$$函数
这种激励函数一般用在神经网络的最后一层做为分类器的输出,有7个节点就能够作7个不一样类别的判别,有1000个节点就能够作1000个不一样样本类别的判断。学习
熵的本质是香农信息量($log( \frac{{1}}{{p}})$,$-log(p)$)的指望。
熵在信息论中表明随机变量不肯定度的度量。一个离散型随机变量 X 的熵 H(X) 定义为:
$$ H(X) = - \sum\limits_{i = 1}^K {p({x_i})\log (p({x_i}))} $$
交叉熵刻画的是实际输出几率和指望输出几率的距离,交叉熵的值越小,则两个几率分布越接近,即实际与指望差距越小。交叉熵中的交叉就体如今$p$(指望几率分布),$q$(实际几率分布)。假设几率分布$p$为指望输出,几率分布为$q$为实际输出,$H(X)$为交叉熵。则:
$$H(X) = - \sum\limits_{i = 1}^K {p({x_i})\log (q({x_i}))}$$
假如,n=3,指望输出$p=(1,0,0)$,模型1的实际输出为$q_1=(0.5,0.2,0.3)$,模型2的实际输出为$q_2=(0.8,0.1,0.1)$,那么交叉熵为:
$$H(p,q_1)=-(1 \times {\ln ^{0.5}}0 +0 \times ln^{0.2} + 0 \times ln^{0.3})= 0.69$$
$$H(p,q_2)=-(1 \times {\ln ^{0.8}}0 + 0 \times ln^{0.1} + 0 \times ln^{0.1})= 0.22$$ui
pytorch中的实现:spa
import torch import numpy as np input1 = torch.from_numpy(np.array([[0.8,0.1,0.1]])) input1.requires_grad=True target1= torch.from_numpy(np.array([0])).long() output1 = loss(input1, target1) print(nll_loss(torch.log(input1),target1))
输出 tensor(0.2231, dtype=torch.float64, grad_fn=<NllLossBackward>)
很显然,$q_2$和$p$分布更接近。code
假如,以“中国乒乓球队和巴西乒乓球对比赛结果”为例:
假设中国乒乓球队和巴西乒乓球队历史交手64次,其中中国队获胜63次,63/64是赛前你们广泛承认的中国队获胜几率,这个是先验几率。
那么此次中国队获胜的平均信息量有多大呢?
$$H(X_i=中国队获胜) = \frac{{63}}{{64}}{\log _2}\frac{{63}}{{64}} $$
同理:
$$H(X_i=巴西队获胜) = \frac{{1}}{{64}}{\log _2}\frac{{1}}{{64}} $$ip
因此,“中国乒乓球队和巴西乒乓球对比赛结果”,这一信息的信息熵为:
$$H(X) =- \sum\limits_{i = 1}^n {p({x_i})\log (p({x_i}))}\\ =H(X_i=中国队获胜)+H(X_i=巴西队获胜)\\ =\frac{{63}}{{64}}{\log _2}\frac{{63}}{{64}} + \frac{{1}}{{64}}{\log _2}\frac{{1}}{{64}}\\ = 0.1164 $$rem
为何Cross Entropy损失函数经常使用于分类问题中呢?咱们从一个简单的例子来分析。
问题引入:
假设咱们有一个 三分类问题,分别用 模型1和 模型2来进行预测。
结果以下:
样本id | 预测值 | 实际值 | 是否预测正确 |
---|---|---|---|
1 | [0.3,0.3,0.4] | [0,0,1] | √ |
2 | [0.3,0.4,0.3] | [0,1,0] | √ |
3 | [0.1,0.2,0.7] | [1,0,0] | × |
样本id | 预测值 | 实际值 | 是否预测正确 |
---|---|---|---|
1 | [0.1,0.2,0.7] | [0,0,1] | √ |
2 | [0.1,0.7,0.2] | [0,1,0] | √ |
3 | [0.3,0.4,0.3] | [1,0,0] | × |
对样本1和样本2,模型1以0.4>0.3的微弱优点正确预测样本1的标签为类别3,而模型2以0.7>0.2>0.1的巨大优点毫无悬念的正确预测出样本标签。
对于样本3,模型1和模型2均预测错误,但模型1以0.7>0.2>0.1的几率,错误的预测样本标签为标签3,但实际标签为标签1,错的离谱!!!但模型2虽然也预测错了,但0.4>0.3>0.2还不算太离谱。
如今咱们用损失函数来定义模型的表现。
$$ClassificationError=\frac{count of error items}{count of all items} $$
-模型1:$$ClassificationError=\frac{1}{3}$$
-模型2:$$ClassificationError=\frac{1}{3}$$
模型1和模型2虽然都预测错了1个,但相对来讲模型2表现更好,按理说模型越好,损失函数值越小,但分类错误率并没表现出来。
均方偏差损失也是一种比较常见的损失函数,其定义为:
$$MSE=\frac{1}{n}\sum\limits_i^n {{{(\widehat {{y_i}} - {y_i})}^2}} $$
模型1:$$MSE=frac{(0.3^2+0.3^2+0.6^2)+(0.3^2+0.6^2+0.3^2)+(0.9^2+0.2^2+0.7^2)}{3}
\ =0.81$$
-模型2:$$MSE=frac{(0.1^2+0.1^2+0.3^2)+(0.1^2+0.3^2+0.2^2)+(0.7^2+0.4^2+0.3^2)}{3}
\ =0.34$$
咱们发现MSE能判断出模型2优于模型1,但采用梯度降低法来求解的时候,MSE的一个缺点就是其偏导值在输出几率值接近0或者接近1的时候很是小,这可能会形成模型刚开始训练时,梯度几乎消失。
对于分类问题的损失函数来讲,分类错误率(分类精确率)和平方和损失都不是很好的损失函数,下面咱们来看一下交叉熵损失函数的表现状况。
在二分类的状况下,模型最终预测的结果只有2类,对于每一个类别咱们预测的几率为$1-p$和$p$。
此时Binary Cross Entropy:
$J=-[y·log(p)+(1-y)·log(1-p)]$
其中:
多分类实际是二分类的扩展。
$$ J= - \sum\limits_{i = 1}^K {{y_i}\log ({p_i})} $$
其中:
如今咱们用交叉熵损失函数来计算损失函数值。
能够发现,交叉熵损失函数能够捕捉到模型1和模型2的差别。
交叉熵损失函数常常用于分类问题中,特别是神经网络分类问题,因为交叉熵涉及到计算每一个类别的几率,因此在神经网络中,交叉熵与softmax函数紧密相关。
咱们用神经网络的最后一层输出状况来看。
下面咱们来推下整个求导公式,求导如图所示,分为三个过程:
$$\frac{{\partial J}}{{\partial {w_n}}} = \frac{{\partial J}}{{\partial {p_j}}} \cdot \frac{{\partial {p_j}}}{{\partial {y_i}}} \cdot \frac{{\partial {y_i}}}{{\partial {w_n}}}$$
先看$\frac{{\partial J}}{{\partial {p_j}}}$:
$$ \frac{{\partial J}}{{\partial {p_j}}} = \frac{{\partial ( - \sum\limits_{j = 1}^K {{y_i}\log ({p_j})} )}}{{\partial {p_j}}} = - \sum\limits_{j = 1}^K {\frac{{{y_i}}}{{{p_j}}}} $$
结合上图,再看$ \frac{{\partial {p_j}}}{{\partial {y_i}}}$:
$${p_j} = \frac{{{e^{{y_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }}$$
$$ \frac{{\partial {p_j}}}{{\partial {y_i}}} = \frac{{\partial (\frac{{{e^{{y_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }})}}{{\partial {y_i}}} \\= \frac{{({e^{{y_i}}})'\sum\limits_{j = 1}^K {{e^{{y_j}}}} - {e^{{y_i}}}(\sum\limits_{j = 1}^K {{e^{{y_k}}}} )'}}{{{{(\sum\limits_{j = 1}^K {{e^{{y_j}}}} )}^2}}} \\= \frac{{{e^{{y_i}}}\sum\limits_{j = 1}^K {{e^{{y_i}}}} - {{({e^{{y_i}}})}^2}}}{{{{(\sum\limits_{j = 1}^K {{e^{{y_i}}}} )}^2}}} \\= \frac{{{e^{{y_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }} - \frac{{{{({e^{{y_i}}})}^2}}}{{{{(\sum\limits_{j = 1}^K {{e^{{y_j}}}} )}^2}}} \\= \frac{{{e^{{y_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }}(1 - \frac{{{e^{{y_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }})\\= S({y_i})(1 - S({y_i})\\=p(i)(1-p(i)) $$
接下来咱们只须要把上面的组合起来:
$$\frac{{\partial J}}{{\partial {p_j}}} \cdot \frac{{\partial {p_j}}}{{\partial {y_i}}}\\ \begin{array}{l} = - p(i)(1 - p(i))\sum\limits_{i = 1,i = j}^K {\frac{{{y_i}}}{{{p_i}}}} - p(i)p(j)\sum\limits_{i = 1,i \ne j}^K {\frac{{{y_i}}}{{{p_j}}}}\\= - (1 - p(i))\sum\limits_{i = 1,i = j}^K {{y_i}} - p(i)\sum\limits_{i = 1,i \ne j}^K {{y_i}}\\= - \sum\limits_{i = 1,i = j}^K {{y_i}} + p(i)\sum\limits_{i = 1}^K {{y_i}}\end{array}$$
最后针对分类问题,给定的$y_i$中只会有一个类别是1,其余类别都是0,因此
$$\frac{{\partial J}}{{\partial {p_j}}} \cdot \frac{{\partial {p_j}}}{{\partial {y_i}}} \cdot \frac{{\partial J}}{{\partial {w_n}}} \\= \frac{{\partial {y_i}}}{{\partial {w_n}}}\\=(p(i)-1)w_n$$
注意看,$p(i)-1$是啥?是否是SoftMax层的输出的几率-1,梯度就是这么容易计算!!!太神奇了?!就是为何神经网络分类器要用交叉熵损失函数的缘由!