当前位置:   article > 正文

深度学习应用篇-自然语言处理[10]:N-Gram、SimCSE介绍,更多技术:数据增强、智能标注、多分类算法、文本信息抽取、多模态信息抽取、模型压缩算法等_ngram语言模型

ngram语言模型

在这里插入图片描述
【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

在这里插入图片描述
专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

本专栏主要方便入门同学快速掌握相关知识。后续会持续把深度学习涉及知识原理分析给大家,让大家在项目实操的同时也能知识储备,知其然、知其所以然、知何由以知其所以然。

声明:部分项目为网络经典项目方便大家快速学习,后续会不断增添实战环节(比赛、论文、现实应用等)

专栏订阅:

深度学习应用篇-自然语言处理[10]:N-Gram、SimCSE介绍,更多技术:数据增强、智能标注、多分类算法、文本信息抽取、多模态信息抽取、模型压缩算法等

1.N-Gram

N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。

该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。

N-gram的用途很广,比如搜索引擎或者输入法提示,词性标注,垃圾短信分类,分词,机器翻译,语音识别能等等等。

  • 概率计算

假设我们有一个由n nn个词组成的句子 S = ( w 1 , w 2 , . . . , w n ) S=(w_{1},w_{2},...,w_{n}) S=(w1,w2,...,wn),如何衡量它的概率呢?让我们假设,每一个单词 w i w_{i} wi都要依赖于从第一个单词 w 1 w_{1} w1到到它之前一个单词 w i − 1 w_{i-1} wi1的影响:

p ( S ) = p ( w 1 w 2 . . . w n ) = p ( w 1 ) p ( w 2 ∣ w 1 ) . . . p ( w n ∣ w n − 1 . . . w 2 w 1 ) p(S)=p(w_{1}w_{2}...w_{n})=p(w_{1})p(w_{2}|w_{1})...p(w_{n}|w_{n-1}...w_{2}w_{1}) p(S)=p(w1w2...wn)=p(w1)p(w2w1)...p(wnwn1...w2w1)

这个衡量方法有两个缺陷:

  1. 参数空间大: 概率 p ( w n ∣ w n − 1 . . . w 2 w 1 ) p(w_{n}|w_{n-1}...w_{2}w_{1}) p(wnwn1...w2w1)的参数有O(n)个。
  2. 数据稀疏,词同时出现的情况可能没有,组合阶数高时尤其明显。

为了解决第一个问题,引入马尔科夫假设(Markov Assumption):一个词的出现仅与它之前的若干个词有关。

p ( w 1 . . . w n ) = ∏ p ( w i ∣ w i − 1 . . . w 1 ) ≈ ∏ p ( w i ∣ w i − 1 . . . w i − N + 1 ) p(w_{1}...w_{n})=\prod{p(w_{i}|w_{i-1}...w_{1})} \approx \prod{p(w_{i}|w_{i-1}...w_{i-N+1})} p(w1...wn)=p(wiwi1...w1)p(wiwi1...wiN+1)

如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为 Bi-gram:

p ( S ) = p ( w 1 w 2 . . . w n ) = p ( w 1 ) p ( w 2 ∣ w 1 ) . . . p ( w n ∣ w n − 1 ) p(S)=p(w_{1}w_{2}...w_{n})=p(w_{1})p(w_{2}|w_{1})...p(w_{n}|w_{n-1}) p(S)=p(w1w2...wn)=p(w1)p(w2w1)...p(wnwn1)

如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为 Tri-gram:

p ( S ) = p ( w 1 w 2 . . . w n ) = p ( w 1 ) p ( w 2 ∣ w 1 ) . . . p ( w n ∣ w n − 1 w n − 2 ) p(S)=p(w_{1}w_{2}...w_{n})=p(w_{1})p(w_{2}|w_{1})...p(w_{n}|w_{n-1}w_{n-2}) p(S)=p(w1w2...wn)=p(w1)p(w2w1)...p(wnwn1wn2)
N-gram的 N NN 可以取很高,然而现实中一般 bi-gram 和 tri-gram 就够用了.

用极大似然估计来计算每一项的条件概率,即频数:

p ( w n ∣ w n − 1 ) = C ( w n − 1 w n ) C ( w n − 1 ) p(w_{n}|w_{n-1})=\frac{C(w_{n-1}w_{n})}{C(w_{n-1})} p(wnwn1)=C(wn1)C(wn1wn)

