【NLP】14 ERNIE应用在语义匹配NLP任务——Paddlehub安装、BERT推广的使用、与Simnet_bow与Word2Vec效果比较

el/2024/2/26 0:22:37

Ernie语义匹配

  • 1. ERNIE 基于paddlehub的语义匹配0-1预测
    • 1.1 数据
    • 1.2 paddlehub
    • 1.3 三种BERT模型结果
  • 2. 中文STS(semantic text similarity)语料处理
  • 3. ERNIE 预训练+微调
    • 3.1 过程与结果
    • 3.2 全部代码
  • 4. Simnet_bow与Word2Vec 效果
    • 4.1 ERNIE 和 simnet_bow 简单服务器调用
    • 4.2 Word2Vec 求和取平均
    • 4.3 全部代码
  • 5. STS-B 数据集
  • 6. 其它
  • 小结

1. ERNIE 基于paddlehub的语义匹配0-1预测

可参考此官方教程:PaddleHub实战——使用ERNIE优化医疗场景文本语义匹配任务,利用paddlehub进行模型搭建,并且这样可以轻松的选择不同的模型

1.1 数据

利用天池“公益AI之星”挑战赛-新冠疫情相似句对判定大赛提供的数据集,这是COVID9疫情相关的呼吸领域的真实数据积累,数据粒度更加细化,判定难度相比多科室文本相似度匹配更高,同时问答数据也更具时效性

数据集给出了文本对(text_a、text_b,text_a为query,text_b为title)以及类别(label)。其中label为1,表示text_a、text_b的文本语义相似,否则表示不相似

pointwise,每一个样本通常由两个文本组成(query,title)。类别形式为0或1,0表示query与title不匹配; 1表示匹配

1.2 paddlehub

输入以下代码安装paddlehub 1.8 及以上版本,注意:不能安装最新即2.0版本!

pip install paddlehub==1.8.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

其中最大序列长度max_seq_len是可以调整的参数,建议值128,根据任务文本长度不同可以调整该值,但不要超过512。

num_slots: 文本匹配任务输入文本的数据量。pointwise文本匹配任务num_slots应为2,表示query和title

关于numpy求最大值:

import numpy as np
x = [[0.08017547, 0.9198245 ],[0.21695773, 0.78304225],[0.9055544 , 0.0944456 ]]print(np.argmax(x))
> 1
print(np.argmax(x[0]))
> 1
print(np.argmax(x, axis=1))
> [1 1 0]
print(np.argmax(x, axis=0))
> [2 0]

这里修改了BaseTask的self._compatible_mode,以便模型能够返回置信度,三句话如下:

[["小孩吃了百令胶囊能打预防针吗", "小孩吃了百令胶囊能不能打预防针"],
["请问呕血与咯血有什么区别?", "请问呕血与咯血异同?" ],
['新冠疫情相似句对判定大赛', '疫情相关的呼吸领域的真实数据']]

1.3 三种BERT模型结果

ERNIE三句话判断的标签与置信度如下:

[2021-04-03 11:59:32,171] [    INFO] - PaddleHub model checkpoint loaded. current_epoch=4, global_step=204, best_score=0.90833
...
['1', '1', '1']
[0.08017547 0.21695773 0.0944456 ]
[0.9198245  0.78304225 0.9055544 ]

将模型换成BERT base Chinese,结果如下:

[2021-04-03 11:56:23,166] [    EVAL] - [dev dataset evaluation result] loss=0.25818 acc=0.89466 f1=0.87201 precision=0.85167 recall=0.89335 [step/sec: 11.73]
...
['1', '1', '1']
[0.06025315 0.4611525  0.4954325 ]
[0.93974686 0.5388475  0.50456756]

再将模型换成chinese-bert-wwm,这是哈工大讯飞联合实验室(HFL)发布的模型,官方链接,wwm意思是全词遮罩(Whole Word Masking)

问题:服务器上下载很慢,可以在Windows上用paddlehub 2.0下载好后发送到服务器上,注意,Windos上不能是paddlehub 1.8 版本,否则会报错,也不行

