参考知乎:https://zhuanlan.zhihu.com/c_1032676400653971456
自动分词是一个没有明确定义的问题
分词中涉及到三个基本问题: 分词规范,歧义切分,未登录词的识别
分词规范
歧义切分
未登录词试别
基于字典
从大规模的训练语料中提取分词词库,并同时将词语的词频统计出来。
通过增减词典来调整最终的分词效果。
基于字
基于字的分词方法将分词过程看作是字的分类问题,其认为每个字在构造一个特定词语时都占据着一个确定的构词位置(词位),为句子中每个字打标签。
一般情况下,我们认为每个字的词位有4种情况:B(Begin)、E(End)、M(Middle)、S(Single)
jieba分词主要的处理思路如下:
对于每一种划分,都将相应的首尾位置相连,例如,对于位置1,可以将它与位置1、位置2、位置4相连接,最终构成一个有向无环图,如下所示,
计算最大概率路径,也即按照这种方式切分后的分词结果的概率最大。在计算最大概率路径时,jieba分词采用从后往前这种方式进行计算。为什么采用从后往前这种方式计算呢?
因为,我们这个有向无环图的方向是从前向后指向,对于一个节点,我们只知道这个节点会指向后面哪些节点,但是我们很难直接知道有哪些前面的节点会指向这个节点。
因为它是基于词典的,所以分词效果的好坏很大程度上取决于词典本身的精确程度
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(am∣I)=32
如果当句子较长时,概率通常为小于1的常数,相乘导致数据下溢,可以用log概率解决!
利用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 T∗N2
到底什么是神经网络?????????
基本概念
感知器怎么样能训练出权重呢?
首先,所有的权重参数都是随机的;然后根据一个标准【代价函数】,使用一些方法【梯度下降】更新权重,直到这个标准【代价函数】的值足够好;或者权重每次更新的值足够小。
什么是梯度下降?
梯度下降中的梯度指的是代价函数对各个参数的偏导数,偏导数的方向决定了在学习过程中参数下降的方向,学习率(通常用α表示)决定了每步变化的步长,有了导数和学习率就可以使用梯度下降算法(Gradient Descent Algorithm)更新参数了。
梯度下降是为了解决什么问题呢?是为了最小化损失函数。最小化损失函数是为了什么?是为了找到合适的系数w和b。
那最快下降的方向 是哪里呢?是切线的方向
在以上的网络中,每一层的参数的维度是多少?
3 * 2 3 * 1
如何理解神经网络是感知机的叠加呢?
譬如在上面的图中,可以把输入层和隐藏层的a1当做一个感知机;输入层和隐藏层的a2当做一个感知机;
而隐藏层和输出层又当做是一个感知机。可以相当于输入层和隐藏层构成了两个或运算;隐藏层和输出层构成了与运算。
或者是输入层和隐藏层构成了两个与运算;隐藏层和输出层构成了或运算。
什么神经网络要叫做反向传播呢?
主要还是层次增多了,根据损失函数对所有的参数进行求导。
Sigmoid函数:
f ( z ) = 1 1 + e − a x f(z)={1 \over 1+e^{-ax}} f(z)=1+e−ax1 f ′ ( z ) = f ( z ) ( 1 − f ( z ) ) f'(z)=f(z)(1-f(z)) f′(z)=f(z)(1−f(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)−(1−y)log(1−outs) 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+1−outs1−y J ′ ( o u t s ) ∗ f ‘ ( z ) = o u t s − y J'(out_s)*f‘(z)=out_s-y J′(outs)∗f‘(z)=outs−y
练习*:
∂ 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 ∂w5∂Eerr=∂outs∂Eerr∗∂outnet∂outs∗∂w5∂outnet=(outs−y)∗h2s
为什么对于Sigmoid函数相对于tanh可能导致模型收敛速度慢?
输出值不以零为中心,可能导致模型收敛速度慢
Sigmoid函数:
其中,a用于控制sigmoid函数的形状,在神经网络中,a一般取1。
f ( z ) = 1 1 + e − a x f(z)={1 \over 1+e^{-ax}} f(z)=1+e−ax1 f ′ ( z ) = f ( z ) ( 1 − f ( z ) ) f'(z)=f(z)(1-f(z)) f′(z)=f(z)(1−f(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+e−xex−e−x t a n h ′ ( x ) = 1 − t a n h 2 ( x ) tanh'(x)=1-tanh^2(x) tanh′(x)=1−tanh2(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。它是比较常用的激活函数。
softmax或称归一化指数函数,将输出向量中的每一个值【对应于多个类别或待挑选的值】,映射到(0,1)区间内,并且所有元素的和为1。
与通常用的max函数相比,softmax是连续可导的,消除了拐点。
为什么要使用向量来表示文本呢?
一方面是因为这样简单直观;另一方面大概是因为计算机处理向量很在行。在图像处理中,一般也将图转换为向量。图片可以方便地将它的像素矩阵转换为向量;
为什么要进行embedding呢?
主要是为了表示词的含义,meaning,可以把最终的Y空间想成是一些特征,通过这些特征来描述一个词。如果映射得当,像上面的图,在二维空间中,run和chase的位置比较接近,也就意味着它们两个对应的向量比较像;或者反过来说,如果我们能够得到词的合适的向量表示,词义相近的词向量表示相近,就能较好地体现它们的语义。
通过使用一个词周围的词来代表这个词。采用这一假设的研究方法大致分为以下两类:
!!!!计算下面两句话的相似程度?
句子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就是通过使用大量文本,根据词的上下文,使用一个带有单个隐藏层的简单神经网络,这个神经网络并不是用于预测任务,目的只是学习输入层到隐藏层的权重,这些权重实际上就构成了我们试图学习的“词向量”。
上下文相似意味着给定的输入,目标词是相似的。
两个算法:
两个训练方法
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树中,高频的词靠近树根,这样高频词需要更少的时间会被找到,符合优化思想。
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时刻产生的输出【可以理解为记忆】,作为输入参与了 时刻的计算。所以,如果不展开,那么看起来就像是在循环了。所以叫做循环神经网络。
长短期记忆网络,为何要提出长的短期记忆网络呢?
为什么隔得太远,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(St−1,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)=W∗H(t−1)+U∗X(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)=W∗H(t−1)+U∗X(t)+b==W∗(W∗H(t−2)+U∗X(t−1)+b)+U∗X(t)+b如果一直迭代下去,即 W n ∗ H ( t 0 ) W^n*H(t_0) Wn∗H(t0),那么此时, W n W^n Wn以及几乎为0,所以 H ( t 0 ) H(t_0) H(t0)几乎不会对当前产生影响。
RNN长期依赖问题
seq2seq又叫Encoder-Decoder模型。它可以实现从一个序列到任意一个序列的转换,模型如下所示,其左半部分为Encoder部分,右半部分为Decoder部分。
最基础的Seq2Seq模型包含了三个部分,即Encoder、Decoder以及连接两者的中间状态向量,Encoder通过学习输入,将其编码成一个固定大小的状态向量C,继而将S传给Decoder,Decoder再通过对状态向量C的学习来进行输出。
基础的Seq2Seq有一些缺点,因为Encoder将输入编码为固定大小状态向量的过程实际上是一“信息有损压缩”的过程,如果信息量越大,那么这个转化向量的过程对信息的损失就越大,基础的模型连接Encoder和Decoder模块的组件仅仅是一个固定大小的状态向量,这使得Decoder无法直接去关注到输入信息的更多细节。相当于是在输入一句话之后,看完一遍,立刻要求进行翻译;对于人而言,长句子的效果也不会很好。
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中的构成元素想象成是由一系列的
从概念上理解,把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作为本次输入,利用上一次的隐藏层得到最终结果。
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 生成固定的位置表示。
Mask就是对某些值进行掩盖,使其不产生效果。
那么具体怎么做呢?
产生一个上三角矩阵,上三角的值全为 1,下三角的权值为 0,对角线也是 0。
其中,Padding Mask 在所有的 Scaled Dot-Product Attention 里面都需要用到,而 Sequence Mask 只有在 Decoder 的 Self-Attention 里面用到。
所以, Scaled Dot-Product Attention 的 forward 方法里面的参数 attn_mask 在不同的地方会有不同的含义。
对于图像来说一般是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任务中,再单独训练每一层的权重向量,对每一层的向量进行线性加权作为每个词汇的最终向量表示。这样一来,每个词汇在不同的上下文语境中,都可以得到不同的向量表示,因此,在一定意义上可以解决一词多义的问题。
GPT也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过Fine-tuning的模式解决下游任务。
GPT为啥会用transformer中的decoder?
解码器中的self attention 层层仅仅允许关注早于当前输出的位置。防止出现“自己看见自己”的问题。是指要预测的下一个词在给定的序列中已经出现的情况。传统语言模型的目标是获得在给定序列从头到尾条件概率相乘后概率最大的下一词,而双向模型会导致预测的下一词已经在给定序列中出现了的问题,这就是“自己看见自己”。
CBOW、RNN以及BERT的区别?
一文读懂BERT(原理篇)
在ELMO/BERT出来之前,大家通常讲的语言模型其实是根据上文内容预测下一个可能跟随的单词,就是常说的自左向右的语言模型任务,或者反过来也行,就是根据下文预测前面的单词,这种类型的LM被称为自回归语言模型。GPT 就是典型的自回归语言模型。
自回归语言模型有优点有缺点,缺点是只能利用上文或者下文的信息,不能同时利用上文和下文的信息。它的优点,其实跟下游NLP任务有关,比如生成类NLP任务,比如文本摘要,机器翻译等,在实际生成内容的时候,就是从左向右的,自回归语言模型天然匹配这个过程。
自编码语言模型
Bert通过在输入X中随机Mask掉一部分单词,然后预训练过程的主要任务之一是根据上下文单词来预测这些被Mask掉的单词。那些被Mask掉的单词就是在输入侧加入的所谓噪音。类似Bert这种预训练模式,被称为DAE LM (Denoising Autoencoding)。