大脑里能装下的:
语言模型的两个分支:
统计语言模型和神经网络语言模型。
统计语言模型:
计算概率,比较哪句话的概率大
神经网络语言模型:
从这开始紧记WQ=C这个公式。
独热编码W:词之间没有关联
一句话解释神经网络语言模型:WQ=C,Q是随机矩阵是一个参数,将C拼接,C=[C1,c2,c3,c4],再经过两层感知机。
思想:W就算是一万维,经过Q后可以变小,Q可以用来控制维度,且经过Q后的词向量都有关联。
如下的矩阵是训练好的Q,【00010】是一个词的独热编码
Word2Vec
他就是为了得到词向量,预测准不准无所谓(不用知道原理,没用)与此同时他也训练好了Q矩阵
一句话解释:输入独热编码,输出词向量
缺点:【00010】只能代表一个词,但是词会有一次多义,解决不了
下游任务改造
word2vec就是预训练语言模型。
为什么这么说?
我们可以直接把独热编码与word2vec预训练好的Q矩阵相乘得到词向量,接着再进行到下游任务环节。(这也算是加快了模型的训练,可以说下游任务就是在此基础上进行的)
ELMO
解决了多义词问题。
用Word2vec做预训练:W独热编码不会变,Q是训练好的不会变,那WQ=C中的C词向量也不会变,所以解决不了一次多意。而用ELMO做预训练模型就解决了一词多义,把词向量传入LSTM,经过两层LSTM去获取上下文信息就解决了一词多义
注意力
Q是查询对象,K是图中的物体
KV往往相同,不同于Q
K,V就是约等于
重要,很简单:
例如Query = a,Key1 = 1,经过F(Q,K)函数计算后得到两者相关性的得分:F(a,1)=s1, F(a,2)=s2, F(a,3)=s3, F(a,4)=s4。由于s1是一个实际的分值,通过softmax函数进行归一化处理,将得分映射到0-1之间得到权重系数(a1,a2,a3,a4)。根据权重系数对Value进行加权求和,得到新的V。
最终得到结果:
自注意
qkv由来:就是X乘不同矩阵得到qkv,因为他们都来自于X,只是乘了不同矩阵,变成了X不同的表达,但实质上还是X。因为qkv都来自于X,所以qkv同源,所以叫自注意力机制。
补充:不论是X,还是QKV,都是一个词的词向量表示,都只是一个词的与一个词向量的模糊对应而已,不存在说一个词一定对应着某个词向量。
大脑里的轮廓图:
感受不出与注意力机制在计算上有什么区别,
都是qkv(为了方便理解中间步骤我这里直接忽略)相乘然后全部相加,难道是注意力机制只有一个Q,所以只用算一次,也就是算一个词与句子中所有其他词的关系(qk1v1(同不同源无所谓)+qk2v2+qk3v3)=V' ,而自注意力机制,比如用在一个句子中,他要算很多次,他要把每一个词与其他词的qkv都算一遍,如thinking算一遍:(q1k1v1(同源)+q1k2v1+q1k3v3)=z1,Machines又算一遍:(q2k1v1+q2k2v2+q3k3v3),然后第三,第四第五个词同理(所有词是可以并行计算的,也就是同时做)就可以算出每个词在句子中与其他词的相关程度。那这么看来注意力机制就是算一遍,自注意力就是算很多遍【这么理解大概率是错的】
自注意力结果:
我这句话中的一个单词跟这句话里的其他所有单词都去做qkv计算(下表填I与I的概率,I个have的概率,have和I的概率。。。。。),把计算得到的结果填入下图的表,得到一个新的Z,这个新的Z就是这个单词的新的表征,这个新的标注会具有句法特征与语义特征。
(对角线上的概率肯定最大,也就是I与I,have与have肯定最大,其他两个相关的词的概率肯定大一些)
补充:
slef-attention解决了长序列依赖,可以做并行,且得到的词向量具有句法特征与语义特征。
1 RNN长序列依赖问题:比如第一个A算得的值为0.1(A里面就是wx+b),传到第二个A,第二个A算得也是0.1,与第一个相乘,就变成了0.01,后面可能就会越来越小,到最后一个A的时候,第一个A的信息几乎没有了。且词传递的过程潜移默化的也含有了顺序关系,
RNN:
2 ELMO用LSTM解决了多义词问题,但slef-attention得到的词向量具有句法特征与语义特征。
句法特征:比如making more, making difficult听起来很合理。
语义特征:its与Law很相似,its与application相似。(相似词)
补充:Self-Attention 计算量实在太大,理论上Self-Attention (Transformer 50个左右的单词效果最好)解决了RNN模型的长序列依赖问题,但是由于文本长度瑶加时,训练时间也将会呈指数增长,因此在处理长文本任务时可能不一定比LSTM (200个左右的单词效果最好)等传统的RNN模型的效果好。
Masked Self Attention 模型
如果有一个完整的句子,那使用自注意力机制没问题,但如果遇到生成式任务,他是一个词一个词生成的,最开始只有一个词,你也没办法计算I与have的,与a与dream的概率,所以把后面几个遮起来没问题。
Multi-Head Self-Attention多头自注意力
自注意力Self-Attention每个词只有一套参数生成qkv,Multi-Head Self-Attention多头自注意力有8套参数(相当于在空间里有了8个位置),生成8套qkv,可将512维的词向量分成8个位置,8次计算得到8个Z,就可以捕捉到不同子空间的信息,再合并8个Z与一个矩阵计算得到最后的与X维度相同的Z。
Positional Encoding
这个东西怎么来的?就是为了解决self-attention在使用并行计算时忽略了词与词的顺序关系而来。
“我爱你”这句话中的爱字是第二个,那pos就是2,下图意思就是对于“爱”字这个512维的词向量,对其偶数维度使用sin函数,对其奇数维度使用cos函数。懂到这就行了。
RNN :他的传递是一个词一个词的按顺序传递
self-attention:他就没有按顺序传递这种说法
粗看Transformer
了解Transformer就是了解Transformer里的小的编码器(Encoder)和小的解码器(Decoder)。
词向量输入我们平时说的【编码器】,实际是要依次经过6个解码器得到一个超级增强后的词向量,然后输入到解码器。
编码器单独看:就是一个自注意力 + Feed Forward,Feed Forward就是两次线性变换w2((w1x+b1) )+b2。
解码器:自注意力 + 交叉注意力+ Feed Forward
细看Transformer编码器
一句话总结编码器:他就是在做词向量,只不过这个词向量更加完美。
Transformer框架:seq(编码器)2seq(解码器)。seq2seq模型就是编码器到解码器这种模型。
编码器:对序列进行向量化得到词向量。
解码器:把词向量输入到解码器,得到结果。(Transformer是翻译生成模型所以在这个任务中是生成单词)
一句话总结编码器:他就是在做词向量,只不过这个词向量更加完美。
怎么变完美的呢?下图一个箭头一个箭头的看,看得懂那说明前面的都懂了。
Thinking传入:
绿色的X1→ 黄色的X1:
绿色的X1 词向量他是首先通过one-hot、word2vec得到,得到绿色的X1 词向量后加上位置编码得到黄色的X1。
黄色的X2也是同理获得。
黄色的X1→ Z1:
黄色的X1,黄色的X2输入到Self-Attention子层中,做注意力机制(黄色X1、X2拼接起来的一句话做),得到z1(z1表征的仍然是thinking,只不过Z1是更加优秀的词向量,因为拥有了位置特征、句法特征、语义特征的词向量)
残差网络:(没必要纠结这个)
残差网络可以避免梯度消失,w3(w2(w1x+b1)+b2)+b3,如果w1,w2,w3特别小,0.0000000000000000....,x就没了,可以理解为【w3(w2(w1x+b1)+b2)+b3+x】)。归一化(LayerNorm),做标准化(避免梯度爆炸),得到了深粉色的z1
Feed Forward:(没必要纠结这个)
Feed Forward,Relu (w2(w1xtb1)+b2),
前面每一步都在做线性变换,wx+b,线性变化的叠加永远都是线性变化,他就是空间中平移和扩大缩小,他没办法拟合某些状态,或者说他没办法把某个位置移到一个所有位置。
而通过Feed Forward中的Relu激活函数做一次或多次非线性变换,这种空间变换就可以把某一种状态/位置无限拟合任何一种位置/状态了) ,得到r1(是thinking 的新的表征)
机器学习与词向量的本质都是在空间中做变换。
细看Transformer解码器
Transformer动态流程:
Transformer生成词是一个一个生成的,每生成一个词就会作为解码器的输入,得到已经生成的词向量作为Q,结合第四个从编码器传过来的词向量K,V去预测第四个词。(通过已经生成的词去让解码器更好的生成)
为什么把生成的词又放到解码器?
可以理解为让注意力机制对已生成的词更加注意,不然他接受的是编码器传过来的一整句话,叫他去一整句话里挑重点肯定不如告诉他生成的词再去叫他挑重点。也就是:通过部分((生成的词)去全部(源语句)的里面挑重点。
为什么要用解码器要用掩码注意力机制?
生成式的核心其实是Masked Attention或者说是Masked Mutil-Head Attention,因为transformer输入的时候是把所有数据输入的,前面的信息可以看到后面的信息,所以需要掩码来遮掩后面的信息。比如上图如果不用Masked Mutil-Head Attention的话,训练阶段解码器一开始输入的就是一整句话,而不是生成一个输入一个,但是道理测试阶段,生成式语言模型是一个一个词生成的,解码器不能提前知道要生成的一整句话,所以就会出现问题。
理解:
输入的词向量用Word2Vec生成用ELMO生成都无所谓,因为transformer会反向跟新,所以你随机初始化一个向量,这个就算误差很大,他只是反向更新的回合多一点,但是还是能帮你更新到一个确定的位置。
生成式的核心其实是Masked Attention或者说是Masked Mutil-Head Attention,因为transformer输入的时候是把所有数据输入的,前面的信息可以看到后面的信息,所以需要掩码来遮掩后面的信息。比如上图如果不用Masked Mutil-Head Attention的话,训练阶段解码器一开始输入的就是一整句话,而不是生成一个输入一个,但是道理测试阶段,生成式语言模型是一个一个词生成的,解码器不能提前知道要生成的一整句话,所以就会出现问题。(依靠上文信息去预测下文,所以Transformer这种生成式模型还是挺片面的)
GPT
文本与图片预训练的区别:
ELMO是预训练得到词向量,用这些词向量去做下游任务。
图片中的预训练得到的是模型,然后在面对下游任务时在进行微调,但是能微调的只能是相近任务。
GPT就是生成式预训练语言模型。
他是单向编码,因为他要做的是生成式任务,所以他也不能用双向编码
BERT
能够获取上下文信息的有(想想图):Word2Vec中的CBOW,ELMO,自注意力,多头自注意力,Transformer编码段
LSTM就是序列型架构,就是一步一步往前传递,考虑上文的时候看不到下文,考虑下文的时候看不到上文(有两个边框)到了最后才能拼接上下文信息,而且有信息传递的过程中可能越来越少。
BERT使用的是Transformer,而Transformer用来self-Attention,他可以看到上下文信息,所以他比起ELMO来说真正的利用了上下文信息。因为他是同时知道了上下文信息,所以
GPT做的是生成式任务,BERT任务属性类似于ELMO,给你一个向量,做特征提取的。
和GPT一样,BERT也采用二段式训练方法:
1.第一阶段:使用易获取的大规模无标签余料,来训练基础语言模型;
2.第二阶段:根据指定任务的少量带标签训练数据进行微调训练。
也叫小样本学习
BERT用的是Transformer编码器,主要是做特征提取,而且他确实能很好的做特征提取,因为他用了。。。
GPT用的是Transformer解码器
bert
在大量无标记数据 集上训练 Transformer 的 Encoders(编码器) 来做 NLU (语言理解),得到优秀的特征提取模型。(最终的模型参数即代表模型学习到的 ” 语言理解能力“ )。
然后根据下游任务微调(fine-tune)模型即可。
补充:计算相似度有三种方式:点乘,MLP,cos相似性
首先:
1 输入爱这个词的向量,与我不爱你四个字的向量
2 F(Q,K)也就是QK做点乘得到,点乘可以反应两个向量之间的相似的程度,点乘结果越大两个向量越相似,我就要越关注。除以根号dk是因为QK结果大SoftMax反向传播梯度很小,就很容易造成梯度消失
3 点乘的结果做SoftMax得到相似度再与V相乘