再将模型换成chinese-electra-base,谷歌与斯坦福大学共同研发的最新预训练模型ELECTRA因其小巧的模型体积以及良好的模型性能受到了广泛关注。为了进一步促进中文预训练模型技术的研究与发展,哈工大讯飞联合实验室基纡官方ELECTRA训练代码以及大规模的中文数据训练出中文ELECTRA预训练模型供大家下载使用。其中ELECTRA-small模型可与BERT-base甚至其他同等规模的模型相媲美,参数数量仅为BERT-base的1/10,谷歌&斯坦福大学官方的ELECTRA,中文ELECTRA可见此

再将模型换成chinese-roberta-wwm-ext,主要是在BERT基础上做了几点调整,其它可见:

  1. 动态Masking,相比于静态,动态Masking是每次输入到序列的Masking都不一样
  2. 移除next predict loss,相比于BERT,采用了连续的full-sentences和doc-sentences作为输入(长度最多为512)
  3. 更大batch size,batch size更大,training step减少,实验效果相当或者更好些
  4. text encoding,基于bytes的编码可以有效防止unknown问题。另外,预训练数据集从16G增加到了160G,训练轮数比BERT有所增加
[2021-04-03 18:16:58,015] [    EVAL] - [dev dataset evaluation result] loss=0.22186 acc=0.90978 f1=0.89119 precision=0.86439 recall=0.91970 [step/sec: 11.72]
...
['1', '1', '1']
[0.02443924 0.22384807 0.24285851]
[0.9755608 0.7761519 0.7571415]

2. 中文STS(semantic text similarity)语料处理

数据来自 ChineseSTS、CCKS2018、XNLI、Chinese SNLI MultiNLI,未使用:LCQMC、OCNLI

数据处理代码如下:

# path_CCKS2018 = '... your path/中文STS/CCKS2018/task3_train.txt'
# path_output = '... your path/中文STS/CCKS2018/train.txt'
# with open(path_CCKS2018, 'r', encoding='utf-8') as file:
#     for line in file.readlines():
#         print(line.strip().split('\t'))# path_ChineseSTS_master = '... your path/中文STS/ChineseSTS-master/simtrain_to05sts_same.txt'
# path_ChineseSTS_master2 = '... your path/中文STS/ChineseSTS-master/train2.txt'
# list = []
# f = open(path_ChineseSTS_master2, 'w', encoding='utf-8')
# with open(path_ChineseSTS_master, 'r', encoding='utf-8') as file:
#     for line in file.readlines():
#         # print(line.strip().split('\t'))
#         tmp = line.strip().split('\t')
#         if eval(tmp[4]) >= 3:tmp[4]=1
#         elif eval(tmp[4]) < 3:tmp[4]=0
#         f.write(tmp[1] + '\t' +tmp[3] + '\t' + str(tmp[4]) + '\n')# path = '... your path/中文STS/Chinese SNLI MultiNli/train.txt'
# output = '... your path/中文STS/Chinese SNLI MultiNli/processing.txt'
# f = open(output, 'w', encoding='utf-8')
# with open(path, 'r',encoding='utf-8') as file:
#     for line in file.readlines():
#         tmp = line.strip().split('\t')
#         try:
#             if tmp[2] == 'neutral':continue
#             elif tmp[2] == 'contradiction':
#                 tmp[2] = '0'
#             elif tmp[2] == 'entailment':
#                 tmp[2] = '1'
#             f.write(tmp[0] + '\t' + tmp[1] + '\t' + tmp[2] + '\n')
#         except:
#             print(tmp)# path = '... your path/中文STS/XNLI/XNLI-1.0/xnli.test.tsv'
# path_out = '... your path/中文STS/XNLI/XNLI-1.0/train2.txt'
# f = open(path_out, 'w', encoding='utf-8')
# with open(path, 'r', encoding='utf-8') as file:
#     for line in file.readlines():
#         tmp = line.strip().split('\t')
#         if tmp[0] != 'zh':continue
#         if tmp[1] == 'neutral':continue
#         if tmp[1] == 'entailment':
#             tmp[1] = '1'
#         elif tmp[1] == 'contradiction':
#             tmp[1] = '0'
#         f.write(tmp[6] + '\t' + tmp[7] + '\t' + tmp[1] + '\n')

