Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning

问题研究

对预训练的语言模型进行微调后就可以在众多下游任务中获取 SOTA 的结果,但这个过程的机制并没有得到很好的理解。

尤其是在低数据情况下,为什么可以使用 vanilla gradient descent 方法在只有数百或数千个标记样本的数据集上调整具有数亿个参数的模型

概念

本征维度 (intrinsic dimension)

对一个高维优化问题,获取对应目标的满意解所需的最小参数维度

 具体公式请参加论文

实验

根据 GLUE 指标在 MRPC 和 QQP 两个微调数据集上利用 DID 和 SAID 方法计算了 BERT 和 RoBERTa 模型的本征维度

结论是:只需要非常低的维度就可以获得一个较好的参数方案。例如,使用 RoBERTa-Large 模型,只需要大约 200 和 800 个参数就可以在 MRPC 和 QQP 任务上达到完整微调方案 90% 的准确率。

另外一个发现是:具有更多参数的 RoBERTa 在各种子空间维度 d 上始终优于 BERT

认为本征维度向量的一种解释是,它根据原始预训练好的表示对手头的任务进行编码。因此,可以将 d 解释为,在预训练表示规定的框架内,对下游任务的最小描述长度 (Hinton & Zemel,1993)。基于这种解释,假设预训练过程隐式地降低了 NLP 任务的内在维度,因此压缩了这些相同任务的最小描述长度。下图验证了这一点。

 

对十几种不同的预训练模型进行了研究。下图表明参数的数量与本征维度的大小呈负相关关系。这在一定程度上证明了大规模模型的有效性从何而来

 

鉴于此前的结果已经看到预训练最小化了本征维度,作者假设模型泛化性能会随着本征维度的减少而提高。

为了验证这一点,作者利用图 2 中 RoBERTa 实验的各种检查点,对d90和验证集性能之间的联系进行了实证实验。如下图所示:

 以上结果表明,较低的本征维度再次与较小的相对泛化边界密切相关

结论

常见的预训练模型具有非常低的本征维度;换句话说,存在与完整参数空间一样有效的低维重新参数化。实验表明,预训练过程隐式地最小化了本征维度,且在固定数量的预训练更新后,较大规模的模型往往具有较低的本征维度。最后,作者将本征维度与泛化边界联系起来,从实验和理论两个角度验证了本征维度与相对泛化边界正相关关系

reference

https://zhuanlan.zhihu.com/p/409426163

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Intrinsic Biophysical Mechanism (IBM) 模型是一个描述神经元膜电位变化的基于生理学的数学模型。下面是一个使用Python实现IBM模型的示例代码: ```python import numpy as np import matplotlib.pyplot as plt # 定义IBM模型 def ibm_model(I, V_rest=-70, C=1, g_L=0.1, E_L=-70, V_th=-55, V_peak=20, delta_t=0.1, t_end=100): """ I: 输入电流 V_rest: 静息电位,默认为-70 mV C: 膜电容,默认为1 μF/cm^2 g_L: 漏电导,默认为0.1 mS/cm^2 E_L: 漏电位,默认为-70 mV V_th: 阈值电位,默认为-55 mV V_peak: 峰值电位,默认为20 mV delta_t: 时间步长,默认为0.1 ms t_end: 模拟时长,默认为100 ms """ # 初始化模拟参数和变量 num_steps = int(t_end / delta_t) t = np.linspace(0, t_end, num_steps) V = np.zeros(num_steps) V[0] = V_rest m = np.zeros(num_steps) m[0] = 0.05 h = np.zeros(num_steps) h[0] = 0.6 n = np.zeros(num_steps) n[0] = 0.32 # 计算模拟结果 for i in range(1, num_steps): # 计算电流 I_L = g_L * (V[i - 1] - E_L) I_Na = 120 * m[i - 1] ** 3 * h[i - 1] * (V[i - 1] - 115) I_K = 36 * n[i - 1] ** 4 * (V[i - 1] + 12) I_ext = I[i - 1] I_total = I_L + I_Na + I_K + I_ext # 计算膜电位 V[i] = V[i - 1] + delta_t / C * I_total # 更新通道状态变量 alpha_m = 0.1 * (V[i - 1] + 40) / (1 - np.exp(-0.1 * (V[i - 1] + 40))) beta_m = 4 * np.exp(-0.0556 * (V[i - 1] + 65)) alpha_h = 0.07 * np.exp(-0.05 * (V[i - 1] + 65)) beta_h = 1 / (1 + np.exp(-0.1 * (V[i - 1] + 35))) alpha_n = 0.01 * (V[i - 1] + 55) / (1 - np.exp(-0.1 * (V[i - 1] + 55))) beta_n = 0.125 * np.exp(-0.0125 * (V[i - 1] + 65)) m[i] = m[i - 1] + delta_t * (alpha_m * (1 - m[i - 1]) - beta_m * m[i - 1]) h[i] = h[i - 1] + delta_t * (alpha_h * (1 - h[i - 1]) - beta_h * h[i - 1]) n[i] = n[i - 1] + delta_t * (alpha_n * (1 - n[i - 1]) - beta_n * n[i - 1]) # 判断是否发生动作电位 if V[i] >= V_th: V[i] = V_peak m[i] = 0 h[i] = 1 n[i] = 0.5 return t, V # 定义输入电流 I = np.zeros(1000) I[100:900] = 10 # 运行IBM模型 t, V = ibm_model(I) # 绘制模拟结果 plt.plot(t, V) plt.xlabel('Time (ms)') plt.ylabel('Membrane Potential (mV)') plt.show() ``` 在以上代码中,我们定义了一个名为`ibm_model`的函数,该函数接受一组输入电流`I`和一些模型参数,并返回模拟结果`t`和膜电位变化`V`。在主程序中,我们定义了一个输入电流`I`,并使用`ibm_model`函数模拟神经元膜电位的变化,最后使用Matplotlib库绘制了模拟结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值