NLP基础知识1【BERT】
- 总结整理BERT和BERT以前预训练模型的知识
BERT之前的语言编码
one-hot的问题
- 维度灾难:由于将文本按01进行编码,维度过高,会遇到维度灾难的困扰,妹子词语的维度是语料库词典的长度。
- 向量离散、稀疏问题:因为one-hot中,句子向量中,如果词出现为1,没出现为0,但是由于维度远远大于句子长度,所以句子中的1远小于0。
- 词语的编码是随机的,不能表示词之间的联系
word2vec存在的问题
- 领域问题:word2vec为静态方式,训练好以后,每个词表达固定。
- 个人认为:可以通过连接线性变换缓解,但是预训练模型的缺点仍无法根治。
elmo存在的问题
- 做编码时使用LSTM,速度较慢
- 使用双向拼接的特征,比BERT效果较差
BERT
- BERT是一种Transformer的双向编码器,旨在通过在左右上下文中共有的条件计算来预先训练来自无标号文本的深度双向表示。因此,经过预先训练的BERT模型只需一个额外的输出层就可以进行微调,从而为各种自然语言处理任务生成最新模型。
-
- Trainsformer encoder架构
-
- 大量语料训练(33亿token)
-
- 双向模型
BERT的输入输出
input组成:Token embedding,Segment embedding,Position embedding,其中
- Token Embedding: 表示单词或子词。
- Position Embedding: 表示字/词在句子中的位置。
- Segment Embedding: 表示单词属于哪个句子或段落(A/B)。

实现步骤:
- 准备数据:将句子对拼接起来,中间用特殊的 [SEP] 标记分隔。例如,句子 A 和句子 B 拼接为:[CLS] 句子A [SEP] 句子B [SEP]。
- 标记 Segment:为句子 A 的每个 Token 分配 Segment ID 0;为句子 B 的每个 Token 分配 Segment ID 1。
- 嵌入表示:
-
- 使用嵌入层将 Token ID 转换为 Token Embedding。
-
- 使用嵌入层将位置 ID 转换为 Position Embedding。
-
- 使用嵌入层将 Segment ID 转换为 Segment Embedding。
- 将 Token Embedding、Position Embedding 和 Segment Embedding 相加,得到每个 Token 的最终表示。
嵌入特点
- 词表30000
- 使用word pieces: playing -> play ##ing
- 长度512
- 区分句子语序: 1. 句子间使用【SEP】隔开 2. 第i句的每一个token添加一个句子i的嵌入
预训练步骤
bert的预训练包含两个任务:Masked LM,Next Sentence Prediction
1. Masked LM
- 做法:随机遮蔽,仅预测遮蔽模块,被遮盖的标记对应的最终隐藏向量被当做softmax关于该词的一个输出。
- 问题:
-
-
- 预训练和微调任务的不匹配
-
-
-
- 收敛速度慢(由于每个batch中仅预测了15%的词语)
-
- 解决问题:
-
-
- 使用一定概率用mask遮蔽随机选择的(15%)单词,例如:
-
-
- 80%使用mask替换单词
-
- 10%使用随机词
-
- 10%不变
- 目的:模型可以学习每个输入词块的分布式语境表征
2. Next Sentence Prediction
- 动机:下游任务中有一些是基于对两个句子的关系理解做的,需要设置模板训练模型的此类能力。
- 方法:设置一个二值化的NSP任务学习句子间的关系
- 具体:选择句子A,B,句子B可能是A的下一句,也可能是随机的一句话,需要判断是否真的是下一句。
微调
- BERT为什么要微调?
- 要适应下游任务和领域做表征。
- 在BERT最后一层添加分类器(或者继续提取编码后做某种任务)
BERT的loss
- BERT的两个预训练任务对应的损失函数是什么?
- L o s s ( θ , θ 1 , θ 2 ) = L o s s 1 ( θ , θ 1 ) + L o s s 2 ( θ , θ 2 ) Loss(\theta,\theta_1,\theta_2) = Loss_1(\theta,\theta_1) + Loss_2(\theta,\theta_2) Loss(θ,θ1,θ2)=Loss1(θ,θ1)+Loss2(θ,θ2)
-
θ
1
\theta_1
θ1是完形填空任务在Encoder上所接的输出层中的参数。其损失函数中:在第一部分的损失函数中,如果被 mask 的词集合为 M,因为它是一个词典大小 上的多分类问题,所用的损失函数叫做负对数似然函数(且是最小化,等价于最大化对数似然函数)。
L o s s 1 ( θ , θ 1 ) = − ∑ i = 1 M l o g ( p ) ( m = m i ∣ θ , θ 1 ) , m i ϵ [ 1 , 2 , … … , ∣ V ∣ ] Loss_1(\theta,\theta_1) = -\sum_{i=1}^{M} log(p)(m = m_i|\theta,\theta_1),m_i\epsilon[1,2,……,|V|] Loss1(θ,θ1)=−i=1∑Mlog(p)(m=mi∣θ,θ1),miϵ[1,2,……,∣V∣] -
θ
2
\theta_2
θ2是句子预测任务在Encoder上所接的分类器的参数。在其损失函数中,也可以人是一个分类任务的损失函数。
L o s s 2 ( θ , θ 2 ) = − ∑ i = 1 N l o g ( p ) ( n = n i ∣ θ , θ 1 ) , n i ϵ [ i s N e x t , n o t N e x t ] Loss_2(\theta,\theta_2) = -\sum_{i=1}^{N} log(p)(n = n_i|\theta,\theta_1),n_i\epsilon[isNext,notNext] Loss2(θ,θ2)=−i=1∑Nlog(p)(n=ni∣θ,θ1),niϵ[isNext,notNext]
L o s s ( θ , θ 1 , θ 2 ) = − ∑ i = 1 M l o g ( p ) ( m = m i ∣ θ , θ 1 ) − ∑ i = 1 N l o g ( p ) ( n = n i ∣ θ , θ 1 ) Loss(\theta,\theta_1,\theta_2) =-\sum_{i=1}^{M} log(p)(m = m_i|\theta,\theta_1)-\sum_{i=1}^{N} log(p)(n = n_i|\theta,\theta_1) Loss(θ,θ1,θ2)=−i=1∑Mlog(p)(m=mi∣θ,θ1)−i=1∑Nlog(p)(n=ni∣θ,θ1)
对比问题
1. 多义词问题:bank,银行,河岸;爱:喜爱,热爱;寄:死了,寄送。
2. w2v为什么解决不了多义词问题:
- w2v无法参与训练,静态的,训练时不能根据上下文场景变化。
3.和GPT有什么区别
- GPT是生成模型,BERT是编码模型。
- GPT根据解码器构建,BERT根据编码器构建。
- GPT是单向的注意力,通过下三角形的Mask将后面的单词掩盖;BERT是双向注意力,而且Mask方法是掩盖和替换单词。
- 训练任务:
-
- GPT-2 自回归(auto-regression):效果好因为是在每个新单词产生后,该单词就被添加在之前生成的单词序列后面,这个序列会成为模型下一步的新输入
-
- Bert 自编码(auto-encoder):获得了结合单词前后的上下文信息的能力,从而取得了更好的效果。
4.传统词向量有什么缺点?
- 除了One-hot来说,使用矩阵分解的LSA,拥有全局信息,但过于复杂,难以应用。
- w2v这类模型语料较少(模型较小没法用很多语料训,有容量上限)
- elmo,bert,gpt是根据上下文的动态特征
1503



被折叠的 条评论
为什么被折叠?



