ELMo: feature-based(做Task任务的时候直接使用预训练网络输出的词向量,即预训练网络不跟Task一起Train);双向RNN-LSTM;
OpenAI GPT: fine-tune-based(做Task任务的时候,前面的预训练网络也跟着一起Train), 用的Transformer;
BERT: fine-tune-based, Transformer,用加MASK的方法把前后方向的词都作用到当前词上;句子级负采样;
ELMo
ELMo的主要做法是先训练一个完整的语言模型,再用这个语言模型去处理需要训练的文本,生成相应的词向量,所以在文中一直强调ELMo的模型对同一个字在不同句子中能生成不同的词向量。
ELMo是feature-based,不是fine-tuning based;也就是pre-training完之后,在task具体任务里,不会再更新之前的那个预训练的biLM网络,只需要把句子输入biLM网络得到句子里每个词的结果向量,再把结果向量输入到task具体任务的网络里;
前面的层倾向于表面句法,后面的层倾向于深层语义,不同的最终任务可以对不同的层进行不同的权重加权;
前向:训练到第k个词时,用第k个词的输出层向量来预测第k+1个词;
后向:训练到第k个词时,用第k个词的输出层向量来预测第k-1个词;
前向和后向的LSTM参数是不同的;输入word-embedding和softmax层参数,是相同的;
对前向而言,第k个中间层向量,编码了1~k这些上下文;对后向而言,编码了k~N这些上下文;
前向和后向一起的极大似然;
总结一下,不像传统的词向量,每一个词只对应一个词向量,ELMo利用预训练好的双向语言模型,然后根据具体输入从该语言模型中可以得到上下文依赖的当前词表示(对于不同上下文的同一个词的表示是不一样的),再当成特征加入到具体的NLP有监督模型里。(多义词, 在句子中的上下文不同,于是就有多种表示)
OpenAI GPT
半监督:先pre-train, 然后fine-tune;后者只需要在前者网络后面加很浅的层,一起训练特定Task;(BERT是抄它的)
首次把Transformer引入预训练;
fine-tune时,把预训练的目标函数作为auxilary objective引入到Task的目标函数里;可以:1.增强Task模型的泛化能力;2.加速训练速度;
细节:用句子最后一个词的输出向量,来做为句子的表示,输入到Task网络里;
由于预训练模型只处理一个序列,所以如果有句子蕴含、句子相似度、最相近句子这种多句子任务,要区别对待:
1. 句子蕴含:有顺序关系,所以2个句子连起来一次搞定;
2. 句子相似度:因为谁在前谁在后会影响结果,所以把A前B后和B前A后分别输入预训练模型,得到2个结果向量,直接相加,再做线性变换;
3. 找最相近句子:目标句子在做,待选择句子在右,多次输入预训练模型,得到的N个结果向量线性变换后进行softmax;
Zero-shot:应该是对Task不做fine-tuning,直接用pre-triain得到的结果们,用设阈值这种简单方法,求解;
1. 语句合乎语法正确性:把句子所有词输出的p(预测为下一个词的概率),求平均log(p);大于阈值的认为是正例,否则负例;
2. 情感分析:在句子末尾加一个词"very",用这个词对应的输出,预测词"positive"和"negative"的概率,谁大就分给谁;
3. 问答:应该是把问句和答句串在一起,求句子所有词输出的p, 求平均log(p); 最大的那个答句,就是结果;
Ablation studies(腐蚀实验):
1. 不使用auxilary objective的话,在大数据集上效果变差明显,小数据集上不明显;
2. 把Transformer换成LSTM,掉下去5.6个点;
3. 直接训练任务,不pre-training,掉下去14.8个点;
GPT2.0
预训练数据质量提高了,数据量增多了;
模型参数更多了;