文章目录
写在最前面的话:本文主要整理深度学习中的损失函数,从原理到作用,详细了解损失函数。
损失函数
损失函数(loss function) 是用来评估模型的预测值f(x)与真实值y的不一致程度,它是一个非负值,常用符号
L
(
f
(
x
)
,
y
)
L(f(x), y)
L(f(x),y)表示。损失函数在模型的性能中起关键作用,选择正确的损失函数能帮助模型在数据集中获得最优最快的收敛,起到指导模型学习的作用。它的值越小,说明模型的鲁棒性越好。损失函数是经验风险函数的核心部分,也是结构风险函数的重要组成部分。模型的结构风险函数包括了经验风险项和正则项,通常可以表示为:
θ
∗
=
arg min
θ
1
N
∑
i
=
1
N
L
(
f
(
x
i
;
θ
)
,
y
i
)
+
λ
Φ
(
θ
)
\theta^*=\argmin_\theta \frac1N\sum_{i=1}^NL(f(x_i;\theta), y_i)+\lambda\Phi(\theta)
θ∗=θargminN1i=1∑NL(f(xi;θ),yi)+λΦ(θ)
其中,加号前面的项为经验风险损失函数,L表示损失函数,加号后面的项为正则化项。
下面介绍在计算机视觉中一些常用的损失函数。
Pixel-wise Loss
pixel-wise:字面上的理解一样,一张图片是由一个个pixel(像素)组成的,这个是图像的基本单位,像素级别的。故,pixel-wise 损失函数是计算预测图像与目标图像的像素间的损失。属于像素间类型的损失函数,常见的有:MSE(L2损失),MAE(L1损失)和交叉熵等。
MSE 均方误差
均方误差(Mean Squared Error,MSE) 是指参数估计值与参数真值之差平方的期望值,MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度,通常用在回归问题中作为损失函数。
M
S
E
=
1
N
∑
i
=
1
N
(
y
i
−
f
(
x
i
)
)
2
MSE=\frac1N\sum_{i=1}^N(y_i-f(x_i))^2
MSE=N1i=1∑N(yi−f(xi))2
其中, i 表示第 i 个样本,N 表示样本总数。
MAE 平均绝对误差
平均绝对误差(Mean Absolute Error,MAE) 是绝对误差的平均值 ,平均绝对误差能更好地反映预测值误差的实际情况,通常用来作为回归算法的性能指标。
M
A
E
=
1
N
∑
i
=
1
N
∣
y
i
−
f
(
x
i
)
∣
MAE=\frac1N\sum_{i=1}^N|y_i-f(x_i)|
MAE=N1i=1∑N∣yi−f(xi)∣
其中, i 表示第 i 个样本,N 表示样本总数。
CE 交叉熵损失
交叉熵(Cross Entry,CE) 是用来评估当前训练得到的概率分布与真实分布的差异情况,减少交叉熵损失就是在提高模型的预测准确率,通常用作分类问题的损失函数。
C
E
(
p
,
q
)
=
−
∑
i
=
1
N
p
(
x
i
)
log
q
(
x
(
−
i
)
)
CE(p,q)=-\sum_{i=1}^Np(x_i)\log q(x_{(-i)})
CE(p,q)=−i=1∑Np(xi)logq(x(−i))
其中,p(x)是指真实分布的概率,q(x)是模型通过数据计算出来的概率估计。
这些损失函数都是对图像中每个像素向量的类预测情况进行评估,所以它们通常都应用在分类和回归问题中。
Perceputal Loss
Perceputal loss 中文名叫感知损失,被用在GAN网络中的。对于图像风格化、超分辨率重建等任务来说,早期使用的像素空间的L2 损失得到的图像细节模糊,视觉效果往往是不好的,它与人眼感知的图像质量并不匹配,因此就有学者提出使用Perceputal loss取代L2 loss,能获得细节丰富的结果。
感知损失是比较图像之间的高级感知和语义差异,它从预训练好的网络中提取前几层的输出指,从而获得图像的底层特征,然后通过简单的像素级损失来比较目标的特征张量和输出值的特征张量的区别。我们都知道,对于一个卷积神经网络CNN来说,浅层的网络是提取简单的特征(如边缘、颜色),而深层的卷积层才能提取更复杂的特征(如特定的形状,模式),因此在网络的前几层捕获的低层次特征都是差不多,这个发现也是支撑迁移学习的理论基础。感知损失的数学表达式为:
L
j
=
∣
∣
V
j
(
y
)
−
V
j
(
f
(
x
)
)
∣
∣
2
2
C
j
∗
H
j
∗
W
j
L_j=\frac{||V_j(y)-V_j(f(x))||^2_2}{C_j*H_j*W_j}
Lj=Cj∗Hj∗Wj∣∣Vj(y)−Vj(f(x))∣∣22
其中,
V
j
(
f
(
x
)
)
V_j(f(x))
Vj(f(x))表示预训练网络第j层在处理图像f(x)时的激活情况,其形状为
(
C
j
,
H
j
,
W
j
)
(C_j,H_j,W_j)
(Cj,Hj,Wj),这里使用L2损失的平方,将图像归一化,比较groun truth图像y与预测图像f(x)的激活情况。
Content-Style Loss
Content-Style Loss是在风格迁移中的一种损失函数。风格转换是将图像的语义内容转换为不同风格的过程,风格迁移模型的目标是:给定一个内容图像(C)和一个风格图像(S),生成出包含C的内容和S的风格的输出图像。
构造风格迁移的损失函数的思路是:
- 随机生成一张图像;
- 计算其与内容图像C之间的内容损失 L c o n t e n t L_{content} Lcontent;
- 计算其与风格图像S之间的内容损失 L s t y l e L_{style} Lstyle;
- 最小化损失函数 L o s s = α L c o n t e n t + β L s t y l e Loss=\alpha L_{content}+\beta L_{style} Loss=αLcontent+βLstyle,其中 α , β \alpha,\beta α,β为超参数。
在风格迁移中,内容损失与上面的感知损失类似,是比较生成图像P与内容图像C在预训练好的网络中某一层的特征图的相似度,即计算两个特征图的L2距离,用数学表示:
L
c
o
n
t
e
n
t
=
∑
i
,
j
∣
∣
A
i
,
j
l
(
C
)
−
A
i
,
j
l
(
P
)
∣
∣
2
2
2
L_{content}=\frac{\sum_{i,j}||A_{i,j}^l(C)-A_{i,j}^l(P)||_2^2}{2}
Lcontent=2∑i,j∣∣Ai,jl(C)−Ai,jl(P)∣∣22
同样,计算生成图像与风格图像的内容损失,然后就可以得到总的风格损失:
L
o
s
s
=
α
L
c
o
n
t
e
n
t
+
β
L
s
t
y
l
e
Loss=\alpha L_{content}+\beta L_{style}
Loss=αLcontent+βLstyle
其中
α
,
β
\alpha,\beta
α,β为超参数。
Texture Loss
Texture Loss(纹理损失)也是出现在风格迁移中的一种损失函数,由Gatys et al在2016年引入在风格迁移中。纹理损失是对感知损失的一种改进,适用在捕获图像的风格中,Gatys et al发现:可以通过查看预训练网络中特征图内的值的空间相关性来提取图像的风格表示。纹理损失主要是通过计算Gram矩阵来实现的:
G
i
,
j
l
=
∑
k
F
i
,
k
l
F
j
,
k
l
G_{i,j}^l=\sum_kF_{i,k}^lF_{j,k}^l
Gi,jl=k∑Fi,klFj,kl
其中,
F
i
F_i
Fi是预训练网络中
l
l
l层的特征图。Gram矩阵是向量化特征映射
F
i
F_i
Fi和
F
j
F_j
Fj在
l
l
l层的内积,它捕获了特征在图像不同部分出现的趋势。
日常科普:n维欧式空间中任意k( k ≤ n k\le n k≤n)个向量 α 1 , α 2 , . . . , α k \alpha_1,\alpha_2,...,\alpha_k α1,α2,...,αk的内积所组成的矩阵称为k个向量 α 1 , α 2 , . . . , α k \alpha_1,\alpha_2,...,\alpha_k α1,α2,...,αk的格拉姆矩阵(Gram矩阵)。
因此,纹理损失的数学表示为:
E
l
=
1
4
N
l
2
M
l
2
∑
i
,
j
(
G
i
,
j
2
−
A
i
,
j
2
)
2
E_l=\frac{1}{4N_l^2M_l^2}\sum_{i,j}(G_{i,j}^2-A_{i,j}^2)^2
El=4Nl2Ml21i,j∑(Gi,j2−Ai,j2)2
其中,
G
i
,
j
G_{i,j}
Gi,j和
A
i
,
j
A_{i,j}
Ai,j分别为模型输出的I层和目标图像在模型中I层的风格样式表示。
N
l
N_l
Nl是第I层中不同特征映射的数量,
M
l
M_l
Ml是第I层中特征映射的容量(简单来说,就是通道的宽高),
E
l
E_l
El代表I层的纹理损失。
整个网络的纹理损失是所有层的纹理损失的加权和:
L
s
t
y
l
e
(
S
,
P
)
=
∑
l
=
0
L
w
l
E
l
L_{style}(S,P)=\sum_{l=0}^Lw_lE_l
Lstyle(S,P)=l=0∑LwlEl
这里的S是风格图像的纹理,P是生成图像。
Topological Perceputal Loss
拓扑感知损失函数(Topological Perceputal Loss)是感知损失的一种延申,主要应用在分割mask预测。 Mosinska等人提出,在图像分割领域中一般使用的是pixel-wise损失,因为图像分割任务的本质还是对像素点的分类,被称为密集预测,所以对于分类问题自然就采用交叉熵损失函数。像素级的损失仅依赖局部测度,不考虑图像中拓扑结构的特征(如连接的形状,或者孔的数量),这导致传统的分类模型会对浅层的结构容易出现分类错误的问题。为了改进像素损失,Mosinska引入了一个惩罚项,该惩罚项基于预训练模型(VGG-19网络)生成的特征图,类似于感知损失,主要考虑补充拓扑信息:
L
t
o
p
=
∑
n
=
1
N
∑
m
=
1
M
∣
∣
l
n
m
(
y
)
−
l
n
m
(
f
(
x
)
)
∣
∣
2
2
L
o
s
s
=
L
p
i
x
e
l
+
μ
L
t
o
p
\begin{aligned} L_{top}&=\sum_{n=1}^N\sum_{m=1}^M||l_n^m(y)-l_n^m(f(x))||^2_2\\ Loss&=L_{pixel}+\mu L_{top}\end{aligned}
LtopLoss=n=1∑Nm=1∑M∣∣lnm(y)−lnm(f(x))∣∣22=Lpixel+μLtop
其中, l n m l_n^m lnm表示VGG-19网络的n层的第m个feature map。 μ \mu μ是衡量像素损失和拓扑损失的权重参数。
GAN Loss
生成式对抗网络(GAN, Generative Adversarial Networks ) 是一种通过模型中的两个模块相互博弈学习产生较好的输出的网络,这两个模块分别为:生成模型(Generative Model)和判别模型(Discriminative Model)。判别模型的任务是评估当前这张图像是ground truth(真图像)还是由生成模型生成的图像(假图像)。在GAN中,生成模型的损失函数是隐式的,它以判别模型的判别结果作为反馈,在训练过程中不断学习。而判别模型的损失函数则是显式的,因此,在网络训练过程中,生成模型和判别模型都参与其中,它们轮流更新各自的模型权重。
Min-Max 损失函数
GAN的计算流程和结构如下图所示。
这是原始的GAN提出的loss:
D
i
s
c
r
i
m
i
n
a
t
o
r
→
max
:
log
D
(
x
)
+
log
(
1
−
D
(
G
(
z
)
)
)
G
e
n
e
r
a
t
o
r
→
min
:
log
(
1
−
D
(
G
(
z
)
)
)
\begin{aligned} Discriminator &\to \max:\log D(x)+\log(1-D(G(z)))\\ Generator &\to \min:\log(1-D(G(z))) \end{aligned}
DiscriminatorGenerator→max:logD(x)+log(1−D(G(z)))→min:log(1−D(G(z)))
这里的
x
x
x代表真实样本,
z
z
z代表噪声样本,
G
(
z
)
G(z)
G(z)表示生成器在随机噪声中生成假的图像。整个损失函数都是在D(判别模型)输出处产生的,D的输出一般是0/1。Discriminator 的损失函数:因为输入采样自真实数据所以我们期望D(x)趋近于1,也就是取max。同理Generator 输入采样自G生成数据,所以我们期望D(G(z))趋近于0更好,也就是取min。但是在实践中发现,这种生成模型的损失函数会饱和。也就是说,如果它不能像判别模型学习得那么快,判别模型赢了,游戏就结束了,模型就不能得到有效的训练。
不饱和的GAN损失
为了解决Min-Max损失中的生成模型损失会出现饱和的情况,专门对生成模型的损失函数做了改进:
G
e
n
e
r
a
t
o
r
→
max
:
log
(
D
(
G
(
z
)
)
)
\begin{aligned} Generator &\to \max:\log(D(G(z))) \end{aligned}
Generator→max:log(D(G(z)))
最小均方GAN损失
借鉴非GAN网络采用的损失函数一般为MSE,所以又提出了一种最小均方GAN损失:
D
i
s
c
r
i
m
i
n
a
t
o
r
→
min
:
(
D
(
x
)
−
1
)
2
+
(
D
(
G
(
z
)
)
)
2
G
e
n
e
r
a
t
o
r
→
min
:
(
D
(
G
(
z
)
)
−
1
)
2
\begin{aligned} Discriminator &\to \min: (D(x)-1)^2+(D(G(z)))^2\\ Generator &\to \min:(D(G(z))-1)^2 \end{aligned}
DiscriminatorGenerator→min:(D(x)−1)2+(D(G(z)))2→min:(D(G(z))−1)2
Wasserstein GAN损失
Martin Arjovsky提出传统GAN的目标是最小化真实图像和生成图像的实际概率分布和预测概率分布之间的距离,即所谓的Kullback-Leibler (KL)散度,使用的Min-Max损失刚好等价于JS散度,由于JS散度存在一个严重的问题:两个分布没有重叠时,JS散度为零,而在训练初期,JS散度是有非常大的可能为零的。所以如果D被训练的过于强,loss会经常收敛到 − 2 log 2 -2\log2 −2log2而没有梯度。
科普什么是JS散度?:JS散度度量了两个概率分布的相似度,基于KL散度的变体,解决了KL散度非对称的问题。一般地,JS散度是对称的,其取值是0到1之间。
KL散度:即相对熵,用来表示两个概率分布之间的差异,但是它并不是对称的。
对于这个问题,他们建议在地球移动距离上对问题进行建模,该模型根据将一个分布转换成另一个分布的成本来计算两个概率分布之间的距离。因此,WGAN提出了一个新的loss,Wasserstein loss, 也称作地球移动距离:
W
(
P
r
,
P
g
)
=
inf
r
∼
Π
(
P
r
,
P
g
)
E
(
x
,
y
)
∼
r
∣
∣
x
−
y
∣
∣
W(P_r,P_g)=\inf_{r\sim \Pi(P_r,P_g)}E_{(x,y)\sim r}||x-y||
W(Pr,Pg)=r∼Π(Pr,Pg)infE(x,y)∼r∣∣x−y∣∣
这个距离的直观含义是,将分布r移动到分布g所需要的距离,所以即使是两个分布没有重叠,这个loss也是有值的。可以证明,该距离可以转化为如下形式:
W
(
P
r
,
P
g
)
=
sup
∣
∣
f
∣
∣
L
≤
1
E
x
∼
P
r
[
f
(
x
)
]
−
E
y
∼
P
g
[
f
(
y
)
]
W(P_r,P_g)=\sup_{||f||_{L\le1}}E_{x\sim P_r}[f(x)]-E_{y\sim P_g}[f(y)]
W(Pr,Pg)=∣∣f∣∣L≤1supEx∼Pr[f(x)]−Ey∼Pg[f(y)]
其中f必须满足1-Lipschitz连续,即:
∣
∣
f
(
x
)
−
f
(
y
)
∣
∣
≤
∣
∣
x
−
y
∣
∣
||f(x)-f(y)||\le||x-y||
∣∣f(x)−f(y)∣∣≤∣∣x−y∣∣。可以看到,符合1-Lipschitz连续的函数的梯度是受限的,可以有效的防止梯度的爆炸,使训练更加稳定。
对于GAN来说,f指的是D或G,而D或G都是模型,即由一系列矩阵乘法复合而成的,那么如果矩阵乘法这个运算满足1-Lipschitz连续,那么其复合运算也会满足1-Lipschitz连续,模型也就满足1-Lipschitz连续因此,WGAN 损失就表示为:
W
G
A
N
L
o
s
s
(
R
e
a
l
I
m
a
g
e
s
)
=
1
∗
a
v
g
p
r
e
d
i
c
t
e
d
s
c
o
r
e
W
G
A
N
L
o
s
s
(
F
a
k
e
I
m
a
g
e
s
)
=
−
1
∗
a
v
g
p
r
e
d
i
c
t
e
d
s
c
o
r
e
\begin{aligned} WGAN Loss(Real Images) &= 1*avg\; predicted \;score\\ WGAN Loss(Fake Images) &= -1*avg \;predicted \;score \end{aligned}
WGANLoss(RealImages)WGANLoss(FakeImages)=1∗avgpredictedscore=−1∗avgpredictedscore
使用Wasserstein损失的GAN涉及到将判别器的概念改变为一个更改评估器,比生成器模型更新得更频繁(例如,更新频率是生成器模型的五倍)。评估器用实际的数字而不是预测概率来给图像打分。它还要求模型的权重保持较小。该得分的计算使得真假图像的得分之间的距离最大程度地分离。Wasserstein的损失的好处是,它提供了一个有用几乎无处不在的梯度,允许模型的继续训练。
循环一致性损失
循环一致性损失是应用在Cycle GAN网络中的一种损失函数。 CycleGAN本质上是两个镜像对称的GAN,构成了一个环形网络,主要由两个生成器及两个判别器组成,如下图所示。X表示X域的图像,Y表示Y域的图像。X域的图像通过生成器G生成Y域的图像,再通过生成器F重构回X域输入的原图像;Y域的图像通过生成器F生成X域图像,再通过生成器G重构回Y域输入的原图像。判别器Dx和Dy起到判别作用,确保图像的风格迁移。
它的损失函数被定义为:
L
c
y
c
(
G
,
F
)
=
E
x
[
∣
∣
F
(
G
(
x
)
)
−
x
∣
∣
2
]
+
E
y
[
∣
∣
G
(
F
(
y
)
)
−
y
∣
∣
2
]
L
(
G
,
F
,
D
X
,
D
Y
)
=
L
G
A
N
(
G
,
D
Y
,
X
,
Y
)
+
L
G
A
N
(
F
,
D
X
,
Y
,
X
)
+
λ
L
c
y
c
(
G
,
F
)
\begin{aligned} L_{cyc}(G,F) &= E_{x}[||F(G(x))-x||_2]\\ &+E_{y}[||G(F(y))-y||_2]\\ \\ L(G,F,D_X,D_Y)&=L_{GAN}(G,D_Y,X,Y)\\ &+L_{GAN}(F,D_X,Y,X)\\ &+\lambda L_{cyc}(G,F) \end{aligned}
Lcyc(G,F)L(G,F,DX,DY)=Ex[∣∣F(G(x))−x∣∣2]+Ey[∣∣G(F(y))−y∣∣2]=LGAN(G,DY,X,Y)+LGAN(F,DX,Y,X)+λLcyc(G,F)
总结
本文主要介绍在计算机视觉中不同网络使用的损失函数。
参考:
https://mp.weixin.qq.com/s?__biz=MzUxNjcxMjQxNg==&mid=2247497334&idx=4&sn=95926d1ae4e209eff6b361dfc3132dc9&chksm=f9a184f9ced60def1b163d5599421494ea755636af08a845844bf5f465334e7eaea0517b4c1e&mpshare=1&scene=23&srcid=0323DdI1QqBoRgXjzFLEKzfi&sharer_sharetime=1584956360970&sharer_shareid=7f7e7160bc27c0d4e5d25b89aee9e9d5#rd
https://zhuanlan.zhihu.com/p/72195907
https://www.jianshu.com/p/64bf39804c80