由以上代码,将CCKS2018、Chinese SNLI MultiNli、ChineseSTS-master、XNLI四个数据集进行格式处理与合并,得到以下格式的数据集,用’\t’进行分隔:
在这里插入图片描述
总句子对数量:412101,文件大小:44.2MB

随机打乱数据,95%的数据作为训练集,5%的数据作为测试集:

path = '... your path/Chinese STS/data.txt'
path_train = '... your path/Chinese STS/train.txt'
path_dev = '... your path/Chinese STS/dev.txt'f1 = open(path_train, 'w', encoding='utf-8')
f2 = open(path_dev, 'w', encoding='utf-8')import random
list = []
with open(path, 'r', encoding='utf-8') as file:for line in file.readlines():list.append(line)
print(len(list))
L = random.sample(range(0, len(list)), len(list))
for i in range(len(list)):if random.randint(1, 100) > 5:      # 训练集f1.write(list[L[i]])else:       # 测试集f2.write(list[L[i]])

训练集句子长度:391374,测试集句子长度:20727

3. ERNIE 预训练+微调

3.1 过程与结果

训练的超参数设为迭代一次,训练过程如下:

[2021-04-03 19:09:58,762] [   TRAIN] - step 300 / 3057: loss=0.43742 acc=0.79688
[2021-04-03 19:10:31,878] [    EVAL] - [dev dataset evaluation result] loss=0.42460 acc=0.80115
[2021-04-03 19:15:25,458] [   TRAIN] - step 600 / 3057: loss=0.35716 acc=0.84219 f1=0.84650 precision=0.83634 recall=0.85692 [step/sec: 1.05]
[2021-04-03 19:15:52,798] [    EVAL] - [dev dataset evaluation result] loss=0.33696 acc=0.85229 f1=0.85776 precision=0.84240 recall=0.87368 [step/sec: 5.92]
[2021-04-03 19:20:47,694] [   TRAIN] - step 900 / 3057: loss=0.31624 acc=0.85938 f1=0.86547 precision=0.87068 recall=0.86033 [step/sec: 1.02]
[2021-04-03 19:21:15,012] [    EVAL] - [dev dataset evaluation result] loss=0.31917 acc=0.86447 f1=0.86435 precision=0.88239 recall=0.84703 [step/sec: 5.93]
[2021-04-03 19:26:08,743] [   TRAIN] - step 1200 / 3057: loss=0.33277 acc=0.85547 f1=0.85995 precision=0.85801 recall=0.86191 [step/sec: 1.04]
[2021-04-03 19:26:36,122] [    EVAL] - [dev dataset evaluation result] loss=0.29532 acc=0.87655 f1=0.87966 precision=0.87428 recall=0.88510 [step/sec: 5.91]
[2021-04-03 19:31:30,448] [   TRAIN] - step 1500 / 3057: loss=0.29113 acc=0.87734 f1=0.88240 precision=0.88174 recall=0.88306 [step/sec: 1.01]
[2021-04-03 19:31:57,800] [    EVAL] - [dev dataset evaluation result] loss=0.28233 acc=0.88301 f1=0.88647 precision=0.87710 recall=0.89605 [step/sec: 5.92]
[2021-04-03 19:36:50,822] [   TRAIN] - step 1800 / 3057: loss=0.28595 acc=0.88281 f1=0.88987 precision=0.88081 recall=0.89911 [step/sec: 1.06]
[2021-04-03 19:37:18,143] [    EVAL] - [dev dataset evaluation result] loss=0.27718 acc=0.88310 f1=0.88768 precision=0.86995 recall=0.90614 [step/sec: 5.93]
[2021-04-03 19:42:14,001] [   TRAIN] - step 2100 / 3057: loss=0.28871 acc=0.86719 f1=0.86593 precision=0.86050 recall=0.87143 [step/sec: 1.03]
[2021-04-03 19:42:41,323] [    EVAL] - [dev dataset evaluation result] loss=0.26953 acc=0.88922 f1=0.89035 precision=0.89851 recall=0.88234 [step/sec: 5.93]
[2021-04-03 19:47:36,276] [   TRAIN] - step 2400 / 3057: loss=0.27113 acc=0.88281 f1=0.88372 precision=0.85202 recall=0.91787 [step/sec: 1.02]
[2021-04-03 19:48:03,595] [    EVAL] - [dev dataset evaluation result] loss=0.26500 acc=0.89150 f1=0.89265 precision=0.90044 recall=0.88501 [step/sec: 5.93]
[2021-04-03 19:52:56,993] [   TRAIN] - step 2700 / 3057: loss=0.25304 acc=0.89844 f1=0.90441 precision=0.90708 recall=0.90176 [step/sec: 1.00]
[2021-04-03 19:53:24,280] [    EVAL] - [dev dataset evaluation result] loss=0.25736 acc=0.89451 f1=0.89667 precision=0.89540 recall=0.89795 [step/sec: 5.93]
[2021-04-03 19:58:19,393] [   TRAIN] - step 3000 / 3057: loss=0.25258 acc=0.89141 f1=0.89681 precision=0.88433 recall=0.90964 [step/sec: 1.00]
[2021-04-03 19:58:46,698] [    EVAL] - [dev dataset evaluation result] loss=0.25527 acc=0.89533 f1=0.89708 precision=0.89927 recall=0.89491 [step/sec: 5.93]
[2021-04-03 19:59:38,235] [   TRAIN] - step 3050 / 3057: loss=0.25146 acc=0.89531 f1=0.89612 precision=0.89752 recall=0.89474 [step/sec: 1.01]
[2021-04-03 20:00:12,357] [    EVAL] - [dev dataset evaluation result] loss=0.25513 acc=0.89509 f1=0.89688 precision=0.89877 recall=0.89500 [step/sec: 5.93]['1', '1', '1']
[0.00513761 0.03052873 0.42773667]
[0.9948624  0.9694713  0.57226336]

