【论文阅读】Self-Paced Curriculum Learning

本文探讨了自定进度学习(SPL)和课程学习(CL)的差异,提出了一种新的学习框架——自定进度课程学习(SPCL),它结合了训练前的先验知识和训练过程中的学习进度,旨在实现师生协作式的高效学习。通过实例和算法描述,文章展示了SPCL在避免过度拟合和整合额外知识方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论文下载
代码
Supplementary Materials
bib:

@INPROCEEDINGS{,
	 title		= {Self-Paced Curriculum Learning},
	 author	    = {Lu Jiang and Deyu Meng and Qian Zhao and Shiguang Shan and Alexander Hauptmann},
	 booktitle	= {AAAI},
	 year		= {2015},
	 pages      = {2694--2700}
}

1. 摘要

Curriculum learning (CL) or self-paced learning (SPL) represents a recently proposed learning regime inspired by the learning process of humans and animals that gradually proceeds from easy to more complex samples in training.

The two methods share a similar conceptual learning paradigm, but differ in specific learning schemes.

In CL, the curriculum is predetermined by prior knowledge, and remain fixed thereafter.

Therefore, this type of method heavily relies on the quality of prior knowledge while ignoring feedback about the learner.

In SPL, the curriculum is dynamically determined to adjust to the learning pace of the leaner.

However, SPL is unable to deal with prior knowledge, rendering it prone to overfitting.

In this paper, we discover the missing link between CL and SPL, and propose a unified framework named self-paced curriculum leaning (SPCL).

SPCL is formulated as a concise optimization problem that takes into account both prior knowledge known before training and the learning progress during training.

In comparison to human education, SPCL is analogous to “instructor-student-collaborative” learning mode, as opposed to “instructor-driven” in CL or “student-driven” in SPL.

Empirically, we show that the advantage of SPCL on two tasks.

课程学习(CL)或自定进度学习(SPL)代表了最近提出的一种学习制度,其灵感来自人类和动物的学习过程,在训练中逐渐从简单到更复杂的样本进行。 这两种方法具有相似的概念学习范式,但具体的学习方案有所不同。 在 CL 中,课程是由先验知识预先确定的,并且此后保持固定。 因此,这种方法严重依赖先验知识的质量,而忽略了学习者的反馈。 在 SPL 中,课程是动态确定的,以适应学习者的学习节奏。 然而,SPL 无法处理先验知识,因此容易出现过度拟合。 在本文中,我们发现了 CL 和 SPL 之间缺失的联系,并提出了一个名为自定进度课程学习(SPCL)的统一框架。 SPCL 被表述为一个简洁的优化问题,它考虑了训练前已知的先验知识和训练期间的学习进度。 与人类教育相比,SPCL类似于“师生协作”的学习模式,而不是CL中的“教师驱动”或SPL中的“学生驱动”。 根据经验,我们展示了 SPCL 在两项任务上的优势。

Note:

  1. 课程学习依赖于课程先验,在许多场景中,课程先验一般都是缺失的。这种方法严重依赖于先验知识的质量,而忽略了学习者的反馈,相当于是老师主导。
  2. 自步学习中课程是动态确定的,以适应学习者节奏。其中,动态确定只是按照loss的高低当作是样本的难易,无法处理额外加入的知识先验。

2. 算法描述

2.1. 自步学习

min ⁡ w , v ∈ [ 0 , 1 ] n E ( w , v ; λ ) = ∑ i = 1 n v i L ( y i , f ( x i , w ) ) − λ ∥ v ∥ 1 (1) \min_{\mathbf{w}, \mathbf{v} \in[0, 1]^n}\mathbb{E}(\mathbf{w}, \mathbf{v};\lambda) = \sum_{i=1}^n{v_iL(y_i, f(\mathbf{x}_i,\mathbf{w}))} - \lambda\|\mathbf{v}\|_1 \tag{1} w,v[0,1]nminE(w,v;λ)=i=1nviL(yi,f(xi,w))λv1(1)

