自步学习(self-paced learning)详解

自步学习总结及Python代码实现

1.定义

自步学习(SPL)是近期提出的一种学习机制,受到人类和动物学习过程的启发,该过程逐渐将复杂的样本纳入训练中,即在训练模型的整个过程中,我们先让模型学习简单的样本,慢慢的再加入复杂的样本让模型进行学习。目前的除了普通的自步学习外,加有多样性(diversity)的自步学习也被提出。

2.不带有多样性的自步学习(SPL)

2.1 简介

SPL就是一般的自步学习,即模型的训练过程中,先从简单样本开始学起,直至复杂样本。

该算法的数学描述如下:

假设样本集合 X = [ x 1 , x 2 , . . . , x n ] X=[x_1,x_2,...,x_n] X=[x1,x2,...,xn],模型为 f ( x ) f(x) f(x),损失函数为 L ( f ( x ) , y ) L(f(x),y) L(f(x),y),其中 f ( x ) f(x) f(x)为对应样本 x x x的预测输出值, y y y为样本 x x x的真是标签值,则自步学习的目标函数可以定义为如下的表达式:

在这里插入图片描述

目标函数第一项解释:其中 v i , i ∈ [ 1 , 2 , . . , n ] v_i,i\in[1,2,..,n] vi,i[1,2,..,n]是对应样本 x 1 , x 2 , . . . x n x_1,x_2,...x_n x1,x2,...xn辅助变量,其作用就是决定对应的样本是否加入训练过程。

目标函数第二项解释:本质就是一个加入的正则项,其中 v i v_i vi是一个0,1变量, λ \lambda λ是一个超参数,用于控制训练过程的学习步长。

2.2 求解

针对目标函数(1),显而易见其是一个非凸问题,无法通过常见的梯度下降算法进行求解。因此,在这一类问题的求解上面,主要是应用替代性凸搜素(Alternative Convex Search)进行求解,这是一种双凸优化的迭代方法,其将变量分为两个不相交的块,在每一次的迭代过程中,优化一个变量块,同时保持另一个变量块保持不变。在该目标函数求解过程中,当 v v v固定时,便可以采用现有的监督学习方法来获取最优的 w ∗ w^* w;在固定 w w w的情况下,全局最优的 v ∗ = [ v 1 ∗ , v 2 ∗ , . . . v n ∗ ] v^*=[v^*_1,v^*_2,...v^*_n] v=[v1,v2,...vn]可以通过下面的式子(2)求得。

在这里插入图片描述

该替代搜索策略背后有一个直观的解释:

  1. 用固定的 w w w更新 v v v时,将损失小于某个阈值 λ \lambda λ(超参数)的样本作为“容易”样本,并将在训练中选择( v i = 1 v_i=1 vi=1),否则未选中( v i = 0 v_i=0 vi=0);
  2. 用固定的 v v v更新 w w w时,仅在选定的“简单”样本上训练分类器。 参数 λ \lambda λ控制模型学习新样本的速度,而 λ \lambda λ物理上对应于模型的“年龄”。 当 λ \lambda λ小时,将仅考虑损耗小的“简单”样本。 随着 λ \lambda λ的增加,更多具有更大损失的样本将逐渐添加以训练更“成熟”的模型。

2.3 代码实现

import numpy as np

# 不带有多样性的自步学习
def spl(loss, lam):
    selected_idx = []
    for idx, val in enumerate(loss):
        if val < lam:
            selected_idx.append(idx)
    selected_idx_arr = np.array(selected_idx)
    return selected_idx_arr


if __name__ == '__main__':
    samples = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
    loss = [0.05, 0.12, 0.12, 0.12, 0.15, 0.40, 0.17, 0.18, 0.35, 0.15, 0.16, 0.20, 0.50, 0.28]
    selected_samples = []

    selected_idx_arr = spl(loss,0.15)

    for selected_idx in selected_idx_arr:
        selected_samples.append(samples[selected_idx])
    print("selected samples are:{}".format(",".join(selected_samples)))

结果:

selected samples are:a,b,c,d

3 .带有多样性的自步学习(SPLD)

3.1 简介

所谓多样性就是意味着所选样本应该不太相似或不完整。 实现此目的的一种直观方法是选择散布在样本空间中的不同组的样本。 一般来讲,组间样本的相关性小于组内样本的相关性。例如:在文本分类中,来自统一标签的样本可以视为同一组,也可以通过对样本进行聚类获得。

带有多样性的自步学习(SPLD)在数学上描述如下:

假设训练样本 X = ( x 1 , x 2 , . . . , x n ) ∈ R m ∗ n X=(x_1,x_2,...,x_n) \in R^{m*n} X=(x1,x2,...,xn)Rmn被分为 b b b个组: X 1 , X 2 , . . . , X b X^1,X^2,...,X^b X1,X2,...,Xb,其中 X j ∈ R m ∗ n j X_j\in R^{m*n_j} XjRmnj的列对应第 j j j组中的样本, n j n_j nj是该组中的样本个数,并且 ∑ j = 1 b n j = n \sum_{j=1}^bn_j=n j=1bnj=n。 因此,将权向量表示为 V = [ V ( 1 ) , V ( 2 ) , . . . , V ( b ) ] V=[V^{(1)},V^{(2)},...,V^{(b)}] V=[V(1),V(2),...,V(b)],其中 V ( j ) = ( v 1 ( j ) , v 2 ( j ) , . . . , v n j ( j ) ) T ∈ [ 0 , 1 ] n j V^{(j)}={(v_1^{(j)},v_2^{(j)},...,v_{n_j}^{(j)})}^T\in {[0,1]}^{n_j} V(j)=(v1(j),v2(j),...,vnj(j))T[0,1]nj。 像常规SPL一样,一方面SPLD需要将 V V V的非零权重分配给常规样本,另一方面需要在可能更多的 V ( i ) V^{(i)} V(i)组中分散非零元素以增加多样性。 可以通过以下优化模型统一实现这两个要求:
在这里插入图片描述

