一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等。

  • 全连接层:等号左边部分就是全连接层做的事,

    • W W W 是全连接层的参数,我们也称为权值,
    • X X X 是全连接层的输入,也就是特征。
    • 从图上可以看出特征 X X XN × 1 N×1 N×1 的向量,这是怎么得到的呢?这个特征就是由全连接层前面多个卷积层和池化层处理后得到的,假设全连接层前面连接的是一个卷积层,这个卷积层的输出是100个特征(也就是我们常说的feature map的channel为100),每个特征的大小是 4 × 4 4×4 4×4,那么在将这些特征输入给全连接层之前会将这些特征flat成 N × 1 N×1 N×1的向量(这个时候 N N N 就是 100 × 4 × 4 = 1600 100×4×4=1600 100×4×4=1600)。
    • 解释完 X X X,再来看 W W WW W W是全连接层的参数,是个 T ∗ N T*N TN 的矩阵,这个 N N NX X XN N N 对应, T T T 表示类别数,比如你是7分类,那么T就是7。我们所说的训练一个网络,对于全连接层而言就是寻找最合适的W矩阵。因此全连接层就是执行 W X WX WX 得到一个 T × 1 T×1 T×1 的向量(也就是图中的 l o g i t s [ T × 1 ] logits[T×1] logits[T×1]
  • l o g i t s [ T × 1 ] logits[T×1] logits[T×1],这个向量里面的每个数都没有大小限制的,也就是从负无穷大到正无穷大。然后如果你是多分类问题,一般会在全连接层后面接一个softmax层,这个softmax的输入是T1的向量,输出也是T1的向量,也就是图中的 p r o b [ T × 1 ] prob[T×1] prob[T×1]
  • p r o b [ T × 1 ] prob[T×1] prob[T×1]:这个向量的每个值表示这个样本属于每个类的概率,只不过输出的向量的每个值的大小范围为0到1。softmax的输出就是概率,即:该样本属于各个类的概率!

一、Softmax(归一化)

1、对普通输入进行Softmax、LogSoftmax

1.1 对普通输入进行Softmax

例如我们的输入是 ( x 1 , x 2 , x 3 , x 4 ) = ( 1 , 2 , 3 , 4 ) (x_1,x_2,x_3,x_4)=(1,2,3,4) (x1,x2,x3,x4)=(1,2,3,4), 那么,Softmax就是对每个元素进行如下的操作:

  • 1 1 1 个元素: x 1 ′ = e x 1 e x 1 + e x 2 + e x 3 + e x 4 = e 1 e 1 + e 2 + e 3 + e 4 = 2.71828 2.71828 + 7.38906 + 20.08554 + 54.59815 = 2.71828 84.79103 = 0.0321 x_1^{'}=\cfrac{e^{x_1}}{e^{x_1}+e^{x_2}+e^{x_3}+e^{x_4}}= \cfrac{e^{1}}{e^{1}+e^{2}+e^{3}+e^{4}}=\cfrac{2.71828}{2.71828+7.38906+20.08554+54.59815}=\cfrac{2.71828}{84.79103}=0.0321 x1=ex1+ex2+ex3+ex4ex1=e1+e2+e3+e4e1=2.71828+7.38906+20.08554+54.598152.71828=84.791032.71828=0.0321
  • 2 2 2 个元素: x 2 ′ = e x 2 e x 1 + e x 2 + e x 3 + e x 4 = e 2 e 1 + e 2 + e 3 + e 4 = 7.38906 2.71828 + 7.38906 + 20.08554 + 54.59815 = 7.38906 84.79103 = 0.0871 x_2^{'}=\cfrac{e^{x_2}}{e^{x_1}+e^{x_2}+e^{x_3}+e^{x_4}}= \cfrac{e^{2}}{e^{1}+e^{2}+e^{3}+e^{4}}=\cfrac{7.38906}{2.71828+7.38906+20.08554+54.59815}=\cfrac{7.38906}{84.79103}=0.0871 x2=ex1+ex2+ex3+ex4ex2=e1+e2+e3+e4e2=2.71828+7.38906+20.08554+54.598157.38906=84.791037.38906=0.0871
  • 3 3 3 个元素: x 3 ′ = e x 3 e x 1 + e x 2 + e x 3 + e x 4 = e 3 e 1 + e 2 + e 3 + e 4 = 20.08554 2.71828 + 7.38906 + 20.08554 + 54.59815 = 20.08554 84.79103 = 0.2369 x_3^{'}=\cfrac{e^{x_3}}{e^{x_1}+e^{x_2}+e^{x_3}+e^{x_4}}= \cfrac{e^{3}}{e^{1}+e^{2}+e^{3}+e^{4}}=\cfrac{20.08554}{2.71828+7.38906+20.08554+54.59815}=\cfrac{20.08554}{84.79103}=0.2369 x3=ex1+ex2+ex3+ex4ex3=e1+e2+e3+e4e3=2.71828+7.38906+20.08554+54.5981520.08554=84.7910320.08554=0.2369
  • 4 4 4 个元素: x 4 ′ = e x 4 e x 1 + e x 2 + e x 3 + e x 4 = e 4 e 1 + e 2 + e 3 + e 4 = 54.59815 2.71828 + 7.38906 + 20.08554 + 54.59815 = 54.59815 84.79103 = 0.6439 x_4^{'}=\cfrac{e^{x_4}}{e^{x_1}+e^{x_2}+e^{x_3}+e^{x_4}}= \cfrac{e^{4}}{e^{1}+e^{2}+e^{3}+e^{4}}=\cfrac{54.59815}{2.71828+7.38906+20.08554+54.59815}=\cfrac{54.59815}{84.79103}=0.6439 x4=ex1+ex2+ex3+ex4ex4=e1+e2+e3+e4e4=2.71828+7.38906+20.08554+54.5981554.59815=84.7910354.59815=0.6439
import torch
import torch.nn as nnsoft_max = nn.Softmax(dim=0)
input = torch.tensor([1.0, 2.0, 3.0, 4.0])
output = soft_max(input)
print("output = ", output)

打印结果:

output =  tensor([0.0321, 0.0871, 0.2369, 0.6439])Process finished with exit code 0

1.2 对普通输入进行LogSoftmax

LogSoftmax就是对Softmax处理后的每个元素计算 l o g log logl n ln ln 值:

  • 1 1 1 个元素 : x 1 ′ ′ = l n ( x 1 ′ ) = l n ( 0.0321 ) = − 3.4402 x_1^{''}=ln(x_1^{'})=ln(0.0321)=-3.4402 x1′′=ln(x1)=ln(0.0321)=3.4402
  • 2 2 2 个元素 : x 2 ′ ′ = l n ( x 2 ′ ) = l n ( 0.0871 ) = − 2.4402 x_2^{''}=ln(x_2^{'})=ln(0.0871)=-2.4402 x2′′=ln(x2)=ln(0.0871)=2.4402
  • 3 3 3 个元素 : x 3 ′ ′ = l n ( x 3 ′ ) = l n ( 0.2369 ) = − 1.4402 x_3^{''}=ln(x_3^{'})=ln(0.2369)=-1.4402 x3′′=ln(x3)=ln(0.2369)=1.4402
  • 4 4 4 个元素 : x 4 ′ ′ = l n ( x 4 ′ ) = l n ( 0.6439 ) = − 0.4402 x_4^{''}=ln(x_4^{'})=ln(0.6439)=-0.4402 x4′′=ln(x4)=ln(0.6439)=0.4402
import torch
import torch.nn as nninput = torch.tensor([1.0, 2.0, 3.0, 4.0])log_soft_max = nn.LogSoftmax(dim=0)
log_softmax_output = log_soft_max(input)
print("log_softmax_output = ", log_softmax_output)

打印结果:

log_softmax_output =  tensor([-3.4402, -2.4402, -1.4402, -0.4402])Process finished with exit code 0

2、对神经网络的输出进行Softmax


通常将网络最后一个全连接层的输入,即上面的 x \textbf{x} x,视为网络从输入数据提取到的特征。





1、步骤01:样品 x i \textbf{x}^i xi 与第 j j j 类的特征模板 w j T \textbf{w}_j^T wjT 分别进行比对,得到样本 x i \textbf{x}^i xi 属于第 j j j 类的分数 z j i z_j^i zji

z i = [ z 1 i z 2 i z 3 i ⋮ z j i ⋮ z K i ] = [ w 1 T ⋅ x i w 2 T ⋅ x i w 3 T ⋅ x i ⋮ w j T ⋅ x i ⋮ w K T ⋅ x i ] = [ w 1 T w 2 T w 3 T ⋮ w j T ⋮ w K T ] ⋅ x i = [ w 1 , 1 w 1 , 2 w 1 , 3 ⋯ w 1 , n ⋯ w 1 , N w 2 , 1 w 2 , 2 w 2 , 3 ⋯ w 2 , n ⋯ w 2 , N w 3 , 1 w 3 , 2 w 3 , 3 ⋯ w 3 , n ⋯ w 3 , N ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ w j , 1 w j , 2 w j , 3 ⋯ w j , n ⋯ w j , N ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ w K , 1 w K , 2 w K , 3 ⋯ w K , n ⋯ w K , N ] ⋅ [ x 1 i x 2 i x 3 i ⋮ x n i ⋮ x N i ] \begin{aligned} \textbf{z}^i= \begin{bmatrix} z_1^i\\[1ex] z_2^i\\[1ex] z_3^i\\[1ex] \vdots\\[1ex] z_j^i\\[1ex] \vdots\\[1ex] z_K^i\\[1ex] \end{bmatrix} =\begin{bmatrix} \textbf{w}_1^T·\textbf{x}^i\\[1ex] \textbf{w}_2^T·\textbf{x}^i\\[1ex] \textbf{w}_3^T·\textbf{x}^i\\[1ex] \vdots\\ \textbf{w}_j^T·\textbf{x}^i\\[1ex] \vdots\\ \textbf{w}_K^T·\textbf{x}^i\\ \end{bmatrix} =\begin{bmatrix} \textbf{w}_1^T\\[1ex] \textbf{w}_2^T\\[1ex] \textbf{w}_3^T\\[1ex] \vdots\\ \textbf{w}_j^T\\[1ex] \vdots\\ \textbf{w}_K^T\\ \end{bmatrix}·\textbf{x}^i = \begin{bmatrix} w_{1,1} & w_{1,2} & w_{1,3} & \cdots & w_{1,n} & \cdots & w_{1,N} \\ w_{2,1} & w_{2,2} & w_{2,3} & \cdots & w_{2,n} & \cdots & w_{2,N} \\ w_{3,1} & w_{3,2} & w_{3,3} & \cdots & w_{3,n} & \cdots & w_{3,N} \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots \\ w_{j,1} & w_{j,2} & w_{j,3} & \cdots & w_{j,n} & \cdots & w_{j,N} \\ \vdots & \vdots & \vdots & \ddots& \vdots & \vdots & \vdots \\ w_{K,1} & w_{K,2} & w_{K,3} & \cdots & w_{K,n} & \cdots & w_{K,N} \\ \end{bmatrix}·\begin{bmatrix} x_1^i\\ x_2^i\\ x_3^i\\ \vdots\\ x_n^i\\ \vdots\\ x_N^i\\ \end{bmatrix} \end{aligned} zi=

z1iz2iz3izjizKi

=

w1Txiw2Txiw3TxiwjTxiwKTxi

=

w1Tw2Tw3TwjTwKT

xi=

w1,1w2,1w3,1wj,1wK,1w1,2w2,2w3,2wj,2wK,2w1,3w2,3w3,3wj,3wK,3w1,nw2,nw3,nwj,nwK,nw1,Nw2,Nw3,Nwj,NwK,N

x1ix2ix3ixnixNi

其中:

  • z j i = w j T ⋅ x i = w j , 1 x 1 i + w j , 2 x 2 i + . . . w j , n x n i + . . . + w j , N x N i z_j^i=\textbf{w}_j^T·\textbf{x}^i=w_{j,1}x_1^i+w_{j,2}x_2^i+...w_{j,n}x_n^i+...+w_{j,N}x_N^i zji=wjTxi=wj,1x1i+wj,2x2i+...wj,nxni+...+wj,NxNi
  • N N N:表示样本数据维度;
  • K K K:表示总的类别数量为 K K K
  • i i i:表示样本编号;
  • x i \textbf{x}_i xi:表示样本 i i i
  • x i , n x_{i,n} xi,n:表示样本 x i \textbf{x}_i xi 的第 n n n 维度的值;
  • w j \textbf{w}_j wj:表示第 j j j 类的权重向量;
  • w j , n w_{j,n} wj,n:表示 j j j 类的权重向量在第 n n n 维度的值;

2、步骤02:使用Softmax函数归一化样本 x i \textbf{x}^i xi 属于第 k k k 类的分数 z k i z_k^i zki

y ^ k i = p ( c = k ∣ x i ; w ) = S o f t m a x ( c = k ∣ x i ; w ) = S o f t m a x ( z k i ) = e z k i ∑ j = 1 K e z j i = e w k T x i ∑ j = 1 K e w j T x i \begin{aligned} \hat{y}_k^i&=p(c=k|\textbf{x}^i;\textbf{w})\\[1ex] &=Softmax(c=k|\textbf{x}^i;\textbf{w})\\[1ex] &=Softmax(z_k^i)\\[1ex] &=\cfrac{e^{z_k^i}}{\sum^K_{j=1}e^{z_j^i}}\\[1ex] &=\cfrac{e^{\textbf{w}_k^T\textbf{x}^i}}{\sum^K_{j=1}e^{\textbf{w}_j^T\textbf{x}^i}} \end{aligned} y^ki=p(c=kxi;w)=Softmax(c=kxi;w)=Softmax(zki)=j=1Kezjiezki=j=1KewjTxiewkTxi

其中:

  • c = k c=k c=k:表示 x i \textbf{x}_i xi 样本的类别为 k k k 类;
  • K K K:表示总的类别数量为 K K K
  • y ^ k i \hat{y}_k^i y^ki:表示第 i i i 号样本 x i \textbf{x}^i xi 属于类别 k k k 的预测概率;所有 K K Ky ^ k i \hat{y}_k^i y^ki 的总和恒等于 1 1 1
  • x i \textbf{x}^i xi:表示样本 i i i
  • w k T \textbf{w}_k^T wkT:表示第 k k k 类的权重向量; w k T = [ w k , 1 w k , 2 w k , 3 ⋯ w k , n ⋯ w k , N ] \textbf{w}_k^T=\begin{bmatrix}w_{k,1} & w_{k,2} & w_{k,3} & \cdots & w_{k,n} & \cdots & w_{k,N}\end{bmatrix} wkT=[wk,1wk,2wk,3wk,nwk,N]N N N 表示样本的数据维度;
  • w j T \textbf{w}_j^T wjT:表示第 j j j 类的权重向量,其中 j = 1 , 2 , . . . , K j=1,2,...,K j=1,2,...,K

二、CrossEntropyLoss(交叉熵损失函数)【多分类,即一个样本只能属于一个类别】

首先我们先不管Pytorch中是如何实现交叉熵的,我们先自己来看一下交叉熵是如何计算的。

多分类(一个样本只能属于一个类别)交叉熵的计算公式如下所示:

L o s s = − ∑ i = 1 N l o s s i = − ∑ i = 1 N y i ∗ l o g ( y ^ i ) Loss = -\sum_{i=1}^{N}loss^i= -\sum_{i=1}^{N}{y_{i}*log(\hat{y}_{i})} Loss=i=1Nlossi=i=1Nyilog(y^i)

其中:

  • i i i:是样本编号;
  • y i y_i yi:是实际值;
  • y i ^ \hat{y_{i}} yi^:是预测值;

假设类别总数量为 4 4 4 类,对于样本 x 1 x_1 x1 的分类的predict为 ( 0.0321 , 0.0871 , 0.2369 , 0.6439 ) (0.0321, 0.0871, 0.2369, 0.6439) (0.0321,0.0871,0.2369,0.6439),target为 ( 0 , 0 , 0 , 1 ) (0,0,0,1) (0,0,0,1),则样本 x 1 x_1 x1 的交叉熵损失就是:

l o s s 1 = y 1 ∗ l o g ( y ^ 1 ) = − 1 × l n ( 0.6439 ) = 0.4402 loss^1={y_{1}*log(\hat{y}_{1})}=-1×ln(0.6439)=0.4402 loss1=y1log(y^1)=1×ln(0.6439)=0.4402

三、Softmax Loss(Softmax + CrossEntropyLoss)

1、单个样本 x i \textbf{x}^i xi 的 Softmax Loss公式

l o s s i = − ∑ j = 1 K y j l o g ( y ^ j i ) = 样本 i 只属于一个类别 k − l o g ( y ^ k i ) loss^i = -\sum_{j=1}^{K}y_{j} log (\hat{y}_j^i)\xlongequal[]{样本i只属于一个类别k}- log (\hat{y}_k^i) lossi=j=1Kyjlog(y^ji)样本i只属于一个类别k

log(y^ki)

  • 首先 l o s s i loss^i lossi 表示样本 i i i 的损失。
  • y ^ j i \hat{y}_j^i y^ji 表示的是样本 i i i 属于类别 j j j 的预测概率。
  • y j y_j yj 表示的是样本 i i i 属于类别 j j j 的真实概率;前面有个求和符号, j j j 的范围也是 1 1 1 到类别数 K K K,因此 y \text{y} y 是一个 1 × K 1×K 1×K 的向量,里面的 K K K 个值,
    • 多分类任务:如果每个样本只属于一个类别,则只有 1 1 1 个值是 1 1 1,其他 K − 1 K-1 K1 个值都是 0 0 0。那么哪个位置的值是 1 1 1 呢?答案是真实标签对应的位置的那个值是 1 1 1,其他都是 0 0 0

      比如:假设类别总数为5类,样本3真实类别为 c 5 c_5 c5 (多分类任务),则样本3的损失函数:
      l o s s 3 = − ∑ j = 1 K y j 3 ⋅ l o g ( y ^ j 3 ) = − [ y 1 3 ⋅ l o g ( y ^ 1 3 ) + y 2 3 ⋅ l o g ( y ^ 2 3 ) + y 3 3 ⋅ l o g ( y ^ 3 3 ) + y 4 3 ⋅ l o g ( y ^ 4 3 ) + y 5 3 ⋅ l o g ( y ^ 5 3 ) ] = − [ 0 ⋅ l o g ( y ^ 1 3 ) + 0 ⋅ l o g ( y ^ 2 3 ) + 0 ⋅ l o g ( y ^ 3 3 ) + 0 ⋅ l o g ( y ^ 4 3 ) + 1 ⋅ l o g ( y ^ 5 3 ) ] = − [ 1 ⋅ l o g ( y ^ 5 3 ) ] = − l o g ( y ^ 5 3 ) \begin{aligned} loss^3=-\sum_{j=1}^Ky_j^3·log(\hat{y}_j^3) &=-[y_1^3·log(\hat{y}_1^3)+y_2^3·log(\hat{y}_2^3)+y_3^3·log(\hat{y}_3^3)+y_4^3·log(\hat{y}_4^3)+y_5^3·log(\hat{y}_5^3)]\\[1ex] &=-[0·log(\hat{y}_1^3)+0·log(\hat{y}_2^3)+0·log(\hat{y}_3^3)+0·log(\hat{y}_4^3)+1·log(\hat{y}_5^3)]\\[1ex] &=-[1·log(\hat{y}_5^3)]\\[1ex] &=-log(\hat{y}_5^3) \end{aligned} loss3=j=1Kyj3log(y^j3)=[y13log(y^13)+y23log(y^23)+y33log(y^33)+y43log(y^43)+y53log(y^53)]=[0log(y^13)+0log(y^23)+0log(y^33)+0log(y^43)+1log(y^53)]=[1log(y^53)]=log(y^53)
    • 多标签分类任务:如果每个样本可以属于多个类别(多标签分类),则可以由 t t t 个值为 1 1 1,其他 K − t K-t Kt 个值为 0 0 0

      比如:假设类别总数为5类,样本3真实类别为 c 1 c_1 c1c 5 c_5 c5 (多标签分类任务),则样本3的损失函数:
      l o s s 3 = − ∑ j = 1 K y j 3 ⋅ l o g ( y ^ j 3 ) = − [ y 1 3 ⋅ l o g ( y ^ 1 3 ) + y 2 3 ⋅ l o g ( y ^ 2 3 ) + y 3 3 ⋅ l o g ( y ^ 3 3 ) + y 4 3 ⋅ l o g ( y ^ 4 3 ) + y 5 3 ⋅ l o g ( y ^ 5 3 ) ] = − [ 1 ⋅ l o g ( y ^ 1 3 ) + 0 ⋅ l o g ( y ^ 2 3 ) + 0 ⋅ l o g ( y ^ 3 3 ) + 0 ⋅ l o g ( y ^ 4 3 ) + 1 ⋅ l o g ( y ^ 5 3 ) ] = − [ 1 ⋅ l o g ( y ^ 1 3 ) + 1 ⋅ l o g ( y ^ 5 3 ) ] = − [ l o g ( y ^ 1 3 ) + l o g ( y ^ 5 3 ) ] \begin{aligned} loss^3=-\sum_{j=1}^Ky_j^3·log(\hat{y}_j^3) &=-[y_1^3·log(\hat{y}_1^3)+y_2^3·log(\hat{y}_2^3)+y_3^3·log(\hat{y}_3^3)+y_4^3·log(\hat{y}_4^3)+y_5^3·log(\hat{y}_5^3)]\\[1ex] &=-[1·log(\hat{y}_1^3)+0·log(\hat{y}_2^3)+0·log(\hat{y}_3^3)+0·log(\hat{y}_4^3)+1·log(\hat{y}_5^3)]\\[1ex] &=-[1·log(\hat{y}_1^3)+1·log(\hat{y}_5^3)]\\[1ex] &=-[log(\hat{y}_1^3)+log(\hat{y}_5^3)] \end{aligned} loss3=j=1Kyj3log(y^j3)=[y13log(y^13)+y23log(y^23)+y33log(y^33)+y43log(y^43)+y53log(y^53)]=[1log(y^13)+0log(y^23)+0log(y^33)+0log(y^43)+1log(y^53)]=[1log(y^13)+1log(y^53)]=[log(y^13)+log(y^53)]

2、样本集 x \textbf{x} x 的 Softmax Loss公式(多分类任务,非多标签任务)

L o s s = − 1 N ∑ i = 1 N l o s s i = − 1 N ∑ i = 1 N ∑ k = 1 K y k i ⋅ l o g ( y ^ k i ) = 样本 i 只属于一个类别 k − 1 N ∑ i = 1 N l o g y ^ k i = − 1 N ∑ i = 1 N l o g [ f ( z k i ) ] = − 1 N ∑ i = 1 N l o g e z k i ∑ j = 1 K e z j i = − 1 N ∑ i = 1 N l o g e w k T x i ∑ j = 1 K e w j T x i = 样本 i 的真实类别 k 记为 y i − 1 N ∑ i = 1 N l o g e w y i T x i ∑ j = 1 K e w j T x i \color{red}{\begin{aligned} Loss&=-\cfrac{1}{N}\sum_{i=1}^Nloss^i\\ &=-\cfrac{1}{N}\sum_{i=1}^N\sum_{k=1}^Ky_k^i·log(\hat{y}_k^i)\\ &\xlongequal[]{样本i只属于一个类别k}-\cfrac{1}{N}\sum_{i=1}^Nlog\hat{y}_k^i\\ &=-\cfrac{1}{N}\sum_{i=1}^Nlog[f(z_k^i)]\\ &=-\cfrac{1}{N}\sum_{i=1}^Nlog\cfrac{e^{z_k^i}}{\sum^K_{j=1}e^{z_j^i}}\\[1ex] &=-\cfrac{1}{N}\sum_{i=1}^Nlog\cfrac{e^{\textbf{w}_k^T\textbf{x}^i}}{\sum^K_{j=1}e^{\textbf{w}_j^T\textbf{x}^i}}\\ &\xlongequal[]{样本i的真实类别k记为y_i}-\cfrac{1}{N}\sum_{i=1}^Nlog\cfrac{e^{\textbf{w}_{y_i}^T\textbf{x}^i}}{\sum^K_{j=1}e^{\textbf{w}_j^T\textbf{x}^i}} \end{aligned}} Loss=N1i=1Nlossi=N1i=1Nk=1Kykilog(y^ki)样本i只属于一个类别k

N1i=1Nlogy^ki=N1i=1Nlog[f(zki)]=N1i=1Nlogj=1Kezjiezki=N1i=1Nlogj=1KewjTxiewkTxi样本i的真实类别k记为yi

N1i=1Nlogj=1KewjTxiewyiTxi

其中:

  • N N N:表示样本总数量;
  • K K K:表示总的类别数量为 K K K
  • k k k:表示样本 x i \textbf{x}^i xi 的真实标签类别,记为 y i y_i yi
  • y ^ k i \hat{y}_k^i y^ki:表示第 i i i 号样本 x i \textbf{x}^i xi 属于类别 k k k 的预测概率;所有 K K Ky ^ k i \hat{y}_k^i y^ki 的总和恒等于 1 1 1
  • x i \textbf{x}^i xi:表示样本 i i i
  • w k T \textbf{w}_k^T wkT:表示第 k k k 类的权重向量; w k T = [ w k , 1 w k , 2 w k , 3 ⋯ w k , n ⋯ w k , N ] \textbf{w}_k^T=\begin{bmatrix}w_{k,1} & w_{k,2} & w_{k,3} & \cdots & w_{k,n} & \cdots & w_{k,N}\end{bmatrix} wkT=[wk,1wk,2wk,3wk,nwk,N]N N N 表示样本的数据维度;
  • w j T \textbf{w}_j^T wjT:表示第 j j j 类的权重向量,其中 j = 1 , 2 , . . . , K j=1,2,...,K j=1,2,...,K

四、Softmax详解

1、softmax执行了什么操作可以得到0到1的概率

softmax执行了什么操作可以得到0到1的概率呢?先来看看softmax的公式

S j = e a j ∑ k = 1 N e a k ∀ j ∈ 1.. N S_j=\frac{e^{a_j}}{\sum_{k=1}^{N}e^{a_k}} \qquad \forall j \in 1..N Sj=k=1Neakeajj1..N

  • 前面说过softmax层的输入是 W ⋅ X W·X WX,假设模型的输入样本是 I I I,讨论一个 3 3 3 分类问题(类别用1,2,3表示),样本 I I I 的真实类别是 2 2 2,那么这个样本 I I I 经过网络所有层到达softmax层之前就得到了 W ⋅ X W·X WX,也就是说 W ⋅ X W·X WX是一个3*1的向量,
  • 那么上面公式中的 a j a_j aj 就表示这个 3 × 1 3×1 3×1 的向量中的第 j j j 个值(最后会得到 S 1 S_1 S1S 2 S_2 S2S 3 S_3 S3);
  • 而分母中的 a k a_k ak(k:1~N) 则表示 3 × 1 3×1 3×1 的向量中的 3 3 3 个值,所以会有个求和符号(这里求和是 k k k1 1 1T T TT T T 和上面图中的 T T T是对应相等的,也就是类别数的意思, j j j 的范围也是 1 1 1T T T)。
  • 因为 e x e^x ex 恒大于0,所以分子永远是正数,分母又是多个正数的和,所以分母也肯定是正数,
  • 因此 S j S_j Sj是正数,而且范围是(0,1); S j = P ( y = j ∣ a ) S_j=P(y=j|a) Sj=P(y=ja)
  • 如果现在不是在训练模型,而是在测试模型,那么当一个样本经过softmax层并输出一个 T × 1 T×1 T×1 的向量时,就会取这个向量中值最大的那个数的index作为这个样本的预测标签。

因此:我们训练全连接层的 W W W 的目标就是使得其输出的 W ⋅ X W·X WX在经过softmax层计算后其对应于真实标签的预测概率要最高。

举个例子:假设你的 W ⋅ X = [ 1 , 2 , 3 ] W·X=[1,2,3] WX=[1,2,3],那么经过softmax层后就会得到 [ 0.09 , 0.24 , 0.67 ] [0.09,0.24,0.67] [0.09,0.24,0.67],这三个数字表示这个样本属于第1,2,3类的概率分别是 0.09,0.24,0.67。

2、Softmax中的soft的解释

Softmax是soft(软化)的max。在CNN的分类问题中,我们的ground truth是one-hot形式,下面以四分类为例,理想输出应该是(1,0,0,0),或者说(100%,0%,0%,0%),这就是我们想让CNN学到的终极目标。

网络输出的幅值千差万别,输出最大的那一路对应的就是我们需要的分类结果。通常用百分比形式计算分类置信度,最简单的方式就是计算输出占比,假设输出特征是 ( x 1 , x 2 , x 3 , x 4 ) (x_{1}, x_{2}, x_{3}, x_{4}) (x1,x2,x3,x4),这种最直接最最普通的方式,相对于soft的max,在这里我们把它叫做hard的max:

而现在通用的是soft的max,将每个输出x非线性放大到exp(x),形式如下:

hard的max和soft的max到底有什么区别呢?看几个例子


相同输出特征情况,soft max比hard max更容易达到终极目标one-hot形式,或者说,softmax降低了训练难度,使得多分类问题更容易收敛。

到底想说什么呢?Softmax鼓励真实目标类别输出比其他类别要大,但并不要求大很多。对于人脸识别的特征映射(feature embedding)来说,Softmax鼓励不同类别的特征分开,但并不鼓励特征分离很多,如上表(5,1,1,1)时loss就已经很小了,此时CNN接近收敛梯度不再下降。

五、Softmax Loss 的局限性

Softmax Loss训练CNN,MNIST上10分类的2维特征映射可视化如下:


不同类别明显分开了,但这种情况并不满足我们人脸识别中特征向量对比的需求。人脸识别中特征向量相似度计算,常用欧式距离(L2 distance)和余弦距离(cosine distance),我们分别讨论这两种情况:

  • L2距离:L2距离越小,向量相似度越高。可能同类的特征向量距离(黄色)比不同类的特征向量距离(绿色)更大
  • cos距离:夹角越小,cos距离越大,向量相似度越高。可能同类的特征向量夹角(黄色)比不同类的特征向量夹角(绿色)更大

    Softmax Loss函数经常在卷积神经网络中被广泛应用,但是这种形式并不能够有效地学习得到使得类内较为紧凑、类间较离散的特征。
  1. Softmax训练的深度特征,会把整个超空间或者超球,按照分类个数进行划分,保证类别是可分的,这一点对多分类任务如MNIST和ImageNet非常合适,因为测试类别必定在训练类别中。
  2. 但Softmax并不要求类内紧凑和类间分离,这一点非常不适合人脸识别任务,因为训练集的1W人数,相对测试集整个世界70亿人类来说,非常微不足道,而我们不可能拿到所有人的训练样本,更过分的是,一般我们还要求训练集和测试集不重叠。
  3. 所以需要改造Softmax,除了保证可分性外,还要做到特征向量类内尽可能紧凑,类间尽可能分离。

六、对Softmax Loss的改进方案

  • Large-Margin Softmax Loss
  • SphereFace
  • CosFace
  • ArcFace



参考资料:
损失函数|交叉熵损失函数
交叉熵损失函数
GitHub:ML_Practice/2019_03_17/Pytorch交叉熵介绍.ipynb
PyTorch中交叉熵的计算-CrossEntropyLoss 介绍
softmax loss详解,softmax与交叉熵的关系
神经网络全连接层+softmax
神经网络最后一层全连接+Softmax的理解
人脸识别的LOSS(上)
【技术综述】一文道尽softmax loss及其变种(2018年版)
The Softmax function and its derivative
【损失函数系列】softmax loss损失函数详解
loss函数之BCELoss
Understanding Categorical Cross-Entropy Loss, Binary Cross-Entropy Loss, Softmax Loss, Logistic Loss, Focal Loss and all those confusing names
softmax回归原理与实现
直观理解为什么分类问题用交叉熵损失而不用均方误差损失?
【机器学习】详解 Softmax Cross Entropy Loss
【损失函数系列】softmax loss损失函数详解

人脸识别-Loss-2010:Softmax Loss(Softmax激活函数 + “交叉熵损失函数”)【样本3真实标签为c_5,则样本3的损失:loss_3=-log(\hat{y}_5^3)】相关推荐

  1. 深度学习基础入门篇[五]:交叉熵损失函数、MSE、CTC损失适用于字识别语音等序列问题、Balanced L1 Loss适用于目标检测

    [深度学习入门到进阶]必看系列,含激活函数.优化策略.损失函数.模型调优.归一化算法.卷积模型.序列模型.预训练模型.对抗神经网络等 专栏详细介绍:[深度学习入门到进阶]必看系列,含激活函数.优化策略 ...

  2. 交叉熵损失函数优缺点_【损失函数】常见的损失函数(loss function)总结

    阅读大概需要7分钟 跟随小博主,每天进步一丢丢 机器学习算法与自然语言处理出品 @公众号原创专栏作者 yyHaker 单位 | 哈工大SCIR实验室 损失函数用来评价模型的预测值和真实值不一样的程度, ...

  3. 深度学习中softmax交叉熵损失函数的理解

    1. softmax层的作用 通过神经网络解决多分类问题时,最常用的一种方式就是在最后一层设置n个输出节点,无论在浅层神经网络还是在CNN中都是如此,比如,在AlexNet中最后的输出层有1000个节 ...

  4. 简单易懂的softmax交叉熵损失函数求导

    简单易懂的softmax交叉熵损失函数求导 本博客转自:http://m.blog.csdn.net/qian99/article/details/78046329 来写一个softmax求导的推导过 ...

  5. SoftMax函数,交叉熵损失函数与熵,对数似然函数

    深度学习以及机器学习中都会用到SoftMax函数,交叉熵损失函数与熵,对数似然函数等一些数学方面的知识,此文作为个人学习笔记. 1.softmax函数 (1)定义 多分类问题中,我们可以使用SoftM ...

  6. 二分类交叉熵损失函数python_【深度学习基础】第二课:softmax分类器和交叉熵损失函数...

    [深度学习基础]系列博客为学习Coursera上吴恩达深度学习课程所做的课程笔记. 本文为原创文章,未经本人允许,禁止转载.转载请注明出处. 1.线性分类 如果我们使用一个线性分类器去进行图像分类该怎 ...

  7. Softmax函数下的交叉熵损失含义与求导

    交叉熵损失函数(CrossEntropy Function)是分类任务中十分常用的损失函数,但若仅仅看它的形式,我们不容易直接靠直觉来感受它的正确性,因此我查阅资料写下本文,以求彻底搞懂. 1.Sof ...

  8. 训练分类器为什么要用cross entropy loss(交叉熵损失函数)而不能用mean square error loss(MSE,最小平方差损失函数)?

    在一个人工智能群里,有人问起,训练分类器为什么要用cross entropy loss(交叉熵损失函数)而不能用mean square error loss(MSE,最小平方差损失函数)呢? 正好,在 ...

  9. 损失函数——交叉熵损失函数(CrossEntropy Loss)

    损失函数--交叉熵损失函数(CrossEntropy Loss) 交叉熵函数为在处理分类问题中常用的一种损失函数,其具体公式为: 1.交叉熵损失函数由来 交叉熵是信息论中的一个重要概念,主要用于度量两 ...

最新文章

  1. python库引用的3种方式比较
  2. 计算机组成原理重要知识,计算机组成原理重要知识点解析
  3. Linux中命令链接操作符的十个最佳实例
  4. IBM发表论文:可能已找到处理量子计算退相干的方法
  5. Linux-SNAT和DNAT
  6. Vue 从入门到进阶之路(十四)
  7. c语言星空程序,C语言实现动态星空
  8. VC++ (二)类的访问级别
  9. Nsight中给工程添加include目录
  10. android按键精灵 释放内存,类人猿按键精灵安卓内存基础教程
  11. Abobe Flash cs6 和 Abobe Flash Builder4.6 破解和许可证过期
  12. Python利用selenium实现自动登录网页qq
  13. ca盘显示无证书_CA证书使用问题及解决方法
  14. VirtualBox系统虚拟盘格式转换vdi/vhd/vmdk
  15. Python串口通信发送浮点型数据
  16. 【图像处理】双线性插值法扩展图像像素及其代码实现(亚像素)
  17. Word全英文件怎么翻译
  18. 辗转相除求最大公约数原理
  19. linux设置NLS_LANG
  20. 使用日历热图进行时序数据可视化

热门文章

  1. 【交换机】网络交换机的作用
  2. 如何彻底删除keil5
  3. Buffon's Needle
  4. [新闻观察]中国网络“名人博客”风声水起
  5. 苹果4S手机IOS6.1.3系统《微信6.2》登录失败解决办法!100%成功!小白也会用!
  6. 浙江大学计算机学院保研率,新鲜出炉:浙大、中科大、复旦大学2021届保研率、各专业推免人数...
  7. 免费开源的云尚发卡V1.5.7
  8. 参加高中毕业十年同学会有感
  9. 【网易邮箱】换绑安全手机(①之前的手机号注销了怎么办 ②网易人工客服在哪)
  10. shell wait 等待命令