2020自然语言处理复习笔记

参考知乎:https://zhuanlan.zhihu.com/c_1032676400653971456

在这里插入图片描述

自然语言处理1:分词

自动分词是一个没有明确定义的问题

1.分词中的基本问题

分词中涉及到三个基本问题: 分词规范,歧义切分,未登录词的识别

分词规范

  • 分词可以看作是寻找一个没有明确定义问题的答案,在衡量一个分词模型的好坏时,需要确定一个统一标准。

歧义切分

  • 交集型切分歧义:汉字串AJB,满足AJ、JB同时为词,此时汉字串J称为交集串。eg:大学生(大学\学生)
  • 组合型切分歧义:汉字串AB,满足A、B、AB同时为词。
    想要正确的做出切分判断,一定要结合上下文语境,甚至韵律、语气、重音、停顿等。

未登录词试别

  • 未登录词,一种是指已有的词表中没有收录的词,另一种是指训练语料中未曾出现过的词(集外词)
    分词模型对于未登录词的处理将是衡量一个系统好坏的重要指标。

2.常用的汉语分词方法

  • 正向最大匹配法
  • 逆向最大匹配法
  • 双向扫描法

基于字典
从大规模的训练语料中提取分词词库,并同时将词语的词频统计出来。
通过增减词典来调整最终的分词效果。

基于字
基于字的分词方法将分词过程看作是字的分类问题,其认为每个字在构造一个特定词语时都占据着一个确定的构词位置(词位),为句子中每个字打标签。
一般情况下,我们认为每个字的词位有4种情况:B(Begin)、E(End)、M(Middle)、S(Single)

3.中文分词工具

jieba分词主要的处理思路如下:

  • 加载词典dict.txt从
  • 内存的词典中构建该句子的DAG(有向无环图)
  • 对于词典中未收录词,使用HMM模型的viterbi算法尝试分词处理
  • 已收录词和未收录词全部分词完毕后,使用dp寻找DAG的最大概率路径
  • 输出分词结果

对于每一种划分,都将相应的首尾位置相连,例如,对于位置1,可以将它与位置1、位置2、位置4相连接,最终构成一个有向无环图,如下所示,
在这里插入图片描述

计算最大概率路径,也即按照这种方式切分后的分词结果的概率最大。在计算最大概率路径时,jieba分词采用从后往前这种方式进行计算。为什么采用从后往前这种方式计算呢?
因为,我们这个有向无环图的方向是从前向后指向,对于一个节点,我们只知道这个节点会指向后面哪些节点,但是我们很难直接知道有哪些前面的节点会指向这个节点。

4.语料库和词典

  1. 对词语的频率进行统计,作为登录词使用
  2. 对单字在词语中的出现位置进行统计,使用BMES模型进行统计,供后面套HMM模型Viterbi算法使用

5.基于字典的方法

  • 正向最大匹配思想MM
  1. 从左向右取待切分汉语句的m个字符作为匹配字段,m为大机器词典中最长词条个数。
  2. 查找大机器词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来。
  • 逆向最大匹配算法RMM
    实验表明,逆向最大匹配算法要优于正向最大匹配算法。
  • 双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法的到的结果进行比较,从而决定正确的分词方法。

因为它是基于词典的,所以分词效果的好坏很大程度上取决于词典本身的精确程度

5.基于统计的方法

N-gram —— 语言模型

  • 某个词的出现依赖于其他若干个词。
  • 获得的信息越多,预测越准确。

语言模型是一个基于概率的判别模型,它的输入是一句话(单词的顺序序列),输出是这句话的概率,即这些单词的联合概率(joint probability)。

Bi-gram : {I, love}, {love, deep}, {deep, learning}
Tri-gram : {I, love, deep}, {love, deep, learning}

马尔科夫假设(Markov Assumption):一个词的出现仅与它之前的若干个词有关

以Bi-gram为例,由三句话组成的语料库
I am Sam
Sam I am
I do not like eggs and ham
统计 “I”出现3此,“I am”出现2此,故 p ( a m ∣ I ) = 2 3 p(am|I)={2 \over 3} p(amI)=32

