ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PaddleNLP 无监督语义匹配实战:基于 ERNIE 的 SimCSE + Word Repetition 中文模型训练与推理

PaddleNLP 无监督语义匹配实战:基于 ERNIE 的 SimCSE + Word Repetition 中文模型训练与推理 人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读SimCSESimple Contrastive Learning of Sentence Embeddings是一种无需标注数据即可训练高质量句向量的对比学习框架特别适合缺乏监督数据、但拥有大量无监督语料的语义匹配与检索场景。本仓库PaddleNLP在slm/examples/text_matching/simcse/中给出了基于 ERNIE 预训练模型的完整可运行实现并借鉴 ESimCSE 论文的 Word RepetitionWR词重复策略进一步提升效果。读完本文你将掌握SimCSE 在中文场景下的效果基线、无监督训练数据的构造原理、完整的训练与评估命令、全部超参数的含义与推荐取值以及基于动态图模型对文本 Pair 进行相似度预测的完整流程。SimCSE 与 ESimCSE 的核心思想SimCSE 的核心思路是利用dropout 作为隐式数据增强同一句话在两次独立的前向中会得到两个不同的句向量因为 dropout 随机丢弃了部分信息把这两个向量视为正样本对同一 batch 内其他样本视为负样本从而构造出无需人工标注的对比学习任务。其损失为 InfoNCE 式的交叉熵损失目标是把每个样本的 [CLS] 向量与其增强副本拉近、与其他样本推远。本仓库在 SimCSE 基础上引入了 ESimCSEEnhanced Sample Building Method提出的Word Repetition 策略在训练样本构造时按一定比例随机重复句中的若干词进一步提升正样本构造的质量。两者结合后模型在 4 个权威中文语义匹配数据集上均有明显提升详见下文效果评估。与项目代码的对应关系SimCSE 模型组网位于 model.pyget_pooled_embedding()取sequence_output[:, 0, :]或经过 pooler 的 cls 向量接可选降维层output_emb_size后过 dropout 并做 L2 归一化F.normalize(p2)得到用于对比的句向量forward()对 query 与 title 两组向量做paddle.matmul(..., transpose_yTrue)得到余弦相似度矩阵再乘以缩放因子scale默认 20后输入F.cross_entropy其中labels为对角线位置paddle.arange即每个样本的正样本正是它自身训练与推理都使用ERNIE-3.0-medium-zh作为编码器见 train.py。Word Repetition 的具体实现位于 data.py 的word_repetition()函数它会统计每条样本的真实长度排除 padding在[1, actual_len-1]区间内随机采样dup_len个位置dup_len不超过int(dup_rate * actual_len)在被选中的 token 处插入一份副本最后按 batch 内最长序列统一补齐 padding。从源码看长度小于等于 5 的短句会跳过该策略且 [CLS]/[SEP] 位置不会被重复。效果评估4 个中文语义匹配数据集项目使用LCQMC、BQ_Corpus、STS-B、ATEC四个中文语义匹配数据集的训练集作为无监督训练语料仅取文本不使用 Label并在各自验证集上评估。评估指标采用 SimCSE 论文使用的Spearman 相关系数数值越高表示模型对句子语义相似度的排序越准。模型LCQMCBQ_CorpusSTS-BATECSimCSE57.0151.7274.7633.56SimCSE WR58.9751.5878.3233.73可以看到加入 Word Repetition 策略后在 LCQMC、STS-B、ATEC 上均取得提升STS-B 从 74.76 提升至 78.32幅度最明显仅在 BQ_Corpus 上略低于纯 SimCSE。整体上 WR 策略为模型带来了稳定的增益。中文数据集的下载地址见 README 中的说明senteval_cn.zip内含上述 4 个数据集的 train/dev 划分。下载解压后目录结构形如senteval_cn/LCQMC/train.txt、senteval_cn/LCQMC/dev.tsv。SimCSE WR 在中文数据集上的推荐超参数以下是 README 给出的各数据集最佳训练超参数数据集epochlearning ratedropoutbatch sizedup rateLCQMC15E-50.3640.32BQ_Corpus11E-50.3640.32STS-B85E-50.1640.32ATEC15E-50.3640.32其中dup_rateWord Repetition 比例统一采用 0.32与 ESimCSE 论文结论一致STS-B 需要更多 epoch8且使用更小的 dropout0.1其余数据集 epoch1、dropout0.3 即可收敛到好效果。仓库中的 train.sh 正是 STS-B 的完整配置示例epochs8、dropout0.3、output_emb_size 256、dup_rate 0.32可直接参考。快速开始代码结构说明本项目位于slm/examples/text_matching/simcse/主要代码结构如下simcse/ ├── model.py # SimCSE 模型组网代码 ├── data.py # 无监督语义匹配训练数据、测试数据的读取逻辑 ├── predict.py # 基于训练好的无监督语义匹配模型计算文本 Pair 相似度 ├── train.sh # 模型训练的脚本 └── train.py # SimCSE 模型训练、评估逻辑各文件的职责清晰分离data.py负责数据读取与 Word Repetition 增强model.py负责网络组网与对比学习损失train.py负责训练主流程与 Spearman 评估predict.py负责加载 checkpoint 做相似度推理。数据读取与无监督训练样本构造在 data.py 中无监督训练数据由read_simcse_text()生成它逐行读取train.txt并把每一行同时作为text_a与text_b输出即yield {text_a: data, text_b: data}构造出文本与自身配对的原始样本随后word_repetition()在 batch 内对两个副本各自随机重复若干词从而生成语义等价但词面不同的正样本对。验证集数据则由read_text_pair()读取dev.tsv的三列text_a、text_b、label用于 Spearman 相关性评估。模型训练以中文文本匹配公开数据集LCQMC为示例仅使用其文本数据构造无监督训练集。执行如下命令即可开始训练并在 LCQMC 验证集上进行 Spearman 相关系数评估$ unset CUDA_VISIBLE_DEVICES python -u -m paddle.distributed.launch --gpus 0 \ train.py \ --device gpu \ --save_dir ./checkpoints/ \ --batch_size 64 \ --learning_rate 5E-5 \ --epochs 1 \ --save_steps 100 \ --eval_steps 100 \ --max_seq_length 64 \ --dropout 0.3 \ --train_set_file ./senteval_cn/LCQMC/train.txt \ --test_set_file ./senteval_cn/LCQMC/dev.tsv说明unset CUDA_VISIBLE_DEVICES是为了让paddle.distributed.launch --gpus能正确接管设备--gpus 0指定使用 0 号 GPU--device可选cpu、gpu或npu使用 gpu 训练时需配合--gpus指定卡号--train_set_file与--test_set_file为必填参数分别指向无监督训练文本与验证集文本对文件。完整参数说明train.py 通过 argparse 暴露了全部可调参数README 与 train.py 中的默认值整理如下参数说明默认值infer_with_fc_pooler可选开关预测阶段计算文本 embedding 时网络前向是否经过训练阶段最后一层 fc。建议关闭不加该参数效果最好Falsedup_rateWord Repetition 词重复比例论文验证 0.32 效果最佳0.32scale计算 cross_entropy loss 前对 cosine 相似度进行缩放的因子20dropoutSimCSE 网络前向使用的 dropout 取值0.1save_dir保存训练模型的目录./checkpointsmax_seq_lengthERNIE-Gram 模型使用的最大序列长度最大不能超过 512显存不足时请调低128batch_size批处理大小请结合显存调整显存不足时请调低32learning_rateFine-tune 最大学习率5e-5weight_decay正则项力度用于防止过拟合0.0epochs训练轮次1warmup_proption学习率 warmup 比例如 0.1 表示前 10% 训练 step 内学习率从 0 线性增长到 learning_rate再缓慢衰减0.0init_from_ckpt模型参数路径用于热启动恢复模型训练Noneseed随机种子1000device训练设备可选 cpu、gpu、npugpu此外 train.py 还支持源码中额外定义的参数output_emb_size将 768 维句向量降维0 表示直接使用 hidden_size建议设为 256 以在召回性能与效率间取得平衡、max_steps覆盖 epochs 的总训练步数大于 0 时生效、margin正负样本对余弦相似度的间隔与eval_steps/save_steps评估与保存间隔。训练流程与评估机制从 train.py 的do_train()可以看出完整的训练链路加载 ERNIE-3.0-medium-zh 预训练模型并把dropout同时注入hidden_dropout_prob与attention_probs_dropout_prob这是 SimCSEdropout 即数据增强的关键训练循环中每个 batch 先按dup_rate对 query 与 title 分别执行word_repetition增强再前向计算对比学习 loss优化器使用AdamW配合LinearDecayWithWarmup学习率调度实现见 paddlenlp/transformers/optimization.py并且对所有含bias/norm的参数跳过 weight decaydecay_params过滤逻辑每隔eval_steps调用do_evaluate()在验证集上通过scipy.stats.spearmanr计算预测相似度与真实 label 的 Spearman 相关系数并打印每隔save_steps保存一次 checkpoint 目录包含model_state.pdparams、tokenizer_config.json与vocab.txt。训练过程中会自动进行训练与评估并持续在save_dir中保存模型目录结构形如checkpoints/ ├── model_100 │ ├── model_state.pdparams │ ├── tokenizer_config.json │ └── vocab.txt └── ...NOTE如需恢复模型训练可设置init_from_ckptcheckpoints/model_100/model_state.pdparamsdo_train()会通过paddle.load与model.set_dict热加载参数后继续训练。基于动态图模型预测训练完成后用 LCQMC 的测试集作为预测数据。测试数据为文本对 制表符格式每行两句之间用 Tab 分隔示例如下谁有狂三这张高清的 这张高清图谁有 英雄联盟什么英雄最好 英雄联盟最好英雄是什么 这是什么意思被蹭网吗 我也是醉了这是什么意思 现在有什么动画片好看呢 现在有什么好看的动画片吗 请问晶达电子厂现在的工资待遇怎么样要求有哪些 三星电子厂工资待遇怎么样啊执行如下命令开始预测--text_pair_file指向两列文本对文件无需 labelpython -u -m paddle.distributed.launch --gpus 0 \ predict.py \ --device gpu \ --params_path ./checkpoints/model_4400/model_state.pdparams\ --batch_size 64 \ --max_seq_length 64 \ --text_pair_file test.tsv从 predict.py 的源码看预测流程为加载ernie-3.0-medium-zhtokenizer 与预训练模型 → 读取文本对文件is_testTrue时每行仅取两列文本→ 加载--params_path指定的model_state.pdparams→ 在paddle.no_grad()下调用model.cosine_sim()计算每对文本的余弦相似度并逐行打印。cosine_sim内部会对 query 与 title 分别取归一化后的 cls 向量并做点积paddle.sum(query_cls_embedding * title_cls_embedding, axis-1)。输出预测结果如下0.7201147675514221 0.9010907411575317 0.5393891334533691 0.9698929786682129 0.6056119203567505数值越接近 1表示两句语义越相似。上述输出与测试数据一一对应例如谁有狂三这张高清的 / 这张高清图谁有的相似度约 0.72英雄联盟什么英雄最好 / 英雄联盟最好英雄是什么约 0.90符合直观语义判断。适用场景与工程建议SimCSE WR 方案适合无监督语义匹配与检索当业务拥有大规模无标注文本如搜索日志、问答记录、商品标题但缺乏人工标注的语义匹配数据时可以直接用原始文本自监督训练句向量再用于向量召回、文本去重、FAQ 匹配等下游任务。工程实践上建议训练时按 README 的超参表配置特别注意 LCQMC/ATEC/BQ 使用dropout0.3STS-B 使用dropout0.1且训练 8 个 epoch预测时关闭infer_with_fc_pooler不加该 flag此时get_pooled_embedding(with_poolerFalse)会直接取sequence_output[:, 0, :]作为句向量避免 pooler 的 tanh 非线性对相似度排序造成干扰若对向量存储与检索效率有要求可设置--output_emb_size 256将 768 维句向量降维源码中该降维层使用标准差 0.02 的截断正态初始化。Reference[1] Gao, Tianyu, Xingcheng Yao, and Danqi Chen. SimCSE: Simple Contrastive Learning of Sentence Embeddings. ArXiv:2104.08821 [Cs], April 18, 2021.[2] Wu, Xing, et al. ESimCSE: Enhanced Sample Building Method for Contrastive Learning of Unsupervised Sentence Embedding. arXiv preprint arXiv:2109.04380 (2021).赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PaddleNLP 语义召回实践基于 SimCSE 的无监督语义索引模型训练、评估与部署PaddleNLP 语义召回实践基于 SimCSE 的无监督语义索引模型训练、评估与部署 语义索引又称向量索引是搜索引擎、推荐系统、广告系统在召回阶段的核人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPwav2vec 无监督语音预训练实战指南基于 fairseq 的模型训练、加载与特征提取wav2vec 无监督语音预训练实战指南基于 fairseq 的模型训练、加载与特征提取 导读 本文基于 infoxlm 仓库内置的 fairseq 框架人工智能大模型预训练深度学习NLP计算机视觉多模态语音音频微调sentence-transformers 无监督 SimCSE 训练指南借助 Dropout 增强与 MultipleNegativesRankingLoss 自监督训练句子嵌入sentence transformers 无监督 SimCSE 训练指南借助 Dropout 增强与 MultipleNegativesRankingLos人工智能NLPEmbedding微调机器学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表