可见最后能达到89.5%的精确度

3.2 全部代码

import numpy as np
from paddlehub.dataset.base_nlp_dataset import TextMatchingDatasetclass COVID19Competition(TextMatchingDataset):def __init__(self, tokenizer=None, max_seq_len=None):# base_path = '/mnt/Data1/ysc/COVID19_sim_competition/'base_path = '/mnt/Data1/ysc/STS/'super(COVID19Competition, self).__init__(is_pair_wise=False,  # 文本匹配类型,是否为pairwisebase_path=base_path,train_file="train.txt",  # 相对于base_path的文件路径    # 2021.04.03dev_file="dev.txt",  # 相对于base_path的文件路径        # 2021.04.03train_file_with_header=False,        # 2021.04.03dev_file_with_header=False,      # 2021.04.03label_list=["0", "1"],tokenizer=tokenizer,max_seq_len=max_seq_len)import paddle
paddle.enable_static()import paddlehub as hub
# module = hub.Module(name='chinese-bert-wwm-ext')      # download, /home/ysc/anaconda3/lib/python3.8/site-packages/paddlehub/module/manager.py
module = hub.Module(directory='/mnt/Data1/ysc/.paddlehub/modules/ernie')
# module = hub.Module(directory='/mnt/Data1/ysc/.paddlehub/modules/bert_chinese_L_12_H_768_A_12')     # please decrease the batch size of your model.
# module = hub.Module(directory='/mnt/Data1/ysc/.paddlehub/modules/chinese_roberta_wwm_ext')inputs, outputs, program = module.context(trainable=True, max_seq_len=128, num_slots=2)tokenizer = hub.BertTokenizer(vocab_file=module.get_vocab_path(), tokenize_chinese_chars=True)dataset = COVID19Competition(tokenizer=tokenizer, max_seq_len=128)strategy = hub.AdamWeightDecayStrategy(weight_decay=0.01, warmup_proportion=0.1, learning_rate=5e-5)config = hub.RunConfig(eval_interval=300,use_cuda=True,num_epoch=1,        # 3batch_size=32,      # 32 for ERNIE, 16 for bert, 16 for chinese_roberta_wwm_extcheckpoint_dir='/mnt/Data1/ysc/.paddlehub/Check_Point/ernie',strategy=strategy)query = outputs["sequence_output"]
title = outputs['sequence_output_2']# 创建pointwise文本匹配任务
pointwise_matching_task = hub.PointwiseTextMatchingTask(dataset=dataset,query_feature=query,title_feature=title,tokenizer=tokenizer,config=config)run_states=pointwise_matching_task.finetune_and_eval()# pointwise_matching_task.load_parameters('ernie.pth')text_pairs = [["小孩吃了百令胶囊能打预防针吗",  # query"小孩吃了百令胶囊能不能打预防针"  # title],["请问呕血与咯血有什么区别?",  # query"请问呕血与咯血异同?"  # title]
]label_list=['0', '1']# The source code of predict function is modified here 2021.04.03
# paddlehub.finetune.task.base_task.RunState
run_states = pointwise_matching_task.predict([["小孩吃了百令胶囊能打预防针吗", "小孩吃了百令胶囊能不能打预防针"],["请问呕血与咯血有什么区别?", "请问呕血与咯血异同?" ],['新冠疫情相似句对判定大赛', '疫情相关的呼吸领域的真实数据']], max_seq_len=128, label_list=label_list, return_result=False, accelerate_mode=True)result =[]
for batch_states in run_states:batch_results = batch_states.run_resultsbatch_infer = np.argmax(batch_results[0], axis=1)result +=[label_list[sample_infer] for sample_infer in batch_infer]label_0 = np.array(batch_results[0])[:,0]label_1 = np.array(batch_results[0])[:, 1]print(result)
print(label_0)
print(label_1)# results = pointwise_matching_task.predict(
#     data=text_pairs,
#     max_seq_len=128,
#     label_list=dataset.get_labels(),
#     return_result=True,
#     accelerate_mode=True)       # False is None!
#
# print(results)
#
# for index, text in enumerate(text_pairs):
#     print("data: %s, prediction_label: %s" % (text, results[index]))