如果当句子较长时,概率通常为小于1的常数,相乘导致数据下溢,可以用log概率解决!

6.基于汉字成词能力的HMM模型

利用HMM模型进行分词,主要是将分词问题视为一个序列标注(sequence labeling)问题。

序列标注,就是将输入句子和分词结果当作两个序列,句子为观测序列,分词结果为状态序列,当完成状态序列的标注,也就得到了分词结果。

HMM模型中的五元组表示:
1.观测序列; 2.隐藏状态序列; 3.状态初始概率; 4.状态转移概率; 5.状态发射概率

例:”去北京大学玩“
观测序列:“去北京大学玩”
隐藏状态序列:SBMMES
初始概率表示:由jieba分词训练出的状态初始概率模型
状态转移概率:P[‘B’][‘E’]代表的含义就是从状态B转移到状态E的概率
状态发射概率,根据HMM模型中观测独立性假设,发射概率,即观测值只取决于当前状态值,也就如下所示, P ( o b s e r v e d [ i ] , s t a t e s [ j ] ) = P ( s t a t e s [ j ] ) ∗ P ( o b s e r v e d [ i ] ∣ s t a t e s [ j ] ) P(observed[i],states[j]) = P(states[j]) * P(observed[i] | states[j]) P(observed[i],states[j])=P(states[j])P(observed[i]states[j])其中, P ( o b s e r v e d [ i ] ∣ s t a t e s [ j ] ) P(observed[i] | states[j]) P(observed[i]states[j])就是从状态发射概率中获得的

HMM模型的参数是如何训练出来???
1.收集切分语料
2.python脚本统计词频
3.要统计的主要有三个概率表:1)位置转换概率 2)位置到单字的发射概率 3)词语以某种状态开头的概率

求产生这个结果的概率???
在这里插入图片描述

维特比算法复杂度 T ∗ N 2 T*N^2 TN2

自然语言处理2:神经网络基础

到底什么是神经网络?????????

基本概念

  • 输入向量(input),即为用来训练感知器的原始数据
  • 阶跃函数(step function),可以通过生物上的神经元阈值来理解,当输入向量和权重相乘之后,如果结果大于阈值(比如0),则神经元激活(返回1),反之则神经元未激活(返回0)
  • 权重(weight),感知器通过数据训练,学习到的权向量通过将它和输入向量点乘,把乘积带入阶梯函数后我们可以得到我们期待的结果。

感知器怎么样能训练出权重呢?
首先,所有的权重参数都是随机的;然后根据一个标准【代价函数】,使用一些方法【梯度下降】更新权重,直到这个标准【代价函数】的值足够好;或者权重每次更新的值足够小。

什么是梯度下降?
梯度下降中的梯度指的是代价函数对各个参数的偏导数,偏导数的方向决定了在学习过程中参数下降的方向,学习率(通常用α表示)决定了每步变化的步长,有了导数和学习率就可以使用梯度下降算法(Gradient Descent Algorithm)更新参数了。
梯度下降是为了解决什么问题呢?是为了最小化损失函数。最小化损失函数是为了什么?是为了找到合适的系数w和b。

那最快下降的方向 是哪里呢?是切线的方向

为什么说XOR是非线性可分的呢?
两层的感知机可以描述异或

在这里插入图片描述

在以上的网络中,每一层的参数的维度是多少?
3 * 2 3 * 1

如何理解神经网络是感知机的叠加呢?
譬如在上面的图中,可以把输入层和隐藏层的a1当做一个感知机;输入层和隐藏层的a2当做一个感知机;
而隐藏层和输出层又当做是一个感知机。可以相当于输入层和隐藏层构成了两个或运算;隐藏层和输出层构成了与运算。
或者是输入层和隐藏层构成了两个与运算;隐藏层和输出层构成了或运算。

什么神经网络要叫做反向传播呢?
主要还是层次增多了,根据损失函数对所有的参数进行求导。

在这里插入图片描述
Sigmoid函数:
f ( z ) = 1 1 + e − a x f(z)={1 \over 1+e^{-ax}} f(z)=1+eax1 f ′ ( z ) = f ( z ) ( 1 − f ( z ) ) f'(z)=f(z)(1-f(z)) f(z)=f(z)(1f(z))

