目录
- 其他注意力
- 过拟合的表现有哪些?
- BN 训练和测试的区别在哪里?
- 梯度下降的公式?
- 反向传播
- 学习率衰减
- 优化器
- 均方误差损失
- 交叉熵损失
- 梯度消失问题
- 梯度爆炸问题
- 权重正则化
- 过拟合
- 分词器
- 位置编码对比
- 激活函数
- 梯度检查点
- 指标
- BERT
- BERT 变体
- MacBERT
- T5
- GPT-1
- GPT-2
- GPT-3
- InstructGPT
- LLama
- LLama-2
- LLama-3
- Qwen
- Qwen2
- chatGLM
- chatGLM-2
- chatGLM-3
- Yi-34B
- BERT的预训练原理和相关改进工作?
- 最近大模型出来很多,你有了解过原理吗?
- chatGLM 和 GPT 模型结构⼀样吗
- Instruct 和 prompt 有什么区别?
- ⼤模型的幻觉怎么评测?
- ⼤模型训练⽅式?
- 写一下 softmax 函数
- DPO
- DPO
- IPO 身份偏好优化
- Kahneman-Taversky优化(KTO)
- SimPO 简单偏好优化
- LoRA
- QLoRA
- LoftQ
- Dora 权重分解低秩适应
- GaLore
- LongLoRA
- LongQLoRA
- 模型量化
- 三、GPTQ
- 四、各大开源模型量化实现
- 五、SmoothQuant
其他注意力
过拟合的表现有哪些?
BN 训练和测试的区别在哪里?
BN(Batch Normalization,批量归一化)是一种用于加速深度神经网络训练并提高其稳定性和性能的技术。它在训练和测试阶段有一些关键的区别。
训练阶段
在训练过程中,BN会对每个小批量(batch)的数据计算均值和方差。
使用计算得到的均值和方差对小批量的数据进行归一化。
归一化后的数据再经过可学习的缩放(gamma)和平移(beta)参数的变换。
为了在测试时使用,BN还会维护一个全局的均值和方差,这些值是通过对训练过程中计算的均值和方差进行移动平均计算得到的。
\(\mu_{\text {batch }}=\frac{1}{m} \sum_{i=1}^{m} x_{i}\)
\(\sigma_{\text {batch }}^{2}=\frac{1}{m} \sum_{i=1}^{m}\left(x_{i}-\mu_{\text {batch }}\right)^{2}\)
\(\hat{x}_{i}=\frac{x_{i}-\mu_{\text {batch }}}{\sqrt{\sigma_{\text {batch }}^{2}+\epsilon}}\)
\(y_{i}=\gamma \hat{x}_{i}+\beta\)
为了在测试阶段能够使用一个稳定的均值和方差,我们需要计算训练过程中这些小批量均值和方差的移动平均值。
移动平均是一种平滑数据的方法,使得我们可以从一个变化的值中得到一个相对稳定的估计值。
第一个批次的均值和方差:\(\mu_{1}=2, \sigma_{1}^{2}=1\)
第二个批次的均值和方差:\(\mu_{2}=4, \sigma_{2}^{2}=2\)
第三个批次的均值和方差:\(\mu_{3}=3, \sigma_{3}^{2}=1.5\)
我们将使用一个学习率 α=0.1来计算移动平均。
首先,我们初始化全局均值和方差为零:
\(\begin{array}{l} \mu_{\text {global }}=0 \\ \sigma_{\text {global }}^{2}=0 \end{array}\)
批次1 更新公式:
\(\begin{array}{l} \mu_{\text {global }}=(1-\alpha) \mu_{\text {global }}+\alpha \mu_{\text {batch }} \\ \sigma_{\text {global }}^{2}=(1-\alpha) \sigma_{\text {global }}^{2}+\alpha \sigma_{\text {batch }}^{2} \end{array}\)
应用第一个批次的数据:
\(\begin{array}{l} \mu_{\text {global }}=(1-0.1) \cdot 0+0.1 \cdot 2=0.2 \\ \sigma_{\text {global }}^{2}=(1-0.1) \cdot 0+0.1 \cdot 1=0.1 \end{array}\)
批次2 应用第二个批次的数据:
\(\begin{array}{l} \mu_{\text {global }}=(1-0.1) \cdot 0.2+0.1 \cdot 4=0.18+0.4=0.58 \\ \sigma_{\text {global }}^{2}=(1-0.1) \cdot 0.1+0.1 \cdot 2=0.09+0.2=0.29 \end{array}\)
测试阶段
在测试阶段,BN不再计算当前批量数据的均值和方差,而是使用在训练阶段通过移动平均计算得到的全局均值和方差。
使用全局均值和方差对测试数据进行归一化。
同样使用训练过程中学到的缩放(gamma)和平移(beta)参数。
\(\hat{x}_{i}=\frac{x_{i}-\mu_{\text {global }}}{\sqrt{\sigma_{\text {global }}^{2}+\epsilon}}\)
\(y_{i}=\gamma \hat{x}_{i}+\beta\)
通过这些机制,BN在训练阶段可以加速训练收敛,并在测试阶段提供稳定的性能表现。
梯度下降的公式?
梯度下降是一种优化算法,用于通过最小化损失函数来训练机器学习模型。它的基本思想是不断调整模型的参数,以使损失函数值逐渐减小。
假设我们有一个损失函数 \(L(\theta)\),其中 \(\theta\) 是模型的参数向量。梯度下降算法的核心步骤是按照损失函数的负梯度方向更新参数。基本的梯度下降更新公式如下:
\(\theta:=\theta-\eta \nabla_{\theta} L(\theta)\)
\(\nabla_{\theta} L(\theta) \text { 是损失函数 } L(\theta) \text { 关于参数 } \theta \text { 的梯度(也称为导数) }\)
假设我们有一个简单的线性回归模型,其损失函数是均方误差(MSE),形式如下:
\(L(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}\)
\(h_{\theta}\left(x^{(i)}\right)=\theta_{0}+\theta_{1} x^{(i)}\)
计算对 \(\theta_{0}\) 的梯度
\(\frac{\partial L(\theta)}{\partial \theta_{0}}=\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)\)
计算对 \(\theta_{1}\) 的梯度
\(\frac{\partial L(\theta)}{\partial \theta_{1}}=\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x^{(i)}\)
得到了\(\theta_{0}\) 和 \(\theta_{1}\) 的梯度之后,我们可以使用梯度下降算法更新模型参数:
\(\begin{array}{l} \theta_{0}:=\theta_{0}-\eta \frac{\partial L(\theta)}{\partial \theta_{0}} \\ \theta_{1}:=\theta_{1}-\eta \frac{\partial L(\theta)}{\partial \theta_{1}} \end{array}\)
梯度下降算法的变种
- 批量梯度下降(Batch Gradient Descent):每次迭代使用全部训练数据来计算梯度。
- 随机梯度下降(Stochastic Gradient Descent, SGD):每次迭代只使用一个训练样本来计算梯度。
- 小批量梯度下降(Mini-batch Gradient Descent):每次迭代使用一个小批量的训练数据来计算梯度。
批量梯度下降:可以快速接近最优解,但是其时间消耗相对其他两种是最大的,因为每一次更新都需要遍历完所有数据。
随机梯度下降:参数更新是最快的,因为每遍历一个数据都会做参数更新,但是由于没有遍历完所有数据,所以其路线不一定是最佳路线,甚至可能会反方向巡迹,不过其整体趋势是往最优解方向行进的,随机梯度下降还有一个好处是有一定概率跳出局部最优解(每次的J(θ)是不固定的),而BGD会直接陷入局部最优解。
小批量梯度下降:权衡了参数更新速度和训练稳定性之后,通过同时处理一小批量数据来减少梯度估计的方差,在梯度估计的稳定性和收敛路径的平滑性上都有所提高。
在使用梯度下降的时候,一般需要进行一些调优策略:
- 学习率过大可能会跳过最优解;学习率过小导致迭代速度过慢;
- 算法初始参数值的选择:初始值不同,最终获得的最小值也可能不同,因为梯度下降求解的是局部最优解,一般情况下,选择多个不同的初始值运行算法,最终返回损失函数最小情况下的结果值。
反向传播
工作原理
- 反向传播的第一步是前向传播,它是神经网络从输入到输出的正向计算过程。得到最终的预测输出,与实际标签进行比较,从而计算出预测误差。
- 在前向传播过程中,通过损失函数(也称为目标函数)来度量模型的预测与实际标签之间的误差。损失函数的选择取决于问题的类型,例如均方误差(Mean Squared Error)用于回归问题,交叉熵(Cross-Entropy)用于分类问题。
- 反向传播误差:反向传播的核心思想是将损失从输出层传播回网络的每一层,计算每一层的权重梯度以便后续的权重更新。
- 梯度更新:一旦计算出每一层的梯度,就可以使用梯度下降或其变种算法(如Adam、RMSprop等)来更新神经网络的权重。
学习率衰减
余弦退火(CosineAnnealing)
余弦退火(Cosine annealing)可以通过余弦函数来降低学习率。余弦函数中随着x的增加余弦值首先缓慢下降,然后加速下降,再次缓慢下降。
在论文Stochastic Gradient Descent with Warm Restarts中介绍主要介绍了带重启的随机梯度下降算法(SGDR),其中就引入了余弦退火的学习率下降方式。我们的目标优化函数可能是多峰的,除了全局最优解之外还有多个局部最优解,在训练时梯度下降算法可能陷入局部最小值,此时可以通过突然提高学习率,来“跳出”局部最小值并找到通向全局最小值的路径。这种方式称为带重启的随机梯度下降方法。
余弦退火的原理
当执行完 \(T_i\) 个epoch之后就会开始热重启(warm restart),而下标 \(i\) 就是指的第几次restart,其中重启并不是重头开始,而是通过增加学习率来模拟,并且重启之后使用旧的 \(x_t\) 作为初始解,这里的 \(x_t\) 就是通过梯度下降求解loss函数的解,也就是神经网络中的权重,因为重启就是为了通过增大学习率来跳过局部最优,所以需要将 \(x_t\) 置为旧值。
只考虑在每一次run(包含重启就是restart)中,学习率是如何减小的。余弦退火( cosine annealing )的原理如下:
\(\eta_{t}=\eta_{\min }^{i}+\frac{1}{2}\left(\eta_{\max }^{i}-\eta_{\min }^{i}\right)\left(1+\cos \left(\frac{T_{c u r}}{T_{i}} \pi\right)\right)\)
\(i\) 就是第几次run(索引值)
\(\eta_{\max }^{i}, \eta_{\min }^{i}\) 分别表示学习率的最大值和最小值,定义了学习率的范围。论文中提到在每次restart之后,减少 \(\eta_{\max }^{i}, \eta_{\min }^{i}\) 的值,但是为了简单,论文中也保持\(\eta_{\max }^{i}, \eta_{\min }^{i}\) 在每次restart之后仍然保持不变。
\(T_{cur}\) 则表示当前执行了多少个epoch,每个 batch运行之后 \(T_{cur}\) 就会更新而此时一个epoch还没有执行完,所以 \(T_{cur}\) 的值可以为小数。
\(\mathrm{T}_{\mathrm{i}}\) 固定为我们训练模型的epoch数
使用warm up和余弦退火的方式来规划学习率
刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoch或者一些step内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后在选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。
优化器
Adam
AdamW
均方误差损失
交叉熵损失
梯度消失问题
梯度消失问题发生在深度神经网络中,特别是在使用某些激活函数(如Sigmoid或Tanh)时。在反向传播过程中,梯度会随着网络的深度逐渐减小,最终变得非常接近零。这意味着深层网络的底层权重几乎不会得到有效的更新,导致网络无法学习到底层特征和模式。
处理梯度消失问题的方法
- 使用激活函数:选择具有更大梯度的激活函数,如ReLU(Rectified Linear Unit),它在正数范围内梯度恒为1,有助于减轻梯度消失问题。
- 权重初始化:使用合适的权重初始化方法,如He初始化,以确保网络在训练初始阶段具有较大的梯度。
- Batch Normalization:批归一化(Batch Normalization)层有助于减少梯度消失问题,通过在每个小批量上标准化输入数据。
梯度爆炸问题
梯度爆炸问题是指在反向传播中,梯度变得非常大,导致权重更新过大,网络无法稳定训练。这通常发生在网络架构复杂、梯度流通路径较长或学习率较大时。
处理梯度爆炸问题的方法
- 梯度裁剪:通过设置一个阈值,当梯度的范数超过阈值时,将梯度进行缩放,以防止梯度爆炸。
- 减小学习率:减小学习率可以减缓梯度的上升速度,降低梯度爆炸的风险。
- 权重正则化:使用权重正则化技术,如L1正则化或L2正则化,可以降低权重的大小,减少梯度爆炸的可能性。
- Batch Normalization:批归一化不仅可以减轻梯度消失问题,还可以一定程度上缓解梯度爆炸问题。
权重正则化
权重正则化是一种常用的技术,用于控制机器学习模型的复杂度,并防止模型在训练过程中出现过拟合的问题。
它通过向损失函数添加一个正则化项,强制模型学习到的权重参数保持较小的值,从而降低模型的复杂度。
L1正则化
L1 正则化通过向损失函数添加权重向量的 L1 范数(权重的绝对值之和)来惩罚模型复杂度。
L1 正则化的损失函数形式如下:\(\mathcal{L}_{\mathrm{L} 1}(\theta)=\mathcal{L}(\theta)+\lambda \sum_{j=1}^{d}\left|\theta_{j}\right|\)
为了优化正则项,会减少参数的绝对值总和,所以L1正则化倾向于选择稀疏权重矩阵。L1正则化主要用于挑选出重要的特征,并舍弃不重要的特征。
L2 正则化
L2 正则化通过向损失函数添加权重向量的 L2 范数(权重的平方和)来惩罚模型复杂度。
L2 正则化的损失函数形式如下:\(\mathcal{L}_{\mathrm{L} 2}(\theta)=\mathcal{L}(\theta)+\lambda \sum_{j=1}^{d} \theta_{j}^{2}\)
为了优化正则项,会减少参数平方的总和,所以L2正则化倾向于选择值很小的权重参数(即权重衰减),主要用于防止模型过拟合。是最常用的正则化方法。一定程度上,L1也可以防止过拟合。
过拟合通常是因为模型在训练数据上表现过于复杂,过度依赖少量训练数据的噪声或特定模式。通过限制权重的大小,L2 正则化能够使模型更倾向于学习简单的模式,而不是过度拟合训练数据中的细节。
L2 正则化也被称为权重衰减,因为它倾向于使权重参数的值衰减或变小。这种衰减效应有助于防止特定权重过大,从而减少了对某些训练样本的过度拟合,提高了模型在新数据上的泛化能力。
假设我们有一个简单的线性回归模型,损失函数采用均方误差(MSE),同时进行 L2 正则化。模型的目标是最小化以下损失函数:
\(L(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+\frac{\lambda}{2} \sum_{j=1}^{d} \theta_{j}^{2}\)
对 \(\theta_{0}\) 的梯度
\(\frac{\partial L(\theta)}{\partial \theta_{0}}=\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)\)
对 \(\theta_{1}\) 的梯度
\(\frac{\partial L(\theta)}{\partial \theta_{1}}=\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x^{(i)}+\lambda \theta_{1}\)
正则化项实际上在每次梯度下降步骤中,都会影响模型参数的更新方向和大小,从而限制了模型参数的增长,减少了过拟合的风险。
\(\begin{array}{l} \theta_{0}:=\theta_{0}-\eta \frac{\partial L(\theta)}{\partial \theta_{0}} \\ \theta_{1}:=\theta_{1}-\eta \frac{\partial L(\theta)}{\partial \theta_{1}} \end{array}\)
过拟合
当模型为了过度拟合训练集而变得很复杂时,就容易出现过拟合现象。这时模型对训练数据拟合得非常好,但是丧失一般性,趋向于记住而不是学习数据的特征,从而导致模型在新的数据上的表现很差,即泛化能力很差。
当过拟合现象发生,模型会将训练集中的随机出现的噪声也当作有效数据,并对其进行学习和拟合,这就是为什么模型在新数据上的表现会出现退化。
分词器
BPE、BBPE
WordPiece
SentencePiece
Tiktoken
位置编码对比
- Transformer用到的三角函数式的绝对位置编码的缺点是无法判断两个token的顺序关系。
- 因此BERT再次基础上进行改进,仍然是绝对位置编码,但通过学习来得到的,而且引入segment embeddings,能够确定两个token之间的方向关系。BERT模型这种编码方式有一个缺点就是配置文件中已经卡死了,最多只能输入512个词,所以BERT模型最多也就处理长度为512的句子。
- T5采用相对位置编码,在attention矩阵的基础上加上一个可训练的偏置项,其实就是T5模型的相对位置编码,然后在进行softmax。
线性偏差注意力ALiBi
baichuan 7B无论第一代还是第二代,位置编码均用的RoPE,而baichuan 13B则无论是第一代还是第二代,均用的ALiBi
激活函数
SwiGLU、Swish、GLU
梯度检查点
梯度检查点是一种优化技术,用于减少内存使用,通过在正向传播中保存中间激活,然后在反向传播中重新计算它们。
指标
困惑度PPL
BERT
BERT是一个基于transformer的深度双向表征模型。本质上是利用transformer结构构造一个多层双向的Encoder网络,通过考虑未标记文本的左右上下文来预训练文本的深度双向表征。
只需要一个额外的输出层,就可以对预训练的BERT模型进行微调,从而为各种任务(如问题问答和语言推断)创建最先进的模型,而无需对特定于任务的体系结构进行实质性修改。
BERT模型结构
根据参数设置的不同,Google论文中提出了Base和Large两种BERT模型。
BERT base 和 GPT模型的参数数量差不多,可以做一个较为公平的比较。
BERT large主要用来刷榜。
Base模型,12层,隐藏层维度768,Attention Head 12,参数量 0.1B。
Large模型,24层,隐藏层维度1024,Attention Head 16层,参数量 0.34B。
分词器
BERT 使用 WordPiece 分词器将单词分解成更小的子词。
BERT模型的输入和输出
BERT模型采用双向并行输入方式,即将句子整个输入到模型,而不是将单词一个接一个地输入。但是实际上在模型内部,输入的句子仍然是逐个词片段(subword tokens)进行处理的,而不是像传统的RNN或者CNN一样,直接将整个句子作为一个单元输入。
BERT的输入既可以是一个句子,也可以是一个句子对,而BERT只是transformer的编码器部分,因此为了使其能够处理两个句子的情况,需要将两个句子合并为一个序列。
每个句子的首个token总为一个特殊的分类token([CLS]),该token的最后隐藏层状态/向量被用来表示整个序列的信息。即若为单句子分类,[CLS]表示输入句子的类别;若为句子对分类,[CLS]表示两个句子是相关的/不相关的,相似意思/相反意思的。
双向建模示例
假设我们有两个句子:
句子 A: "I went to the store to buy some groceries."
句子 B: "It was a sunny day outside."
步骤:
- 分词和标记处理:
"[CLS]", "I", "went", "to", "the", "store", "to", "buy", "some", "groceries", ".", "[SEP]", "It", "was", "a", "sunny", "day", "outside", ".", "[SEP]"
- 每个词片段被映射为对应的词嵌入向量。
- Transformer 编码器处理:在进行自注意力计算时,例如计算词片段 "store" 的表示时,BERT模型不仅会考虑到该词片段左侧的词片段(如 "the", "to"),还会同时考虑右侧的词片段(如 "buy", "some")
BERT模型输入序列
BERT额外引入了segment embedding,判断token是属于前一个句子还是后一个句子,使得token的位置更加精准。
BERT模型的预训练任务
BERT采用两个无监督任务进行参数预训练,分别为masked language model(MLM) 和 next sentence prediction (NSP)。
掩码语言建模 (MLM)
对输入到BERT中的分词之后的词元序列,它有15%的概率会被随即替换成掩码(替换为统一标记符[MASK]),预测这些被掩盖的词来训练双向语言模型。其中[CLS]和[SEP]不会被替换。
这样做会产生两个缺点:
- 预训练和微调时的不一致,因为在微调时是没有掩码的
- 由于每个batch中只有15%的词会被预测,因此模型的收敛速度比起单向的语言模型会慢,训练花费的时间更长
对于第一个缺点的解决方法:把80%需要被替换成[MASK]的词进行替换,10%随即替换为其他词,10%保留原词。由于transformer encoder并不知道哪个词需要被预测,哪个词是被随机替换的,这样就强迫每个词的表达需要参照上下文信息。
对于第二个缺点,目前没有有效的解决办法,但是从提升收益的角度看,付出的代价是值得的。
下一个句子预测 Next Sentence Prediction(NSP)
为了训练一个理解句子间关系的模型,引入一个下一个句子预测任务,这个任务的训练语料可以从语料库中抽取句子对包括两个句子A和B来进行生成,其中50%的概率B是A的下一个句子,50%的概率B是语料中的一个随机句子。
NSP任务是预测B是否是A的下一个句子。
NSP的目的是获取句子间的信息,这点是语言模型无法直接捕捉的。
在训练中,MLM与NSP的loss是同时计算的,属于多任务学习。
BERT微调
在已经预训练好的语言模型基础上,对参数进行调整,使其更好地适用于下游任务。
即使下游任务各不相同,使用BERT微调时只需要增加输出层。
-
BERT用于句子的分类任务
预训练中的NSP任务使得BERT中的[CLS]位置的输出包含了整个句子对(句子)的信息,我们利用其在有标注的数据上微调模型,给出预测结果。
只需要在transformer的输出之上加一个分类层。
BERT直接取第一个[CLS]token的final hidden state C 与权重相乘之后做softmax,得到预测结果P。
\(P=\operatorname{softmax}\left(C W^{T}\right)\)
-
BERT用于问答任务
预训练中的MLM任务使得每个token位置的输出都包含了丰富的上下文语境以及token本身的信息,我们对BERT的每个token的输出都做一次分类,在有标注的数据上微调模型给出预测。
图中表示一个问答任务,给出一个问题Question,并给出一个文章document,然后从文章中标出答案的具体位置。
引入一个开始向量S,和一个结束向量E,对于文本的每个输出,都与两个向量做点乘。
文章的每个输出对Start向量做点乘,取最高的那个结果的位置作为答案的起点a。
文章的每个输出对End向量做点乘,取最高的那个结果的位置作为答案的终点b。
最后的答案就是document[ a : b ]
-
BERT用于NER任务
给出一句话,对每个词进行标注,判断属于人名,地名,机构名,还是其他。
① BERT模型 + FC layer ( 全连接层 ):只需要在BERT的基础上增加一层全连接层,一般情况下,在NER任务中,经过线性层+softmax,然后给出每个词的NER标签。
② BERT + CRF模型:CRF(Conditional Random Field,条件随机场)是一种经典的概率图模型,通常用于序列标注任务。在BERT模型后连接CRF层的主要目的是利用CRF的能力来对输出序列进行全局一致性建模,从而提高序列标注任务的准确性。
BERT模型创新
- BERT使用双向Transformer编码器作为其基础架构。
- BERT模型采用了预训练和微调的两阶段策略。预训练阶段通过大规模无标注文本数据进行训练,利用双向语言模型和遮蔽语言建模任务来学习通用的语言表示。微调阶段则通过少量标注数据进行端到端的监督学习,针对特定任务(如文本分类、命名实体识别等)进行微调,从而使模型适应具体任务。
- BERT引入了MLM任务,这是一种新型的预训练目标。使模型在预训练阶段学习到更好的双向语言表示,而不是像传统的单向语言模型那样仅仅预测下一个词片段。
- BERT模型能够在单个训练实例中同时处理句子级别和词级别的任务。通过将输入序列中的两个句子同时输入模型(例如使用特殊标记区分),BERT能够学习到句子之间的关系,这对于理解和生成自然语言文本都是有益的。
BERT局限性
- BERT模型使用了掩码语言模型(MLM)作为预训练目标,但这种方式会使预训练和微调阶段的输入不一致,因为预训练时有部分词被掩盖,而微调时没有
- BERT模型对中文的处理是以字为单位的,忽略了词语和短语等更高层次的语义信息。
- 使用BERT模型时,最多只能输入512个词,在BERT的config中,max_position_embeddings:512
- BERT模型在做生成式任务时效果不够好。
- BERT模型的参数量很大,导致存储和训练都比较消耗资源
BERT 变体
RoBERTa
作者发现BERT是严重训练不足的并提出了一些预训练BERT模型的方法。RoBERTa通过以下改变来改善BERT的预训练:
- 在MLM任务中使用动态掩码而不是静态掩码
- 移除NSP任务,仅使用MLM任务
- 通过更大的批大小训练,BERT的batch_size为256,RoBERTa的batch_size为8000,应该是8192 maybe。
- 使用BBPE作为分词器
使用动态掩码而不是静态掩码
我们知道在BERT的MLM任务中,我们随机对15%的标记进行掩码,然后让模型预测掩码的标记。
假设我们有一个句子:We arrived at the airport in time
。现在,在预处理后我们有:
tokens = [ [CLS], we, arrived, at, the, airport, in, time, [SEP] ]
接着,我们随机对15%的标记进行掩码:
tokens = [ [CLS], we, [MASK], at, the airport, in, [MASK], [SEP] ]
现在,我们将这些掩码后的标记列表喂给BERT模型并训练它去预测被掩码的标记。注意掩码操作只在预处理阶段进行一次,然后我们训练模型在不同的epoch中去预测这些已经掩码的标记。这被称为静态掩码。
RoBERTa使用动态掩码。我们举个例子来理解动态掩码。
首先,我们将句子复制10份,假设我们将给定的句子:We arrived at the airport in time
复制了10份。接着,我们对所有的这10个同样的句子随机地对15%的标记进行掩码。所以,现在我们有10个被掩码的句子,其中每个句子被掩码的标记不同:
我们训练模型40个epoch。对于每个epoch,我们用不同标记被掩码的句子喂给模型。
比如epoch1,我们将句子1喂给模型;epoch2,我们将句子2喂给模型,如此循环重复:
这样我们的模型只会在4个epoch中看到具有同样掩码标记的句子。比如,句子1会被epoch1,epoch11,epoch21和epoch31看到。这样,我们使用动态掩码而不是静态掩码去训练RoBERTa模型。
简单来讲,每个句子,在不同的epoch使用不同的mask。
ALBERT
想解决的是BERT模型参数量过多的问题,相比BERT它是一个精简版的。
使用下面两种技术来减少参数量:
-
跨层参数共享:比如BERT-base包含12个编码器层,在训练时,需要学习所有编码器层的参数。而使用跨层参数共享的方法,我们只需要学习第一个编码器层的参数,然后让其他所有层共用这套参数。
在应用跨层参数共享时有几种不同的方式:
- All-shared: 共享第一个编码器层的所有子层参数到其他编码器层
- Shared feedforward network:只共享第一个编码器层的前馈神经网络层参数到其他编码器层(的前馈神经网络)
- Shared attention:只共享第一个编码器层的多头注意力层参数到其他编码器层(的多头注意力层)
ALBERT模型使用All-shared模式。
-
嵌入层参数分解(Factorized embedding layer parameterization )
为了减少嵌入层的参数量。
WordPiece 嵌入:每个子词单元从词汇表中映射到一个独热编码向量,独热编码向量通过嵌入矩阵映射到一个固定大小的嵌入向量,WordPiece 嵌入在输入到 BERT 模型之前是固定的,无论上下文如何变化,同一个子词的嵌入向量始终相同。
嵌入层参数分解方法将嵌入矩阵分解为更小的矩阵。
我们首先将独热向量投影到低维嵌入空间 \(V \times E\),然后再将该低维嵌入投影到隐藏空间 \(E \times H\),而不是直接投影独热向量到隐藏空间 \(V \times H\)
句子顺序预测
ALBERT也使用MLM任务,但没有使用NSP任务,而是使用一个新任务,叫句子顺序预测(sentence order prediction,SOP)。
ALBERT的作者指出基于NSP任务进行预训练并不是真的有效,它与MLM任务相比并不是一个很难的任务。同时,NSP结合了主题预测和连贯性预测到一个任务中。为了解决这个问题,他们引入了SOP任务,SOP基于句子间的连贯性而不是主题预测。我们来看下SOP任务的细节。
类似NSP,SOP也是一个二分类任务。在NSP中,我们训练模型去预测某个句子对是属于isNext
还是notNext
类别,而在SOP任务中,我们训练模型去预测给定句子对中的句子顺序是否被交换过。
MacBERT
为了解决BERTMLM预训练和微调时不一致
- MacBERT提出,可以不使用 [MASK]标记,而是将[MASK]标记位置的词替换成[另外一个近义词],然后让模型去进行[词语纠错]。
- 和BERT类似,MacBERT对15%的输入单词进行遮蔽,其中80%将替换为相似的单词,10%将替换为随机的词,剩下的10%将保留原始单词 (BERT中将80设置为[MASK], 其余一样)
T5
T5模型介绍
T5这篇论文严格意义上讲并不是一篇创新型论文,而更像是一篇实验报告。
- 在此之前的几乎所有预训练语言模型,在下游任务微调过程中都需要添加非线性层,将模型的输出转化为任务指定的输出格式。
- T5不需要对模型做任何改动,只需要提供下游任务的微调数据。
- 不需要添加任何非线性层。
- 唯一要做的就是在输入数据前加上任务声明前缀。
- T5模型:万事皆可text2text
T5模型结构
T5模型本质上来说是一个基于transformer的encoder-decoder模型。
T5模型的输入表示
Google提出的SentencePiece分词方法,并不是所有语言都是以空格分词的,比如中文日文等。
SentencePiece不将空格视为分隔符,下划线被引入,代替了空格和句子开头的特殊符号。
位置编码
T5模型采用了一种长距离不敏感的相对位置编码,这一设计考虑到远距离的单词依赖往往比较稀疏而不精细,需要对周围单词的位置做精确区分,远距离单词的位置变化相对缓慢。
T5并没有在输入的input embedding之后加position embedding,而是在Encoder的第一层的Self-attention计算Q和K乘积之后加入了一个relative position embbedding,也就是在计算softmax之前。
只有在Encoder和Decoder的第一层处的Attention模块最后有一个relative_attention_bias的Embedding矩阵。
相对位置编码 \(r_{i j}\) 则是一个标量数值,一共有32种类型,也就是说在T5中一共是32种相对位置。
然而,T5的输入长度是512 token,相对的位置类型远大于32种。所以,T5使用了一种分区的方式将任意多的相对位置信息映射到32种最终类型上。
需要注意的是,相对位置信息只在Encoder和Decoder的第一层Self-attention计算中起作用,并且所有head之间不共享。
T5模型预训练方法
-
自监督的预训练方法:
①语言模型式:单向的从左到右依次预测,典型代表为GPT-2模型
②Bert-style:随机破坏掉一部分,然后进行还原
③顺序还原式:将文本打乱,然后进行还原
-
对文本一部分进行破坏
①Mask法:将破坏的token换成特殊的标记,如[mask]
②替换span:将一个span替换为特殊标记
③Deop法:没有替换操作,直接随机丢弃一些字符
-
对文本的百分之多少进行破坏
15%
-
对多长的文本段进行破坏
span长度为3
T5模型的多任务学习
本论文的多任务学习仅对应于将数据集混合在一起。相比之下,大多数将多任务学习应用于NLP的应用都会添加特定于任务的分类网络,或者为每个任务使用不同的损失函数。
将各种NLP任务都转化为Seq2Seq任务进行训练。
多任务一起训练时如何采样数据?
① 根据各任务数据集大小计算概率 ②各任务数据采样概率相同 ...
多任务训练在大多数情况下都不如预训练+微调。
作者又提出多任务训练+微调:先用多个任务进行预训练,再对具体任务进行微调。
T5模型贡献
- 把所有NLP任务都转化为text-to-text范式
- 原始的编码器-解码器架构在text-to-text框架中效果最好,T5在编码器和解码器中共享参数,总参数量与仅编码器或仅解码器相同,所以计算成本相似。
- 引入了C4数据集
- 训练策略上:微调时所有参数一起更新是最好的,但计算代价大。
GPT-1
GPT-2
GPT-3
InstructGPT
LLama
LLama-2
LLama-3
Qwen
1. 简介
-
Qwen(基础预训练语言模型,即基座模型)和 Qwen-Chat(聊天模型,该模型采用人类对齐技术进行微调),官方还开发了编码专用模型 Code-Qwen 和 Code-Qwen-Chat,以及基于基座模型开发的数学专用模型 Math-Qwen-Chat,但是 Code-Qwen和Math-Qwen-Chat都没有开源。
-
Qwen-Chat拥有先进的工具使用和规划能力,可用于创建agent应用程序。
QWEN:在包含数万亿token的大量数据集上预训练得到
QWEN-CHAT:使用SFT和RLHF将QWEN与人类的偏好对齐
改进版本QWEN-CHAT-RLHF
2. 预训练
预训练使用3万亿token,数据集是多语种,其中很大一部分数据主要还是英文和中文,具体的中英文数据量的比例、以及是否做过平衡数据的技术处理,官方报告中并未详细阐述。
数据预处理:
-
文本数据抽取:对于公共网络数据,从 HTML 中提取文本数据
-
语言识别: 使用语言识别工具判断文本语言,提取英文和中文数据
-
去重: 使用明文去重和基于MinHash+LSH的模糊去重算法进行重复数据删除。
明文去重
明文去重是一种精确匹配方法,它通过直接比较数据集中的文本序列来识别重复项。
通常首先对文本进行规范化处理,比如转换为小写、去除标点符号和特殊字符等,以减少由于格式差异导致的错误匹配。
然后,可以使用哈希表或其他数据结构来存储已经出现过的文本的哈希值。
当新的文本加入数据集时,会计算其哈希值并与哈希表中存储的值进行比较。如果存在相同的哈希值,则认为该文本是重复的,并且可以将其从数据集中删除。
基于MinHash+LSH的模糊去重算法
模糊去重适用于识别那些不是完全相同,但内容非常相似的文本,这些文本可能由于一些微小的变化(如同义词替换、句子重构等)而未能通过明文去重被识别出来。
LSH(Locality-Sensitive Hashing)是一种哈希技术,它能够保证相似的数据项有更高的概率映射到同一个“桶”或哈希值。
-
质量控制: 结合规则和机器学习方法对文本质量进行评分,包括语言模型、文本质量评分模型从而识别和过滤低质量数据。同时还从各种来源手动抽查文本样本进行审查,以确保质量。
-
安全控制: 使用模型识别并过滤涉及暴力、偏见、色情等不安全内容。
-
up-sample采样: 针对某些高质量源的数据进行上采样,以确保多样化的高质量内容。
-
BPE分词: 使用BPE分词算法,针对中文扩充词表提升性能。
-
长序列建模:采用窗口Self-Attention等技术提高长序列建模能力。
3. 分词
QWEN的分词(Tokenization)采用的是基于BPE(Byte Pair Encoding)的方法,兼顾中文和英文等多语言场景的效率,主要步骤如下:
- 首先,基于开源分词器 tiktoken 的 cl100k 基础词表进行初始化。
- 然后,针对中文场景,向词表中增添常用的中文字和词,扩充词表规模。
- 同时,参考GPT-3.5和LLaMA的实现,将数字切分成单个数字,如将"123"分词为"1"、"2"、"3"。最终词表大小约为152K。
4. 模型设计
Qwen采用了改进版的 Transformer架构。具体来说,采用了最近开源的大型语言模型LLaMA的训练方法,并做了如下改进:
- embedding和输出映射不进行权重共享,从而达到以内存成本为代价换取获得更好的性能。
- 使用RoPE作为位置编码
- 在大多数层中移除了Bias,但在QKV层保留以提升模型的外推能力
- 使用了预归一化(Pre-Norm)和RMSNorm进行规范化。Pre-Norm是使用最广泛的方法,与post-normalization相比,它已被证明能提高训练的稳定性。
- 使用了SwiGLU作为激活函数。它是 Swish 和门控线性单元GLU的组合。初步实验表明,基于GLU的激活函数普遍优于其他基线选项,如 GeLU。
- 按照以往研究中的常见做法,将前馈网络(FFN)的维度从隐藏大小的 4 倍降至隐藏大小的8/3。
5. 外推能力
Qwen利用了以下几种技术来实现inference阶段的上下文长度扩展:
-
NTK感知插值(NTK-aware interpolation), 这种无需训练的技术可以调整比例参数以防止在扩展长度时丢失高频信息。
-
动态NTK感知插值(dynamic NTK-aware interpolation),是NTK感知插值的改进版本, 可以以块为单位动态改变比例参数,避免性能大幅下降。
以实际输入序列长度进行NTK-aware插值
-
LogN-Scaling,根据上下文长度与训练长度的比值,对Q和V的点积进行重新缩放,确保注意力值的熵随着上下文长度的增长而保持稳定。
QWEN additionally incorporates two attention mechanisms: LogN-Scaling (Chiang & Cholak, 2022; Su, 2023a) and window attention (Beltagy et al., 2020).
在长上下文扩展中,感觉主要还是dynamic_ntk发挥的作用
-
使用分层窗口Self-Attention,将注意力限制在一个上下文窗口内,防止模型关注到太远的内容。并在不同层采用不同的窗口大小,较低的层使用较短的窗口,而较高的层使用较长的窗口。这是因为官方观察到Qwen模型在处理长上下文时在不同层次上的建模能力存在差异,较低的层次相对于较高的层次更加敏感于上下文长度的扩展。为此,为每个层分配了不同的窗口大小,对较低的层使用较短的窗口,对较高的层使用较长的窗口。
6. 模型训练
- 采用标准的自回归语言模型训练目标
- 训练时上下文长度为2048 (2k)
- 注意力模块采用Flash Attention技术,以提高计算效率并减少内存使用。
- 采用AdamW优化器,设置β1=0.9,β2=0.95,ε=1e-8。
- 使用余弦学习率计划,为每种模型设定一个峰值学习率。学习率会衰减到峰值学习率的 10% 的最小学习率。
- 使用BFloat16混合精度加速训练。
SFT监督微调
1.)Qwen采用ChatML样式(OpenAI 2022年提出)的格式来进行模型训练。ChatML格式利用特殊符号表示不同类型信息,如系统设置、用户输入、助手输出等,这有助于模型有效区分信息。采用会话流式对话风格,而不是简单的问答形式,使模型学会真实的人机交互。
训练任务依然与预训练一样,预测下一个token。
对系统和用户的输入应用mask,只预测助手的输出。
使用AdamW优化器,超参数β1、β2和ϵ为别为0.9、0.95和1e−8。学习率先增后恒定。
序列长度限制在2048,训练batch size=128。
训练4000步,在前1430步中,学习率逐渐增加,达到2e−6的峰值。
为了防止过拟合,权重衰减的值设置为0.1,dropout设置为0.1,梯度裁剪的限制为1.0。
RM 模型
在奖励模型的构建上,先采用大量数据进行偏好模型预训练(preference model pretraining,PMP)。该数据集由样本对组成,每个样本对包含对单个查询的两个不同回复及其相应的偏好。再用这些高质量偏好数据精调奖励模型。
在创建奖励模型时,使用同一个预训练语言模型Qwen进行PMP流程的初始化。随后,对 PMP 模型进行微调,以提高其性能。值得一提的是,在原始 Qwen 模型中加入了一个池化层,根据特定的结束token提取句子的奖励值。这一过程的学习率被设置为一个恒定值:3e-6,batch size为64。此外,序列长度设置为2048,训练过程持续1个epoch。
强化学习
PPO阶段共包含四个模型:policy模型、value模型、reference模型、reward模型。在开始PPO流程之前,暂停policy模型的更新,先对value价值模型训练50步预热,从而确保value模型能够有效地适应不同的reward模型。
在PPO期间,同时为每个查询采样两个响应。将KL散度系数设置为0.04,并将奖励基于 running mean 进行归一化。策略和价值模型的学习率分别为1 × 10^-6和5 × 10^-6。为了增强训练稳定性,我们使用价值损失剪裁,剪裁值为0.15。在推理时,策略top-p设置为0.9。我们的发现表明,尽管熵略低于将top-p设置为1.0时,但奖励的增长更快,最终在类似条件下实现持续更高的评估奖励。
熵:熵是衡量随机变量不确定性的指标。
将top-p设置为0.9,减少了生成的多样性(熵略低),但选择的内容更有可能是高质量和相关的。
这种设置使得模型在推理过程中更快地获得较高的奖励,并最终在评估中表现得更好。
此外,我们实施了一个预训练梯度以减轻对齐税。实证发现表明,使用这种特定的奖励模型,KL惩罚足够强大,能够抵消那些不是严格代码或数学性质的基准测试中的对齐税,例如测试常识知识和阅读理解的测试。必须使用比PPO数据大得多的预训练数据量来确保预训练梯度的有效性。此外,我们的实证研究建议,这个系数的值过大可能会显著阻碍对奖励模型的对齐,最终损害最终对齐,而值过小只会对减少对齐税产生边际效应。
1.) 实验表明,使用这个特定的奖励模型,KL惩罚在某些基准测试中(例如常识知识和阅读理解测试)足够强大,可以有效地对抗对齐成本。
2.) 预训练梯度的系数设置非常关键。如果系数值过大,会显著阻碍模型与奖励模型的对齐,最终削弱对齐效果。如果系数值过小,则对减轻对齐成本的影响很小。
对齐结果(自动和人工评估)
7. 模型效果
- 在3个数据集上(如在MMLU数据集),QWEN-14B版优于LLaMA2-70B模型。
- Qwen-7B 的表现不错,超越 LLaMA2-13B,并比肩Baichuan2-13B。
Qwen2
chatGLM
chatGLM-2
chatGLM-3
Yi-34B
BERT的预训练原理和相关改进工作?
最近大模型出来很多,你有了解过原理吗?
chatGLM 和 GPT 模型结构⼀样吗
Instruct 和 prompt 有什么区别?
⼤模型的幻觉怎么评测?
⼤模型训练⽅式?
写一下 softmax 函数
DPO
优势函数
优势函数Advantage Function \(A^{\theta}(s_t,a_t)\) 是对一个动作在平均意义上比其他动作好多少的度量
评估动作的价值就看其因此得到的期望奖励,\(A_\pi (s,a) = Q_\pi (s,a) - V_\pi (s)\)
通常我们只学习\(V_\pi (s)\),然后通过\(V_\pi (s)\)与奖励的结合来估计\(Q_\pi\),\(Q_\pi = R+ \gamma V_{\pi }(s_{t+1})\)
从而可得 \(A_\pi (s,a) = Q_\pi (s,a) - V_\pi (s) = R + \gamma V_{\pi }(s_{t+1}) - V_\pi (s)\)
总之\(A^{\theta }(s_{t},a_{t})\)要估测的是在状态\(s_{t}\)采取动作\(a_{t}\)是好的还是不好的:
1.)如果\(A^{\theta }(s_{t},a_{t})\)是正的(即大于0),意味着在状态 \(s_{t}\) 采取动作 \(a_{t}\) 获得的回报比在状态 \(s_{t}\) 下采取任何其他可能的动作获得的回报都要好,要增加概率
2.)如果\(A^{\theta }(s_{t},a_{t})\)是负的(即小于0),意味着在状态 \(s_{t}\) 采取动作 \(a_{t}\) 得到的回报比其他动作的平均回报要差,要减少概率
近端策略优化惩罚PPO-penalty的流程
-
明确目标函数,需要优化\(J^{\theta^{\prime}}(\theta)\),让其最大化
\(J^{\theta^{\prime}}(\theta)=\mathbb{E}_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} \mid s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} \mid s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right)\right]\)
-
先初始化一个策略的参数\(\theta\),前一个训练迭代得到的actor参数\(\theta'\)与环境交互,采样得到大量状态动作对,根据\(\theta'\)交互结果,估计\(A^{\theta '}(s_t,a_t)\)
-
训练时添加KL散度约束,是\(\theta\)与\(\theta'\)输出动作的KL散度,用于衡量\(\theta\)与\(\theta'\)的相似程度,我们希望学习出的\(\theta\)与\(\theta'\)越相似越好。
-
PPO优化公式 \(J_{\mathrm{PPO}}^{\theta^{\prime}}(\theta)=J^{\theta^{\prime}}(\theta)-\beta \mathrm{KL}\left(\theta, \theta^{\prime}\right)\)
近端策略优化裁剪PPO-clip
这里应该是为了降低计算KL散度的复杂度,PPO-Clip目标函数里没有KL散度
\(J_{\mathrm{PPO} 2}^{\theta^{\prime}}(\theta) \approx \sum_{\left(s_{t}, a_{t}\right)} \min \left(\frac{p_{\theta}\left(a_{t} \mid s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} \mid s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right), \operatorname{clip}\left(\frac{p_{\theta}\left(a_{t} \mid s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} \mid s_{t}\right)}, 1-\varepsilon, 1+\varepsilon\right) A^{\theta^{\prime}}\left(s_{t}, a_{t}\right)\right)\)
本质目标也是为了让\(p_\theta(a_t|s_t)\)与\(p_{\theta '}(a_t|s_t)\)尽可能接近。
DPO
- DPO 最大的贡献在于提出了一种方法,可以跳过训练 RM 的过程,直接利用人类偏好数据训练 LM,并在理论上通过 DPO 训练得到的 LM,和通过 RLHF 得到的 LM 是一致的。
- DPO 是通过参数化 RLHF 中的奖励函数来直接根据偏好数据学习策略模型,这样就无需显式的奖励模型了。
原RLHF的优化目标:最大化奖励和最小化参考策略的KL散度
\(\max _{\pi_{\theta}} \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_{\theta}(y \mid x)}\left[r_{\phi}(x, y)\right]-\beta \mathbb{D}_{\mathrm{KL}}\left[\pi_{\theta}(y \mid x) \| \pi_{\mathrm{ref}}(y \mid x)\right]\)
DPO重参数化等效于具有隐式奖励函数:
\(\hat{r}_{\theta}(x, y)=\beta \log \frac{\pi_{\theta}(y \mid x)}{\pi_{\text {ref }}(y \mid x)}\)
DPO的训练目标 \(\mathcal{L}_{DPO}(\pi_{\theta }; \pi_{ref}) = -\mathbb{E}_{\left(x, y_{w}, y_{l}\right) \sim \mathcal{D}}\left[\log \sigma\left(\beta \log \frac{\pi_{\theta}\left(y_{w} \mid x\right)}{\pi_{\mathrm{ref}}\left(y_{w} \mid x\right)}-\beta \log \frac{\pi_{\theta}\left(y_{l} \mid x\right)}{\pi_{\mathrm{ref}}\left(y_{l} \mid x\right)}\right)\right]\)
\(\beta\):超参数,一般在 0.1-0.5 之间
\(\pi_\theta(y_w|x)\):输入给定 x,当前 Policy model 生成好的 response 的累积概率,每个 token 的概率求和
\(\pi_{ref}(y_l | x)\):输入给定 x,原始 reference model 生成坏的 response 的累积概率
开始训练时,reference model 和 Policy model 都是同一个模型,只不过在训练过程中reference model 不会更新权重。
IPO 身份偏好优化
- 身份偏好优化(IPO)是一种基于用户身份的偏好优化算法。它通过分析用户的身份特征,如年龄、性别、职业等,来推断用户的偏好,并据此调整模型的输出。IPO算法的优点在于能够利用用户的身份特征进行个性化推荐,提高推荐的准确性。然而,它也存在一定的挑战,比如如何准确地获取和利用用户的身份特征,以及如何平衡不同身份特征之间的冲突。
IPO相当于在DPO的损失函数上添加了一个正则项,从而可以使得不适用early stopping技巧就可以使模型收敛。
与DPO类似,直接优化偏好的算法,但使用了离线对比损失。
损失函数
\(\mathcal{L}_{I P O}(\pi)=-\mathbb{E}_{\left(x, y_{w}, y_{l}\right) \sim \mathcal{D}}\left(h_{\pi}\left(y_{w}, y_{l}, x\right)-\frac{\tau^{-1}}{2}\right)^{2}\)
\(h_{\pi}\left(y, y^{\prime}, x\right)=\log \left(\frac{\pi(y \mid x) \pi_{\mathrm{ref}}\left(y^{\prime} \mid x\right)}{\pi\left(y^{\prime} \mid x\right) \pi_{\mathrm{ref}}(y \mid x)}\right)\) 衡量了在给定上下文\(
标签:,right,训练,模型,theta,量化,left From: https://www.cnblogs.com/mudou/p/18327484