赞
踩
pre-train:让机器解某个任务之前先训练一下。今天NLP领域的常见做法是:训练一个模型,模型是根据大量的文字(无标记,直接爬取的文字)训练出来的,它可以读懂人类文字 什么叫读懂?
接下来针对要解决的任务,可以收集部分少量的资料,对模型进行微调fine-tune,让机器来解决不同的任务(不同的针对性资料对模型进行微调来解决不同的任务)
预训练模型:把输入的每一个token表示成一个embedding vector,这个embedding vector包含了原来token的语义,意思相近的token会有相近的embedding,这些embedding中的某些维度可以看出跟语义的关联性
在过去,没有ELMo和BERT之前,通常是一个token对应一个向量。问题是同样的token就会有同样的embedding,就会对应到同样的向量。例如知名的word2vec、Glove
Embedding就是用一个低维的向量表示一个物体,这个Embedding向量的性质是能使距离相近的向量对应的物体有相近的含义,正是因为Embedding能够用低维向量对物体进行编码还能保留其含义的特点,所以其非常适合用于深度学习。由于我们熟知的one hot encoding、multi hot encoding是一种稀疏向量的编码方式,所以不适合用来深度学习进行特征表示,相反Embedding概括而言,就是一种高效的低维稠密的操作。
词嵌入( word embedding):基于神经网络的分布表示又称为词向量、词嵌入,神经网络词向量模型与其它分布表示方法一样,均基于分布假说,核心依然是上下文的表示以及上下文与目标词之间的关系的建模。
keras中的Embedding和Word2vec的区别
其实二者的目标是一样的,都是我们为了学到词的稠密的嵌入表示。只不过学习的方式不一样。Word2vec是无监督的学习方式,利用上下文环境来学习词的嵌入表示,因此可以学到相关词,但是只能捕捉到局部分布信息。
而在keras的Embedding层中,权重的更新是基于标签的信息进行学习,为了达到较高的监督学习的效果,会将Embedding作为网络的一层,根据target进行学习和调整。比如LSTM中对词向量的微调。
简单来说,Word2vec一般单独提前训练好,而Embedding一般作为模型中的层随着模型一同训练。
如果英文词汇作为token,难以穷尽。改用字母作为token,通过看当前词汇的词根词缀判断新单词的含义,代表模型:FastText
如果中文,把中文的每个字看做一个图像放进CNN,期待CNN能看到偏旁部首来判断含义
看一整个句子,才得到对应的embedding,也就考虑了上下文的信息
这个模型架构可以input一个序列,output一个序列,这个架构(模型)有多层,这个架构可以用LSTM(ELmo) 也可以用self-attention layers(BERT)
随着模型越来越大,穷人适合的模型:让模型变小,其中著名的就是ALBERT,架构相同,它的所有参数都一样,而且表现还变好了一点点
哪些模型用了哪些技术来压缩大小,参考资料如下
self-attention的计算量是n方,n是sequence的长度,随着sequence的长度变长,可能会出现问题。reformer和longformer的出现就是为了减少self-attention的复杂度
输入:多个句子需要sep分隔符号
输出:
微调整个模型:两个部分,预训练模型(训练过的参数)+特定任务(随机参数) ,
训练后的模型往往非常大,很多参数需要存下来,所以提出了adaptor的概念
只调adaptor的部分,预训练模型是不变的,此时只需要存原来模型中不需要调的部分+每一个预训练模型中的adaptor
注意颜色变化,变化的才训练(调参)
目标:这个预训练的模型,输入一排向量,输出一排向量,且输出的向量是Contextualized word embedding考虑上下文的
方法:自监督学习(用部分输入预测另外一部分输入,输入和输出对不是人工标注的)
如何得到这种输入输出的关系?做一个模型去预测下一个输入的token时,必须一个一个输入w,一个一个预测h,直接输入的话模型就会偷看到答案,以至于什么都学不到
language model其实就是在做predict next token这件事,预训练模型其实就是一个LM(语言模型)。用什么样的神经网络架构训练LM,来预测下一个token?最早:用LSTM(著名:ULMFiT)现在使用:self-attention(著名LM使用sa的例子:GPT、GPT-2、Megatron、turing NLG)但是要小心,要控制attention的范围,因为每一个位置都可以attention其他位置(不能偷看答案)
predict next token做预测的时候,考虑了它左边的信息来生成embedding,但是右边呢?
ELMO考虑了右边,左到右的LSTM的输出+右到左的LSTM的输出,连接起来,这样考虑了两边,但是这只是简单拼接,两个方向的考虑都是不完整的句子
能不能在处理左侧内容的时候就考虑到右侧内容,反之同理?BERT可以做到这件事
它把输入的token盖住,两种方法盖住
根据盖住部分对应输出的embedding,去预测被盖起来的token是什么。
BERT用的是transformer(是没有限制的sa,每一个token都可以atten到其他token),就解决了同时考虑所有token的问题,同时因为预测内容是被MASK起来了所以不用担心偷看到
CBOW:word2vec的一种训练方法,用两侧内容预测t位置的token,这种方法的模型非常简单不能看很长的内容,有固定的的窗口,只能看窗口大小的上下文
BERT:预测被盖起来的地方,给多少输入就可以看多长的上下文。这是一个复杂的模型。
遮盖的内容是随机决定的,但是遮盖方法决定了机器能不能学到东西,一下是两种复杂的遮盖方法:
XL:transformer-XL,它可以维度读取信息,可以用relative positional embedding
认为BERT有问题:认为遮盖会导致依赖预测,而无法学到一些内容。(其实BERT的MASK随机盖住就不会有这种问题)
XLnet的运作可以从两种观点来看:
XLnet不像bert一样给mask的内容,而是只给位置附加信息。这里就涉及到一个特殊的神经网络架构
bert不适合做s2s的预训练模型(因为缺乏生成的能力)
如果要做需要s2s model 的NLP任务,那么bert只能当做encoder,decoder部分就没有pre-train到
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。