p ( w n ∣ w n − 1 w n − 2 ) = C ( w n − 2 w n − 1 w n ) C ( w n − 2 w n − 1 ) p(w_{n}|w_{n-1}w_{n-2})=\frac{C(w_{n-2}w_{n-1}w_{n})}{C(w_{n-2}w_{n-1})} p(wnwn1wn2)=C(wn2wn1)C(wn2wn1wn)

p ( w n ∣ w n − 1 . . . w 2 w 1 ) = C ( w 1 w 2 . . . w n ) C ( w 1 w 2 . . . w n − 1 ) p(w_{n}|w_{n-1}...w_{2}w_{1})=\frac{C(w_{1}w_{2}...w_{n})}{C(w_{1}w_{2}...w_{n-1})} p(wnwn1...w2w1)=C(w1w2...wn1)C(w1w2...wn)

具体地,以Bi-gram为例,我们有这样一个由三句话组成的语料库:

I am Sam
Sam I am
I do not like apple
  • 1
  • 2
  • 3

容易统计,“I”出现了3次,“I am”出现了2次,因此能计算概率:

p ( a m ∣ I ) = 2 3 p(am|I)=\frac{2}{3} p(amI)=32

同理,还能计算出如下概率:

p ( S a m ∣ a m ) = 0.5 p(Sam|am)=0.5 p(Samam)=0.5

p ( d o ∣ I ) = 0.33 p(do|I)=0.33 p(doI)=0.33
等等

2.SimCSE

句向量表征技术一直都是NLP领域的热门话题,在BERT前时代,一般都采用word2vec训练出的word-embedding结合pooling策略进行句向量表征,或者在有训练数据情况下,采用TextCNN/BiLSTM结合Siamese network策略进行句向量表征。在BERT时代,人们借助预训练语言模型的固有优势,一般采用BERT模型的[CLS]向量(即句子的起始字符向量)作为句向量表征;SimCSE采用对比学习的方法,进行句向量表征,在BERT模型上获取更好的句向量表征,详细介绍如下:

2.1.介绍

SimCSE(simple contrastive
sentence embedding framework),即简单的对比句向量表征框架。SimCSE共包含了无监督和有监督的两种方法。无监督方法,采用dropout技术,对原始文本进行数据增强,从而构造出正样本,用于后续对比学习训练;监督学习方法,借助于文本蕴含(自然语言推理)数据集,将蕴涵-pair作为正例,矛盾-pair作为难负例,用于后续对比学习训练。并且通过对比学习解决了预训练Embedding的各向异性问题,使其空间分布更均匀,当有监督数据可用时,可以使正样本直接更紧密。模型结构如下图所示:

其中,图a为无监督SimCSE,图b为有监督SimCSE,详细模型介绍见第3节和第4节。
下面将从对比学习背景、无监督SimCSE、有监督SimCSE、各向异性问题、实验细节五个方面进行详细介绍。

2.2.对比学习背景

2.2.1定义

对比学习就是以拉近相似数据,推开不相似数据为目标,有效地学习数据表征。给定一个pair对样本集合 D = { ( x i , x i + ) } i = 1 m D=\{(x_{i}, x_{i}^{+})\}^{m}_{i=1} D={(xi,xi+)}i=1m,其中 x i x_{i} xi x i + x_{i}^{+} xi+为相似样本,优化目标一般采用通过批内负样本(in-batch negatives)交叉熵损失函数,如下,
l i = − log ⁡ e s i m ( h i , h i + ) / τ ∑ j = 1 N e s i m ( h i , h j + ) / τ l_{i}=-\log\frac{e^{sim(h_{i},h_{i}^{+})/\tau}}{\sum_{j=1}^{N} e^{sim(h_{i},h_{j}^{+})/\tau}} li=logj=1Nesim(hi,hj+)/τesim(hi,hi+)/τ
其中, h i h_{i} hi h i + h_{i}^{+} hi+ x i x_{i} xi x i + x_{i}^{+} xi+的句向量表示, N N N为训练过程中batch的大小, s i m ( h i , h i + ) sim(h_{i},h_{i}^{+}) sim(hi,hi+)为向量 h i h_{i} hi h i + h_{i}^{+} hi+余弦相似度, τ \tau τ为温度超参。

在SimCSE论文中,采用BERT模型对句子进行句向量表征,即 h = f θ ( x ) h=f_{\theta}(x) h=fθ(x),其中, f θ f_{\theta} fθ为BERT模型参数,并通过对比学习损失优化网络全部参数。

2.2.2构造正样本

