遥远的BERT模型...

Transformer 是谷歌大脑在2017年底发表的论文 attention is all you need 文章解读 中所提出来的seq2seq模型,BERT就是从transformer 中衍生出来的预训练语言模型

现在很多处理效果非常好的模型,都融合了BERT , 模型排名

transformer原理

相比于LSTM的迭代训练,transformer的训练是并行的,使用了位置嵌入来理解语言的顺序,使用自注意力机制和全连接层来进行计算。

主要分为两部分:

  • 编码器:把自然语言序列映射成隐藏层的数学表达

    1. 字向量与位置嵌入:由于没有迭代计算需要提供每个字的位置信息,从而让模型学到位置之间的依赖关系和自然语言的时序特征

    2. 自注意力机制:求词向量的点积,即余弦距离,最后得到 N * N 注意力矩阵,第 i 行表示第 i 个字 与 每一个字的相关程度,沿着最后一个维度做softmax归一化,是概率之和为1形成概率分布。

      注意力矩阵的作用就是得到一个权重的概率分布,然后用其点乘词向量,就可以得到加权后的线性组合,使得每个字向量都含有当前句子内所有字向量的信息

    3. 残差连接:避免梯度消失

    4. 归一化:把隐藏层归一为标准正态分布,加速收敛

    5. 前馈:进行两层线性映射并用激活函数激活;然后重复3、4

  • 解码器:把隐藏层映射为自然语言序列,用于下游的命名实体识别、语义关系抽取、摘要生成、情感分类等

BERT

语言模型就是用来求一个句子出现的概率

BERT模型的全称是双向transformer编码表达。 只用到了编码器的部分,在每句话的句头添加一个特殊字符,让句子中的所有信息向这个字符汇总,就可以根据这个字符的hidden state 完成一些分类。

训练:

  1. MASKED LM : 随机遮盖或替换任意字词,让模型通过上下文的理解预测,做Loss时只计算被遮盖部分的Loss
  2. Next Sentence Prediction : 在句子中加特殊符号判断是否上下文相关,实际是一个分类问题

参数:

看到作者这句

但是经过我的实际测试, 结合我目前正在研究的命名实体识别, 语义分析, 关系抽取和知识图谱的需求, 发现其实这个参数比较过剩, 把参数缩减到2千万, 但即使这样, 使用一块11GB显存的2080Ti显卡, 训练维基百科语料的BERT也需要一周的时间

2千万。。。一周。。。11GB显存。。。感觉可以告辞了呢。。。

在数据集不够的情况下,使用BERT这种参数这么多的模型,训练会产生严重过拟合,泛化能力差的情况

就我们的项目而言,在现有条件下,基本可以告别这种方法了吧。。。

序列模型的深度学习建议使用PyTorch