代价函数使用的交叉熵:
J = − y l o g ( o u t s ) − ( 1 − y ) l o g ( 1 − o u t s ) J=-ylog(out_s)-(1-y)log(1-out_s) J=ylog(outs)(1y)log(1outs) J ′ ( o u t s ) = 1 o u t s + 1 − y 1 − o u t s J'(out_s)={1 \over out_s}+{1-y \over 1-out_s} J(outs)=outs1+1outs1y J ′ ( o u t s ) ∗ f ‘ ( z ) = o u t s − y J'(out_s)*f‘(z)=out_s-y J(outs)f(z)=outsy

练习*:
∂ E e r r ∂ w 5 = ∂ E e r r ∂ o u t s ∗ ∂ o u t s ∂ o u t n e t ∗ ∂ o u t n e t ∂ w 5 = ( o u t s − y ) ∗ h 2 s {∂E_{err} \over ∂w_5} ={∂E_{err} \over ∂out_s} * {∂out_s \over ∂out_{net}} * {∂out_{net} \over ∂w_5}=(out_s-y)*h2_s w5Eerr=outsEerroutnetoutsw5outnet=(outsy)h2s

2.激活函数

为什么对于Sigmoid函数相对于tanh可能导致模型收敛速度慢?
输出值不以零为中心,可能导致模型收敛速度慢

Sigmoid函数:
其中,a用于控制sigmoid函数的形状,在神经网络中,a一般取1。
f ( z ) = 1 1 + e − a x f(z)={1 \over 1+e^{-ax}} f(z)=1+eax1 f ′ ( z ) = f ( z ) ( 1 − f ( z ) ) f'(z)=f(z)(1-f(z)) f(z)=f(z)(1f(z))
Sigmoid 函数和导数画图如下 :
在这里插入图片描述

Tanh函数
t a n h ( x ) = 2 σ ( 2 x ) − 1 = e x − e − x e x + e − x tanh(x)=2\sigma (2x)-1 = {e^x-e^{-x} \over e^x+e^{-x}} tanh(x)=2σ(2x)1=ex+exexex t a n h ′ ( x ) = 1 − t a n h 2 ( x ) tanh'(x)=1-tanh^2(x) tanh(x)=1tanh2(x)
Tanh函数和导数:
在这里插入图片描述

Sigmoid函数在深度网络中常常会导致导数逐渐变为0,使得参数无法被更新,神经网络无法被优化?原因在于两点:
(1) 在上图中容易看出,当中较大或较小时,导数接近0,而后向传递的数学依据是微积分求导的链式法则,当前层的导数需要之前各层导数的乘积,几个小数的相乘,结果会很接近0
(2) Sigmoid导数的最大值是0.25,这意味着导数在每一层至少会被压缩为原来的1/4,通过两层后被变为1/16。不同的层次计算出来的梯度的大小不同,越靠前的层的学习速度就越慢。也就是,梯度消失的问题

如果计算出来的wx+b的值太大,那么经过sigmoid函数处理的值接近于1,而会导致导数接近于0。所以,在初始化的时候,系数不能取太大的值。

哪些方法有助于解决深度网络的梯度消失问题?为什么?
控制网络深度,预训练+微调,使用ReLU激活函数

ReLU函数(Rectified Linear Units)其实就是一个取最大值函数。
在这里插入图片描述
虽然它形式非常简单,但是它比较好地解决了梯度消失的问题,而且计算速度非常快,只需要判断输入是否大于0,收敛速度远快于sigmoid和tanh。它是比较常用的激活函数。

3.Softmax

softmax或称归一化指数函数,将输出向量中的每一个值【对应于多个类别或待挑选的值】,映射到(0,1)区间内,并且所有元素的和为1。
与通常用的max函数相比,softmax是连续可导的,消除了拐点。

自然语言处理3:词向量

为什么要使用向量来表示文本呢?
一方面是因为这样简单直观;另一方面大概是因为计算机处理向量很在行。在图像处理中,一般也将图转换为向量。图片可以方便地将它的像素矩阵转换为向量;

