寻找解决样本不均衡方法之Focal Loss与GHM
主要参考资料:5分钟理解Focal Loss与GHM——解决样本不平衡利器 - 知乎 (zhihu.com)
-
Focal Loss的引入主要是为了解决难易样本数量不平衡(注意,有区别于正负样本数量不平衡)的问题,实际可以使用的范围非常广泛。
-
注:如本人遇到的就是通过一个二分类模型处理违规帖子内容,场景就是正负样本不均衡以及难易样本数量数量不均衡都参杂其中的问题。
我们以交叉熵损失函数举例:(Cross entropy)
- 交叉熵损失函数可以看我另一篇介绍:交叉熵损失函数 - 知乎 (zhihu.com)
C E = − [ y log y ^ + ( 1 − y ) log ( 1 − y ^ ) ] (1) CE = -[y\log{\hat{y}} + (1-y)\log{(1- \hat{y})}]\tag{1} CE=−[ylogy^+(1−y)log(1−y^)](1)
C E = { − log ( y ^ ) i f y = 1 − log ( 1 − y ^ ) i f y = 0 (1.1) CE=\begin{cases} -\log(\hat{y})& if & y = 1 \\ -\log(1 - \hat{y})& if & y = 0\end{cases}\tag{1.1} CE={−log(y^)−log(1−y^)ifify=1y=0(1.1)
为了解决正负样本不平衡的问题,我们通常会在交叉熵损失的前面加上一个参数 α ,即:
C
E
=
{
−
α
log
(
y
^
)
i
f
y
=
1
−
(
1
−
α
)
log
(
1
−
y
^
)
i
f
y
=
0
(1.2)
CE=\begin{cases} -\alpha \log(\hat{y})& if & y = 1 \\ -(1- \alpha)\log(1 - \hat{y})& if & y = 0\end{cases}\tag{1.2}
CE={−αlog(y^)−(1−α)log(1−y^)ifify=1y=0(1.2)
但这并不能解决全部问题。根据正、负、难、易,样本一共可以分为以下四类:正难 正易 负难 负易(类比混淆矩阵)
由于真实场景下,易分样本的数量还是相对太多,主导了总的损失(不区分的时候是正负样本中数量大的主导,区分了正负样本难易样本中数量大的又会占据主导)这些问题都是需要解决的,这时候Focal Loss应运而生,其认为要处理易分样本(即:置信度高的样本)对模型的提升效果非常小,所以应该降低模型对这些样本的关注度,重点关注那些难以区分的样本。
该方法的核心思想就是:进一步降低高置信度,也就是易分样本的损失,其实就是说降低这些易分样本的权重,所以衍生了:
F
L
=
{
−
(
1
−
y
^
)
γ
log
(
y
^
)
i
f
y
=
1
−
p
γ
log
(
1
−
y
^
)
i
f
y
=
0
(1.3)
FL=\begin{cases} -(1-\hat{y})^{\gamma} \log(\hat{y})& if & y = 1 \\ -p^{\gamma}\log(1 - \hat{y})& if & y = 0\end{cases}\tag{1.3}
FL={−(1−y^)γlog(y^)−pγlog(1−y^)ifify=1y=0(1.3)
结合公式(1.2)得到最终的Focal Loss的最终形式,一个解决正负样本不均衡,一个解决难易样本不均衡两个问题
F
L
=
{
−
α
(
1
−
y
^
)
γ
log
(
y
^
)
i
f
y
=
1
−
(
1
−
α
)
p
γ
log
(
1
−
y
^
)
i
f
y
=
0
(1.4)
FL=\begin{cases} -\alpha(1-\hat{y})^{\gamma} \log(\hat{y})& if & y = 1 \\ - (1- \alpha) p^{\gamma}\log(1 - \hat{y})& if & y = 0\end{cases}\tag{1.4}
FL={−α(1−y^)γlog(y^)−(1−α)pγlog(1−y^)ifify=1y=0(1.4)
参考资料中给出数据为当γ为2的时候,α取0.25效果最佳(可以自己看参考资料)
Focal Loss代码参考资料中也有写,由于本文只作为理解FL是啥,所以想要代码可以自己去参考资料中自取
GHM
- Focal Loss重点关注那些难以区分的样本难免会忽略另一个很重要的因素,离群点,这些异常点对于一个收敛模型还是影响很大的,还有就是α和γ的取值问题,这两个取值本身是互相影响的,而GHM解决了这两个问题。
文章定义了一个新概念:梯度模长g
g
=
∣
y
^
−
y
∣
=
{
1
−
y
^
i
f
y
=
1
y
^
i
f
y
=
0
(2)
g=| \hat{y} - y |=\begin{cases} 1 - \hat{y}& if & y = 1 \\ \hat{y}& if & y = 0\end{cases}\tag{2}
g=∣y^−y∣={1−y^y^ifify=1y=0(2)
-
其中y^是模型预测的概率,y是真实的标签,取0或者1
-
也就是说预测概率与真实标签的差距越大,即g的值越大,说明样本越难区分
公式(2)由来:
- 此处的log其实应该是ln才对,在公式(2.1) --> (2.2)可以注意一下
假如x是sigmoid的的函数输出:y = sigmoid(x)
- 公式(2.1)可以参考上方我的交叉熵函数文章里面的手写部分
∂ y ∂ x = y ( 1 − y ) (2.1) \frac{\partial{y}}{\partial{x}} = y(1-y)\tag{2.1} ∂x∂y=y(1−y)(2.1)
∂ C E x = { y ^ − 1 i f y = 1 y ^ i f y = 0 = y ^ − y (2.2) \frac{\partial{CE}}{x} = \begin{cases} \hat{y} - 1& if & y = 1 \\ \hat{y}& if & y = 0\end{cases} = \hat{y} - y\tag{2.2} x∂CE={y^−1y^ifify=1y=0=y^−y(2.2)
g = ∣ ∂ C E x ∣ (2.3) g = | \frac{\partial{CE}}{x} |\tag{2.3} g=∣x∂CE∣(2.3)
看下图梯度模长与样本数量的关系:
-
①可以看到,梯度模长接近于0的样本数量最多,随着梯度模长的增长,样本数量迅速减少,但是在梯度模长接近于1时,样本数量也挺多,GHM的关注点就是,我们确实不应该太多关注易分样本,但是特别难分的样本点比如离群点,一样也不该过多关注这些离群点。这些离群点的梯度模长d要比一般的样本大很多,如果模型被迫去关注这些样本,反而有可能降低模型的准确度!况且,这些样本的数量也很多!
-
②或者:左边的易分样本,对应着横坐标有着非常低的g,可以看到易分样本的梯度模长非常小,表明了这些样本的真实值和预测值非常接近了,但是其数量所占比例非常大,其实这部分易分样本对于模型的提升效果非常小。同时注意右边的难分样本,文中认为,这部分样本同样对模型的提升效果没有帮助,这部分样本同样也有着非常大的比例。其实我们需要关注的应该是中间部分的样本(既不是easy example也不是very hard example),这些样本对模型的提升更有帮助。
那么如何同时衰减两边的易分样本和特别难分的样本呢?参考资料中解释是密度的概念,什么意思呢?就是说,定义一个变量,让这个变量能衡量出一定梯度范围内的样本数量,其实也就是说两头的密度更大一些,刚好就是我们的目标,所以可以以这个为条件来达到我们的目的
于是,作者定义了梯度密度 GD(g) ——本文最重要的公式:
G
D
(
g
)
=
1
l
ε
(
g
)
∑
k
=
1
N
δ
ε
(
g
k
,
g
)
(3)
GD(g) = \frac{1}{l_{\varepsilon}(g)}\sum_{k=1}^N \delta_{\varepsilon}(g_{k},g)\tag{3}
GD(g)=lε(g)1k=1∑Nδε(gk,g)(3)
δ ε ( g k , g ) = { 1 i f y − ε 2 < = x < = y + ε 2 0 i f o t h e r w i s e (3.1) \delta_{\varepsilon}(g_{k},g) = \begin{cases} 1& if & y- \frac{\varepsilon}{2} <= x < = y+ \frac{\varepsilon}{2}\\ 0& if & otherwise\end{cases}\tag{3.1} δε(gk,g)={10ifify−2ε<=x<=y+2εotherwise(3.1)
l
ε
(
g
)
=
min
(
g
+
ε
2
,
1
)
−
max
(
g
−
ε
2
,
0
)
(3.2)
l_{\varepsilon}(g) = \min(g+ \frac{\varepsilon}{2}, 1) - \max(g- \frac{\varepsilon}{2}, 0)\tag{3.2}
lε(g)=min(g+2ε,1)−max(g−2ε,0)(3.2)
- ①那么接下来对于每个样本,上面公式表示单位梯度模长g部分的样本个数,那么个数的倒数,不就是单位梯度模长g部分样本每个的密度吗?那么每个样本的交叉熵损失*该样本的梯度密度的倒数即可
- ②也可以这样理解:
通过定义参数βi:
β
i
=
N
G
D
(
g
i
)
(3.3)
\beta_{i} = \frac{N}{GD(g_{i})}\tag{3.3}
βi=GD(gi)N(3.3)
如果定性分析一下:对于梯度密度大的样本,GD即的值很大,则β就会相应的变小;反之对于GD的值很小,则β就会相应的变大,而之前的分部图中可以看到,easy example和very hard example的分部都非常的密集,即GD的值很大,因此通过参数刚好能够达到抑制这两部分,同时提高有用样本权重的目的。
注:分子N是为了使得当划分长度ε很大为1的时候,β也为1
将定义的β引入到交叉熵损失函数中,可以得到GHM-C loss的表达式
L
G
H
M
−
C
=
1
N
∑
i
=
1
N
β
i
L
C
E
(
y
i
,
y
i
^
)
=
∑
i
=
1
N
L
C
E
(
y
i
,
y
i
^
)
G
D
(
g
i
)
(4)
L_{GHM-C} = \frac{1}{N}\sum_{i=1}^N\beta_{i}L_{CE}(y_{i}, \hat{y_{i}}) = \sum_{i=1}^N\frac{L_{CE}(y_{i}, \hat{y_{i}})}{GD(g_{i})}\tag{4}
LGHM−C=N1i=1∑NβiLCE(yi,yi^)=i=1∑NGD(gi)LCE(yi,yi^)(4)
抑制效果如下
GHM-C和Focal Loss都对easy example做了很好的抑制,而GHM-C和Focal Loss在对very hard examples上有更好的抑制效果。
GHM在回归问题上的运用,本文不再详细叙述
参考资料:
- 注:参考资料3讲解的比较通俗易懂,但是有些地方比较抽象,公示的推导可以参考2,介绍的个人认为比较详细,可以两篇对比着学习
- 解决one-stage目标检测正负样本不均衡的另类方法–Gradient Harmonized_叫我西瓜超人的博客-CSDN博客_gradient norm
- 5分钟理解Focal Loss与GHM——解决样本不平衡利器 - 知乎 (zhihu.com)