《阿里云天池大赛赛题解析(深度学习篇)》学习笔记(1)自然语言处理基础

自然语言处理基础

Natural Language Processing,NLP。
主要任务包括自然语言理解Natural Language Understanding,NLU和自然语言生成Natural Language Generation,NLG。

词向量

将字和词映射为一组反映其语义特征的实数向量,这种方式被称为词向量。
常用的词向量有独热表示(One-Hot Representation)和分布表示(Distribution Representation)。

独热表示

一种采用独热(One-Hot)编码的词向量表示方法。
使用N位0和1的编码方式来表示N种状态。
任意时刻只有一种状态有效。
想使用独热编码的字词,就要构建全词表。
全词表的大小即为独热编码的长度。
独热编码相当于给每个字词分配一个唯一的id,这种稀疏编码不能反映字词背后蕴含的语义信息,且占用大量内存。

分布表示

为表示字词的语义信息,将字词表示为一个定长的稠密向量。
稠密向量之间的距离计算(相似度计算),即反映字词背后的语义信息。
稠密向量的设置需要从句子、文档中不断学习后进行,因此需要对句子进行建模。

语言模型

语言模型定义了自然语言中标记序列的概率分布。
是对句子进行建模,并求解句子的概率分布。

传统语言模型

  1. 词袋模型
    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)计算方法。
  2. 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(w2w1)P(w3w1,w2)...P(wmw1,w2,...,wm1)
    上式概率难以计算,使用马尔科夫假设简化计算。
    马尔科夫假设:某时刻的状态只和其前(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,...,wn1)t=nmP(wtwtn+1,...,wt1)
    此模型即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(wtwtn+1,...,wt1)=C(wtn+1,...,wt1)C(wtn+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分别进行二分类损失计算。
    通过负采样与其对应的损失函数,可大幅提高神经语言模型的训练效率。
  1. Skip-Gram模型
    此模型通过中心词预测上下文窗口中的词。
    将处理为单词索引的句子作为输入,经过Embedding层将索引转换为对应的词向量(bs,len,dim)。
    bs指batchsize,即分组大小。
    len指句子长度。
    dim指词向量的维度。
    针对其中的某个中心词样本(1,1,dim),通过MLP层转换为隐层张量(1,1,hidden)。假设该中心层的上下文范围为C窗口大小,则分别计算中心词隐层张量与C个上下文词对应的损失,最终求和作为该中心词的损失,并反向传播回对应的词向量,从而进行词向量的学习与更新。
  2. CBOW模型
    与Skip-Gram模型相反,此模型通过上下文中的全部词预测中心词。
    将处理为单词索引的句子作为输入,经过Embedding层将索引转换为对应的词向量(bs,len,dim)。
    假设该中心词的上下文范围为C窗口大小,针对其中的某个中心词上下文样本(1,C,dim),通过MLP层转换为隐层张量,并求和得到(1,1,hidden)。
    计算上下文求和的隐层张量与中心词对应的损失,并反向传播回对应的C个上下文词向量,从而进行词向量的学习与更新。
    谷歌2013年发布了提供Skip-Gram和CBOW训练的word2vec工具,用于高效地计算静态词向量,挖掘词之间的关系。
  3. 另一种模型: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(YX)=P(y1x)P(y2y1,x)...P(ymy1,...,ym1,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)模型。该模型的问世标志深度学习技术在自然语言处理中的重大突破。

你可能感兴趣的:(深度学习,NLP,神经网络,深度学习,自然语言处理,nlp,机器学习,人工智能)