PAPER
CODE
面对样本不平衡问题和标签噪声等问题,之前是通过regularizers或者reweight算法,但是需要不断调整超参取得较好的效果。本文提出了meta-learning的算法,基于梯度方向调整权重。具体做法是需要保证获得一个足够干净的小样本数据集,每经过一轮batch大小的训练就基于当前更新的权重,执行meta gradient descent step来最小化在这个干净无偏差的验证集上的loss。这个方法避免了额外的超参调整,在样本不平衡和标签噪声等问题上可以有很好的效果,所需要的仅仅是一个很小数量的干净的验证集。
在解决样本问题上的工作:
训练集样本权重分配:
AdaBoost:寻找难例来训练分类器。
难例挖掘: 下采样多数样本,挖掘最难的样本
Focal Loss:不同样本添加不同权重,困难样本权重更大
outliers和noise processes:
有些方法是先学习简单样本在学习困难样本
部分工作是去研究如何更好地初始化网络参数
直接对样本数据集下手,re-sample之类的
在最近的meta-learning中,很多都在探索使用validation loss作为meta-objective,本文算法的区别是没有额外的超参,并且避免了成本较高的离线训练。
本文的模型看做online approximation而不是meta-learning objective,这样就可以处理任何常规的监督学习。
文章给出了具体实现并且有理论保证,收敛率为 O ( 1 / ϵ 2 ) O\left(1 / \epsilon^{2}\right) O(1/ϵ2)
( x , y ) (x,y) (x,y)为输入-标签对, { ( x i , y i ) , 1 ≤ i ≤ N } \left\{\left(x_{i}, y_{i}\right), 1 \leq i \leq N\right\} {(xi,yi),1≤i≤N}为训练集,假设 { ( x i v , y i v ) , 1 ≤ i ≤ M } \left\{\left(x_{i}^{v}, y_{i}^{v}\right), 1 \leq i \leq M\right\} {(xiv,yiv),1≤i≤M}为一个很小的干净无偏差的验证集,其中 M ≪ N M \ll N M≪N. v v v表示验证集, i i i表示第 i t h i^{th} ith个数据;同时假设训练集是包含验证集的,如果不包含,就把验证集加入到训练集中,从而使得训练过程中能够利用更多信息。
用 Φ ( x , θ ) \Phi(x, \theta) Φ(x,θ)表示网络模型, θ \theta θ为模型参数,定义 C ( y ^ , y ) C(\hat{y}, y) C(y^,y)为loss函数,其中 y ^ = Φ ( x , θ ) \hat{y}=\Phi(x, \theta) y^=Φ(x,θ)。
在一般的训练中,我们希望最小化训练集上的期望loss,也就是 1 N ∑ i = 1 N C ( y ^ i , y i ) = 1 N ∑ i = 1 N f i ( θ ) \frac{1}{N} \sum_{i=1}^{N} C\left(\hat{y}_{i}, y_{i}\right)=\frac{1}{N} \sum_{i=1}^{N} f_{i}(\theta) N1∑i=1NC(y^i,yi)=N1∑i=1Nfi(θ),其中每一个输入样本权重相等, f i ( θ ) f_{i}(\theta) fi(θ)表示输入数据 x i x_i xi对应的loss。本文希望通过最小化weighted loss来学习去re-weight 输入。weighted loss如下:
θ ∗ ( w ) = arg min θ ∑ i = 1 N w i f i ( θ ) (1) \theta^{*}(w)=\arg \min _{\theta} \sum_{i=1}^{N} w_{i} f_{i}(\theta) \tag{1} θ∗(w)=argθmini=1∑Nwifi(θ)(1)
其中 w i w_i wi一开始未知, { w i } i = 1 N \left\{w_{i}\right\}_{i=1}^{N} {wi}i=1N可以被理解成训练超参数,基于 w w w在验证集上的表现来最优化 w w w:
w ∗ = arg min w , w ≥ 0 1 M ∑ i = 1 M f i v ( θ ∗ ( w ) ) (2) w^{*}=\arg \min _{w, w \geq 0} \frac{1}{M} \sum_{i=1}^{M} f_{i}^{v}\left(\theta^{*}(w)\right) \tag{2} w∗=argw,w≥0minM1i=1∑Mfiv(θ∗(w))(2)
这里需要保证 w i ≥ 0 w_i \geq 0 wi≥0 对所有的 i i i,因为最小化负的training loss可能会导致一些不稳定的情况。
Note:公式(1)(2)实际上就是最小化training loss同时还得保证这时候的权重在验证集的loss也最小。
Online Approximation 计算最优的 w i w_i wi需要两层嵌套的最优化循环,并且单个循环成本很高。本文方法的目的是通过一层优化循环来在线调整 w w w。每一个training iteration中,首先只在training loss平面上检查部分训练样本的下降方向,然后根据和validation loss平面下降方向的相似性对样本进行reweighting。
大多数深度网络都有用SGD或者改进版来优化loss。对于training过程的每一步 t t t,采样出mini-batch个训练样本 { ( x i , y i ) , 1 ≤ i ≤ n } \left\{\left(x_{i}, y_{i}\right), 1 \leq i \leq n\right\} {(xi,yi),1≤i≤n}, n n n是mini-batch size 且 n ≪ N n \ll N n≪N。然后根据mini-batch上期望loss的下降方向来更新参数。
最普通的SGD如下:
θ t + 1 = θ t − α ∇ ( 1 n ∑ i = 1 n f i ( θ t ) ) (3) \theta_{t+1}=\theta_{t}-\alpha \nabla\left(\frac{1}{n} \sum_{i=1}^{n} f_{i}\left(\theta_{t}\right)\right) \tag{3} θt+1=θt−α∇(n1i=1∑nfi(θt))(3)
其中 α \alpha α是step size。
本文想要探究在第 t t t个training step,什么因素影响了训练样本 i i i在validation set上的性能。
于是对mini-batch 中的每个样本,加上一个权重扰动 ϵ i \epsilon_{i} ϵi
f i , ϵ ( θ ) = ϵ i f i ( θ ) (4) f_{i, \epsilon}(\theta)=\epsilon_{i} f_{i}(\theta) \tag{4} fi,ϵ(θ)=ϵifi(θ)(4)
Note: 目前这样和weighted loss看起来没什么区别
θ ^ t + 1 ( ϵ ) = θ t − α ∇ ∑ i = 1 n f i , ϵ ( θ ) ∣ θ = θ t (5) \hat{\theta}_{t+1}(\epsilon)=\theta_{t}-\left.\alpha \nabla \sum_{i=1}^{n} f_{i, \epsilon} (\theta)\right|_{\theta=\theta_{t}} \tag{5} θ^t+1(ϵ)=θt−α∇i=1∑nfi,ϵ(θ)∣∣∣∣∣θ=θt(5)
然后寻找在第 t t t步能够最小化验证集loss f v f^{v} fv的最优的 ϵ ∗ \epsilon^* ϵ∗
ϵ t ∗ = arg min ϵ 1 M ∑ i = 1 M f i v ( θ t + 1 ( ϵ ) ) (6) \epsilon_{t}^{*}=\arg \min _{\epsilon} \frac{1}{M} \sum_{i=1}^{M} f_{i}^{v}\left(\theta_{t+1}(\epsilon)\right) \tag{6} ϵt∗=argϵminM1i=1∑Mfiv(θt+1(ϵ))(6)
这样计算依然成本很高,为了更容易的在第 t t t步估计 w i w_i wi,本文在mini-batch大小的验证集( ϵ t \epsilon_t ϵt)上采用一步梯度下降(single gradient descent step),并对输出进行矫正保证权重均非负。
u i , t = − η ∂ ∂ ϵ i , t 1 m ∑ j = 1 m f j v ( θ t + 1 ( ϵ ) ) ∣ ϵ i , t = 0 (7) u_{i, t}=-\left.\eta \frac{\partial}{\partial \epsilon_{i, t}} \frac{1}{m} \sum_{j=1}^{m} f_{j}^{v}\left(\theta_{t+1}(\epsilon)\right)\right|_{\epsilon_{i, t}=0} \tag{7} ui,t=−η∂ϵi,t∂m1j=1∑mfjv(θt+1(ϵ))∣∣∣∣∣ϵi,t=0(7)
w ~ i , t = max ( u i , t , 0 ) (8) \tilde{w}_{i, t}=\max \left(u_{i, t}, 0\right) \tag{8} w~i,t=max(ui,t,0)(8)
其中 η \eta η是在 ϵ \epsilon ϵ上的下降步长。
为了匹配原本的训练步长,实际上,我们可以考虑在一个batch中把所有样本的权重标准化,使他们的和为1.
也就是对集合加一个强限制,使其满足 { w : ∥ w ∥ 1 = 1 } ∪ { 0 } \{w:\|w\|_{1}=1 \} \cup \{0\} {w:∥w∥1=1}∪{0}
w i , t = w ~ i , t ( ∑ j w ~ j , t ) + δ ( ∑ j w ~ j , t ) (9) w_{i, t}=\frac{\tilde{w}_{i, t}}{\left(\sum_{j} \tilde{w}_{j, t}\right)+\delta\left(\sum_{j} \tilde{w}_{j, t}\right)} \tag{9} wi,t=(∑jw~j,t)+δ(∑jw~j,t)w~i,t(9)
其中 δ ( ⋅ ) \delta(\cdot) δ(⋅)是为了防止出现在mini-batch中所有的 w i w_i wi都是0的情况,也就是如果 a = 0 a=0 a=0那么有 δ ( a ) = 1 \delta(a)=1 δ(a)=1,其他情况下都是 δ ( a ) = 0 \delta(a)=0 δ(a)=0。如果没有批归一化步骤,该算法可能朝着最高效的学习率的方向修改,本文的one-step方法在学习率的选择上可能会更保守。此外,通过批归一化,有效地取消了元学习速率参数 η \eta η。
给了一个多层感知器的数学公式推导,感兴趣可以阅读原文
Note:图的流程描述下来就是首先正常前向计算,获得loss,然后backward,依据样本权重更新参数,获得新的参数 θ ^ \hat{\theta} θ^,然后放入验证集forward,backward,根据validation loss 获得样本权重并更新。然后继续步骤1.
详细算法步骤如下:
使用这个reweight策略的训练时间是正常训练网络的三倍(因为有两次forward-backward,还有一个backward-on-backward),如果想缩减时间,可以减少验证集的batch size。
作者认为多花时间训练来避免不断的调参之类的操作是值得的。
有空在补,公式太多不想看了
作者做了两个实验,一个是在MNIST上的imbalance问题,一个是CIFAR上的noisy label问题。
作者说适用于任何深度网络,已经有了开源的pytorch代码,后续加到自己的工作中试一下看看效果。