文本表示是自然语言处理(NLP)领域的核心问题, 其在很多NLP、信息检索的下游任务中发挥着非常重要的作用。近几年, 随着深度学习的发展,尤其是预训练语言模型的出现极大的推动了文本表示技术的效果, 基于预训练语言模型的文本表示模型在学术研究数据、工业实际应用中都明显优于传统的基于统计模型或者浅层神经网络的文本表示模型。这里, 我们主要关注基于预训练语言模型的文本表示。 文本表示示例, 输入一个句子, 输入一个固定维度的连续向量: 文本的向量表示通常可以用于文本聚类、文本相似度计算、文本向量召回等下游任务中。 基于监督数据训练的文本表示模型通常采用Dual Ecoder框架, 如下图所示。在Dual Ecoder框架中, Query和Documet文本通过预训练语言模型编码后, 通常采用预训练语言模型[CLS]位置的向量作为最终的文本向量表示。基于标注数据的标签, 通过计算query-documet之间的cosie或者L2距离度量两者之间的相关性。 使用方式: 使用范围: 在ModelScope框架上,提供输入文本(默认最长文本长度为128),即可以通过简单的Pipelie调用来使用coROM文本向量表示模型。ModelScope封装了统一的接口对外提供单句向量表示、双句文本相似度、多候选相似度计算功能 本模型基于MS MARCO Passage Rakig英文数据集(通用领域)上训练,在垂类领域英文文本上的文本效果会有降低,请用户自行评测后决定如何使用 训练数据采用MS MARCO Passage Rakig官方开源数据 模型采用4张NVIDIA V100机器训练, 超参设置如下: 我们主要在文本向量召回场景下评估模型效果, MS MARCO Passage Rakig Dev评估结果:coROM英文通用文本表示模型
Dual Ecoder文本表示模型
使用方式和范围
如何使用
代码示例
from modelscope.models import Model
from modelscope.pipelies import pipelie
from modelscope.utils.costat import Tasks
model_id = "damo/lp_corom_setece-embeddig_eglish-base"
pipelie_se = pipelie(Tasks.setece_embeddig,
model=model_id)
iputs = {
"source_setece": ["how log it take to get a master degree"],
"seteces_to_compare": [
"O average, studets take about 18 to 24 moths to complete a master degree.",
"O the other had, some studets prefer to go at a slower pace ad choose to take",
"several years to complete their studies.",
"It ca take aywhere from two semesters"
]
}
result = pipelie_se(iput=iputs)
prit (result)
# {'text_embeddig': array([[ 0.08452811, -0.0636334 , 0.5774376 , ..., 0.1499477 ,
# 0.07685442, 0.06914043],
# [-0.12009228, 0.1660448 , 0.35046986, ..., 0.0850232 ,
# -0.01834037, 0.10846637],
# [-0.14880717, -0.3792838 , -0.34287834, ..., 0.33967134,
# -0.12936975, -0.2094945 ],
# [ 0.37085992, 0.52807516, 0.170942 , ..., 0.00421665,
# 0.00313525, -0.25771397],
# [ 0.27699593, -0.08881918, -0.08759344, ..., 0.26941332,
# 0.09722027, 0.06628524]], dtype=float32), 'scores': [162.09716796875, 118.86981964111328, 138.30409240722656, 136.58656311035156]}
模型局限性以及可能的偏差
训练数据介绍
训练流程
trai_epochs=3
max_sequece_legth=128
batch_size=64
learig_rate=5e-6
optimizer=AdamW
训练示例代码
# 需在GPU环境运行
# 加载数据集过程可能由于网络原因失败,请尝试重新运行代码
from modelscope.metaifo import Traiers
from modelscope.msdatasets import MsDataset
from modelscope.traiers import build_traier
import tempfile
import os
tmp_dir = tempfile.TemporaryDirectory().ame
if ot os.path.exists(tmp_dir):
os.makedirs(tmp_dir)
# load dataset
ds = MsDataset.load('msmarco-passage-rakig', 'zyzull')
trai_ds = ds['trai'].to_hf_dataset()
dev_ds = ds['dev'].to_hf_dataset()
model_id = 'damo/lp_corom_setece-embeddig_eglish-base'
def cfg_modify_f(cfg):
cfg.task = 'setece-embeddig'
cfg['preprocessor'] = {'type': 'setece-embeddig','max_legth': 256}
cfg['dataset'] = {
'trai': {
'type': 'bert',
'query_sequece': 'query',
'pos_sequece': 'positive_passages',
'eg_sequece': 'egative_passages',
'text_fileds': ['text'],
'qid_field': 'query_id'
},
'val': {
'type': 'bert',
'query_sequece': 'query',
'pos_sequece': 'positive_passages',
'eg_sequece': 'egative_passages',
'text_fileds': ['text'],
'qid_field': 'query_id'
},
}
cfg['trai']['eg_samples'] = 4
cfg['evaluatio']['dataloader']['batch_size_per_gpu'] = 30
cfg.trai.max_epochs = 1
cfg.trai.trai_batch_size = 4
retur cfg
kwargs = dict(
model=model_id,
trai_dataset=trai_ds,
work_dir=tmp_dir,
eval_dataset=dev_ds,
cfg_modify_f=cfg_modify_f)
traier = build_traier(ame=Traiers.lp_setece_embeddig_traier, default_args=kwargs)
traier.trai()
模型效果评估
Model
MRR@10
Recall@1000
BERT-base
33.4
95.5
ANCE
33.0
95.5
ME-BERT
33.8
-
RecketQA
37.0
97.9
Codeser
36.6
97.4
coCodeser
38.2
98.4
coROM
37.3
97.4
引用
@article{msmarcoData,
author = {Tri Nguye ad Mir Roseberg ad Xia Sog ad Jiafeg Gao ad Saurabh Tiwary ad Raga Majumder ad Li Deg},
title = {{MS} {MARCO:} {A} Huma Geerated MAchie Readig COmprehesio Dataset},
joural = {CoRR},
volume = {abs/1611.09268},
year = {2016}
}
点击空白处退出提示
评论