对比学习中的一个关键问题是如何构建 ( x i , x i + ) (x_{i}, x_{i}^{+}) (xi,xi+)数据对。在计算机视觉中,通过对一张图片进行简单地裁剪,翻转,扭曲和旋转就可以获取质量很高的 x i + x_{i}^{+} xi+;而在自然语言处理中,构造 x i + x_{i}^{+} xi+的方法与图像类似,一般对原始句子进行转译、重排,或对部分词语删除、插入、替换等;但是由于离散性,导致NLP中的数据扩充往往会引入大量的负面噪声,使得 x i + x_{i}^{+} xi+的质量难以保证。

在SimCSE论文中,提出使用标准dropout操作构造高质量 x i + x_{i}^{+} xi+,并达到比上述数据扩充更好的效果。

2.2.3对齐性和均匀性

在对比学习中,通常使用对齐性(alignment)和均匀性(uniformity)来衡量表征质量的好坏。

alignment是计算 ( x i , x i + ) (x_{i}, x_{i}^{+}) (xi,xi+)数据对向量表征之间的距离,表示数据之前的紧密程度,
l a l i g n ≜ E ( x i , x i + )   p p o s ∣ ∣ f ( x ) − f ( x + ) ∣ ∣ 2 l_{align} \triangleq \mathop{E}\limits_{(x_{i}, x_{i}^{+})~p_{pos}} ||f(x)-f(x^+)||^2 lalign(xi,xi+) pposE∣∣f(x)f(x+)2
uniformity是计算 x i x_{i} xi向量表征在整体特征分布上的均匀程度,
l u n i f o r m ≜ l o g E x , y ∼ i . i . d . p d a t a e − 2 ∣ ∣ f ( x ) − f ( y ) ∣ ∣ 2 l_{uniform} \triangleq log \mathop{E}\limits_{x,y \mathop{\sim}\limits^{i.i.d.} p_{data}} e^{-2||f(x)-f(y)||^2} luniformlogx,yi.i.d.pdataEe2∣∣f(x)f(y)2
其中, p d a t a p_{data} pdata表示数据分布。

这两个指标与对比学习的目标是一致的:正例之间应该保持紧密,而任意向量的语义特征应该尽可能地分散在超球体上。

2.3.无监督SimCSE

无监督SimCSE的思想非常简单,给定一个句子集合 { x i } i = 1 m \{x_i\}_{i=1}^{m} {xi}i=1m,将 x i x_{i} xi分别输入到编码器中两次,分别得到向量 z i z_{i} zi的正例和 z i ’ z_{i}^{’} zi;由于随机dropout masks机制存在于模型的fully-connected layers和attention probabilities上,因此相同的输入,经过模型后会得到不同的结果;将 z i ’ z_{i}^{’} zi向量作为 z i z_{i} zi的正例,其他向量作为负例,SimCSE的训练目标变成:
l i = − log ⁡ e s i m ( h i z i , h i z i ’ ) / τ ∑ j = 1 N e s i m ( h i z i , h j z j ’ ) / τ l_{i}=-\log\frac{e^{sim(h_{i}^{z_i},h_{i}^{^{z_i^{’}}})/\tau}}{\sum_{j=1}^{N} e^{sim(h_{i}^{z_i},h_{j}^{z_j^{’}})/\tau}} li=logj=1Nesim(hizi,hjzj)/τesim(hizi,hizi)/τ
注意: z z z为Transformers中的标准dropout mask,在无监督SimCSE没有额外增加任何dropout。

2.3.1Dropout数据增强与其他的比较

通过dropout masks机制进行数据增强构造正例的方法,可以视为一种最小形式的数据扩充,正例与原始样本之间采用完全相同的句子,只有在向量表征过程中的dropout mask有所不同。

在STS-B的开发集上,比较该方法与其他数据增强方法的差异。在英文维基上随机抽取 1 0 6 10^6 106个句子进行训练,学习速率=3e-5,批次大小为64。并训练过程中没有使用STS训练集。

  • 裁剪,删除和替换等数据增强方法,效果均不如dropout masks机制,即使删除一个词也会损害性能,详细如下表所示,

  • 使用下一句作为目标训练,或者采用两个独立的编码器进行编码的效果,不如采用一个编码器的dropout masks机制,详细如下表所示,

3.2为什么该方法可以work?

  • 为了进一步理解dropout噪声在无监督SimCSE中的作用,论文尝试了不同的dropout率,如下表所示,

可以发现仅在默认dropout概率p=0.1时效果最优,并且当dropout概率p=0,或者相同输入有同样的dropout mask时,效果显著下降。

  • 在训练过程中,每隔10步检查一次模型,并可视化alignment和uniformity在训练过程中的变化,如下图所示,

