自然语言处理通用框架BERT原理解读
BERT任务目标概述
- 自然语言处理通用解决方案
- 需要熟悉word2vec, RNN 网络模型,了解词向量如何建模
- 重点在于Transformer网络架构,BERT训练方法,实际应用
- 开源项目,可以直接套用
- 提供预训练模型,基本任务拿过来直接用
Transformer
- 要做一件什么事
- 基本组成依旧是机器翻译模型中常见的Seq2Seq网络
-
输入输出都很直观,其核心架构就是下图中间的网络设计
Transformer总体架构
传统RNN网络计算时的问题:RNN网络层数少,每个X输入都利用了上一个输出值,所以相互不独立,不能进行并行训练和加速。Transformer可以解决该问题
![](https://img.haomeiwen.com/i9298309/04f73d1a2efed99e.png)
-
传统的RNN网络
- Self-Attention机制来进行并行计算,在输入和输出都相同
-
输出结果是同时被计算出来的,现在基本已经取代RNN了
传统的RNN网络结构
-
传统的word2vec
- 表示向量时有什么问题?
- 如果‘干哈那’是一个词
- 不同语境中相同的词如何表达
- 预训练好的向量就永久不变了
![](https://img.haomeiwen.com/i9298309/77f2cd650639f3db.png)
上图为传统的word2vec分类,相同的词离得比较近,不同的词距离比较远。如果训练完一个词后,词向量基本就不会变了。不同的词在不同语义中应该表达不同的意思。因为这个缺点,BERT加入了不同上下文对词的影响。
![](https://img.haomeiwen.com/i9298309/e286baec3cb4dc6a.png)
Self-attention
根据不同语境会理解词的意思,没有人工干预,自动理解上下文。例如下图的对it词编码,需要通过整个文章对其进行编码。
![](https://img.haomeiwen.com/i9298309/a10d3e46217460dc.png)
Self-attention如何计算
-
输入经过编码后得到向量。
-
想得到当前词语上下文的关系,可以当做是加权。
-
构建三个矩阵分别来查询当前词跟其他词的关系,以及特征向量的表达。
self attention计算
-
三个需要训练的矩阵
-
Q:query,要去查询的
-
K:key,等着被查的
-
V:value,实际的特征信息
![](https://img.haomeiwen.com/i9298309/2c80542b9f73b35b.png)
- q与k的内积表示有多匹配
- 输入两个向量得到一个分值
- K: key,等着被查的
- V: value,实际的特征信息
![](https://img.haomeiwen.com/i9298309/0cdd279710ff4fa6.png)
首先每个词的Q会和查询每一个词K值的关系,这个过程中用Q与K的内积表示(当两个向量线性无关时,垂直内积为0,相关时有夹角,内积有值),q与k内积为,矩阵的对应位置相乘的合。
- 最终的得分值经过softmax就是最终上下文结果
- Scaled Dot-Product Attention
- 不能让分值随着向量维度的增大而增加
![](https://img.haomeiwen.com/i9298309/c9f4fd9ddfc86320.png)
Softmax回忆
![](https://img.haomeiwen.com/i9298309/8d121d6af5071948.png)
- 每个词的Attention计算
-
每个词的Q会跟整个序列中每一个K计算得分,然后基于得分再分配特征
Attention计算
-
- Attention整体计算流程
- 每个词的Q会跟每一个K计算得分
- Softmax后就得到整个加权结果
- 此时每个词看的不只是它前面的序列
-
而是整个输入序列 同一时间计算出所有词的表示结果
Attention整体计算流程
结果
Multi-head的作用
- multi-headed机制 一组q,k,v得到了一组当前词的特征表达
- 类似卷积神经网络中的filter
-
能不能提取多种特征呢?
-
卷积中的特征图:
![](https://img.haomeiwen.com/i9298309/18434310164f9acd.png)
- multi-headed机制 (一般来说做8个head就够了)
- 通过不同的head得到多个特征表达
- 将所有特征拼接在一起
-
可以通过再一层全连接来降维
multi-headed
![](https://img.haomeiwen.com/i9298309/db6d51adf843fbf7.png)
![](https://img.haomeiwen.com/i9298309/72ef77562c89f0f5.png)
- multi-headed结果
- 不同的注意力结果
- 得到的特征向量表达也不相同
![](https://img.haomeiwen.com/i9298309/91af8a8026cc9b62.png)
![](https://img.haomeiwen.com/i9298309/385772ba69c9182e.png)
堆叠多层
计算方法都是相同的
![](https://img.haomeiwen.com/i9298309/6016405e158e885b.png)
位置编码与多层堆叠
位置信息表达
- 在self-attention中每个词都会考虑整个序列的加权,所以其出现位置 并不会对结果产生什么影响,相当于放哪都无所谓,但是这跟实际就 有些不符合了,我们希望模型能对位置有额外的认识。
![](https://img.haomeiwen.com/i9298309/8201f03aa517d876.png)
Add与Normalize
![](https://img.haomeiwen.com/i9298309/6dc6e0bf91512a71.png)
归一化:均值为0 标准差为1
![](https://img.haomeiwen.com/i9298309/9d844bf9b9d100cb.png)
连接:基本的残差连接方式
![](https://img.haomeiwen.com/i9298309/684c951b77846413.png)
Transformer整体架构梳理
-
Decoder Attention
- 计算不同
-
加入了MASK机制(为了使还未输出的值变为不可以利用,只可以利用前面已经输出的结果)
-
最终输出结果
- 得出最终预测结果
-
损失函数 cross-entropy即可
-
整体梳理
- Self-Attention
- Multi-Head
- 多层堆叠,位置编码
-
并行加速训练
整体流程
效果展示
![](https://img.haomeiwen.com/i9298309/c67291ea68f3fc0f.png)
BERT模型训练方法
-
BERT训练的词向量有什么不同?
- 在word2vec中,相同词对应的向量训练好后就固定了
- 但在不同的场景中,‘干哈呢’的意思会相同吗?
-
这名字该怎么解释?
- Bidirectional Encoder Representations from TransformersEncoder
- 说白了就是transformer的encoder部分
-
并不需要标签,有预料就能训练了
BERT就是encoder端
-
如何训练BERT
-
方法1:句子中有15%的词汇被随机mask掉
-
交给模型去预测被mask的家伙到底是什么
-
词语的可能性太多了,中文一般是字
-
如果BERT训练的向量好,那分类自然OK
方法1
-
方法2:预测两个句子是否应该连在一起
-
[seq]:两个句子之前的连接符,[cls]:表示要做分类的向量
方法2:两句话应该链接在一起
-
![](https://img.haomeiwen.com/i9298309/86d70e36e8d1620e.png)
- 如何使用BERT
- 是不是需要先训练好向量的表达,然后再训练需要的模型呢?
-
所需的任务融入BERT中即可,它俩一起训练的!
分类任务
分类任务
阅读理解应用
阅读理解题,输入是文章和问题, 输出是理解的答案位置。
![](https://img.haomeiwen.com/i9298309/991de1946b76f520.png)
![](https://img.haomeiwen.com/i9298309/eb4fc01693fc53dc.png)
如何设计网络呢?需要分别计算答案的起始和终止位置
需要额外训练两个辅助向量,一个开始索引一个结束索引,例如下图黄色start,蓝色end,圆点表示做内积。
![](https://img.haomeiwen.com/i9298309/9ba5902e8af4582f.png)
![](https://img.haomeiwen.com/i9298309/8d5deccbe564ca25.png)
网友评论