4. Simnet_bow与Word2Vec 效果

4.1 ERNIE 和 simnet_bow 简单服务器调用

  1. 可参考此文章,代码在此,和语音识别和文本识别一样,利用API,没有什么难度,感觉不太会用,可能是版本问题,服务器使用见此,不好用
  2. 文本相似度计算可用paddle的短文本相似度的框架,SimNet是一个计算短文本相似度的模型,可以根据用户输入的两个文本,计算出相似度得分。该PaddleHub Module基于百度海量搜索数据进行训练,支持命令行和Python接口进行预测。同时支持用该Module的预训练embedding Fine-tune下游任务。词袋模型,不考虑语法和语序,用一组无序单词来表达一段文本
    SimNet (Similarity Net) 是一个计算短文本相似度的框架,主要包括 BOW、CNN、RNN、MMDNN 等核心网络结构形式。SimNet 框架在百度各产品上广泛应用,提供语义相似度计算训练和预测框架,适用于信息检索、新闻推荐、智能客服等多个应用场景,帮助企业解决语义匹配问题

4.2 Word2Vec 求和取平均

句向量为空:

她傲慢地环视了一下会场。	自比乐毅。
一艘载着两个人的小船在水中移动。	船在动。
微拉贷	开通微米贷
一对跳舞的夫妇正在表演一场俯卧在地板上的戏。	有些人在动。
我想贷	借贷
下載	我从哪下载呀