在这里插入图片描述
为什么要进行embedding呢?
主要是为了表示词的含义,meaning,可以把最终的Y空间想成是一些特征,通过这些特征来描述一个词。如果映射得当,像上面的图,在二维空间中,run和chase的位置比较接近,也就意味着它们两个对应的向量比较像;或者反过来说,如果我们能够得到词的合适的向量表示,词义相近的词向量表示相近,就能较好地体现它们的语义。

通过使用一个词周围的词来代表这个词。采用这一假设的研究方法大致分为以下两类:

  • 基于计数的方法 (e.g. 潜在语义分析, Glove),
  • 预测方法 (e.g. 神经概率化语言模型,word2vec).

!!!!计算下面两句话的相似程度?
句子A:我喜欢看电视,不喜欢看电影。
句子B:我不喜欢看电视,也不喜欢看电影。
第一步,分词。  
句子A:我/喜欢/看/电视,不/喜欢/看/电影。
句子B:我/不/喜欢/看/电视,也/不/喜欢/看/电影。
第二步,列出所有的词。  
我,喜欢,看,电视,电影,不,也。
第三步,计算词频。  
句子A:我 1,喜欢 2,看 2,电视 1,电影 1,不 1,也 0。
句子B:我 1,喜欢 2,看 2,电视 1,电影 1,不 2,也 1。
第四步,写出词频向量。  
句子A:[1, 2, 2, 1, 1, 1, 0]
句子B:[1, 2, 2, 1, 1, 2, 1]

简而言之:基于计数的方法计算某词汇与其邻近词汇在一个大型语料库中共同出现的频率及其他统计量,然后将这些统计量映射到一个小型且稠密的向量中。预测方法则试图直接从某词汇的邻近词汇对其进行预测,在此过程中利用已经学习到的小型且稠密的embedding向量。

word2vec就是通过使用大量文本,根据词的上下文,使用一个带有单个隐藏层的简单神经网络,这个神经网络并不是用于预测任务,目的只是学习输入层到隐藏层的权重,这些权重实际上就构成了我们试图学习的“词向量”。

上下文相似意味着给定的输入,目标词是相似的。
两个算法:

  1. skip-grams(SG) 给定目标单词,预测上下文单词
  2. Continuous Bag of Words(CBOW),从词袋上下文中预测目标单词

两个训练方法

  1. hierarchical softmax
  2. negative sampling

CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词(目标单词target)的词向量。
在这里插入图片描述

Skip-gram模型和CBOW模型相反,目标单词现在在输入层,上下文单词在输出层。
在这里插入图片描述
Skip-gram: 适用于少量训练数据,甚至可以代表稀有单词或短语。
CBOW:训练速度比 skip-gram 快几倍,对于频繁单词的准确度稍好一些。

如何理解CBOW对高频词更友好,而skip-gram对低频词更友好呢?
CBOW可以预测得出beautiful或者nice是最可能的,因为它本来就是被训练来找出最大可能的词。从训练的角度来看, beautiful或者nice比delightful出现的次数要多,也就意味着beautiful或者nice对上下文单词的影响力要大得多,那么delightful这样的单词在同样的上下文中就比较受歧视。从训练角度来看,在更新参数的时候,低频词和高频词一起被更新,它们的更新一方面次数比较少,一方面,每次更新也受到了高频词的影响。
而skip-gram进行预测的次数是要多于cbow,因为每个词在作为中心词时,都要对上下文词预测一次,都要进行2C次的预测、调整,当数据量较少,或者词为生僻词出现次数较少时, 这种多次的调整会使得词向量相对的更加准确。

Huffman树有什么好处呢?
得到Huffman树后我们会对叶子节点进行Huffman编码,由于权重高的叶子节点越靠近根节点,而权重低的叶子节点会远离根节点,这样我们的高权重节点编码值较短,而低权重值编码值较长。这保证的树的带权路径最短,也符合我们的信息论,即我们希望越常用的词拥有更短的编码。

使用huffman树对效率的改进有两方面,
首先,由于是二叉树,之前计算量为V ,现在变成了 l o g 2 V log_2V log2V
第二,由于huffman树中,高频的词靠近树根,这样高频词需要更少的时间会被找到,符合优化思想。

自然语言处理4:循环神经网络

