当前位置:   article > 正文

NLP里的迁移学习:BERT_bert 迁移学习

bert 迁移学习
NLP里的迁移学习:
  • 使用预训练好的模型来抽取词、句子的特征

  • 不更新预训练好的模型

  • 需要构建新的网络来抓取新任务需要的信息

    • word2vec忽略了时序信息,

      语言模型只看了一个方向

word2vec的训练模式有两个:利用边上词预测中间词 和 利用中间词预测边上词;

可以看做是一个训练网络,训练起来比较快,可以利用大量的数据去训练。

一般使用这种语言模型,不会去修改预训练好的模型,他的缺点是只能提取比较底层的特征,所以很多时候只是把word2vec模型用在嵌入层,就是替换掉原始的随机嵌入,就是开始就把词语转化为一个嵌入向量,包含了一些底层特征。但是后续还是要利用或设计一些复杂的模型进一步提取特征,如CNN、RNN等,就是利用一些和目标任务相关的网络来抽取需要的特征。

因为word2vec只提取到了一些局部信息,没有看到很多时序信息,一般是只看到了一个方向的信息。语言模型也只看到了一个方向的信息。

BERT的动机:
  • 基于微调的NLP模型(迁移学习)

  • 预训练的模型抽取了足够多的信息(使得抽取的特征信息能够抓住输入文本的很多语义信息,当做一个新任务是,只需要增加一个简单的输出层就行了(转化为最终任务需要的label空间中),不需要再额外叠加其他的CNN RNN等模型提取特征了)

  • 新的任务只需要增加一个简单的输出层

BERT架构:
  • 只有编码器的Transfomer

  • 两个版本:

    • Base:#blocks=12,hidden size=768,#heads=12,#parameter=110M

    • Large:#blocks=24,hidden size=1024,

  • 在大规模数据上训练 > 3B词

(第一个在nlp上用的很深的网络,能够抽取出比较好的特征,并很好地用于其他模型)

bert在输入和loss上是有创新的。

对输入的修改:
  • 每个样本是一个句子对 通过<SEP>来分割句子 变成 两个小句

  • 加入额外的片段嵌入(使得transformer模型能够区分两个句子)

  • 位置编码可学习 (不进行手工设计,模型自己学习得到 位置编码向量)

预训练任务1:带掩码的语言模型
  • Transfomer的编码器是双向的,标准语言模型要求单向

  • 带掩码的语言模型每次随机(15%)将一些词元换成<mask>

bert不能做预测下一个词

encoder是双向的,它是知道上下文双向信息的;decoder才是单向的

bert不是去预测未来的,是做完形填空的,它能知道双向信息,但因为在微调任务中,data里面没有<mask>这个东西,现在bert训练时加了很多mask,但是在微调的时候是没有mask的,bert不是要看见mask就去预测,所以对mask有如下改动:

保持原来的token:就是看到自己的信息,有点像 作弊

这样改变mask会使得模型不会看见mask就去预测。

因为在实际应用预训练模型时,是没有mask的,所以这种作弊下的改动就是和实际应用预训练 模型而没有mask的情况类似。

预训练任务2:下一句子预测
  • 预测一个句子对中两个句子是不是相邻的 二分类任务

  • 训练样本中:

    • 正样本:50%概率选择相邻句子对:<cls>this movie is great <sep> i like it <sep>

    • 负样本:50%概率选择随机句子对:<cls>this movie is great <sep> hello <sep>

  • 将<cls>对应的输出放到一个全连接层来预测

总结
  • BERT针对微调设计

  • 基于Transfomer的编码器做了如下修改

    • 模型更大,训练数据更多

    • 输入句子对,片段嵌入,可学习的位置编码

    • 训练时使用两个任务:

      • 带掩码的语言模型

      • 下一个句子预测

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号