1.word2vec
1.1 CBOW(词袋模型)
根据上下出现的单词预测中间的单词,包括输入层、投影层、输出层。输入层包括上下出现单词的向量化表示;投影层是把输入层的向量累加求和后做映射;输出层(计算语料库中所有单词的概率,计算量大!)所以设计的底层是一颗哈夫曼树,按照语料库中单词出现的频率作为权重进行构建,出现频率越高的节点在树中层数越浅。
1.2 skip-gram
与词袋模型刚好相反,skip-gram模型是根据当前词推测当前单词可能的前后单词。
构建上下文词--目标词的数据集,采用了负采样技巧,使用上下文词+随机从语料库中选取词语构成负样本,将任务转化为逻辑回归N元分类任务。
2.Transformer
2.1预训练模型
为什么要研究预训练模型?
有大量任务中存在无标注数据,若采用人工标注则费时费力。那么我们可以采用先使用大规模数据集训练一个大模型,再利用我们手头少量数据集做微调。
2.2训练过程
略
2.3模型优势
比起CNN,CNN只能通过卷积核提取到局部信息,而对于文本数据忽略了长距离的依赖。
比起RNN,RNN随着距离的增加,信息衰减严重,而transformer不存在距离问题它只取决于两者的相关性。RNN建模当前词时只会用到前面的词,而transformer建模当前词时不仅可以用到前面的词也会用到后面的词。RNN无法做到并行计算,只能一步一步计算隐藏层状态。
2.4位置编码
为了解决句子中的时序问题,transformer引入了位置编码。
当位置为偶数时为sin(××),位置为奇数时为cos(××)。
2.5解码器的两个注意力层
第一个是带masked的多头注意力层,本质上是一个自注意力层,与Encoder不同的是该自注意力层只允许关注已输出位置的信息,在通过softmax之前进行mask使之变为一个很大的负数。
第二个是不带masked的多头注意力层,也叫Encoder-Decoder注意力层。不同的是,Decoder中的qkv只有q来源于上一个Decoder的输出,kv全部来源于Encoder的最后一层输出。
3.ELMO模型
产生原因:因为word2vec无法区分多义词的不同语义,因此ELMO可以根据上下文动态调整:预训练(双层双向LSTM)+ 特征融合。伪双向---分开训练的!!!
本质思想:事先用语言模型学好一个单词的Word Embedding,然后在实际使用Word Embedding的时候,单词已经具备了特定的上下文了,这个时候可以根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。
ELMO虽然采用的双向结构,但两个方向是彼此独立训练的,从而避免了已知答案去预测答案的情况。
**【使用】**ELMO会得到三个Embedding向量:单词的word Embedding、第一层LSTM对应的Embedding(表示单词的句法信息)、第二次LSTM对应的Embedding(表示单词的语义信息)。分别给予这三个Embedding一个权重(这个权重可以通过学习得到),将三个Embedding分别乘以权重再进行累加后得到一个Embedding,将它作为补充的新特征用于下游任务。
4.生成式预训练模型GPT
GPT使用了transformer中的Encoder结构,其中的self-Attention替换为了masked的self-Attention,从而每个位置的词看不到后面的词。
为什么采用单向不采用双向:因为模型要训练预测能力,双向结构可以看到中间要预测的单词。因此GPT放弃了transformer的双向结构改用单向结构,也奠定了GPT根据已有的上下文生成下文的任务。
**【使用】**下游任务要向GPT的网络结构看齐,在做下游任务时GPT的参数初始化为预训练好的GPT网络参数,最后使用手头的任务训练这个网络并进行微调。
5.集大成者Bert
Bert使用了双向的transformer的结构集成,Bert综合了ELMO的双向优势与GPT的transformer特征提取优势。
**【使用】**同样是预训练,在下游任务中进行微调。
【输入输出部分的处理】为了适配多任务下的迁移学习,Bert设计了更通用的输入层和输出层。起始位置用[CLS]标识,两个句子用[SEP]分割,每个单词有三个Embedding---单词Embedding(有的单词会被拆分为一组公共字词单元,如playing被拆为play和ing)、句子Embedding、位置信息Embedding,将这三个Embedding直接相加得到最终输入。
**【两个创新】**Bert除了集中了前两个模型的优势之外,还做出了两个创新。
一个是让Bert具备通过上下文做预测的能力。具体做法是将大量的词替换为,模型需要通过上下文去预测这些标签。但是,直接将大量的词替换为标签可能会造成一些问题,模型可能会认为只需要预测相应的输出就行,其他位置的输出就无所谓。同时Fine-Tuning阶段的输入数据中并没有标签,也有数据分布不同的问题。因此文本中15%的词用于预测,这15%中的80%被替换为,10%的词被替换为其他词,另外10%保持不动。
另一个是让Bert具备判断句子B是否为句子A下文的能力。50%的训练数据选择语料库中真正相连的两个句子,50%的训练数据是从语料库中随机选取一个句子拼在第一个句子后面。这个做法相当于token级别的完形填空。