admin 管理员组

文章数量: 887021

人脸识别

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

  • 全连接层:等号左边部分就是全连接层做的事,
    • W W W 是全连接层的参数,我们也称为权值,
    • X X X 是全连接层的输入,也就是特征。
    • 从图上可以看出特征 X X X 是 N × 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 W, W W W是全连接层的参数,是个 T ∗ N T*N T∗N 的矩阵,这个 N N N 和 X X X 的 N 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​+ex4​ex1​​=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​+ex4​ex2​​=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​+ex4​ex3​​=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​+ex4​ex4​​=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 log 或 l 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=⎣ ⎡​z1i​z2i​z3i​⋮zji​⋮zKi​​⎦ ⎤​=⎣ ⎡​w1T​⋅xiw2T​⋅xiw3T​⋅xi⋮wjT​⋅xi⋮wKT​⋅xi​⎦ ⎤​=⎣ ⎡​w1T​w2T​w3T​⋮wjT​⋮wKT​​⎦ ⎤​⋅xi=⎣ ⎡​w1,1​w2,1​w3,1​⋮wj,1​⋮wK,1​​w1,2​w2,2​w3,2​⋮wj,2​⋮wK,2​​w1,3​w2,3​w3,3​⋮wj,3​⋮wK,3​​⋯⋯⋯⋱⋯⋱⋯​w1,n​w2,n​w3,n​⋮wj,n​⋮wK,n​​⋯⋯⋯⋮⋯⋮⋯​w1,N​w2,N​w3,N​⋮wj,N​⋮wK,N​​⎦ ⎤​⋅⎣ ⎡​x1i​x2i​x3i​⋮xni​⋮xNi​​⎦ ⎤​​

其中:

  • 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​=wjT​⋅xi=wj,1​x1i​+wj,2​x2i​+...wj,n​xni​+...+wj,N​xNi​
  • 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=k∣xi;w)=Softmax(c=k∣xi;w)=Softmax(zki​)=∑j=1K​ezji​ezki​​=∑j=1K​ewjT​xiewkT​xi​​

其中:

  • 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 K 个 y ^ 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,1​​wk,2​​wk,3​​⋯​wk,n​​⋯​wk,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=1∑N​lossi=−i=1∑N​yi​∗log(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=y1​∗log(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=1∑K​yj​log(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 K−1 个值都是 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=1∑K​yj3​⋅log(y^​j3​)​=−[y13​⋅log(y^​13​)+y23​⋅log(y^​23​)+y33​⋅log(y^​33​)+y43​⋅log(y^​43​)+y53​⋅log(y^​53​)]=−[0⋅log(y^​13​)+0⋅log(y^​23​)+0⋅log(y^​33​)+0⋅log(y^​43​)+1⋅log(y^​53​)]=−[1⋅log(y^​53​)]=−log(y^​53​)​
    • 多标签分类任务:如果每个样本可以属于多个类别(多标签分类),则可以由 t t t 个值为 1 1 1,其他 K − t K-t K−t 个值为 0 0 0。

      比如:假设类别总数为5类,样本3真实类别为 c 1 c_1 c1​, 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 ) ] = − [ 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=1∑K​yj3​⋅log(y^​j3​)​=−[y13​⋅log(y^​13​)+y23​⋅log(y^​23​)+y33​⋅log(y^​33​)+y43​⋅log(y^​43​)+y53​⋅log(y^​53​)]=−[1⋅log(y^​13​)+0⋅log(y^​23​)+0⋅log(y^​33​)+0⋅log(y^​43​)+1⋅log(y^​53​)]=−[1⋅log(y^​13​)+1⋅log(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​=−N1​i=1∑N​lossi=−N1​i=1∑N​k=1∑K​yki​⋅log(y^​ki​)样本i只属于一个类别k ​−N1​i=1∑N​logy^​ki​=−N1​i=1∑N​log[f(zki​)]=−N1​i=1∑N​log∑j=1K​ezji​ezki​​=−N1​i=1∑N​log∑j=1K​ewjT​xiewkT​xi​样本i的真实类别k记为yi​ ​−N1​i=1∑N​log∑j=1K​ewjT​xiewyi​T​xi​​

其中:

  • 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 K 个 y ^ 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,1​​wk,2​​wk,3​​⋯​wk,n​​⋯​wk,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=1N​eak​eaj​​∀j∈1..N

  • 前面说过softmax层的输入是 W ⋅ X W·X W⋅X,假设模型的输入样本是 I I I,讨论一个 3 3 3 分类问题(类别用1,2,3表示),样本 I I I 的真实类别是 2 2 2,那么这个样本 I I I 经过网络所有层到达softmax层之前就得到了 W ⋅ X W·X W⋅X,也就是说 W ⋅ X W·X W⋅X是一个3*1的向量,
  • 那么上面公式中的 a j a_j aj​ 就表示这个 3 × 1 3×1 3×1 的向量中的第 j j j 个值(最后会得到 S 1 S_1 S1​, S 2 S_2 S2​, S 3 S_3 S3​);
  • 而分母中的 a k a_k ak​(k:1~N) 则表示 3 × 1 3×1 3×1 的向量中的 3 3 3 个值,所以会有个求和符号(这里求和是 k k k 从 1 1 1 到 T T T, T T T 和上面图中的 T T T是对应相等的,也就是类别数的意思, j j j 的范围也是 1 1 1到 T 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=j∣a);
  • 如果现在不是在训练模型,而是在测试模型,那么当一个样本经过softmax层并输出一个 T × 1 T×1 T×1 的向量时,就会取这个向量中值最大的那个数的index作为这个样本的预测标签。

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

举个例子:假设你的 W ⋅ X = [ 1 , 2 , 3 ] W·X=[1,2,3] W⋅X=[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损失函数详解

本文标签: 人脸识别