RNN的主要思想就是把隐藏层/输出层的值保存在memory中,参与到新的输入的计算中。
RNN的优点是使得序列处理称为可能:序列可以是输入,可以是输出,或者输入输出都是序列。
在这里插入图片描述

RNN为什么会有记忆功能呢?
因为在下一次的计算中,隐藏单元也和输入一起参与了运算。我们知道隐藏单元是输入的计算结果;因此可以在一定程度上保留输入的信息。

在这里插入图片描述

上面是以输入[1,1]为例,算出来输出为[4,4],同时更新 a a a为[2,2]。接下来,输入为[1,1],因为 a a a为[2,2],可以计算出隐藏层的结果是[6,6],因此,输出层的结果是[12,12],以及更新 a a a 为[6,6]。

!!! 练习:接下来的输入为[2,2],请问输出和 a a a分别是多少?
[32,32] a = [16,16]

在这里插入图片描述
请问,上面计算字符级语言模型的例子中,从输入层到隐藏层、从隐藏层到隐藏层、以及从隐藏层到输出层的权重维度分别是什么?
在这里插入图片描述

RNN为何具有记忆上下文的功能呢?
之所以能够有记忆功能,主要是在t-1时刻产生的输出【可以理解为记忆】,作为输入参与了 时刻的计算。所以,如果不展开,那么看起来就像是在循环了。所以叫做循环神经网络。

2.LSTM (long short-term memory)

长短期记忆网络,为何要提出长的短期记忆网络呢?
为什么隔得太远,RNN会失效:
在这里插入图片描述

所以LSTM提出的主要目标是让网络具有较长远的记忆。问题是,它是怎么样做到的呢?
LSTM的“循环单元”有四个网络结构,相互影响:
在这里插入图片描述
三个门,分别是 forget gate,input gate和output gate。input gate用于控制有多少的输入可以被加入到cell中;output gate用于控制新的cell中的内容有多少可以被输出;forget gate用于控制旧的cell中的内容有多少可以保存。至于门到底是打开,还是关闭,这就是网络自己学习到的。

LSTM 如何来避免梯度消失?
传统的RNN是用覆盖的的方式计算状态: S t = f ( S t − 1 , x t ) S_t=f(S_{t-1},x_t) St=f(St1,xt),也就是说,这有点类似于复合函数,那么根据链式求导的法则,复合函数求导是一种乘积的方式,那么如果导数都是小数或者都是大于1的数的话,就会使得总的梯度发生vanishing或explosion的情况。
而在LSTM中,状态S是通过累加的方式来计算的,那这样的话,就不是一直复合函数的形式了,它的的导数也不是乘积的形式。
在一般的RNN中,每个时刻neuron的output都会被放到memory中去,所以在每个时刻memory中的值都会被洗掉。但在LSTM中,是把memory中原来的值乘上一个数再加上一个数,即memory和input是相加的关系。所以LSTM中如果weight影响了memory中的值,那么这个影响会永远都存在。

如何理解RNN具有记忆上下文的功能,但是并不具有长期的记忆?
不能记忆太前或者太后的内容,因为存在梯度爆炸或者梯度消失。
H ( t ) = W ∗ H ( t − 1 ) + U ∗ X ( t ) + b H(t)=W*H(t-1)+U*X(t)+b H(t)=WH(t1)+UX(t)+b其中,H代表隐藏层,X代表输入。如果当abs(W)<1时,那么: H ( t ) = W ∗ H ( t − 1 ) + U ∗ X ( t ) + b = = W ∗ ( W ∗ H ( t − 2 ) + U ∗ X ( t − 1 ) + b ) + U ∗ X ( t ) + b H(t)=W*H(t-1)+U*X(t)+b==W*(W*H(t-2)+U*X(t-1)+b)+U*X(t)+b H(t)=WH(t1)+UX(t)+b==W(WH(t2)+UX(t1)+b)+UX(t)+b如果一直迭代下去,即 W n ∗ H ( t 0 ) W^n*H(t_0) WnH(t0),那么此时, W n W^n Wn以及几乎为0,所以 H ( t 0 ) H(t_0) H(t0)几乎不会对当前产生影响。
RNN长期依赖问题