使用simnet_bow(0.633)和word2vec(0.6188)时余弦相似度阈值设为0.7的时候,与原标签的预测精确度都为0.6左右,仅仅比瞎蒙(0.5)好一点点,比较simnet_bow和word2vec预测的标签,精确度也只有0.7左右,分类错误的句子例如:

两个小女孩穿着白色空手道制服。 两个女孩穿着拳击服。 0 1 0
两个人正在梯子上一起工作。 一个人在梯子上 0 1 0
一个戴着帽子和围裙的人在自行车上工作。 男人在摩托车上工作 0 1 0
地下储罐 地下狗屋。 0 1 0
她不合作 她在合作。 1 0 0
更换银行卡 我想重新绑定银行卡 1 0 0
两个孩子正在试验昆虫。 两个孩子在玩国旗足球。 1 0 0
没有借钱这个地方 微信借钱在哪里啊 1 0 0
刚才没接到电话,请重新打过来,谢谢 没有接到银行电话 1 0 1
具体的网址是 网站 1 0 1
一男一女站在路标前。 两个人站着。 1 0 1
开通颗粒贷 开通,微贷款 1 0 1
整体直径接近8英尺。 它的直径约为80英尺。 1 0 0
电子账单 500010期的账单 1 0 1
我微信流水账你们看不到吗 没看见我的流水? 1 0 1
10001天多少息 18000日息多少一天 1 0 1
更换电话 手机换号,怎么更改 1 0 1
在篮球场上滑板的人 在户外的人。 0 1 1
两个穿着蓝色潜水衣的孩子冲浪。 两个孩子冲浪。 0 1 1
这些戴着头盔的人正在户外攀岩。 人们正在攀岩 0 1 1
这个女孩正用绳子在一个小池塘上摇摆。 一个女孩在摇摆。 0 1 1

4.3 全部代码

import paddlehub as hubsimnet_bow = hub.Module(name="simnet_bow")
base_path = '/mnt/Data1/ysc/STS/dev.txt'text1 = []
text2 = []
label = []
with open(base_path, 'r', encoding='utf-8')as file:for line in file.readlines():tmp = line.strip().split('\t')text1.append(tmp[0])text2.append(tmp[1])label.append(eval(tmp[2]))test_text = [text1, text2]results = simnet_bow.similarity(texts=test_text, use_gpu=False)predict = []
max_score = 0.7     # 0.8--0.6000  0.75--0.6244  0.7--0.6333   0.75--0.6261   0.6--0.6152   0.5--0.5749for result in results:if result['similarity'] > max_score:predict.append(1)else:predict.append(0)cnt = 0
for i in range(len(label)):if label[i]==predict[i]:cnt += 1
print(cnt/len(label))from gensim.models import KeyedVectors
import jieba
import numpy as np
import re
from scipy.spatial.distance import cosine
word_vectors = KeyedVectors.load('vectors.kv')def get_sentence_vec(sentence):sentence = ''.join(re.findall('[\u4e00-\u9fa5|\n]',sentence))sentence_list = ' '.join(jieba.cut(sentence)).split(' ')vecsum = np.zeros(word_vectors.vector_size)cnt = 0for word in sentence_list:try:vecsum = vecsum + word_vectors[word]cnt += 1except:continueif cnt == 0:# print('Not exist!')return vecsumreturn vecsum/cntscore = 0.7     # 0.8--0.5909      0.75--0.6103    0.7--0.6188     0.65--0.621      0.6--0.6176
predict2 = []
for i in range(len(label)):vec1 = get_sentence_vec(text1[i])vec2 = get_sentence_vec(text2[i])if vec1.all() == 0 or vec2.all() == 0:# print(text1[i] + '\t' + text2[i])predict2.append(-1)else:if 1 - cosine(vec1, vec2) > score:predict2.append(1)else:predict2.append(0)cnt2 = 0
length = 0
for i in range(len(label)):if predict2[i] == -1:continuelength += 1if predict2[i] == label[i]:cnt2 += 1
print(cnt2/length)cnt3 = 0
length2 = 0
for i in range(len(label)):if predict2[i] == -1:continuelength2 += 1if predict[i] == predict2[i]:cnt3 += 1else:print(text1[i],text2[i],predict[i], predict2[i], label[i])
print(cnt3/length2)     # 0.7108

