Flooding-X: 超参数无关的Flooding方法

Flooding-X: 超参数无关的Flooding方法,第1张

Flooding-X: 超参数无关的Flooding方法

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 Accordance

ACL2022的投稿有一篇名为《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}} εg1​f(θ−ε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∂L​T(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∂L​T(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)1​j=1∑k​i​=ji=1​∑k​C(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)1​j=i+1∑N​i=1∑N−1​Sbatch accd​(Bs​,Bt​)​(11)

Analysis and Discussion

实验结果这里就不放了,简单说一下就是作者使用了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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5658043.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)