自然语言处理5:seq2seq & attention

1.seq2seq模型

seq2seq又叫Encoder-Decoder模型。它可以实现从一个序列到任意一个序列的转换,模型如下所示,其左半部分为Encoder部分,右半部分为Decoder部分。
在这里插入图片描述
最基础的Seq2Seq模型包含了三个部分,即Encoder、Decoder以及连接两者的中间状态向量,Encoder通过学习输入,将其编码成一个固定大小的状态向量C,继而将S传给Decoder,Decoder再通过对状态向量C的学习来进行输出。

基础的Seq2Seq有一些缺点,因为Encoder将输入编码为固定大小状态向量的过程实际上是一“信息有损压缩”的过程,如果信息量越大,那么这个转化向量的过程对信息的损失就越大,基础的模型连接Encoder和Decoder模块的组件仅仅是一个固定大小的状态向量,这使得Decoder无法直接去关注到输入信息的更多细节。相当于是在输入一句话之后,看完一遍,立刻要求进行翻译;对于人而言,长句子的效果也不会很好。

2.Attention

在这里插入图片描述
第一步:对encoder的所有隐藏状态计算score。

decoder_hidden = [10, 5, 10]
encoder_hidden  score
---------------------
     [0, 1, 1]     15 (= 10×0 + 5×1 + 10×1, the dot product)
     [5, 0, 1]     60
     [1, 1, 0]     15
     [0, 5, 1]     35

第二步,对分数放到softmax层计算,以得到attention distribution

encoder_hidden  score  score^
-----------------------------
     [0, 1, 1]     15       0
     [5, 0, 1]     60       1
     [1, 1, 0]     15       0
     [0, 5, 1]     35       0

第三步:将每个编码器隐藏状态乘以其softmaxed的分数。

encoder  score  score^  alignment
---------------------------------
[0, 1, 1]   15      0   [0, 0, 0]
[5, 0, 1]   60      1   [5, 0, 1]
[1, 1, 0]   15      0   [0, 0, 0]
[0, 5, 1]   35      0   [0, 0, 0]

第4步:对向量求和。对齐向量相加产生上下文向量。 上下文向量是来自上一步的对齐向量的聚合信息。

encoder  score  score^  alignment
---------------------------------
[0, 1, 1]   15     0  [0, 0, 0]
[5, 0, 1]   60     1  [5, 0, 1]
[1, 1, 0]   15     0  [0, 0, 0]
[0, 5, 1]   35     0  [0, 0, 0]
context = [0+5+0+0, 0+0+0+0, 0+1+0+0] = [5, 0, 1]

在这里插入图片描述
我们可以这样来看待Attention机制:将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。
在这里插入图片描述

从概念上理解,把Attention仍然理解为从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息。聚焦的过程体现在权重系数的计算上,权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。

通过Self Attention到底学到了哪些规律或者抽取出了哪些特征呢?或者说引入Self Attention有什么增益或者好处呢?
Self Attention可以捕获同一个句子中单词之间的一些句法特征(比如有一定距离的短语结构)或者语义特征(its)。
引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。但是Self Attention在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self Attention对于增加计算的并行性也有直接帮助作用。这是为何Self Attention逐渐被广泛使用的主要原因。

在这里插入图片描述
如何理解在Attention中的value和key以及query?
key和query必须维数相同,才能点积,而value是没有要求的。
首先要明确,query ⋅ \cdot key = 权重。权重 * value = attention。attention 加上上文输出 得到本次输入。
在上图中,隐藏层decoder hidden stats即querry,图中下部的黄色输入C即key(也是value),将query乘key得到分数,经过softmax得到权重之后,再乘以value得到attention,attention即上下文关系,上一次的输出加上本次attention作为本次输入,利用上一次的隐藏层得到最终结果。

自然语言处理6:Transformer

Transformer 实际上就是一个带self-attention的seq2seq,包括encoder和decoder两部分,共6+6层,但是它是第一个完全依赖于 Self-Attention 来计算其输入和输出表示的模型,而不使用 RNN 或 CNN

