自然语言处理基础
Natural Language Processing,NLP。
主要任务包括自然语言理解Natural Language Understanding,NLU和自然语言生成Natural Language Generation,NLG。
词向量
将字和词映射为一组反映其语义特征的实数向量,这种方式被称为词向量。
常用的词向量有独热表示(One-Hot Representation)和分布表示(Distribution Representation)。
独热表示
一种采用独热(One-Hot)编码的词向量表示方法。
使用N位0和1的编码方式来表示N种状态。
任意时刻只有一种状态有效。
想使用独热编码的字词,就要构建全词表。
全词表的大小即为独热编码的长度。
独热编码相当于给每个字词分配一个唯一的id,这种稀疏编码不能反映字词背后蕴含的语义信息,且占用大量内存。
分布表示
为表示字词的语义信息,将字词表示为一个定长的稠密向量。
稠密向量之间的距离计算(相似度计算),即反映字词背后的语义信息。
稠密向量的设置需要从句子、文档中不断学习后进行,因此需要对句子进行建模。
语言模型
语言模型定义了自然语言中标记序列的概率分布。
是对句子进行建模,并求解句子的概率分布。
传统语言模型
- 词袋模型
Bag-of-Words Model。
使用一个定长的稀疏向量表示一个句子,每一位代表一个字词,向量的长度为全词表的大小,用字词出现的频数替代独热编码的0、1。
举例:
“我喜欢吃苹果,乔布斯也喜欢吃苹果。”
“乔布斯创办了苹果公司”
全词表:[我,喜欢,吃,苹果,乔布斯,也,创办,了,公司],大小为9
词袋表示:[1,2,2,2,1,1,0,0,0][0,0,0,1,1,0,1,1,1]
在这种方式下,字词频数反映了字词在句子中的重要性。
从文档的角度看,字词频数又与频率成反比,此时可用TF-IDF(Term Frequency- Inverse Document Frequency)计算方法。
- n-gram模型
词袋模型无法反映字词在句子中的顺序信息,而语言模型是对句子概率分布的建模。
句子的联合概率分布计算公式:
P ( w 1 , w 2 , . . . , w m ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) . . . P ( w m ∣ w 1 , w 2 , . . . , w m − 1 ) P(w_1,w_2,...,w_m)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)...P(w_m|w_1,w_2,...,w_{m-1}) P(w1,w2,...,wm)=P(w1)P(w2∣w1)P(w3∣w1,w2)...P(wm∣w1,w2,...,wm−1)
上式概率难以计算,使用马尔科夫假设简化计算。
马尔科夫假设:某时刻的状态只和其前(n-1)个时刻的状态有关。
概率分布计算公式转换为:
P ( w 1 , w 2 , . . . , w m ) = P ( w 1 , w 2 , . . . , w n − 1 ) ∏ t = n m P ( w t ∣ w t − n + 1 , . . . , w t − 1 ) P(w_1,w_2,...,w_m)=P(w_1,w_2,...,w_n-1)\prod_{t=n}^{m}P(w_t|w_{t-n+1},...,w_{t-1}) P(w1,w2,...,wm)=P(w1,w2,...,wn−1)t=n∏mP(wt∣wt−n+1,...,wt−1)
此模型即n-gram模型。
词袋模型为1-gram模型。
n-gram模型通常采用极大似然估计计算,只需统计每个n-gram在训练集中的频数。
P ( w t ∣ w t − n + 1 , . . . , w t − 1 ) = C ( w t − n + 1 , . . . , w t ) C ( w t − n + 1 , . . . , w t − 1 ) P(w_t|w_{t-n+1},...,w_{t-1})=\frac{C(w_{t-n+1},...,w_t)}{C(w_{t-n+1},...,w_{t-1})} P(wt∣wt−n+1,...,wt−1)=C(wt−n+1,...,wt−1)C(wt−n+1,...,wt)
单纯的频数统计会出现0,采用某种平滑方法进行统计。
常用拉普拉斯平滑:
P ( w i ) = c i + 1 N + V P(w_i)=\frac{c_i+1}{N+V} P(wi)=N+Vci+1
c_i为词频,N为单词总数量,V为词表大小。
传统语言模型通过计算句子序列的俄联合概率得到句子的分布表达,因此无需再使用词向量进行分析。
若需要的到词向量,可先利用n-gram模型得到字词的共现矩阵,然后对矩阵做SVD分解,以得到词向量的分布表达。
神经语言模型
可直接训练得到词向量的分布表达。
通过神经网络训练。
通常被称为词嵌入(Word Embedding)。
模型接受一个句子为输入,并将这个句子本身作为输出。
构建思想类似自编码器(Auto-Encoder)。
本质是通过无监督的方式,学习神经网络。
训练完成后输出网络中间的隐层特征,而隐层特征就是我们希望得到的词向量。
神经语言模型本质上是分类模型,首先网络通过SoftMax层输出每个位置的全词表分布,即每个位置进行全词表大小的分类。然后取对应位置的最大概率作为输出。并采用交叉熵作为损失函数进行训练。
可以看到,神经语言模型的分类类别是全词表大小,而一般词表的大小均在 e 4 e^4 e4以上。这样网络的参数将会过于庞大,导致整个模型难以收敛。
有多项技术可以解决此问题,比如负采样技术。
- 负采样(negative sampling):负采样过程中,先不进行全词表上的参数更新,而只对正样本随机选取的负样本进行采样。然后根据这些采样负样本和正样本计算损失函数,从而更新正样本的参数。
假设词表大小V,负采样数k,词向量维度dim。
采用SoftMax训练最后多层感知机层的参数更新量为:V*dim。
采用负采样后更新参数量为:(k+1)*dim,其中k< 在负采样后,通常有两种损失函数的计算方式:
1.sampled softmax loss:将采样词表上的SoftMax近似转化为全词表的SotfMax计算。
2.nce loss:k+1个二分类的损失和,即对正样本对应的1个Label和k个负样本Label分别进行二分类损失计算。
通过负采样与其对应的损失函数,可大幅提高神经语言模型的训练效率。
- Skip-Gram模型
此模型通过中心词预测上下文窗口中的词。
将处理为单词索引的句子作为输入,经过Embedding层将索引转换为对应的词向量(bs,len,dim)。
bs指batchsize,即分组大小。
len指句子长度。
dim指词向量的维度。
针对其中的某个中心词样本(1,1,dim),通过MLP层转换为隐层张量(1,1,hidden)。假设该中心层的上下文范围为C窗口大小,则分别计算中心词隐层张量与C个上下文词对应的损失,最终求和作为该中心词的损失,并反向传播回对应的词向量,从而进行词向量的学习与更新。
- CBOW模型
与Skip-Gram模型相反,此模型通过上下文中的全部词预测中心词。
将处理为单词索引的句子作为输入,经过Embedding层将索引转换为对应的词向量(bs,len,dim)。
假设该中心词的上下文范围为C窗口大小,针对其中的某个中心词上下文样本(1,C,dim),通过MLP层转换为隐层张量,并求和得到(1,1,hidden)。
计算上下文求和的隐层张量与中心词对应的损失,并反向传播回对应的C个上下文词向量,从而进行词向量的学习与更新。
谷歌2013年发布了提供Skip-Gram和CBOW训练的word2vec工具,用于高效地计算静态词向量,挖掘词之间的关系。
- 另一种模型:PLM(Pre-trained Language Model)预训练语言模型,逐渐成为研究的热点。
NPL中DL的几种基本结构
1.卷积神经网络
常见的卷积计算单元有一维卷积CNN1D、二维卷积CNN2D和三维卷积CNN3D。
视觉领域主要使用CNN2D。
绝大数自然语言处理任务属于序列任务,数据只有一个轴(句子长度),因此使用CNN1D。
维度设为dim,卷积核大小设为k*dim。
这样就可以把CNN1D看作每一个卷积核提取一组k-gram的特征张量,再进行拼接的过程。
首先训练出每个单词的词向量。
然后将处理为单词索引的句子作为输入。
经过Embedding层转换为对应的特征张量(b,len,dim)。
提供给卷积CNN1D层,CNN1D层(假设选取对齐方式)滑动卷积核,计算特征张量(bs,len,1)。
使用k种卷积核,得到k组特征张量(bs,len,1)。
然后对其分别进行最大化池(Max Pooling)后再拼接,得到池化张量(bs,k,1)。
再经过几层MLP与SoftMax层,输出类别概率。
CNN1D对挖掘序列数据在上下文窗口中的信息非常有效。
但难以在长距离上下文信息种保持信息。
2.循环神经网络
RNN对序列的每一位置都进行同样的循环单元计算,但每一循环单元除了接受该位置的信息,还要接受上一循环单元的输出作为输入。
训练过程中,由于采用了反向传播算法,梯度只在不同的时刻会以惩罚的形式进行累计,最终会出现梯度过大/过小问题——梯度爆炸/梯度消失。
改进模型:LSTM、GRU。
- 1.LSTM:在简单RNN基础上增加了细胞状态cell state,以直接传递相邻时刻间的信息。
原理类似ResNet的残差思想。
细胞状态下,梯度不会消失。
该模型还引入了采用Sigmoid激活的门控机制(遗忘门、输入门与输出门),来分别控制上一时刻的细胞状态、输入信息和输出信息的进一步传递。
- 2.GRU:对LSTM进行了简化。将细胞状态和隐藏状态合并。将遗忘门与输入门合并。
降低计算复杂度。
LSTM和GRU的门控制单元使信息经过多次Sigmoid激活,导数小于1,因此减小了梯度爆炸的可能性。
实践中一般会进一步采用梯度裁剪,即给定梯度上下限,来避免梯度爆炸。
RNN还提供了多对一(文本分类)和多对多(序列标注)任务的基本结构。
3.编码器-解码器框架与注意力机制
针对多对多任务。
也被称作Seq2Seq模型。
本质可看作一种条件性的语言模型:
P ( Y ∣ X ) = P ( y 1 ∣ x ) P ( y 2 ∣ y 1 , x ) . . . P ( y m ∣ y 1 , . . . , y m − 1 , x ) P(Y|X) = P(y_1|x)P(y_2|y_1,x)...P(y_m|y_1,...,y_{m-1},x) P(Y∣X)=P(y1∣x)P(y2∣y1,x)...P(ym∣y1,...,ym−1,x)
该框架每时刻输出都受全部序列的约束。
编码器通常采用RNN计算输入序列的隐藏状态,通常保留最后一个隐藏状态,该隐藏状态经过MLP层转换,传递给解码器。
解码器通常采用RNN,但过程复杂,可分为训练过程、预测过程。
- 训练过程:训练时有目标序列,解码器将目标序列对应的词向量与隐藏状态一同作为输入,输出下一时刻的预测概率。
- 预测过程:无目标序列,将隐藏状态和解码器上一时刻输出的对应词向量作为输入,输出下一时刻的预测概率。
- 注意力机制:对过长信息进行选择性地保留。
首先将编码器的全部隐藏状态(bs,len,dim)与t时刻输入解码器的词向量(bs,dim)做矩阵乘法。
然后进行SoftMax归一化,得到注意力权重(bs,len)。
然后将注意力权重与编码器的全部隐藏状态再做矩阵乘法,得到上下文向量(bs,dim)。
最后该向量与t时刻输入解码器的词向量进行拼接,再被输入解码器的RNN进行训练。
权重的计算方式:乘性模型、加性模型、线性模型。
可将注意力机制视为一种查询(Query)键值对(Key,Value)的关系。
以上使用稠密向量计算注意力的机制,被称为软注意力(Soft Attention)机制。
使用独热编码向量计算注意力权重的机制,被称为硬注意力(Hard Attention)机制。
谷歌提出使用多头注意力(Multi-Head Attention)机制的Transformer结构来替换RNN。并进一步将Transformer用于预训练语言模型,并提出BERT(Bidirectional Encoder Representations from Transformers)模型。该模型的问世标志深度学习技术在自然语言处理中的重大突破。