可以发现,在训练过程中,所有模型的均匀性都在提高,但是对于no-dropout和fixed-0.1模型来说对齐性急剧下降,而无监督SimCSE和delete-one-word模型进本持平。虽然delete-one-word模型的对齐性好于无监督SimCSE,但是均匀性相差较多,因此在整体效果上,无监督SimCSE更胜一筹。

2.4.有监督SimCSE

对比学习的关键是如何构建 ( x i , x i + ) (x_{i}, x_{i}^{+}) (xi,xi+)数据对,在无监督SimCSE中,借助dropout mask机制,构造高质量 x i + x_{i}^{+} xi+数据,已经获得了较好的句向量表征;在有监督SimCSE中,如何通过监督数据,进一步提高句向量表征,具体如下:

2.4.1监督数据的选择

共存在四种数据集,适合构造对比学习 ( x i , x i + ) (x_{i}, x_{i}^{+}) (xi,xi+)数据对,分别是:

  • QQP:Quora问题对;

相似的问题对为正样本,如下:

正样本
How can I improve my communication and verbal skills? 
What should we do to improve communication skills?
  • 1
  • 2
  • 3

不相似的问题对为负样本,如下:

负样本
Why are you so sexy? 
How sexy are you?
  • 1
  • 2
  • 3
  • Flickr30k:每个图像都有5个人进行描述,可以认为同一图像的任意两个描述为一对 ( x i , x i + ) (x_{i}, x_{i}^{+}) (xi,xi+)数据对;
    以下图为例:

对图片中的人物的5段描述,如下:

人物描述
Gray haired man in black suit and yellow tie working in a financial environment.
A graying man in a suit is perplexed at a business meeting.
A businessman in a yellow tie gives a frustrated look.
A man in a yellow tie is rubbing the back of his neck.
A man with a yellow tie looks concerned.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • ParaNMT:大规模的回译数据集;

针对原数据进行机器翻译,获得回译数据,如下:

原数据:so, what’s half an hour?
回译数据:half an hour won’t kill you.
  • 1
  • 2
  • NLI datasets:自然语言推理数据集,包括:SNLI和MNLI。

自然语言推理数据集,包含蕴含、矛盾和中立;蕴含表示第二句话可以推理出第一句话;矛盾表示第二句话不能推理出第一句话;中立表示两句话无关;举例如下:

蕴含样本
well you see that on television also 
You can see that on television, as well.
  • 1
  • 2
  • 3
矛盾样本
but that takes too much planning 
It doesn't take much planning.
  • 1
  • 2
  • 3
中立样本
Conceptually cream skimming has two basic dimensions - product and geography. 
Product and geography are what make cream skimming work.
  • 1
  • 2
  • 3

在四种数据集上,直接使用 ( x i , x i + ) (x_{i}, x_{i}^{+}) (xi,xi+)数据对进行训练的结果如下表所示,

可以发现,NLI数据集上,采用语义蕴含对作为 ( x i , x i + ) (x_{i}, x_{i}^{+}) (xi,xi+)数据对的效果最好;并且统计发现,语义蕴含对(SNLI + MNLI)的词汇重叠仅占比39%,而QQP和ParaNMT数据集占比60%和55%。最终,选择NLI数据集进行监督学习。

2.4.2难负例的使用

NLI数据集中,一个前提假设文本,具有对应的蕴含文本和矛盾文本,将矛盾文本作为难负例;即, ( x i , x i + ) (x_{i}, x_{i}^{+}) (xi,xi+)数据对变成 ( x i , x i + , x i − ) (x_{i}, x_{i}^{+}, x_{i}^{-}) (xi,xi+,xi)数据组,其中, x i + x_{i}^{+} xi+为蕴含文本, x i − x_{i}^{-} xi为矛盾文本;监督学习SimCSE的训练目标变成:
l i = − log ⁡ e s i m ( h i , h i + ) / τ ∑ j = 1 N ( e s i m ( h i , h j + ) / τ + e s i m ( h i , h j − ) / τ ) l_{i}=-\log\frac{e^{sim(h_{i},h_{i}^{+})/\tau}}{\sum_{j=1}^{N} (e^{sim(h_{i},h_{j}^{+})/\tau} +e^{sim(h_{i},h_{j}^{-})/\tau})} li=logj=1N(esim(hi,hj+)/τ+esim(hi,hj)/τ)esim(hi,hi+)/τ
通过上表可以发现,增加矛盾文本作为难负例后,效果有所提高。
直观上,区分难负例(矛盾文本)和Batch内其他负例可能是有益的,将监督学习SimCSE的训练目标变成:
l i = − log ⁡ e s i m ( h i , h i + ) / τ ∑ j = 1 N ( e s i m ( h i , h j + ) / τ + α 1 i j e s i m ( h i , h j − ) / τ ) l_{i}=-\log\frac{e^{sim(h_{i},h_{i}^{+})/\tau}}{\sum_{j=1}^{N} (e^{sim(h_{i},h_{j}^{+})/\tau} + \alpha^{1_{i}^{j}} e^{sim(h_{i},h_{j}^{-})/\tau})} li=logj=1N(esim(hi,hj+)/τ+α1ijesim(hi,hj)/τ)esim(hi,hi+)/τ
用不同的α值训练SimCSE模型,并在STS-B开发集上对训练的模型进行评价,发现当α为1时效果最优,并且中性数据不会带来更多的收益,如下表所示,