λ \lambda λ γ \gamma γ是分别作用在简单项 ∑ i = 1 n v i \sum_{i=1}^nv_i i=1nvi和多样性项 ∣ ∣ V ∣ ∣ 2 , 1 ||V||_{2,1} V2,1的两个超参数。对于多样性项,有:

在这里插入图片描述

SPLD在等式中引入了新的正则化术语。(3)由两个部分组成。 一个是从常规SPL继承的负 l 1 l_1 l1-范数,它倾向于选择简单而不是复杂的样本。 另一个是负 l 2 , 1 l_{2,1} l2,1-范数,它有助于选择来自更多组中的各种样本。 众所周知, l 2 , 1 l_{2,1} l2,1-范数导致 V V V的按组稀疏表示,即 V V V的非零个数倾向于集中在少数几个组中。 相反,负的 l 2 , 1 l_{2,1} l2,1-范数对按组稀疏具有反作用,即 V V V的非零个数倾向于分散在大量组中。 换句话说,期望该反组稀疏表示实现期望的多样性。 请注意,当每个组仅包含一个样本时,(3)退化为 (1)。

与SPL中的方程式(1)中的凸正则化项不同。SPLD中的目标函数是非凸的。 因此,传统的基于梯度的方法无法直接应用于优化 V V V。接下来,我们将利用SPLD算法对上述问题进行求解。

3.2 SPLD算法

与SPL相似,可以使用替代搜索策略来求解等式(3)。然而,一个挑战是:用固定的 W W W优化 V V V成为不可置疑的问题。 我们提出了一种简单而有效的算法来提取此问题的全局最优值,如下面的算法所示:

在这里插入图片描述

3.3 SPLD算法实现

import numpy as np



def spld(loss, group_member_ship, lam, gamma):
    groups_labels = np.array(list(set(group_member_ship)))
    b = len(groups_labels)
    selected_idx = []
    selected_score = [0] * len(loss)
    for j in range(b):
        idx_in_group = np.where(group_member_ship == groups_labels[j])[0]
        # print(idx_in_group)
        loss_in_group = []
        # print(type(idx_in_group))
        for idx in idx_in_group:
            loss_in_group.append(loss[idx])
        idx_loss_dict = dict()
        for i in idx_in_group:
            idx_loss_dict[i] = loss[int(i)]
        sorted_idx_in_group = sorted(idx_loss_dict.keys(), key=lambda s: idx_loss_dict[s])
        sorted_idx_in_group_arr = np.array(sorted_idx_in_group)

        # print(sorted_idx_in_group_arr)

        for (i, ii) in enumerate(sorted_idx_in_group_arr):
            if loss[ii] < (lam + gamma / (np.sqrt(i + 1) + np.sqrt(i))):
                selected_idx.append(ii)
            else:
                pass
            selected_score[ii] = loss[ii] - (lam + gamma / (np.sqrt(i + 1) + np.sqrt(i)))

    selected_idx_arr = np.array(selected_idx)
    selected_idx_and_new_loss_dict = dict()
    for idx in selected_idx_arr:
        selected_idx_and_new_loss_dict[idx] = selected_score[idx]

    sorted_idx_in_selected_samples = sorted(selected_idx_and_new_loss_dict.keys(),
                                            key=lambda s: selected_idx_and_new_loss_dict[s])

    sorted_idx_in_selected_samples_arr = np.array(sorted_idx_in_selected_samples)
    return sorted_idx_in_selected_samples_arr


if __name__ == '__main__':
    samples = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
    group_member_ship = [1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4]
    loss = [0.5, 0.6, 0.7, 0.8, 1.2, 0.9, 1.0, 2.3, 1.8, 0.7, 3.9, 0.8, 0.9, 0.8]
    selected_samples = []

    selected_idx_arr = spld(loss, group_member_ship, 2.4, 16)

    #print(selected_idx_arr)
    for selected_idx in selected_idx_arr:
        selected_samples.append(samples[selected_idx])
    print("selected samples are:{}".format(",".join(selected_samples)))

结果:

selected samples are:a,j,n,g,b,l,i,c,m,d,f,h,e,k

4.总结

自步学习作为一种学习机制,可以在很多深度学习模型中加入这种机制。比如:在推荐系统中,可能因为推荐种类的单一性导致推荐效果一般,因此,便可以加入自步学习作为弥补,考虑样本的多样性问题。当然,在一般的模型中,训练过程中加入自步学习也是可以使得模型的性能得到一定的提升。

参考文献:Self-Paced Learning with Diversity,附上下载地址:http://www.cs.cmu.edu/~lujiang/camera_ready_papers/NIPS_2014.pdf,具体代码可到github.com/shiqiuwang查看。

猜你喜欢

转载自blog.csdn.net/wqs12345612/article/details/111714393