dropout 机制存在,对于同一句子的两次输出是不同的

本文介绍SimCSE无监督方法在语义相似度任务中的应用,包括使用ERNIE模型进行对比学习训练,构建语义索引库,并应用于反作弊策略。实验结果显示,该模型能有效识别相似提问。

SimCSE 提供了无监督(上图 a)和有监督(上图 b)两种架构,由于业务需要我们只用了无监督方式,其基本思路是:

1. 同一个 batch 内的数据两次输入模型。

2. 由于有 dropout 机制存在,对于同一句子的两次输出是不同的,两次输出互为正例,其他为负例。

3. 最小化目标函数,进行参数更新。

论文中,在一个 batch 中,样本 i 的损失函数为对比学习的 InfoNCE Loss[8]

图片

最终模型的效果在各个数据集上基本处于碾压的存在。

图片

03 应用

由于业务需求是当有新增提问时,获取历史相似提问簇,因此整个过程分为三个阶段:

step1:训练 ernie-SimCSE,获取句子 encoder,本阶段主要获取编码器用来获取句子的语义向量;

step2:构建语义索引库,本阶段主要是得到语义索引,用于检索相似向量;

step3:反作弊策略,将相似向量用于反作弊策略,用于识别群发推广。

3.1 ernie-SimCSE

目前对于预训练模型的应用从『预训练』+『子任务 finetune』的模式过渡为『预训练』+『领域预训练』+『子任务 finetune』,我们选取的 encoder 模型为当前中文领域最好的 ernie 模型,在 ernie 模型基础上增加 SimCSE,训练过程为:

  1. 在预训练基础上添加搜索 Q-T 匹配任务的训练,得到 Ernie-Search,通过大规模点击日志构建 Q-T 图,我们在这张图上通过随机游走采样出 q-t-q-t 序列 S = [q0 , t1 , …, qN-1 , tN] ,然后在这个序列上执行针对序列 S 的遮盖词预测完成预训练任务;

  2. 在 Ernie-Search 的基础上利用,单独利用知道提问数据进行进一步 post-train,得到 Ernie-Search-ZD;

  3. 在 Ernie-Search-ZD,添加 SimCSE 对比学习,获取最终的模型 Ernie-SearchCSE。

图片

3.2 问题及优化

论文中的损失没有计算增强后的样本之间的损失,原因可能是由于计算成本的考虑,我们对损失进行了改进,对于增强后的数据也纳入负例的损失计算:

图片

3.3 模型效果

为了观测模型的最终效果,我们选取了之前的 17 个目标 case,以及随机选取 10 个其它句子:

由下方热力图可以看出,符合当初模型预期,前 10 个的相似性远大于后 10 个的相似性。对于提问『北京肋软骨隆鼻刘彦军做的怎么样?』检索索引库中语义最相似 TOP 10 获取疑似变形推广。

图片

### 损失函数与 Dropout 的关系 损失函数的核心作用是衡量模型预测值与实际目标之间的差异,从而指导反向传播过程中的参数更新[^1]。而 Dropout 是一种正则化技术,在训练阶段通过随机丢弃部分神经元来减少过拟合的风险[^4]。 #### 1. **损失函数的作用** 损失函数定义了网络性能的优化方向。在网络训练期间,前向传播产生的输出会与真实标签进行比较,进而计算误差。这个误差被用来调整网络权重和偏置,使得下一次迭代的结果更接近于期望的目标。常见的损失函数有均方误差 (MSE) 和交叉熵损失 (Cross-Entropy Loss),具体选择取决于任务类型(回归或分类)。 #### 2. **Dropout 的工作原理** Dropout 技术在每次训练批次中随机屏蔽一部分神经元及其对应的连接,这相当于在同一数据集上同时训练多个较小规模的子网络。最终测试时,则使用完整的网络并按比例缩放激活值以补偿训练阶段丢失的信息。这种方法有助于提高泛化能力,降低因复杂特征交互而导致的过拟合现象。 #### 3. **两者的结合方式** 尽管它们的功能不同——一个是评估指标,另一个是用来改进学习策略的技术手段——但在整个深度学习框架里二者紧密相连: - 在每轮梯度下降之前先应用 Dropout 来构建当前次级架构; - 接着执行标准流程完成向前传递操作得到估计概率分布; - 利用选定类型的代价函数量化上述结果同标注类别间的偏差程度; - 基于此数值反馈至各节点重新校准内部状态直至满足收敛条件为止。 下面展示了一个简单的 TensorFlow/Keras 实现例子展示了如何一起运用这两者: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout model = Sequential([ Dense(64, activation='relu', input_shape=(input_dim,)), Dropout(rate=0.5), # 添加 dropout Dense(output_dim, activation='softmax') ]) model.compile(optimizer='adam', loss='categorical_crossentropy', # 设置损失函数 metrics=['accuracy']) ``` 在这个代码片段中可以看到我们仅设置了 `loss` 参数指定了我们的损失函数形式为多类别的对数似然成本即 `'categorical_crossentropy'`, 同时也加入了 `Dropout` 设置其保留率为 0.5 表明一半输入会被临时移除参与后续运算. ### 结论 综上所述,虽然损失函数负责提供关于模型表现好坏的具体测量依据,但像 Dropout 这样的机制则是为了增强系统的鲁棒性和适应未知情况的能力所设计出来的补充措施之一。当把这两种工具合理搭配起来之后就能有效提升整体解决方案的质量水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值