2.5.各向异性问题

最近的研究发现了语言表征中的各向异性问题,即训练后的embeddings仅占据在向量空间中狭窄的部分,严重限制了向量的表现力。
缓解这个问题的一个简单方法是后处理,可以消除主要的主成分或将embeddings映射到各向同性分布。另一种常见的解决方案是在训练过程中添加正则项。
而对比学习的优化目标可以改善缓解各向异性问题,当负例数趋近于无穷大时,对比学习目标的渐近表示为:
− 1 τ E ( x i , x i + ) ∼ p p o s [ f ( x ) T f ( x + ) ] + E x ∼ p d a t a [ log ⁡ E x − ∼ p d a t a [ e f ( x ) T f ( x − ) / τ ] ] - \frac{1}{\tau}\mathop{E}\limits_{(x_{i}, x_{i}^{+}) \sim p_{pos}}[f(x)^{T}f(x^+)] + \mathop{E}\limits_{x \sim p_{data}}[\log \mathop{E}\limits_{x^- \sim p_{data}}[e^{f(x)^{T}f(x^-)/ \tau}]] τ1(xi,xi+)pposE[f(x)Tf(x+)]+xpdataE[logxpdataE[ef(x)Tf(x)/τ]]
其中,第一项使正例之间更相似,第二项使将负例之间分开。而第二项在优化过程中,会压平向量空间的奇异谱,因此对比学习有望缓解表征退化问题,提高句向量表征的均匀性。并通过下图,可以发现,

  • 虽然预训练embeddings具有良好的对齐性,但其均匀性较差;
  • 后处理方法,大大改善均匀性,但也使其对齐性变差;
  • 无监督SimCSE有效地提高了预训练embeddings的均匀性,同时保持了良好的对齐性;
  • 有监督SimCSE,可以进一步提高对齐性。

2.6.实验细节

对7个语义文本相似度(STS)任务进行了实验,将无监督和有监督的SimCSE与STS任务中的最先进的句子嵌入方法进行了比较,可以发现,无监督和有监督的SimCSE均取得了sota的效果,具体如下表所示,

2.6.1训练参数

对于有监督的SimCSE,对模型进行3个轮的训练,在STS-B的开发集上每训练250步进行一次模型验证,并保存测试集上最优效果的节点。对于无监督的SimCSE与有监督的SimCSE操作一致,但仅训练一个epoch。并对批次大小和学习率进行网格搜索,找寻最优参数,如下图所示,

实验发现,只要相应地调整学习速率,SimCSE对批量大小并不敏感,这与对比学习需要大批次的发现相矛盾。可能原因为所有SimCSE模型都是在原有预训练模型基础上继续训练的,已经提供了较好的初始化参数。

2.6.2MLP Layer

对于无监督和有监督的SimCSE,训练过程均采用在带有一个MLP层的[CLS]向量作为句向量表征。但,对于无监督的SimCSE,在测试中丢弃了MLP层,仅使用[CLS]向量作为句向量表征,详细实验如下表所示,

2.6.3MLM

在训练过程中引入masked language modeling变量,可以提到模型的迁移效果,如下表所示,

但值得注意的是,迁移性的提高,会造成原始任务上的效果下降。

2.6.4温度

温度主要用于调整softmax函数的平滑程度,在训练过程中,温度为0.05时,效果最佳。

SimCSE论文,在无监督句向量表征上,通过简单的dropout方式,构造了对比学习的正例,达到堪比监督学习效果,堪称大道至简。并且在监督学习上,对比学习框架效果也取得了SOTA。

  • 参考文献

更多文章请关注公重号:汀丶人工智能

3.NLP更多详细介绍:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等

前人栽树后人乘凉,本专栏提供资料:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等项目代码整合,省去你大把时间,效率提升。 帮助你快速完成任务落地,以及科研baseline。

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/862079
推荐阅读
相关标签
  

闽ICP备14008679号