5. STS-B 数据集

Semantic Textual Similarity Benchmark: 这是一个类似回归的问题——给出一对句子, 使用1~5(0-5?)的评分评价两者在语义上的相似程度,来自比赛的Task 1: Semantic Textual Similarity Multilingual and Crosslingual Focused Evaluation,介绍,参考文献引用:

Cer D M, Diab M T, Agirre E, et al. SemEval-2017 Task 1: Semantic Textual Similarity Multilingual and Crosslingual Focused Evaluation[J]. meeting of the association for computational linguistics, 2017: 1-14.

不同模型在Semantic Textual Similarity on STS Benchmark数据集上的表现与排名

6. 其它

官方给了一个语义匹配的示例脚本,但是看不懂

ERNIE的论文代码复现过程在此,ERNIE的简介见–ERNIE: Enhanced Language Representation with Informative Entities,语义匹配,不同数据集有不同的表现最好的模型

wget https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2		# Download Wikidump
wget -c https://cloud.tsinghua.edu.cn/f/a519318708df4dc8a853/?dl=1 -O alias_entity.txt		# Download alise
python3 pretrain_data/WikiExtractor.py enwiki-latest-pages-articles.xml.bz2 -o pretrain_data/output -l --min_text_length 100 --filter_disambig_pages -it abbr,b,big --processes 4		# WikiExtractor
python3 pretrain_data/extract.py 4		# Modify anchors with 4 processes
python3 pretrain_data/create_ids.py 4		# Preprocess with 4 processes
...

Preprocess with 4 processes这一步需要安装tensorflow:

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --upgrade tensorflow-gpu
INFO: Finished 4-process extraction of 6132409 articles in 4192.1s (1462.9 art/s)
INFO: total of page: 11143091, total of articl page: 6274306; total of used articl page: 6132409
...

还是放弃了,他们使用8个NVIDIA-2080Ti对我们的模型进行预训练,每个GPU中有32个实例。完成训练需要将近一天的时间(一个epoch就足够了),我觉得并不能很好的复现他们的结果

另:glue排名,ERNIE的综合表现是相当好的:
在这里插入图片描述

小结

  1. Paddlehub是个好东西,但是对2.0的支持不太行,只能1.8的版本,这样的话只能有3个BERT模型可以使用,主要还是套ERNIE的语义匹配的代码
  2. 中文STS语料还是东找找西找找拼起来的一个数据集,感觉什么微粒贷的数据集其实可以不需要,这里只迭代了一次,精度就可以达到90%左右了,总体来说还可以
  3. Simnet_bow其实原来是什么不太清楚,是不是就是BOW,应该就是的呢,效果一般,Word2Vec效果也一般,但是感觉仅考虑语义的话是不是又不太行?这里之后可以考虑加权求和或者D-S融合处理一下
  4. 英语模型应该不用复现吧,直接查论文或者官网的Rank呗,英文其实原理都是一样的,就是WordEmbedding不一样,就不管了吧
  5. 总之文本处理到这里真结束了,明天开始语音的学习!!!

http://www.ngui.cc/el/3526011.html

相关文章

【深度学习人类语言处理】1 课程介绍、语音辨识1——人类语言处理六种模型、Token、五种Seq2Seq Model(LAS、CTC、RNN-T、Neural Transducer、MoChA)

Deep Learning for Human Ianguage Processing1. DLHLP-Introduction1.1 概述1.2 六种模型与应用1.2.1 语音到文本1.2.2 文本到语音1.2.3 语音到语音1.2.4 语音到Class1.2.5 文本到文本1.2.6 文本到Class1.3 更多应用2. 语音辨识2.1 语音辨识的Token2.2 声学特征提取2.3 Listen…

【DL】6 GAN入门1——基本思想(Generator、Discriminator)、条件生成、无监督生成(直接转换、投射到公共空间)

