ICML2020的论文《Do We Need Zero Training Loss After Achieving Zero Training Error?》提出了一种Flooding方法,用于缓解模型过拟合,详情可以看我的文章《我们真的需要把训练集的损失降到零吗?》。这里简单过一下,论文提出了一个超参数
b
b
b,并将损失函数改写为
L
~
(
θ
)
=
∣
L
(
θ
)
−
b
∣
+
b
(1)
tilde{mathcal{L}}(boldsymbol{theta}) = |mathcal{L}(boldsymbol{theta}) -b| + btag{1}
L~(θ)=∣L(θ)−b∣+b(1)
其中,
b
b
b是预先设定的阈值,当
L
(
θ
)
>
b
mathcal{L}(boldsymbol{theta})>b
L(θ)>b时
L
~
(
θ
)
=
L
(
θ
)
tilde{mathcal{L}}(boldsymbol{theta})=mathcal{L}(boldsymbol{theta})
L~(θ)=L(θ),这时就是执行普通的梯度下降;而
L
(
θ
)
<
b
mathcal{L}(boldsymbol{theta})
这样做有什么效果呢?论文显示,在某些任务中,训练集的损失函数经过这样处理后,验证集的损失能出现 “二次下降(Double Descent)”,如下图
左图:不加Flooding的训练示意图;右图:加了Flooding的训练示意图
我们可以假设梯度先下降一步后上升一步,学习率为
ε
varepsilon
ε,通过泰勒展开可以得到
θ
n
+
1
≈
θ
n
−
1
−
ε
2
2
∇
θ
∣
∣
g
(
θ
n
−
1
)
∣
∣
2
(2)
boldsymbol{theta}_{n+1} approx boldsymbol{theta}_{n-1}-frac{varepsilon^2}{2}nabla_{boldsymbol{theta}} ||g(boldsymbol{theta}_{n-1})||^2tag{2}
θn+1≈θn−1−2ε2∇θ∣∣g(θn−1)∣∣2(2)
其中,
θ
n
boldsymbol{theta}_{n}
θn表示第
n
n
n次迭代的参数,
g
(
θ
n
−
1
)
=
∇
θ
L
(
θ
n
−
1
)
g(boldsymbol{theta}_{n-1})=nabla_{boldsymbol{theta}}mathcal{L}(boldsymbol{theta}_{n-1})
g(θn−1)=∇θL(θn−1)表示损失对参数
θ
n
−
1
boldsymbol{theta}_{n-1}
θn−1的梯度。式(2)的结果相当于以
ε
2
2
frac{varepsilon^2}{2}
2ε2为学习率、损失函数为梯度惩罚
∣
g
(
θ
)
∣
∣
2
=
∣
∣
∇
θ
L
(
θ
)
∣
∣
2
|g(boldsymbol{theta})||^2=||nabla_{boldsymbol{theta}}mathcal{L}(boldsymbol{theta})||^2
∣g(θ)∣∣2=∣∣∇θL(θ)∣∣2的梯度下降
Achilles’ Heel of Flooding详细的推导过程见《我们真的需要把训练集的损失降到零吗?》
Flooding的阿喀琉斯之踵在于超参数 b b b,我们需要花非常多的时间寻找最佳的阈值 b b b,这并不是一件容易的事
Achilles’ Heel(阿喀琉斯之踵)阿喀琉斯是古希腊神话故事中的英雄人物,刀q不入,唯一的弱点是脚后跟(踵)。后用于来比喻某东西的致命缺陷
下图展示了使用BERT在SST-2数据集上不同的阈值 b b b对结果的影响(黄色区域是最佳结果)。可以看出, b b b的设置对结果的影响非常大
Gradient AccordanceACL2022的投稿有一篇名为《Flooding-X: Improving BERT’s Resistance to Adversarial Attacks via Loss-Restricted Fine-Tuning》的文章,以"梯度一致性"作为开启Flooding的"阀门",而不再采用超参数
b
b
b。具体来说,我们首先定义包含参数
θ
boldsymbol{theta}
θ的模型
f
f
f,考虑一个样本
x
x
x以及真实标签
y
y
y,它们的损失为
L
(
f
(
θ
,
x
)
,
y
)
mathcal{L}(f(boldsymbol{theta}, x), y)
L(f(θ,x),y),损失关于参数的梯度为
g
=
∇
θ
L
(
f
(
θ
,
x
)
,
y
)
(3)
boldsymbol{g} = nabla_{boldsymbol{theta}}mathcal{L}(f(boldsymbol{theta}, x),y)tag{3}
g=∇θL(f(θ,x),y)(3)
其中,式(3)的负值就是参数
θ
boldsymbol{theta}
θ更新的方向。现在我们考虑两个样本
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
(x_1,y_1), (x_2,y_2)
(x1,y1),(x2,y2)的情况,根据上述定义,样本1的梯度为
g
1
=
∇
θ
L
(
f
(
θ
,
x
1
)
,
y
1
)
(4)
boldsymbol{g_1} = nabla_{boldsymbol{theta}}mathcal{L}(f(boldsymbol{theta}, x_1), y_1)tag{4}
g1=∇θL(f(θ,x1),y1)(4)
对于样本1来说,参数更新所导致的损失变化为
Δ
L
1
=
L
(
f
(
θ
−
ε
g
1
,
x
1
)
,
y
1
)
−
L
(
f
(
θ
,
x
1
)
,
y
1
)
(5)
begin{aligned} Delta mathcal{L}_1 = &mathcal{L}(f(boldsymbol{theta} - varepsilon boldsymbol{g_1}, x_1), y_1)\ &- mathcal{L}(f(boldsymbol{theta}, x_1), y_1) end{aligned}tag{5}
ΔL1=L(f(θ−εg1,x1),y1)−L(f(θ,x1),y1)(5)
将
f
(
θ
,
x
1
)
f(boldsymbol{theta}, x_1)
f(θ,x1)通过泰勒展开变形得
f
(
θ
,
x
1
)
≈
f
(
θ
−
ε
g
1
,
x
1
)
+
ε
g
1
∂
f
∂
θ
(6)
f(boldsymbol{theta}, x_1)approx f(boldsymbol{theta} - varepsilonboldsymbol{g_1}, x_1) + varepsilon boldsymbol{g_1}frac{partial f}{partial boldsymbol{theta}}tag{6}
f(θ,x1)≈f(θ−εg1,x1)+εg1∂θ∂f(6)
f ( θ − ε g 1 , x 1 ) − f ( θ , x 1 ) ε g 1 = ∂ f ∂ θ frac{f(boldsymbol{theta} - varepsilonboldsymbol{g_1}, x_1) -f(boldsymbol{theta}, x_1)}{varepsilon boldsymbol{g_1}}= frac{partial f}{partial boldsymbol{theta}} εg1f(θ−εg1,x1)−f(θ,x1)=∂θ∂f
我们将
ε
g
1
∂
f
∂
θ
varepsilon boldsymbol{g_1}frac{partial f}{partial boldsymbol{theta}}
εg1∂θ∂f记作
T
(
x
1
)
T(x_1)
T(x1),并对
L
(
f
(
θ
,
x
1
)
,
y
1
)
mathcal{L}(f(boldsymbol{theta}, x_1), y_1)
L(f(θ,x1),y1)做类似的泰勒展开得
L
(
f
(
θ
,
x
1
)
,
y
1
)
=
L
(
f
(
θ
−
ε
g
1
,
x
1
)
+
T
(
x
1
)
,
y
1
)
≈
L
(
f
(
θ
−
ε
g
1
,
x
1
)
,
y
1
)
+
∂
L
∂
f
T
(
x
1
)
(7)
begin{aligned} mathcal{L}(&f(boldsymbol{theta}, x_1), y_1)\ &= mathcal{L}(f(boldsymbol{theta} - varepsilon boldsymbol{g_1}, x_1) + T(x_1), y_1)\ &approx mathcal{L}(f(boldsymbol{theta} - varepsilon boldsymbol{g_1}, x_1), y_1)\ &+frac{partial mathcal{L}}{partial f}T(x_1) end{aligned}tag{7}
L(f(θ,x1),y1)=L(f(θ−εg1,x1)+T(x1),y1)≈L(f(θ−εg1,x1),y1)+∂f∂LT(x1)(7)
根据式(6)可以推出第一个等号,约等于是从泰勒展开推导的,具体来说
L ( A + T ( x 1 ) , y 1 ) − L ( A , y 1 ) T ( x 1 ) = L ′ frac{mathcal{L}(A + T(x_1), y_1) -mathcal{L}(A, y_1)}{T(x_1)} = mathcal{L}' T(x1)L(A+T(x1),y1)−L(A,y1)=L′
将式(7)带入式(5)得
Δ
L
1
≈
−
∂
L
∂
f
T
(
x
1
)
=
−
ε
g
1
∂
L
∂
f
∂
f
∂
θ
=
−
ε
g
1
⋅
g
1
(8)
begin{aligned} Delta mathcal{L}_1 &approx -frac{partial mathcal{L}}{partial f}T(x_1)\ &=-varepsilon boldsymbol{g_1}frac{partial mathcal{L}}{partial f} frac{partial f}{partial boldsymbol{theta}}\ &=-varepsilon boldsymbol{g_1} cdot boldsymbol{g_1} end{aligned}tag{8}
ΔL1≈−∂f∂LT(x1)=−εg1∂f∂L∂θ∂f=−εg1⋅g1(8)
类似的,参数根据样本
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1)更新后,在样本
(
x
2
,
y
2
)
(x_2, y_2)
(x2,y2)上的损失差为
Δ
L
2
=
−
ε
g
1
⋅
g
2
Delta mathcal{L}_2 = -varepsilon boldsymbol{g_1}cdot boldsymbol{g_2}
ΔL2=−εg1⋅g2
值得注意的是,根据定义, Δ L 1 Delta mathcal{L}_1 ΔL1是负的,因为模型是对于 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)更新的,自然就会导致其损失的降低。如果 Δ L 2 Delta mathcal{L_2} ΔL2也是负的,那么在 ( x 1 , y 1 ) (x_1, y_1) (x1,y1)上更新的模型被认为对 ( x 2 , y 2 ) (x_2, y_2) (x2,y2)有积极的影响。上面的等式表明,这种共同关系相当于两个样本的梯度 g 1 , g 2 boldsymbol{g_1},boldsymbol{g_2} g1,g2之间的乘积,我们称其为梯度一致性(Gradient Accordance)
Coarse-Grained Gradient Accordance上面提到的可以看作是样本级别的梯度一致性,由于其粒度太细,计算起来非常复杂,因此我们将其应用到batch级别的粗粒度上进行计算
考虑训练过程中包含
n
n
n个样本的mini-batch
B
0
B_0
B0,其中样本
X
=
{
x
1
,
x
2
,
.
.
.
,
x
n
}
boldsymbol{X} = {x_1, x_2,...,x_n}
X={x1,x2,...,xn},标签
y
=
{
y
1
,
y
2
,
.
.
.
,
y
n
}
boldsymbol{y}={y_1, y_2,...,y_n}
y={y1,y2,...,yn},其中
y
i
∈
{
c
1
,
c
2
,
.
.
.
,
c
k
}
y_iin {c_1, c_2,...,c_k}
yi∈{c1,c2,...,ck},即有
k
k
k个类别。这些样本可以根据它们的标签拆分成
k
k
k组(每组内的样本标签是一样的)
X
=
X
1
∪
X
2
∪
⋯
∪
X
k
boldsymbol{X} = boldsymbol{X_1}cup boldsymbol{X_2} cup cdots cup boldsymbol{X_k}
X=X1∪X2∪⋯∪Xk
由此可以将
B
0
B_0
B0拆分成多个子batch的并集,
B
0
=
B
0
1
∪
B
0
2
∪
⋯
B
0
k
B_0 = B_0^1cup B_0^2cup cdots B_0^k
B0=B01∪B02∪⋯B0k。我们定义两个子batch
B
0
1
B_0^1
B01和
B
0
2
B_0^2
B02的类一致性分数为
C
(
B
0
1
,
B
0
2
)
=
E
[
cos
(
g
1
,
g
2
)
]
(9)
C(B_0^1, B_0^2) = mathbb{E}[cos (boldsymbol{g_1}, boldsymbol{g_2})]tag{9}
C(B01,B02)=E[cos(g1,g2)](9)
其中,
g
1
boldsymbol{g}_1
g1是模型在样本集
B
0
1
B_0^1
B01上的损失对参数的梯度,
cos
(
g
1
,
g
2
)
=
(
g
1
/
∣
g
1
∣
)
⋅
(
g
2
/
∣
g
2
∣
)
cos(boldsymbol{g_1}, boldsymbol{g_2})=(boldsymbol{g_1}/|boldsymbol{g_1}|)cdot (boldsymbol{g_2}/|boldsymbol{g_2}|)
cos(g1,g2)=(g1/∣g1∣)⋅(g2/∣g2∣)
类一致性可以用于判断:对类别 c 1 c_1 c1的样本集 B 0 1 B_0^1 B01进行梯度下降是否也会减少类别 c 2 c_2 c2所对应的样本集 B 0 2 B_0^2 B02的损失
假设一个Epoch中有
N
N
N个batch,那么
B
s
B_s
Bs与
B
t
B_t
Bt的批一致性分数定义如下:
S
batch accd
(
B
s
,
B
t
)
=
1
k
(
k
−
1
)
∑
j
=
1
k
∑
i
=
1
i
≠
j
k
C
(
B
s
i
,
B
t
j
)
(10)
begin{aligned} S_{text{batch accd}}&(B_s, B_t)\ &=frac{1}{k(k-1)}sum_{j=1}^ksum_{i=1 atop i neq j}^k C(B_s^i, B_t^j) end{aligned}tag{10}
Sbatch accd(Bs,Bt)=k(k−1)1j=1∑ki=ji=1∑kC(Bsi,Btj)(10)
批一致性可以通过评估一个批次的参数更新对另一个批次的影响,量化两个批次的学习一致性。更具体地说,
S
batch accd
S_{text{batch accd}}
Sbatch accd如果是正的,表示这两个批次处于相同的学习节奏下,每个批次更新的模型对它们都有好处
任意一个Epoch的梯度一致性最终定义为
S
epoch accd
=
1
N
(
N
−
1
)
∑
j
=
i
+
1
N
∑
i
=
1
N
−
1
S
batch accd
(
B
s
,
B
t
)
(11)
begin{aligned} &S_{text{epoch accd}} \ &= frac{1}{N(N-1)}sum_{j=i+1}^N sum_{i=1}^{N-1} S_{text{batch accd}}(B_s, B_t) end{aligned}tag{11}
Sepoch accd=N(N−1)1j=i+1∑Ni=1∑N−1Sbatch accd(Bs,Bt)(11)
实验结果这里就不放了,简单说一下就是作者使用了TextFooler、BERT-Attack、TextBugger三种攻击手段,以PGD、FreeLB、TAVAT等方法为baseline进行对比,结果表明使用Flooding-X效果很好
从下图可以看出,当梯度一致性指标从负数变为正数时,测试集损失也开始上升,说明梯度一致性这个指标可以很好的当作是过拟合的信号
个人总结2020年提出的Flooding本身就是一个非常有意思的Trick,可惜原论文作者也苦于超参数 b b b的选择,因此其应用不算广泛。ACL2022这篇论文提出了梯度一致性的概念,让模型自己感知什么时候该进行Flooding,避免了超参数的选择问题
References- 我们真的需要把训练集的损失降到零吗?
- Flooding-X: Improving BERT’s Resistance to Adversarial Attacks via Loss-Restricted Fine-Tuning
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)