理论上,在训练集上,深层网络不会比浅层网络差。但是为什么出现下面这种情况呢?
随着层数增加,训练集上效果反而变差,这被称为退化问题。原因是随着网络越来越深,训练和优化变得越来越难,过深的网络会产生退化问题,效果反而不如相对较浅的网络。而残差网络可以解决这个问题,残差网络越深,训练集上效果越好。

残差网络有什么好处呢?
显而易见:因为增加了残差项,那么该网络求 残差的偏导的时候,多了一项常数 1,所以反向传播过程,梯度连乘,也不会造成梯度消失。

什么是 Layer Normalization 呢?
它是归一化数据的一种方式,不过 LN 是在每一个样本上计算均值和方差,而不是 BN 那种在批方向计算均值和方差。

为什么transformer要加入positional embedding呢?
因为attention的天涯若比邻,失去了句子中词语的位置信息。一般将位置信息简单分为绝对位置信息和相对位置信息,并且前者对句子语义的影响不大,更为重要的是后者。
以情感分析 sentiment analysis 为例:

I like this movie because it doesn't have an overhead history. Positive
I don'tlike this movie because it has an overhead history. Negative

don’t 与like的相对位置不同,决定了这两句话的情感取向是一正一负的,但在传统词袋(Bag-Of-Words BOW)模型中,这两句话得到的句子表征却是一致的,可见单词的相对位置对语义有关键性影响。

那么,如何对位置信息进行表示呢?
Transformer 中使用 Positional Encoding 生成固定的位置表示。
在这里插入图片描述

2.Mask

Mask就是对某些值进行掩盖,使其不产生效果。

  • Padding Mask
    处理非定长序列,区分padding和非padding部分,如在RNN等模型和Attention机制中的应用等。
    padding 对应的字符只是为了统一长度,并没有实际的价值,因此希望在之后的计算中屏蔽它们,这时候就需要 Mask。
  • Sequence Mask
    防止标签泄露,如:Transformer decoder中的mask矩阵,BERT中的[Mask]位,XLNet中的mask矩阵等。
    Sequence Mask 是为了使得 Decoder 不能看见未来的信息。也就是对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。

    那么具体怎么做呢?
    产生一个上三角矩阵,上三角的值全为 1,下三角的权值为 0,对角线也是 0。

其中,Padding Mask 在所有的 Scaled Dot-Product Attention 里面都需要用到,而 Sequence Mask 只有在 Decoder 的 Self-Attention 里面用到。
所以, Scaled Dot-Product Attention 的 forward 方法里面的参数 attn_mask 在不同的地方会有不同的含义。

自然语言处理7:从EMLo到Bert

对于图像来说一般是CNN的多层叠加网络结构,可以先用某个训练集合比如训练集合A或者训练集合B对这个网络进行预先训练,在A任务上或者B任务上学会网络参数,然后存起来以备后用。假设我们面临第三个任务C,网络结构采取相同的网络结构,在比较浅的几层CNN结构,网络参数初始化的时候可以加载A任务或者B任务学习好的参数,其它CNN高层参数仍然随机初始化。
为什么这种预训练的思路是可行的?
对于层级的CNN结构来说,不同层级的神经元学习到了不同类型的图像特征,由底向上特征形成层级结构,越是底层的特征越是所有不论什么领域的图像都会具备的比如边角线弧线等底层基础特征,越往上抽取出的特征越与手头任务相关。,所以预训练好的网络参数,尤其是底层的网络参数抽取出特征跟具体任务越无关,越具备任务的通用性,而高层特征跟任务关联较大,实际可以不用使用,或者采用Fine-tuning用新数据集合清洗掉高层无关的特征抽取器。

Fine-tuning方式是指在已经训练好的语言模型的基础上,加入少量的task-specific parameters, 例如对于分类问题在语言模型基础上加一层softmax网络,然后在新的语料上重新训练来进行fine-tune。除了最后一层,所有的参数都变化了。

如何解决多义词语境问题?
ELMO的本质思想是:事先用语言模型在一个大的语料库上学习好词的word embedding,但此时的多义词仍然无法区分,不过没关系,我们接着用我们的训练数据(去除标签)来运行预训练好的ELMO 模型。作者将这种称为domain transfer。这样利用我们训练数据的上下文信息就可以获得词在当前语境下的word embedding。

