特定畛域常识图谱交融计划:文本匹配算法之预训练模型 SimBert、ERNIE-Gram
文本匹配工作在自然语言解决中是十分重要的根底工作之一,个别钻研两段文本之间的关系。有很多利用场景;如信息检索、问答零碎、智能对话、文本甄别、智能举荐、文本数据去重、文本类似度计算、自然语言推理、问答零碎、信息检索等,但文本匹配或者说自然语言解决依然存在很多难点。这些自然语言解决工作在很大水平上都能够形象成文本匹配问题,比方信息检索能够归结为搜索词和文档资源的匹配,问答零碎能够归结为问题和候选答案的匹配,复述问题能够归结为两个同义句的匹配。
0. 前言:特定畛域常识图谱交融计划
本我的项目次要围绕着特定畛域常识图谱 (Domain-specific KnowledgeGraph:DKG) 交融计划:文本匹配算法、常识交融学术界计划、常识交融业界落地计划、算法测评 KG 生产品质保障解说了文本匹配算法的综述,从经典的传统模型到孪生神经网络“双塔模型”再到预训练模型以及有监督无监督联结模型,期间也波及了近几年前沿的比照学习模型,之后提出了文本匹配技巧晋升计划,最终给出了 DKG 的落地计划。这边次要以原理解说和技术计划论述为主,之后会缓缓把我的项目开源进去,一起共建 KG,从常识抽取到常识交融、常识推理、品质评估等争取走通残缺的流程。
0.1 前置参考我的项目
前置参考我的项目
1. 特定畛域常识图谱交融计划:技术常识前置【一】- 文本匹配算法
https://blog.csdn.net/sinat_39620217/article/details/128718537
2. 特定畛域常识图谱交融计划:文本匹配算法 Simnet、Simcse、Diffcse【二】
https://blog.csdn.net/sinat_39620217/article/details/128833057
3. 特定畛域常识图谱交融计划:文本匹配算法之预训练 Simbert、ERNIE-Gram 单塔模型等诸多模型【三】
https://blog.csdn.net/sinat_39620217/article/details/129026570
4. 特定畛域常识图谱交融计划:学以致用 - 问题匹配鲁棒性评测较量验证【四】
https://blog.csdn.net/sinat_39620217/article/details/129026193
NLP 常识图谱我的项目合集(信息抽取、文本分类、图神经网络、性能优化等)
https://blog.csdn.net/sinat_39620217/article/details/128805154
2023 计算机领域顶会以及 ACL 自然语言解决(NLP)钻研子方向汇总
https://blog.csdn.net/sinat_39620217/article/details/128897539
0.2 论断先看
仿真后果如下:
模型 | dev acc |
---|---|
Simcse(无监督) | 58.97% |
Diffcse(无监督) | 63.23% |
bert-base-chinese | 86.53% |
bert-wwm-chinese | 86.33% |
bert-wwm-ext-chinese | 86.05% |
ernie-tiny | 86.07% |
roberta-wwm-ext | 87.53% |
rbt3 | 85.37% |
rbtl3 | 85.17% |
ERNIE-1.0-Base | 89.34% |
ERNIE-1.0-Base | 89.34% |
ERNIE-Gram-Base-Pointwise | 90.58% |
- SimCSE 模型适宜不足监督数据,然而又有大量无监督数据的匹配和检索场景。
- 相比于 SimCSE 模型,DiffCSE 模型会更关注语句之间的差异性,具备准确的向量示意能力。DiffCSE 模型同样适宜不足监督数据,然而又有大量无监督数据的匹配和检索场景。
- 显著看到有监督模型中 ERNIE-Gram 比之前所有模型性能的优良
1.SimBERT(UniLM)
预训练模型依照训练形式或者网络结构能够分成三类:
- 一是以 BERT[2]为代表的 自编码(Auto-Encoding)语言模型 ,Autoencoding Language Modeling,自编码语言模型:通过上下文信息来预测以后被 mask 的 token,代表有 BERT、Word2Vec(CBOW) 等. 它应用 MLM 做预训练任务,自编码预训模型往往更善于做 判断类工作 ,或者叫做自然语言了解(Natural Language Understanding,NLU)工作,例如 文本分类,NER等。
$p(x)=\prod_{x \in \text { Mask}} p(x \mid$ content $)$
毛病 :因为训练中采纳了[MASK] 标记,导致预训练与微调阶段不统一的问题,且对于生成式问题的反对能力较差
长处 :可能很好的编码上下文语义信息,在自然语言了解(NLU) 相干的上游工作上体现突出
- 二是以 GPT[3]为代表的 自回归(Auto-Regressive)语言模型 ,Aotoregressive Lanuage Modeling,自回归语言模型:依据后面(或前面) 呈现的 token 来预测以后时刻的 token,代表模型有 ELMO、GTP 等, 它个别采纳 生成类工作 做预训练,相似于咱们写一篇文章,自回归语言模型更善于做生成类工作(Natural Language Generating,NLG),例如 文章生成 等。
$\begin{aligned} & \text {forward:} p(x)=\prod_{t=1}^T p\left(x_t \mid x_{<t}\right) \\ & \text {backward :} p(x)=\prod_{t=T}^1 p\left(x_t \mid x_{>t}\right)\end{aligned}$
毛病 :只能利用单向语义而不能同时利用上下文信息
长处 :对自然语言生成工作(NLG) 敌对,合乎生成式工作的生成过程
- 三是以 encoder-decoder 为根底模型架构的预训练模,例如 MASS[4],它通过编码器将输出句子编码成特征向量,而后通过解码器将该特征向量转化成输入文本序列。基于 Encoder-Decoder 的预训练模型的长处是它可能兼顾自编码语言模型和自回归语言模型:在它的编码器之后 接一个分类层便能够制作一个判断类工作,而同时应用编码器和解码器便能够做生成类工作。
这里要介绍的 对立语言模型(Unified Language Model,UniLM)[1]从网络结构上看,它的构造是和 BERT 雷同的编码器的构造。然而从它的预训练任务上来看,它不仅能够像自编码语言模型那样利用掩码标记的上下文进行训练,还能够像自回归语言模型那样从左向右的进行训练。甚至能够像 Encoder-Decoder 架构的模型先对输出文本进行编码,再从左向右的生成序列。
UniLM 是在微软研究院在 BERT 的根底上提出的预训练语言模型,被称为对立预训练语言模型。应用三种非凡的 Mask 的预训练指标,从而使得模型能够用于 NLG,同时在 NLU 工作取得和 BERT 一样的成果
它能够实现单向、序列到序列和双向预测工作,能够说是联合了 AR 和 AE 两种语言模型的长处,UniLM 在文本摘要、生成式问题答复等畛域获得了 SOTA 的问题
[1] Dong, Li, et al. “Unified language model pre-training for natural language understanding and generation.” Advances in Neural Information Processing Systems 32 (2019).
[2] Devlin J, Chang M W, Lee K, et al. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding[J]. arXiv preprint arXiv:1810.04805, 2018.
[3] Radford, A., Narasimhan, K., Salimans, T. and Sutskever, I., 2018. Improving language understanding by generative pre-training.
[4] Song, Kaitao, et al. “Mass: Masked sequence to sequence pre-training for language generation.”arXiv preprint arXiv:1905.02450(2019).
1.1 UniLM 模型详解
原始论文:Unified Language Model Pre-training for Natural Language Understanding and Generation
刚介绍的三种不同的类型的预训练架构往往须要应用不同的预训练任务进行训练。然而这些工作都能够演绎为依据 已知的内容预测未知的内容 ,不同的是哪些内容是咱们已知的,哪些是须要预测的。UniLM 最外围的内容将用来训练不同架构的工作都对立到了一种相似于掩码语言模型的框架上,而后通过一个 变量掩码矩阵 M(Mask Matrix)
来适配不同的工作。UniLM 所有外围的内容能够概括为下图。
模型框架如上图所示,在预训练阶段,UniLM 模型通过三种不同指标函数的语言模型(包含:双向语言模型,单向语言模型和序列到序列语言模型),去独特学习一个 Transformer 网络;为了管制对将要预测的 token 可见到的上下文,应用了不同的 self-attention mask 来实现。即通过不同的掩码来管制预测单词的可见上下文词语数量,实现不同的模型表征.
1.1.1 模型输出
首先对于一个输出句子,UniLM 采纳了 WordPiece 的形式对其进行了分词。除了分词失去的 token 嵌入,UniLM 中增加了地位嵌入(和 BERT 雷同的形式)和用于辨别文本对的两个段的段嵌入(Segment Embedding)。为了失去整句的特征向量,UniLM 在句子的开始增加了 [SOS] 标记。为了宰割不同的段,它向其中增加了 [EOS] 标记。具体例子能够参考图中的蓝色虚线框中的内容。包含 token embedding,position embedding,segment embedding,同时 segment embedding 还能够作为模型采取何种训练形式 (单向,双向,序列到序列) 的一种标识
1.1.2 网络结构
如图 1 红色虚线框中的内容,UniLM 应用了 $L$ 层 Transformer 的架构,为了辨别使不同的预训练任务能够共享这个网络,UniLM 在其中增加了 掩码矩阵 的运算符。具体的讲,咱们假如输出文本示意为
$\left\{\boldsymbol{x}_i\right\}_{i=1}^{|x|}$,它通过嵌入层后失去第一层的输出 $\boldsymbol{H}^0=\left[\boldsymbol{x}_1, \cdots, \boldsymbol{x}_{|x|}\right]$,而后通过 $L$ 层 Transformer 后失去最终的特征向量,示意为 $\boldsymbol{H}^l=\text {Transformer}\left(\boldsymbol{H}^{l-1}\right), l \in[1, L]$, 再形象编码成 $\mathbf{H}_1=\left[\mathbf{h}_1^{\mathbf{l}}, \ldots, \mathbf{h}_{|\mathbf{x}|}^{\mathbf{1}}\right]$ 的不同档次的上下文示意。在每个 $\text{Transformer}_l$ 块中,应用多个 self-attention heads 来聚合前一层的输入向量。对于第 $l$ 个 $\text{Transformer}_l$ 层,self-attention head $\mathbf A_l$ 的输入通过以下方。不同于原始的 Transformer,UniLM 在其中增加了掩码矩阵,以第 $l$ 层为例,此时 Transformer 转化为式 (1) 到式 (3) 所示的模式。
$\begin{gathered}\boldsymbol{Q}_l=\boldsymbol{H}^{l-1} \boldsymbol{W}_l^Q \quad \boldsymbol{K}_l=\boldsymbol{H}^{l-1} \boldsymbol{W}_l^K \quad \boldsymbol{V}_l=\boldsymbol{H}^{l-1} \boldsymbol{W}_l^V \\ \boldsymbol{M}_{i j}= \begin{cases}0, & \text {allow to attend} \\ -\infty & \text {prevent from attending}\end{cases} \\ \boldsymbol{A}_l=\operatorname{softmax}\left(\frac{\boldsymbol{Q}_l \boldsymbol{K}_l^{\top}}{\sqrt{d_k}}+\boldsymbol{M}\right) \boldsymbol{V}_l\end{gathered}$
其中 $\mathbf{H}^{l-1} \in \mathbb{R}^{|x| \times d_h}$ 别离应用参数矩阵 $\boldsymbol{W}_l^Q, \boldsymbol{W}_l^K, \boldsymbol{W}_l^V$ 别离线性地投影到三元组 Query,Key,Value 中,$M \in \mathbb{R}^{|x| \times |x|}$ 是咱们后面屡次提到过的用于管制预训练任务的掩码矩阵。通过依据掩码矩阵 $M$ 确定一对 tokens 是否能够互相 attend,笼罩被编码的特色,让预测时只能关注到与特定工作相干的特色,从而实现了不同的预训练形式.
1.1.3 工作对立
UniLM 共有 4 个预训练任务,除了图 1 中所示的三个语言模型外,还有一个经典的 NSP 工作,上面咱们别离介绍它们。
-
双向语言模型:
- MASK 完形填空工作,输出的是一个文本对 $[SOS,x_1,x_2,Mask,x_4,EOS,x_5,MASK,x_7,EOS]$
- 双向语言模型是图 1 的最下面的工作,它和掩码语言模型一样就是利用上下文预测被掩码的局部。,与 Bert 模型统一,在预测被掩蔽 token 时,能够察看到所有的 token,如上图所示,应用全 0 矩阵来作为掩码矩阵, 模型须要依据所有的上下文剖析,所以 $M$ 是一个 0 矩阵。
-
单向语言模型:
- MASK 完形填空工作,输出的是一个独自的文本 $[x_1,x_2,Mask,x_4]$
- 单向语言模型能够使从左向右也能够是从右向左,图 1 的例子是从左向右的,也就是 GPT[3]中应用的掩码形式。在这种预测形式中,模型在预测第 t 工夫片的内容时只能看到第 t 工夫片之前的内容,因而 $M$ 是一个上三角全为 $-\infty$ 的上三角矩阵(图 1 中第二个掩码矩阵的暗影局部)。同理,当单向语言模型是从右向左时,$M$ 是一个下三角矩阵。在这种训练形式中,观测序列分为从左到右和从右向左两种,从左到右,即仅通过被掩蔽 token 的左侧所有本文来预测被掩蔽的 token;从右到左,则是仅通过被掩蔽 token 的右侧所有本文来预测被掩蔽的 token,如上图所示,应用上三角矩阵来作为掩码矩阵,暗影局部为,空白局部为 0,
-
Seq-to-Seq 语言模型:
- MASK 完形填空工作,输出的是一个文本对 $[SOS,x_1,x_2,Mask,x_4,EOS,x_5,MASK,x_7,EOS]$
- 如果被掩蔽 token 在第一个文本序列中,那么仅能够应用第一个文本序列中所有 token,不能应用第二个文本序列的任何信息;如果被掩蔽 token 在第二个文本序列中,那么应用一个文本序列中所有 token 和第二个文本序列中被掩蔽 token 的左侧所有 token 预测被掩蔽 token
- 如上图所示,在训练的时候,一个序列由 [SOS]S_1[EOS]S_2[EOS] 组成,其中 S1 是 source segments,S2 是 target segments。随机 mask 两个 segment 其中的词,其中如果 masked 是 source segment 的词的话,则它能够 attend to 所有的 source segment 的 tokens,如果 masked 的是 target segment,则模型只能 attend to 所有的 source tokens 以及 target segment 中以后词和该词右边的所有 tokens,这样模型能够隐形地学习到一个双向的 encoder 和单向 decoder(相似 transformer)
在 Seq-to-Seq 工作中,例如机器翻译,咱们通常先通过编码器将输出句子编码成特征向量,而后通过解码器将这个特征向量解码成预测内容。UniLM 的构造和传统的 Encoder-Decoder 模型的差别十分大,它仅有一个多层的 Transformer 形成。在进行预训练时,UniLM 首先将两个句子拼接成一个序列,并通过 [EOS] 来宰割句子,示意为:[SOS]S1[EOS]S2[EOS]。在编码时,咱们须要晓得输出句子的残缺内容,因而不须要对输出文本进行笼罩。然而当进行解码时,解码器的局部便变成一个从左向右的单向语言模型。因而对于句子中的第 1 个片段(S1 局部)对应的块矩阵,它是一个 0 矩阵(左上块矩阵),对于的句子第 2 个片段(S2 局部)的对应的块矩阵,它是上三角矩阵的一部分(右上块矩阵)。因而咱们能够失去图 1 中最上面的 $M$。能够看出,UniLM 尽管采纳了编码器的架构,然而在训练 Seq-to-Seq 语言模型时它也能够像经典的 Encoder-to-Decoder 那样关注到输出的全副特色以及输入的已生成的特色。
- NSP:UniLM 也像 BERT 一样增加了 NSP 作为预训练任务。对于双向语言模型(Bidirectional LM),与 Bert 模型一样,也进行下一个句子预测。如果是第一段文本的下一段文本,则预测 1;否则预测 0
1.1.4 训练与微调
训练:在训练时,1/ 3 的工夫用来训练双向语言模型,1/ 3 的工夫用来训练单向语言模型,其中从左向右和从右向左各站一半,最初 1 / 3 用了训练 Encoder-Decoder 架构。
微调 :对于 NLU 工作来说,咱们能够间接将 UniLM 视作一个编码器,而后通过[SOS] 标记失去整句的特征向量,再通过在特征向量后增加分类层失去预测的类别。对于 NLG 工作来说,咱们能够像后面介绍的把句子拼接成序列“[SOS]S1[EOS]S2[EOS]”。其中 S1 是输出文本的全部内容。为了进行微调,咱们会随机掩码掉指标句子 S2 的局部内容。同时咱们可会掩码掉指标句子的 [EOS],咱们的目标是让模型本人预测何时预测[EOS] 从而进行预测,而不是预测一个咱们提前设置好的长度。
- 网络设置:24 层 Transformer,1024 个 hidden size,16 个 attention heads
- 参数大小:340M
- 初始化:间接采纳 Bert-Large 的参数初始化
- 激活函数:GELU,与 bert 一样
- dropout 比例:0.1
- 权重衰减因子:0.01
- batch_size:330
- 混合训练形式:对于一个 batch,1/ 3 工夫采纳双向语言模型的指标,1/ 3 的工夫采纳 Seq2Seq 语言模型指标,最初 1 / 3 平均分配给两种单向学习的语言模型,也就是 left-to-right 和 right-to-left 形式各占 1 / 6 工夫
- MASK 形式:总体比例 15%,其中 80% 的状况下间接用 [MASK] 代替,10% 的状况下随机抉择一个词代替,最初 10% 的状况用实在值。还有就是 80% 的状况是每次只 mask 一个词,另外 20% 的状况是 mask 掉 bi-gram 或者 tri-gram
1.1.5 小结
UniLM 和很多 Encoder-Decoder 架构的模型一样(例如 MASS)像对立 NLU 和 NLG 工作,然而无疑 UniLM 的架构更加优雅。像 MASS 在做 NLU 工作时,它只会采纳模型的 Encoder 局部,从而抛弃了 Decoder 局部的全副特色。UniLM 有一个问题是在做机器翻译这样经典的 Seq-to-Seq 工作时,它的掩码机制导致它并没有应用示意 [SOS] 标记对应的全句特色,而是应用了输出句子的序列。这个形式可能不足了对整句特色的捕捉,从而导致生成的内容不足对全局信息的把控。此外,UniLM 在五个 NLG 数据集上的体现优于以前的最新模型:CNN/DailyMail 和 Gigaword 文本摘要、SQuAD 问题生成、CoQA 生成问题答复和 DSTC7 基于对话生成,其劣势总结如下:
- 三种不同的训练指标,网络参数共享
- 网络参数共享,使得模型防止了过拟合于某繁多的语言模型,使得学习进去的模型更加具备普适性
- 采纳了 Seq2Seq 语言模型,使得其在可能实现 NLU 工作的同时,也可能实现 NLG 工作
1.2 SimBert
1.2.1 交融检索和生成的 SimBERT 模型
基于 UniLM 思维、融检索与生成于一体的 BERT 模型。
权重下载:https://github.com/ZhuiyiTech…
UniLM 的外围是通过非凡的 Attention Mask 来赋予模型具备 Seq2Seq 的能力。如果输出是“你想吃啥”,指标句子是“白切鸡”,那 UNILM 将这两个句子拼成一个:[CLS] 你 想 吃 啥 [SEP] 白 切 鸡 [SEP],而后接如图的 Attention Mask:
换句话说,[CLS] 你 想 吃 啥 [SEP]这几个 token 之间是双向的 Attention,而白 切 鸡 [SEP]这几个 token 则是单向 Attention,从而容许递归地预测白 切 鸡 [SEP]这几个 token,所以它具备文本生成能力。
<center>UNILM 做 Seq2Seq 模型图示。输出局部外部可做双向 Attention,输入局部只做单向 Attention。</center>
Seq2Seq 只能阐明 UniLM 具备 NLG 的能力,那后面为什么说它同时具备 NLU 和 NLG 能力呢?因为 UniLM 非凡的 Attention Mask,所以 [CLS] 你 想 吃 啥 [SEP] 这 6 个 token 只在它们之间互相做 Attention,而跟白 切 鸡 [SEP]齐全没关系,这就意味着,只管前面拼接了白 切 鸡 [SEP],但这不会影响到前 6 个编码向量。再说明确一点,那就是前 6 个编码向量等价于只有 [CLS] 你 想 吃 啥 [SEP] 时的编码后果,如果 [CLS] 的向量代表着句向量,那么它就是你 想 吃 啥的句向量,而不是加上白 切 鸡后的句向量。
因为这个个性,UniLM 在输出的时候也随机退出一些[MASK],这样输出局部就能够做 MLM 工作,输入局部就能够做 Seq2Seq 工作,MLM 加强了 NLU 能力,而 Seq2Seq 加强了 NLG 能力,两全其美。
1.2.2 SimBert
SimBERT 属于有监督训练,训练语料是自行收集到的类似句对,通过一句来预测另一句的类似句生成工作来构建 Seq2Seq 局部,而后后面也提到过 [CLS] 的向量事实上就代表着输出的句向量,所以能够同时用它来训练一个检索工作,如下图
假如 SENT_a 和 SENT_b 是一组类似句,那么在同一个 batch 中,把 [CLS] SENT_a [SEP] SENT_b [SEP] 和[CLS] SENT_b [SEP] SENT_a [SEP]都退出训练,做一个类似句的生成工作,这是 Seq2Seq 局部。
另一方面,把整个 batch 内的 [CLS] 向量都拿进去,失去一个 bxd 的句向量矩阵 V(b 是 batch_size,d 是 hidden_size),而后对 d 维度做 l2 归一化,失去新的 V,而后两两做内积,失去 bxv 的类似度矩阵 VV^T,接着乘以一个 scale(咱们取了 30),并 mask 掉对角线局部,最初每一行进行 softmax,作为一个分类工作训练,每个样本的指标标签是它的类似句(至于本身曾经被 mask 掉)。说白了,就是把 batch 内所有的非类似样本都当作负样本,借助 softmax 来减少类似样本的类似度,升高其余样本的类似度。
具体介绍请看:https://kexue.fm/archives/7427
局部后果展现:
>>> gen_synonyms(u'微信和支付宝哪个好?')
[
u'微信和支付宝,哪个好?',
u'微信和支付宝哪个好',
u'支付宝和微信哪个好',
u'支付宝和微信哪个好啊',
u'微信和支付宝那个好用?',
u'微信和支付宝哪个好用',
u'支付宝和微信那个更好',
u'支付宝和微信哪个好用',
u'微信和支付宝用起来哪个好?',
u'微信和支付宝选哪个好',
u'微信好还是支付宝比拟用',
u'微信与支付宝哪个',
u'支付宝和微信哪个好用一点?',
u'支付宝好还是微信',
u'微信支付宝到底哪个好',
u'支付宝和微信哪个实用性更好',
u'好,支付宝和微信哪个更平安?',
u'微信支付宝哪个好用?有什么区别',
u'微信和支付宝有什么区别?谁比拟好用',
u'支付宝和微信哪个好玩'
]
>>> most_similar(u'怎么开初婚未育证实', 20)
[(u'开初婚未育证实怎么弄?', 0.9728098),
(u'初婚未育状况证实怎么开?', 0.9612292),
(u'到哪里开初婚未育证实?', 0.94987774),
(u'初婚未育证实在哪里开?', 0.9476072),
(u'男方也要开初婚证实吗?', 0.7712214),
(u'初婚证实除了村里开,单位能够开吗?', 0.63224965),
(u'生孩子怎么发', 0.40672967),
(u'是须要您到当地公安局开具变更证实的', 0.39978087),
(u'淘宝开店认证未通过怎么办', 0.39477515),
(u'您好,是须要当地公安局开具的变更证实的', 0.39288986),
(u'没有工作证实,怎么办信用卡', 0.37745982),
(u'未成年小孩还没办身份证怎么买高铁车票', 0.36504325),
(u'烟草证不给办,应该怎么办呢?', 0.35596085),
(u'怎么生孩子', 0.3493368),
(u'怎么开福利彩票站', 0.34158638),
(u'沈阳烟草证怎么办?好办不?', 0.33718678),
(u'男性不孕不育有哪些特色', 0.33530876),
(u'结婚证丢了一本怎么办离婚', 0.33166665),
(u'怎么到地税局开发票?', 0.33079252),
(u'男性不孕不育查看要留神什么?', 0.3274408)
]
1.2.3 SimBER 训练预测
SimBERT 的模型权重是以 Google 开源的 BERT 模型为根底,基于微软的 UniLM 思维设计了融检索与生成于一体的工作,来进一步微调后失去的模型,所以它同时具备类似问生成和类似句检索能力。
数据集应用的是 LCQMC 相干状况参考:https://aistudio.baidu.com/ai…
# 数据筹备:应用 PaddleNLP 内置数据集
from paddlenlp.datasets import load_dataset
train_ds, dev_ds, test_ds = load_dataset("lcqmc", splits=["train", "dev", "test"])
#保留数据集并查看
import json
with open("/home/aistudio/output/test.txt", "w+",encoding='UTF-8') as f: #a : 写入文件,若文件不存在则会先创立再写入,但不会笼罩原文件,而是追加在文件开端
for result in dev_ds:
line = json.dumps(result, ensure_ascii=False) #对中文默认应用的 ascii 编码. 想输入真正的中文须要指定 ensure_ascii=False
f.write(line + "\n")
#数据有上传一份也有内置读取,依据集体爱好自行抉择
待预测数据集局部展现:
开初婚未育证实怎么弄?初婚未育状况证实怎么开?1
谁晓得她是网络美女吗?恋情这杯酒谁喝都会醉是什么歌 0
人和畜生的区别是什么?人与畜生的区别是什么!1
男孩喝女孩的尿的故事 怎么才晓得是生男孩还是女孩 0
这种图片是用什么软件制作的?这种图片制作是用什么软件呢?1
这腰带是什么牌子 护腰带什么牌子好 0
什么牌子的空调最好!什么牌子的空调扇最好 0
这里要留神数据格式。没有标签的
开初婚未育证实怎么弄?初婚未育状况证实怎么开?谁晓得她是网络美女吗?恋情这杯酒谁喝都会醉是什么歌
人和畜生的区别是什么?人与畜生的区别是什么!男孩喝女孩的尿的故事 怎么才晓得是生男孩还是女孩
这种图片是用什么软件制作的?这种图片制作是用什么软件呢?这腰带是什么牌子 护腰带什么牌子好
什么牌子的空调最好!什么牌子的空调扇最好
# 模型预测
# %cd SimBERT
!export CUDA_VISIBLE_DEVICES=0
!python predict.py --input_file /home/aistudio/LCQMC/dev.txt
依照 predict.py.py 进行预测失去类似度, 局部展现:
{'query': '开初婚未育证实怎么弄?', 'title': '初婚未育状况证实怎么开?', 'similarity': 0.9500292}
{'query': '谁晓得她是网络美女吗?', 'title': '恋情这杯酒谁喝都会醉是什么歌', 'similarity': 0.24593769}
{'query': '人和畜生的区别是什么?', 'title': '人与畜生的区别是什么!', 'similarity': 0.9916624}
{'query': '男孩喝女孩的尿的故事', 'title': '怎么才晓得是生男孩还是女孩', 'similarity': 0.3250241}
{'query': '这种图片是用什么软件制作的?', 'title': '这种图片制作是用什么软件呢?', 'similarity': 0.9774641}
{'query': '这腰带是什么牌子', 'title': '护腰带什么牌子好', 'similarity': 0.74771273}
{'query': '什么牌子的空调最好!', 'title': '什么牌子的空调扇最好', 'similarity': 0.83304036}
以阈值 0.9 以上为类似度判断,失去后果和标注答案统一 1010100.
2.Sentence Transformers (ERNIE/BERT/RoBERTa/Electra)
随着深度学习的倒退,模型参数的数量飞速增长。为了训练这些参数,须要更大的数据集来防止过拟合。然而,对于大部分 NLP 工作来说,构建大规模的标注数据集十分艰难(老本过高),特地是对于句法和语义相干的工作。相比之下,大规模的未标注语料库的构建则绝对容易。为了利用这些数据,咱们能够先从其中学习到一个好的示意,再将这些示意利用到其余工作中。最近的钻研表明,基于大规模未标注语料库的预训练模型(Pretrained Models, PTM) 在 NLP 工作上获得了很好的体现。
近年来,大量的钻研表明基于大型语料库的预训练模型(Pretrained Models, PTM)能够学习通用的语言示意,有利于上游 NLP 工作,同时可能防止从零开始训练模型。随着计算能力的倒退,深度模型的呈现(即 Transformer)和训练技巧的加强使得 PTM 一直倒退,由浅变深。
百度的预训练模型 ERNIE 通过海量的数据训练后,其特色抽取的工作曾经做的十分好。借鉴迁徙学习的思维,咱们能够利用其在海量数据中学习的语义信息辅助小数据集(如本示例中的医疗文本数据集)上的工作。以 ERNIE 为代表的模型 Fine-tune 实现文本匹配工作。
应用预训练模型 ERNIE 实现文本匹配工作,大家可能会想到将 query 和 title 文本拼接,之后输出 ERNIE 中,取 CLS 特色(pooled_output),之后输入全连贯层,进行二分类。如下图 ERNIE 用于句对分类工作的用法:
然而,以上用法的问题在于,ERNIE 的模型参数十分宏大,导致计算量十分大,预测的速度也不够现实。从而达不到线上业务的要求。针对该问题,能够应用 PaddleNLP 工具搭建 Sentence Transformer 网络。
**Sentence Transformer 采纳了双塔(Siamese)的网络结构。Query 和 Title 别离输出 ERNIE,共享一个 ERNIE 参数,失去各自的 token embedding 特色。之后对 token embedding 进行 pooling(此处教程应用 mean pooling 操作),之后输入别离记作 u,v。之后将三个表征(u,v,|u-v|)拼接起来,进行二分类。网络结构如上图所示。同时,不仅能够应用 ERNIR 作为文本语义特征提取器,能够利用 BERT/RoBerta/Electra 等模型作为文本语义特征提取器
**
论文参考:Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks https://arxiv.org/abs/1908.10084
那么 Sentence Transformer 采纳 Siamese 的网路构造,是如何晋升预测速度呢?
Siamese 的网络结构益处在于 query 和 title 别离输出同一套网络。如在信息搜寻工作中,此时就能够将数据库中的 title 文本提前计算好对应 sequence_output 特色,保留在数据库中。当用户搜寻 query 时,只需计算 query 的 sequence_output 特色与保留在数据库中的 title sequence_output 特色,通过一个简略的 mean_pooling 和全连贯层进行二分类即可。从而大幅晋升预测效率,同时也保障了模型性能。
对于匹配工作罕用的 Siamese 网络结构能够参考:https://blog.csdn.net/thrivin…
2.1 模型简介
针对中文文本匹配问题,开源了一系列模型:
- BERT(Bidirectional Encoder Representations from Transformers)中文模型,简写 bert-base-chinese,其由 12 层 Transformer 网络组成。
- ERNIE(Enhanced Representation through Knowledge Integration),反对 ERNIE 1.0 中文模型(简写 ernie-1.0)和 ERNIE Tiny 中文模型(简写 ernie-tiny)。其中 ernie 由 12 层 Transformer 网络组成,ernie-tiny 由 3 层 Transformer 网络组成。
- RoBERTa(A Robustly Optimized BERT Pretraining Approach),反对 12 层 Transformer 网络的 roberta-wwm-ext。
在 LQCMC 数据集下各个模型评估:
模型 | dev acc | test acc |
---|---|---|
bert-base-chinese | 0.86537 | 0.84440 |
bert-wwm-chinese | 0.86333 | 0.84128 |
bert-wwm-ext-chinese | 0.86049 | 0.83848 |
ernie-1.0 | 0.87480 | 0.84760 |
ernie-tiny | 0.86071 | 0.83352 |
roberta-wwm-ext | 0.87526 | 0.84904 |
rbt3 | 0.85367 | 0.83464 |
rbtl3 | 0.85174 | 0.83744 |
2.2 模型训练
以中文文本匹配公开数据集 LCQMC 为示例数据集,能够运行上面的命令,在训练集(train.tsv)上进行模型训练,并在开发集(dev.tsv)验证
局部后果展现:
global step 7010, epoch: 8, batch: 479, loss: 0.06888, accu: 0.97227, speed: 1.40 step/s
global step 7020, epoch: 8, batch: 489, loss: 0.08377, accu: 0.97617, speed: 6.30 step/s
global step 7030, epoch: 8, batch: 499, loss: 0.07471, accu: 0.97630, speed: 6.32 step/s
global step 7040, epoch: 8, batch: 509, loss: 0.05239, accu: 0.97559, speed: 6.32 step/s
global step 7050, epoch: 8, batch: 519, loss: 0.04824, accu: 0.97539, speed: 6.30 step/s
global step 7060, epoch: 8, batch: 529, loss: 0.05198, accu: 0.97617, speed: 6.42 step/s
global step 7070, epoch: 8, batch: 539, loss: 0.07196, accu: 0.97651, speed: 6.42 step/s
global step 7080, epoch: 8, batch: 549, loss: 0.07003, accu: 0.97646, speed: 6.36 step/s
global step 7090, epoch: 8, batch: 559, loss: 0.10023, accu: 0.97587, speed: 6.34 step/s
global step 7100, epoch: 8, batch: 569, loss: 0.04805, accu: 0.97641, speed: 6.08 step/s
eval loss: 0.46545, accu: 0.87264
[2023-02-07 17:31:29,933] [INFO] - tokenizer config file saved in ./checkpoints_ernie/model_7100/tokenizer_config.json
[2023-02-07 17:31:29,933] [INFO] - Special tokens file saved in ./checkpoints_ernie/model_7100/special_tokens_map.json
代码示例中应用的预训练模型是 ERNIE,如果想要应用其余预训练模型如 BERT,RoBERTa,Electra 等,只需更换 model 和 tokenizer 即可。
# 应用 ERNIE 预训练模型
# ernie-3.0-medium-zh
model = AutoModel.from_pretrained('ernie-3.0-medium-zh')
tokenizer = AutoTokenizer.from_pretrained('ernie-3.0-medium-zh')
# ernie-1.0
# model = AutoModel.from_pretrained('ernie-1.0-base-zh')
# tokenizer = AutoTokenizer.from_pretrained('ernie-1.0-base-zh')
# ernie-tiny
# model = AutoModel.Model.from_pretrained('ernie-tiny')
# tokenizer = AutoTokenizer.from_pretrained('ernie-tiny')
# 应用 BERT 预训练模型
# bert-base-chinese
# model = AutoModel.Model.from_pretrained('bert-base-chinese')
# tokenizer = AutoTokenizer.from_pretrained('bert-base-chinese')
# bert-wwm-chinese
# model = AutoModel.from_pretrained('bert-wwm-chinese')
# tokenizer = AutoTokenizer.from_pretrained('bert-wwm-chinese')
# bert-wwm-ext-chinese
# model = AutoModel.from_pretrained('bert-wwm-ext-chinese')
# tokenizer = AutoTokenizer.from_pretrained('bert-wwm-ext-chinese')
# 应用 RoBERTa 预训练模型
# roberta-wwm-ext
# model = AutoModel..from_pretrained('roberta-wwm-ext')
# tokenizer = AutoTokenizer.from_pretrained('roberta-wwm-ext')
# roberta-wwm-ext
# model = AutoModel.from_pretrained('roberta-wwm-ext-large')
# tokenizer = AutoTokenizer.from_pretrained('roberta-wwm-ext-large')
更多预训练模型,参考 transformers
程序运行时将会主动进行训练,评估,测试。同时训练过程中会主动保留模型在指定的 save_dir 中。如:
checkpoints/
├── model_100
│ ├── model_config.json
│ ├── model_state.pdparams
│ ├── tokenizer_config.json
│ └── vocab.txt
└── ...
NOTE:
如需复原模型训练,则能够设置 init_from_ckpt,如 init_from_ckpt=checkpoints/model_100/model_state.pdparams。
如需应用 ernie-tiny 模型,则须要提前先装置 sentencepiece 依赖,如 pip install sentencepiece
# 模型预测
!export CUDA_VISIBLE_DEVICES=0
!python predict.py --device gpu --params_path /home/aistudio/Fine-tune/checkpoints_ernie/model_7100/model_state.pdparams
输入后果:
Data: ['开初婚未育证实怎么弄?', '初婚未育状况证实怎么开?'] Lable: similar
Data: ['谁晓得她是网络美女吗?', '恋情这杯酒谁喝都会醉是什么歌'] Lable: dissimilar
Data: ['人和畜生的区别是什么?', '人与畜生的区别是什么!'] Lable: similar
Data: ['男孩喝女孩的尿的故事', '怎么才晓得是生男孩还是女孩'] Lable: dissimilar
Data: ['这种图片是用什么软件制作的?', '这种图片制作是用什么软件呢?'] Lable: similar
Data: ['这腰带是什么牌子', '护腰带什么牌子好'] Lable: dissimilar
Data: ['什么牌子的空调最好!', '什么牌子的空调扇最好'] Lable: dissimilar
1010100 和 Simbert 以及标注实在标签统一
批改代码 api 接口参考:https://www.paddlepaddle.org….
2.3 小结
基于双塔 Point-wise 范式的语义匹配模型 SimNet 和 Sentence Transformers, 这 2 种计划计算效率更高,适宜对延时要求高、依据语义类似度进行粗排的利用场景。
对于 Sentence Transformer 更多信息参考 www.SBERT.net 以及论文:
- Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks (EMNLP 2019)
- Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation (EMNLP 2020)
- Augmented SBERT: Data Augmentation Method for Improving Bi-Encoders for Pairwise Sentence Scoring Tasks (arXiv 2020)
3. 预训练模型 ERNIE-Gram 的单塔文本匹配
文本匹配工作数据每一个样本通常由两个文本组成(query,title)。类别模式为 0 或 1,0 示意 query 与 title 不匹配;1 示意匹配。
- 基于单塔 Point-wise 范式的语义匹配模型 ernie_matching: 模型精度高、计算复杂度高, 适宜间接进行语义匹配 2 分类的利用场景。
- 基于单塔 Pair-wise 范式的语义匹配模型 ernie_matching: 模型精度高、计算复杂度高, 对文本类似度大小的序关系建模能力更强,适宜将类似度特色作为下层排序模块输出特色的利用场景。
- 基于双塔 Point-Wise 范式的语义匹配模型 这 2 种计划计算效率更高,适宜对延时要求高、依据语义类似度进行粗排的利用场景。
- Pointwise:输出两个文本和一个标签,可看作为一个分类问题,即判断输出的两个文本是否匹配。
- Pairwise:输出为三个文本,别离为 Query 以及对应的正样本和负样本,该训练形式思考到了文本之间的绝对程序。
单塔 / 双塔
- 单塔:先将输出文本合并,而后输出到繁多的神经网络模型。
- 双塔:对输出文本别离进行编码成固定长度的向量,通过文本的示意向量进行交互计算失去文本之间的关系。
本我的项目应用语义匹配数据集 LCQMC 作为训练集 , 基于 ERNIE-Gram 预训练模型热启训练并开源了单塔 Point-wise 语义匹配模型,用户能够间接基于这个模型对文本对进行语义匹配的 2 分类工作
代码构造阐明
ernie_matching/
├── deply # 部署
| └── python
| └── predict.py # python 预测部署示例
├── export_model.py # 动态图参数导出动态图参数脚本
├── model.py # Point-wise & Pair-wise 匹配模型组网
├── data.py # Point-wise & Pair-wise 训练样本的转换逻辑、Pair-wise 生成随机负例的逻辑
├── train_pointwise.py # Point-wise 单塔匹配模型训练脚本
├── train_pairwise.py # Pair-wise 单塔匹配模型训练脚本
├── predict_pointwise.py # Point-wise 单塔匹配模型预测脚本,输入文本对是否类似: 0、1 分类
├── predict_pairwise.py # Pair-wise 单塔匹配模型预测脚本,输入文本对的类似度打分
└── train.py # 模型训练评估
数据集简介:
LCQMC 是百度晓得畛域的中文问题匹配数据集,目标是为了解决在中文畛域大规模问题匹配数据集的缺失。该数据集从百度晓得不同畛域的用户问题中抽取构建数据。
3.1 模型训练与预测
以中文文本匹配公开数据集 LCQMC 为示例数据集,能够运行上面的命令,在训练集(train.tsv)上进行单塔 Point-wise 模型训练,并在开发集(dev.tsv)验证。
%cd ERNIE_Gram
!unset CUDA_VISIBLE_DEVICES
!python -u -m paddle.distributed.launch --gpus "0" train_pointwise.py \
--device gpu \
--save_dir ./checkpoints \
--batch_size 32 \
--learning_rate 2E-5\
--save_step 1000 \
--eval_step 200 \
--epochs 3
# save_dir:可选,保留训练模型的目录;默认保留在当前目录 checkpoints 文件夹下。# max_seq_length:可选,ERNIE-Gram 模型应用的最大序列长度,最大不能超过 512, 若呈现显存有余,请适当调低这一参数;默认为 128。# batch_size:可选,批处理大小,请联合显存状况进行调整,若呈现显存有余,请适当调低这一参数;默认为 32。# learning_rate:可选,Fine-tune 的最大学习率;默认为 5e-5。# weight_decay:可选,管制正则项力度的参数,用于避免过拟合,默认为 0.0。# epochs: 训练轮次,默认为 3。# warmup_proption:可选,学习率 warmup 策略的比例,如果 0.1,则学习率会在前 10% 训练 step 的过程中从 0 缓缓增长到 learning_rate, 而后再迟缓衰减,默认为 0.0。# init_from_ckpt:可选,模型参数门路,热启动模型训练;默认为 None。# seed:可选,随机种子,默认为 1000.
# device: 选用什么设施进行训练,可选 cpu 或 gpu。如应用 gpu 训练则参数 gpus 指定 GPU 卡号。
预测后果局部展现:
global step 3810, epoch: 1, batch: 3810, loss: 0.27187, accu: 0.90938, speed: 1.25 step/s
global step 3820, epoch: 1, batch: 3820, loss: 0.24648, accu: 0.92188, speed: 21.63 step/s
global step 3830, epoch: 1, batch: 3830, loss: 0.23190, accu: 0.92604, speed: 21.38 step/s
global step 3840, epoch: 1, batch: 3840, loss: 0.35609, accu: 0.91484, speed: 20.81 step/s
global step 3850, epoch: 1, batch: 3850, loss: 0.06531, accu: 0.91687, speed: 19.64 step/s
global step 3860, epoch: 1, batch: 3860, loss: 0.16462, accu: 0.91667, speed: 20.57 step/s
global step 3870, epoch: 1, batch: 3870, loss: 0.26173, accu: 0.91607, speed: 19.78 step/s
global step 3880, epoch: 1, batch: 3880, loss: 0.26429, accu: 0.91602, speed: 19.62 step/s
global step 3890, epoch: 1, batch: 3890, loss: 0.09031, accu: 0.91771, speed: 20.49 step/s
global step 3900, epoch: 1, batch: 3900, loss: 0.16542, accu: 0.91938, speed: 21.26 step/s
global step 3910, epoch: 1, batch: 3910, loss: 0.27632, accu: 0.92074, speed: 21.87 step/s
global step 3920, epoch: 1, batch: 3920, loss: 0.13577, accu: 0.92109, speed: 22.31 step/s
global step 3930, epoch: 1, batch: 3930, loss: 0.15333, accu: 0.91971, speed: 18.52 step/s
global step 3940, epoch: 1, batch: 3940, loss: 0.10362, accu: 0.92031, speed: 21.68 step/s
global step 3950, epoch: 1, batch: 3950, loss: 0.14692, accu: 0.92146, speed: 21.74 step/s
global step 3960, epoch: 1, batch: 3960, loss: 0.17472, accu: 0.92168, speed: 19.54 step/s
global step 3970, epoch: 1, batch: 3970, loss: 0.31994, accu: 0.91967, speed: 21.06 step/s
global step 3980, epoch: 1, batch: 3980, loss: 0.17073, accu: 0.91875, speed: 21.22 step/s
global step 3990, epoch: 1, batch: 3990, loss: 0.14955, accu: 0.91891, speed: 21.51 step/s
global step 4000, epoch: 1, batch: 4000, loss: 0.13987, accu: 0.91922, speed: 21.74 step/s
eval dev loss: 0.30795, accu: 0.87253
如果想要应用其余预训练模型如 ERNIE, BERT,RoBERTa,Electra 等,只需更换 model 和 tokenizer 即可。
# 应用 ERNIE-3.0-medium-zh 预训练模型
model = AutoModel.from_pretrained('ernie-3.0-medium-zh')
tokenizer = AutoTokenizer.from_pretrained('ernie-3.0-medium-zh')
# 应用 ERNIE-Gram 预训练模型
model = AutoModel.from_pretrained('ernie-gram-zh')
tokenizer = AutoTokenizer.from_pretrained('ernie-gram-zh')
# 应用 ERNIE 预训练模型
# ernie-1.0
#model = AutoModel.from_pretrained('ernie-1.0-base-zh'))
#tokenizer = AutoTokenizer.from_pretrained('ernie-1.0-base-zh')
# ernie-tiny
# model = AutoModel.from_pretrained('ernie-tiny'))
# tokenizer = AutoTokenizer.from_pretrained('ernie-tiny')
# 应用 BERT 预训练模型
# bert-base-chinese
# model = AutoModel.from_pretrained('bert-base-chinese')
# tokenizer = AutoTokenizer.from_pretrained('bert-base-chinese')
# bert-wwm-chinese
# model = AutoModel.from_pretrained('bert-wwm-chinese')
# tokenizer = AutoTokenizer.from_pretrained('bert-wwm-chinese')
# bert-wwm-ext-chinese
# model = AutoModel.from_pretrained('bert-wwm-ext-chinese')
# tokenizer = AutoTokenizer.from_pretrained('bert-wwm-ext-chinese')
# 应用 RoBERTa 预训练模型
# roberta-wwm-ext
# model = AutoModel.from_pretrained('roberta-wwm-ext')
# tokenizer = AutoTokenizer.from_pretrained('roberta-wwm-ext')
# roberta-wwm-ext
# model = AutoModel.from_pretrained('roberta-wwm-ext-large')
# tokenizer = AutoTokenizer.from_pretrained('roberta-wwm-ext-large')
NOTE:
如需复原模型训练,则能够设置 init_from_ckpt,如 init_from_ckpt=checkpoints/model_100/model_state.pdparams。
如需应用 ernie-tiny 模型,则须要提前先装置 sentencepiece 依赖,如 pip install sentencepiece
!unset CUDA_VISIBLE_DEVICES
!python -u -m paddle.distributed.launch --gpus "0" \
predict_pointwise.py \
--device gpu \
--params_path "./checkpoints/model_4000/model_state.pdparams"\
--batch_size 128 \
--max_seq_length 64 \
--input_file '/home/aistudio/LCQMC/test.tsv'
预测后果局部展现:
{'query': '这张图是哪儿', 'title': '这张图谁有', 'pred_label': 0}
{'query': '这是什么水果?', 'title': '这是什么水果。怎么吃?', 'pred_label': 1}
{'query': '下巴长痘痘疼是什么起因', 'title': '下巴长痘痘是什么起因?', 'pred_label': 1}
{'query': '世界上最苦楚的是什么', 'title': '世界上最苦楚的是什么?', 'pred_label': 1}
{'query': '北京的市花是什么?', 'title': '北京的市花是什么花?', 'pred_label': 1}
{'query': '这个小男孩叫什么?', 'title': '什么的捡鱼的小男孩', 'pred_label': 0}
{'query': '蓝牙耳机什么牌子最好的?', 'title': '什么牌子的蓝牙耳机最好用', 'pred_label': 1}
{'query': '湖南卫视咱们约会吧两头的歌曲是什么', 'title': '咱们约会吧约会胜利歌曲是什么', 'pred_label': 0}
{'query': '孕妇能吃驴肉吗', 'title': '孕妇能够吃驴肉吗?', 'pred_label': 1}
{'query': '什么鞋子比拟好', 'title': '配什么鞋子比拟好…', 'pred_label': 1}
{'query': '怎么把词典下载到手机上啊', 'title': '怎么把牛津高阶英汉双解词典下载到手机词典上啊', 'pred_label': 0}
{'query': '话费充值哪里便宜', 'title': '哪里充值 (话费) 最便宜?', 'pred_label': 1}
{'query': '怎么下载歌曲到手机', 'title': '怎么往手机上下载歌曲', 'pred_label': 1}
{'query': '苹果手机丢了如何找回?', 'title': '苹果手机掉了怎么找回', 'pred_label': 1}
{'query': '考试怎么考高分?', 'title': '考试如何考高分', 'pred_label': 1}
{'query': '带吉兆是什么意思', 'title': '主吉兆是什么意思', 'pred_label': 1}
{'query': '浅蓝色牛仔裤配什么色彩的帆布鞋难看啊', 'title': '浅蓝色牛仔裤配什么色彩外套和鞋子难看', 'pred_label': 0}
{'query': '怎么能力赚大钱', 'title': '怎么样去赚大钱呢', 'pred_label': 1}
{'query': '王冕是哪个朝代的', 'title': '王冕是哪个朝代的啊', 'pred_label': 1}
{'query': '世界上真的有僵尸吗?', 'title': '这个世界上真的有僵尸吗', 'pred_label': 1}
{'query': '梦见小女孩哭', 'title': '梦见小女孩对我笑。', 'pred_label': 0}
{'query': '这是神马电影?说什的?', 'title': '这是神马电影?!', 'pred_label': 1}
{'query': '李易峰高兴大本营饭拍', 'title': '看李易峰上高兴大本营吻戏', 'pred_label': 0}
3.2 基于动态图部署预测
模型导出
应用动态图训练完结之后,能够应用动态图导出工具 export_model.py 将动态图参数导出成动态图参数。执行如下命令:
!python export_model.py --params_path checkpoints/model_4000/model_state.pdparams --output_path=./output
# 其中 params_path 是指动态图训练保留的参数门路,output_path 是指动态图参数导出门路。# 预测部署
# 导出动态图模型之后,能够基于动态图模型进行预测,deploy/python/predict.py 文件提供了动态图预测示例。执行如下命令:!python deploy/predict.py --model_dir ./output
局部后果展现:
Data: {'query': '〈我是特种兵之火凤凰〉难看吗', 'title': '特种兵之火凤凰难看吗?'} Label: similar
Data: {'query': '当初看电影用什么软件好', 'title': '当初下电影个别用什么软件'} Label: similar
Data: {'query': '什么水取之不尽用之不竭是什么生肖', 'title': '什么水取之不尽用之不竭打一生肖'} Label: similar
Data: {'query': '愤恨的小鸟哪里下载', 'title': '愤恨的小鸟在哪里下载'} Label: similar
Data: {'query': '中国象棋巨匠网', 'title': '中国象棋巨匠'} Label: dissimilar
Data: {'query': '怎么注册谷歌账号?', 'title': '谷歌账号怎么注册'} Label: similar
Data: {'query': '哪里能够看点金胜手', 'title': '点金胜手哪里能看完'} Label: similar
Data: {'query': '什么牌子的行车记录仪好,怎么选', 'title': '行车记录仪什么牌子好;选哪个?'} Label: similar
Data: {'query': '芭比公主系列总共有哪些 QUQ', 'title': '芭比公主系列动漫有哪些'} Label: dissimilar
Data: {'query': '新疆省会哪里', 'title': '新疆省会是哪里?'} Label: similar
Data: {'query': '明天星期几!', 'title': '明天星期几呢'} Label: similar
Data: {'query': '蜂蛹怎么吃', 'title': '蜂蛹怎么养'} Label: dissimilar
Data: {'query': '少年老成是什么生肖', 'title': '什么生肖是少年老成'} Label: similar
Data: {'query': '无关爱国的歌曲', 'title': '爱国歌曲有哪些'} Label: similar
3.3 小结
模型 | dev acc |
---|---|
Simcse(无监督) | 58.97% |
Diffcse(无监督) | 63.23% |
bert-base-chinese | 86.53% |
bert-wwm-chinese | 86.33% |
bert-wwm-ext-chinese | 86.05% |
ernie-tiny | 86.07% |
roberta-wwm-ext | 87.53% |
rbt3 | 85.37% |
rbtl3 | 85.17% |
ERNIE-1.0-Base | 89.34% |
ERNIE-1.0-Base | 89.34% |
ERNIE-Gram-Base-Pointwise | 90.58% |
- SimCSE 模型适宜不足监督数据,然而又有大量无监督数据的匹配和检索场景。
- 相比于 SimCSE 模型,DiffCSE 模型会更关注语句之间的差异性,具备准确的向量示意能力。DiffCSE 模型同样适宜不足监督数据,然而又有大量无监督数据的匹配和检索场景。
- 显著看到有监督模型中 ERNIE-Gram 比之前所有模型性能的优良
参考文章:https://aistudio.baidu.com/ai…
4. 学以致用 – 千言问题匹配鲁棒性评测较量验证
特定畛域常识图谱交融计划:学以致用 - 问题匹配鲁棒性评测较量验证
本我的项目次要讲述文本匹配算法的利用实际、并给出相应的优化计划介绍如:可解释学习等。最初文末介绍了常识交融学术界计划、常识交融业界落地计划、算法测评 KG 生产品质保障等,波及比照学习和文本。
https://blog.csdn.net/sinat_39620217/article/details/129026193
5. 特定畛域常识图谱 (Domain-specific KnowledgeGraph:DKG) 交融计划(重点!)
在后面技术常识下能够看看后续的理论业务落地计划和学术计划
对于图神经网络的常识交融技术学习参考上面链接:[PGL 图学习我的项目合集 & 数据集分享 & 技术演绎业务落地技巧[系列十]](https://aistudio.baidu.com/ai…)
从入门常识到经典图算法以及进阶图算法等,自行查阅食用!
文章篇幅无限请参考专栏按需查阅:NLP 常识图谱相干技术业务落地计划和码源
5.1 特定畛域常识图谱常识交融计划(实体对齐):优酷畛域常识图谱为例
计划链接:https://blog.csdn.net/sinat_39620217/article/details/128614951
5.2 特定畛域常识图谱常识交融计划(实体对齐):娱乐常识图谱构建之人物实体对齐
计划链接:https://blog.csdn.net/sinat_39620217/article/details/128673963
5.3 特定畛域常识图谱常识交融计划(实体对齐):商品常识图谱技术实战
计划链接:https://blog.csdn.net/sinat_39620217/article/details/128674429
5.4 特定畛域常识图谱常识交融计划(实体对齐):基于图神经网络的商品异构实体表征摸索
计划链接:https://blog.csdn.net/sinat_39620217/article/details/128674929
5.5 特定畛域常识图谱常识交融计划(实体对齐)论文合集
计划链接:https://blog.csdn.net/sinat_39620217/article/details/128675199
论文材料链接:两份内容不雷同,且依照序号从小到大重要性顺次递加
常识图谱实体对齐材料论文参考(PDF)+ 实体对齐计划 + 特定畛域常识图谱常识交融计划(实体对齐)
常识图谱实体对齐材料论文参考(CAJ)+ 实体对齐计划 + 特定畛域常识图谱常识交融计划(实体对齐)
5.6 常识交融算法测试计划(常识生产品质保障)
计划链接:https://blog.csdn.net/sinat_39620217/article/details/128675698
6. 总结
文本匹配工作在自然语言解决中是十分重要的根底工作之一,个别钻研两段文本之间的关系。有很多利用场景;如信息检索、问答零碎、智能对话、文本甄别、智能举荐、文本数据去重、文本类似度计算、自然语言推理、问答零碎、信息检索等,但文本匹配或者说自然语言解决依然存在很多难点。这些自然语言解决工作在很大水平上都能够形象成文本匹配问题,比方信息检索能够归结为搜索词和文档资源的匹配,问答零碎能够归结为问题和候选答案的匹配,复述问题能够归结为两个同义句的匹配。
本我的项目次要围绕着特定畛域常识图谱 (Domain-specific KnowledgeGraph:DKG) 交融计划:文本匹配算法、常识交融学术界计划、常识交融业界落地计划、算法测评 KG 生产品质保障解说了文本匹配算法的综述,从经典的传统模型到孪生神经网络“双塔模型”再到预训练模型以及有监督无监督联结模型,期间也波及了近几年前沿的比照学习模型,之后提出了文本匹配技巧晋升计划,最终给出了 DKG 的落地计划。这边次要以原理解说和技术计划论述为主,之后会缓缓把我的项目开源进去,一起共建 KG,从常识抽取到常识交融、常识推理、品质评估等争取走通残缺的流程。
模型 | dev acc |
---|---|
Simcse(无监督) | 58.97% |
Diffcse(无监督) | 63.23% |
bert-base-chinese | 86.53% |
bert-wwm-chinese | 86.33% |
bert-wwm-ext-chinese | 86.05% |
ernie-tiny | 86.07% |
roberta-wwm-ext | 87.53% |
rbt3 | 85.37% |
rbtl3 | 85.17% |
ERNIE-1.0-Base | 89.34% |
ERNIE-1.0-Base | 89.34% |
ERNIE-Gram-Base-Pointwise | 90.58% |
- SimCSE 模型适宜不足监督数据,然而又有大量无监督数据的匹配和检索场景。
- 相比于 SimCSE 模型,DiffCSE 模型会更关注语句之间的差异性,具备准确的向量示意能力。DiffCSE 模型同样适宜不足监督数据,然而又有大量无监督数据的匹配和检索场景。
- 显著看到有监督模型中 ERNIE-Gram 比之前所有模型性能的优良
我的项目参考链接:
UniLM 详解:https://zhuanlan.zhihu.com/p/…
原论文:Unified Language Model Pre-training for Natural Language Understanding and Generation:https://arxiv.org/pdf/1905.03…
UniLM 模型详解:https://www.jianshu.com/p/22e…
苏神:交融检索和生成的 SimBERT 模型:https://kexue.fm/archives/7427
simbert:https://github.com/PaddlePadd…
simbert:https://github.com/ZhuiyiTech…
开源预训练语言模型合集:https://github.com/ZhuiyiTech…