浅谈feature-based 和 fine-tune

feature-based 和 fine-tune是NLP方向使用预训练模型时常用的两种方式,所以简单总结下。

Feature-based

Feature-based指在使用时,并不直接使用模型本身,而是利用模型产生的结果,即LM embedding,通过预训练的模型处理数据得到额外的特征,引入到要训练的模型中。

例如,在文本分类、序列标注等任务中,对输入的词进行编码得到词的embedding时,

对于静态词向量(word2vec, glove)就是使用查表的方式,每个词根据word2vec或者glove甚至是最原始的one-hot方式,得到的静态词向量,一个词对应一个200或者300维的向量表示,在下游任务中继续更新。所以说其实word2vec就是最原始的预训练语言模型,先用一批数据训练得到一批词的静态词向量。

而动态词向量(elmo和bert)也是一样,可以直接拿下游训练的数据,输入训练好的编码器encoder,然后得到每个词的embedding,也可以拿某层的hidden state输出当做额外的特征,引入到要训练的模型中,在下游任务中只训练这些输出的线性组合(w1 * h1 + w2 * h2 + w3 * h3 …)中的w,而h是不变的。
这样的做法一个明显的缺点就是占用存储太大了,毕竟要把所有的特征都保存一下。

  • 静态词向量指训练以后,不发生改变了,也就是一个词只能唯一确定的向量和它对应,无法解决一词多义问题
  • 动态词向量指同一个词的embedding会因为不同的上下文而发生变化

feature-based方法包括两步:

  1. 首先在大的语料A上无监督地训练语言模型,训练完毕得到语言模型
  2. 然后构造task-specific model例如序列标注模型,采用有标记的语料B来有监督地训练task-sepcific model,将语言模型的参数固定,语料B的训练数据经过语言模型得到LM embedding,作为task-specific model的额外特征

fine-tune

Fine-tune 方法会根据下游特定的任务,在原来的模型上面进行一些修改,使得最后输出是当前任务需要的,然后在新的语料上重新训练来进行fine-tune。这些修改一般是在模型的最后一层,或者在现有的网络后添加一个网络结构用于匹配下游的各种任务。

GPT1 GPT2 就采用了Fine-tune 方法,GPT3得益于海量的与训练样本和庞大的网络参数,不在需要 fine-tune过程;

BERT论文采用了LM + fine-tuning的方法,同时也讨论了BERT + task-specific model的方法,例如情感分析任务,将数据输入bert模型,将最后的输出取得第一个token的输出,传入一个softmax层,得到一个分类的结果,所以其实就是在最后加了一层softmax。

但是这种方式的话很明显占用资源更大,因为要重新训练,实现的时候又会有各种各样的问题,所以还是需要实践来完善。

fine-tune分为两个步骤:

  1. 构造语言模型,采用大的语料A来训练语言模型
  2. 在语言模型基础上增加少量神经网络层来完成specific task例如序列标注、分类等,然后采用有标记的语料B来有监督地训练模型,这个过程中语言模型的参数并不固定,依然是trainable variables.

使用BERT应用于不同的下游任务例子,具体的如下:

  • 对于情感分析等单句分类任务,可以直接输入单个句子(不需要[SEP]分隔双句),将[CLS]的输出直接输入到分类器进行分类
  • 对于句子对任务(句子关系判断任务),需要用[SEP]分隔两个句子输入到模型中,然后同样仅须将[CLS]的输出送到分类器进行分类

  • 对于问答任务,将问题与答案拼接输入到BERT模型中,然后将答案位置的输出向量进行二分类并在句子方向上进行softmax(只需预测开始和结束位置即可)

  • 对于命名实体识别任务,对每个位置的输出进行分类即可,如果将每个位置的输出作为特征输入到CRF将取得更好的效果。

  • 对于常规分类任务中,需要在 Transformer 的输出之上加一个分类层.

参考资料:
feature-based 和 fine-tune
#深入理解# NLP 中的 Feature-based 和 Fine-tune 两种学习方法
论文解读:BERT模型及fine-tuning

猜你喜欢

转载自blog.csdn.net/weixin_46707326/article/details/123451774