等式1应该就是自步学习中最经典的形式了。其中,对于自步正则 − ∥ v ∥ 1 -\|\mathbf{v}\|_1 v1是可以替换的,有很多的类型,这个是最经典的hard型(非0即1)。对于等式1的求解可以采用ACS (Alternative Convex Search)。

  1. 固定 w \mathbf{w} w,求解 v \mathbf{v} v。存在闭式解(可以理解为解析解) v ∗ = [ v 1 ∗ , … , v n ∗ ] \mathbf{v}^* = [v_1^*, \dots, v_n^*] v=[v1,,vn],
    v i ∗ = { 1 , L ( y i , f ( x i , w ) ) < λ ; 0 , otherwise. v_i^* = \begin{cases} 1, & L(y_i, f(x_i, \mathbf{w})) < \lambda;\\ 0, &\text{otherwise.}\\ \end{cases} vi={1,0,L(yi,f(xi,w))<λ;otherwise.
  2. 固定 v \mathbf{v} v,用梯度下降法(也可以用其他优化方法)求解 w \mathbf{w} w

存在的弊端:

However, since the learning is completely dominated by the training loss, the learning may be prone to overfitting. Moreover, it provides no way to incorporate prior guidance in learning. To the best of our knowledge, there has been no studies to incorporate prior knowledge into SPL, nor to analyze the relation between CL and SPL.

2.1. 自步课程学习

自步课程学习想要打造一种师生协同的学习范式,其中,同时考虑训练前已知的先验知识和训练期间学到的知识。

Self-paced Curriculum Learning:

min ⁡ w , v ∈ [ 0 , 1 ] n E ( w , v ; λ , Ψ ) = ∑ i = 1 n v i L ( y i , f ( x i , w ) ) − f ( v ; λ ) s.t.  v ∈ Ψ (2) \begin{aligned}\min_{\mathbf{w}, \mathbf{v} \in[0, 1]^n}\mathbb{E}(\mathbf{w}, \mathbf{v};\lambda, \Psi) = \sum_{i=1}^n{v_iL(y_i, f(\mathbf{x}_i,\mathbf{w}))} &- f(\mathbf{v}; \lambda) \\ &\text{s.t. } \mathbf{v} \in \Psi \\ \end{aligned}\tag{2} w,v[0,1]nminE(w,v;λ,Ψ)=i=1nviL(yi,f(xi,w))f(v;λ)s.t. vΨ(2)

Note:

  1. 相比一式,增加了一个 Ψ \Psi Ψ课程约束,在原文中叫做Curriculum region
  2. 求解这个优化问题也是使用ACS,固定第一个求解第二个,固定第二个个,求解第一个。不同的是求解 v ∗ v^* v时没法获得闭式解了,可以通过求解带约束的优化问题来求解。
  3. 对于Curriculum region,原文有额外的定义,我这里就不再详细的写了,就只写一下我的感受。原文中给了一个满足Curriculum region定义的一个约束 Ψ = { v ∣ a T × v ≤ c } \Psi = \{\mathbf{v}| a^{\mathsf{T}}\times \mathbf{v} \leq c\} Ψ={vaT×vc}。当然,你也可以自定义一个满足课题的约束,前提是要满足对于该该区域中的任意两个点, x i , x j x_i, x_j xi,xj, 如果课程优先级 γ ( x i ) < γ ( x j ) \gamma(x_i) < \gamma(x_j) γ(xi)<γ(xj), 那么满足 ∫ Ψ v i d v > ∫ Ψ v j d v \int_{\Psi}v_i d\mathbf{v} > \int_{\Psi}v_j d\mathbf{v} Ψvidv>Ψvjdv,也就是 v i v_i vi Ψ \Psi Ψ的期望大于 v j v_j vj Ψ \Psi Ψ的期望,也就是模型重点拟合v_i( γ ( x i ) < γ ( x j ) \gamma(x_i) < \gamma(x_j) γ(xi)<γ(xj),也就是说学习课程优先的内容)。

3. 实验

论文中提供的代码是R语言的,我用python实现了一个demo,但是对于Example 1求解 v ∗ v^* v不是完全一致,猜想应该是求解算法不同的问题。

from scipy.optimize import minimize
import numpy as np

# samples
id = np.array(['a', 'b', 'c', 'd', 'e', 'f'])
myloss = np.array([0.1, 0.2, 0.4, 0.6, 0.5, 0.3]).reshape([-1, 1])
print("####### input loss ######")
print(myloss)

# 4) calculate curriculum constraints
# A = matrix(0, nrow=length(id), ncol=1)
# curriculum constraints matrix
A = np.zeros([len(id), 1])
A[:, 0] = np.array([0.1, 0.0, 0.4, 0.3, 0.5, 1.0])
# A[:, 0] = np.array([2.3, 2.2, 2.1, 2.0, 1.7, 1.5])
print("####### A matrix ######")
print("A: ", A)
c = 1.0
# c = 6.0

# 5) optimize v with modality constraint (A)
# v0 = replicate(length(id),0)
v0 = np.repeat(0, len(id))
print("v0: ", v0)
# a small constant for optmization accuracy
tolerance = 1e-7
print("tolerance: ", tolerance)

# tolerance = 0
# parameter in self-paced learning
lambda_var = 0.8333

# paramaters
u1 = -1 * A  # -Av >= -c	i.e.	Av <= c

# c1 = -1 * c - tolerance  # -Av >= -c	i.e.	Av <= c
c1 = c + tolerance

# 三个约束
# v 大于等于 0
# v 小于等于 1
# A^T \times V <= c
# inequality means that it is to be non-negative.
cons = ({'type': 'ineq', 'fun': lambda v: v @ u1 + c1})


# 定义目标函数
def objective_function(v):
    obj = v @ myloss - lambda_var * np.sum(v)
    return obj


# 定义目标函数的梯度
def objective_gradient(v):
    grads = myloss - lambda_var
    return grads


# 设置bounds
# bounds = tuple([(-tolerance, 1 + tolerance) for i in range(len(v0))])
bounds = tuple([(0, 1) for i in range(len(v0))])
# x0 = np.zeros([len(id)])
# res_SLSQP = minimize(objective_function, v0, method='SLSQP', jac=objective_gradient, constraints=cons, bounds=bounds)


# res = minimize(objective_function, v0, method='SLSQP', constraints=cons, bounds=bounds)
print("###res_SLSQP###")
res_SLSQP = minimize(objective_function, v0, method='SLSQP', jac=objective_gradient, constraints=cons, bounds=bounds,
                     options={"maxiter": 100, "disp": True})
print('最小值:', res_SLSQP.fun)
print('最优解:', res_SLSQP.x)
print('迭代终止是否成功:', res_SLSQP.success)
print('迭代终止原因:', res_SLSQP.message)
print("最终解是否满足先验课程知识: ", res_SLSQP.x @ u1 + c1 >= 0)

print("###COBYLA###")
res_COBYLA = minimize(objective_function, v0, method='COBYLA', jac=objective_gradient, constraints=cons, bounds=bounds,
                      options={"maxiter": 100, "disp": True})
print('最小值:', res_COBYLA.fun)
print('最优解:', res_COBYLA.x)
print('迭代终止是否成功:', res_COBYLA.success)
print('迭代终止原因:', res_COBYLA.message)
print("最终解是否满足先验课程知识: ", res_COBYLA.x @ u1 + c1 >= 0)

# v_2 = np.array([1, 1, 1, 0.88, 0.47, 0])
v_2 = np.array([1, 0.91, 0.10, 0.00, 0.00, 1.00])
print('论文最优解:', v_2)
print("论文最小值:", objective_function(v_2))
print("论文最终解是否满足先验课程知识: ", v_2 @ u1 + c1 >= 0)

4. 总结

自步学习是通过loss大小来判断样本学习难易,有时候我们有其他的学习准则,其实这时候就已经是课程学习的内容了。自步学习之所以称为自步,就是只依照loss大小自发的学习,至于不同的自步学习变种,本质上就是自步正则,难易样本权重惩罚系数不同。而以往想要按照其他学习准则,就只能用课程学习了,按照已经定义好的课程先验知识来学习。本文就是将自步学习和课程学习做了连接,自步课程学习想要打造一种师生协同的学习范式,其中,同时考虑训练前已知的先验知识和训练期间学到的知识。

### 自适应学习算法的实现 自适应学习(Self-Paced Learning, SPL)是一种模仿人类认知过程的学习方法,其核心思想是从简单到复杂逐步训练模型。虽然提供的引用中未直接提及SPL的具体代码实现[^1],但可以根据已有的研究和框架来构建其实现。 以下是基于Python的一个简单的自适应学习算法实现示例: #### 基于难度加权的自适应学习伪代码 ```python import numpy as np def self_paced_learning(X_train, y_train, model, loss_function, lambda_min=0.1, lambda_max=1.0, rate=0.1): """ 实现一个基本的自适应学习算法 参数: X_train: 训练数据特征矩阵 y_train: 训练数据标签向量 model: 可训练的机器学习模型 loss_function: 损失函数计算方式 lambda_min: 难度参数下限 lambda_max: 难度参数上限 rate: 更新速率 返回: trained_model: 经过自适应学习调整后的模型 """ n_samples = len(y_train) lambdas = np.full(n_samples, lambda_min) # 初始化样本权重为最小值 while True: weighted_loss = [] for i in range(n_samples): prediction = model.predict([X_train[i]])[0] loss = loss_function(prediction, y_train[i]) weighted_loss.append(loss * lambdas[i]) # 加入权重调节 total_weighted_loss = sum(weighted_loss) if total_weighted_loss < threshold or all(lambdas >= lambda_max): # 收敛条件 break # 调整样本权重 for i in range(n_samples): if weighted_loss[i] > average_loss: lambdas[i] += rate # 提高困难样本权重 else: lambdas[i] -= rate # 减少容易样本权重 lambdas[i] = max(lambda_min, min(lambdas[i], lambda_max)) # 截断范围 # 使用更新后的权重重新训练模型 model.fit(X_train, y_train, sample_weights=lambdas) return model ``` 此代码片段展示了一个基础版本的自适应学习逻辑,其中通过动态调整样本权重来控制训练过程中不同样本的影响程度[^3]。 --- ### 关键概念解释 - **难度参数**:`lambda` 控制每个样本的重要性,在初始阶段赋予较低权重给较难样本,随着迭代逐渐增加这些样本的影响力。 - **损失函数**:用于衡量当前预测与真实值之间的差距,通常可以采用均方误差或交叉熵等标准形式。 - **收敛条件**:当总体加权损失低于设定阈值或者所有样本达到最大允许权重时停止训练循环。 上述实现仅为理论上的简化版,实际应用可能需要针对具体场景进一步优化并引入更多高级特性如正则化项或其他约束机制[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来日可期1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值