GAN 11. Introduction of Generative Adversarial Network (GAN)1.1 GAN的基本思想1.2 GAN作为结构化学习1.3 Generator可以自己学习吗&#xff1f;1.4 鉴别器能生成吗&#xff1f;1.5 一点理论2. Conditional Generation by GAN3. 无监督条件生成3.1 直接转换3.2 投射到公共空…

【PyTorch】12 生成对抗网络实战——用GAN生成动漫头像

GAN 生成动漫头像1. 获取数据2. 用GAN生成2.1 Generator2.2 Discriminator2.3 其它细节2.4 训练思路3. 全部代码4. 结果展示与分析小结深度卷积生成对抗网络&#xff08;DCGAN&#xff09;:Unsupervised Representation Learning with Deep Convolutional Generative Adversari…

【语音信号处理】2语音信号实践——LSTM(hidden、output)、Attention、语音可视化

语音信号处理 深度学习1. LSTM-hidden 实现细节2. LSTM-output 实现细节3. Attention4. 语音可视化5. 全部代码小结1. LSTM-hidden 实现细节 关于class torch.utils.data.Dataset官方文档&#xff0c; 当ATCH_SIZE 128&#xff0c;HIDDEN_SIZE 64&#xff0c;最大迭代次数…

【NLP】文献翻译4——CH-SIMS:中文多模态情感分析数据集与细粒度的模态注释

CH-SIMS: A Chinese Multimodal Sentiment Analysis Dataset with Fine-grained Annotations of Modality摘要1. 介绍2. 相关工作2.1 多模态数据集2.2 多模态情感分析2.3 多任务学习3. CH-SIMS 数据集3.1 数据获取3.2 标注3.3 特征提取4. 多模式多任务学习框架4.1 单模态子网4.…

【NLP】文献翻译5——用自我监督的多任务学习学习特定模式的表征,用于多模态情感分析

Learning Modality-Specific Representations with Self-Supervised Multi-Task Learning for Multimodal Sentiment Analysis摘要1. 介绍2. 相关工作2.1 多模态情感分析2.2 Transformer and BERT2.3 多任务学习3. 方法论3.1 任务设定3.2 总体架构3.3 ULGM3.4 优化目标4. 实验环…

【PyTorch】13 Image Caption:让神经网络看图讲故事

图像描述1、数据集获取2、文本数据处理3、图像数据处理4、训练5、全部代码6、总结1、数据集获取 数据来自&#xff1a;AI challenger 2017 图像描述数据集 百度网盘: https://pan.baidu.com/s/1g1XaPKzNvOurH9M44p1qrw 提取码: bag3 这里由于原训练集太大&#xff0c;这里仅使…

【PyTorch】14 AI艺术家:神经网络风格迁移

风格迁移 Style Transfer1、数据集2、原理简介3、用Pytorch实现风格迁移4、结果展示5、全部代码小结详细可参考此CSDN 1、数据集 使用COCO数据集&#xff0c;官方网站点此&#xff0c;下载点此&#xff0c;共13.5GB&#xff0c;82783张图片 2、原理简介 风格迁移分为两类&a…

【20210906】让实验室服务器运行本地python代码

从零开始配置实验室电脑的python环境1. 电脑信息2. 电脑环境配置&#xff08;1&#xff09;Pycharm&#xff08;2&#xff09;anaconda&#xff08;3&#xff09;配置Anacondapycharm环境3. 服务器环境配置小结在实验室刚刚装好的DELL电脑&#xff0c;设备规格&#xff1a;Vost…

【20210910】让实验室服务器在Anaconda环境运行本地python代码

从零开始配置服务器的python环境1. 下载Anaconda Linux2. Pycharm3. 配置服务器上Python环境4. tmux应用5. Anaconda环境小结1. 下载Anaconda Linux 可以查看服务器的Linux版本&#xff1a; cat /proc/versionLinux version 5.11.13-arch1-1 (linuxarchlinux) (gcc (GCC) 10.…