ELMO训练的不再只是一个词向量,而是一个包含多层BiLstm的模型,然后对于每一个句子,都需要传入该模型,分别拿到每个时间步在每个层的输出,最后在具体的NLP任务中,再单独训练每一层的权重向量,对每一层的向量进行线性加权作为每个词汇的最终向量表示。这样一来,每个词汇在不同的上下文语境中,都可以得到不同的向量表示,因此,在一定意义上可以解决一词多义的问题。

2.从Word Embedding到GPT

GPT也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过Fine-tuning的模式解决下游任务。

GPT为啥会用transformer中的decoder?
解码器中的self attention 层层仅仅允许关注早于当前输出的位置。防止出现“自己看见自己”的问题。是指要预测的下一个词在给定的序列中已经出现的情况。传统语言模型的目标是获得在给定序列从头到尾条件概率相乘后概率最大的下一词,而双向模型会导致预测的下一词已经在给定序列中出现了的问题,这就是“自己看见自己”。

3.BERT (基于Transformer的双向编码器表示形式)

在这里插入图片描述
CBOW、RNN以及BERT的区别?
在这里插入图片描述
一文读懂BERT(原理篇)

自然语言处理8:XLNet以及GPT

在ELMO/BERT出来之前,大家通常讲的语言模型其实是根据上文内容预测下一个可能跟随的单词,就是常说的自左向右的语言模型任务,或者反过来也行,就是根据下文预测前面的单词,这种类型的LM被称为自回归语言模型。GPT 就是典型的自回归语言模型。

自回归语言模型有优点有缺点,缺点是只能利用上文或者下文的信息,不能同时利用上文和下文的信息。它的优点,其实跟下游NLP任务有关,比如生成类NLP任务,比如文本摘要,机器翻译等,在实际生成内容的时候,就是从左向右的,自回归语言模型天然匹配这个过程。

自编码语言模型

Bert通过在输入X中随机Mask掉一部分单词,然后预训练过程的主要任务之一是根据上下文单词来预测这些被Mask掉的单词。那些被Mask掉的单词就是在输入侧加入的所谓噪音。类似Bert这种预训练模式,被称为DAE LM (Denoising Autoencoding)。

  • 好处是:能够同时利用上文和下文,所以信息利用充分
  • 缺点是在输入侧引入[Mask]标记,导致预训练阶段和Fine-tuning阶段不一致的问题,因为Fine-tuning阶段是看不到[Mask]标记的,引入了[Mask]噪声,即使在小部分情况下使用了其他token,但仍与真实数据存在差异。另外,BERT有个不符合真实情况的假设:即被mask掉的token是相互独立的。

重点总结

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
自然语言处理是计算机科学领域的一个重点研究领域,它旨在使计算机能够理解、处理人类语言,并以此为基础用于各种任务,例如自动翻译、问答系统、语音识别等。近年来,自然语言处理技术的快速发展和应用,在人工智能领域中占据了重要的地位。 Matlab是一种强大的科学计算软件,该软件提供了大量的工具箱和函数库,可用于解决各种科学计算问题。在自然语言处理领域中,Matlab也提供了一些工具箱和函数库,可用于文本数据的探索、处理、分析和建模。 Matlab自然语言处理工具箱提供了丰富的功能,包括文本数据的读取、分析和可视化,词袋模型的构建和应用,主题模型的建模和分析,情感分析和文本分类等。此外,Matlab还提供了一些常用的自然语言处理工具库,例如NLTK,用于分析和处理英语文本。 Matlab在自然语言处理领域的应用非常广泛,可以应用于各种任务,例如情感分析、信息抽取、机器翻译等。Matlab基于自然语言处理技术可以实现高效的文本处理和分析,可以用于处理大量的文本数据,并从中提取有用的信息。此外,Matlab还可应用于语音识别和语音合成等领域,为自然语言处理技术的发展和应用提供了更广阔的空间。 总之,Matlab作为一种强大的科学计算软件,在自然语言处理领域的应用越来越广泛,它为自然语言处理技术的发展和应用提供了强有力的支持和保障。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头队长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值