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+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 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=⎣ ⎡z1iz2iz3i⋮zji⋮zKi⎦ ⎤=⎣ ⎡w1T⋅xiw2T⋅xiw3T⋅xi⋮wjT⋅xi⋮wKT⋅xi⎦ ⎤=⎣ ⎡w1Tw2Tw3T⋮wjT⋮wKT⎦ ⎤⋅xi=⎣ ⎡w1,1w2,1w3,1⋮wj,1⋮wK,1w1,2w2,2w3,2⋮wj,2⋮wK,2w1,3w2,3w3,3⋮wj,3⋮wK,3⋯⋯⋯⋱⋯⋱⋯w1,nw2,nw3,n⋮wj,n⋮wK,n⋯⋯⋯⋮⋯⋮⋯w1,Nw2,Nw3,N⋮wj,N⋮wK,N⎦ ⎤⋅⎣ ⎡x1ix2ix3i⋮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,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=k∣xi;w)=Softmax(c=k∣xi;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 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,1wk,2wk,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∑Nlossi=−i=1∑Nyi∗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∑Kyjlog(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∑Kyj3⋅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∑Kyj3⋅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)]
- 多分类任务:如果每个样本只属于一个类别,则只有 1 1 1 个值是 1 1 1,其他 K − 1 K-1 K−1 个值都是 0 0 0。那么哪个位置的值是 1 1 1 呢?答案是真实标签对应的位置的那个值是 1 1 1,其他都是 0 0 0。
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=1∑Nlossi=−N1i=1∑Nk=1∑Kyki⋅log(y^ki)样本i只属于一个类别k −N1i=1∑Nlogy^ki=−N1i=1∑Nlog[f(zki)]=−N1i=1∑Nlog∑j=1Kezjiezki=−N1i=1∑Nlog∑j=1KewjTxiewkTxi样本i的真实类别k记为yi −N1i=1∑Nlog∑j=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 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,1wk,2wk,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=1Neakeaj∀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函数经常在卷积神经网络中被广泛应用,但是这种形式并不能够有效地学习得到使得类内较为紧凑、类间较离散的特征。
- Softmax训练的深度特征,会把整个超空间或者超球,按照分类个数进行划分,保证类别是可分的,这一点对多分类任务如MNIST和ImageNet非常合适,因为测试类别必定在训练类别中。
- 但Softmax并不要求类内紧凑和类间分离,这一点非常不适合人脸识别任务,因为训练集的1W人数,相对测试集整个世界70亿人类来说,非常微不足道,而我们不可能拿到所有人的训练样本,更过分的是,一般我们还要求训练集和测试集不重叠。
- 所以需要改造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损失函数详解
本文标签: 人脸识别
版权声明:本文标题:人脸识别 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687260189h82265.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论