## 目录
- [1. 什么是BERT](#1-什么是bert)
- [2. 从Word Embedding到Bert模型的发展](#2-从word-embedding到bert模型的发展)
- [2.1 图像的预训练](#21-图像的预训练)
- [2.2 Word Embedding](#22-word-embedding)
- [2.3 ELMO](#23-elmo)
- [2.4 GPT](#24-gpt)
- [2.5 BERT](#25-bert)
- [3. BERT的评价](#3-bert的评价)
- [4. 代码实现](#4-代码实现)
- [5. 参考文献](#5-参考文献)
## 1. 什么是BERT
**BERT的全称是Bidirectional Encoder Representation from Transformers**,是Google2018年提出的预训练模型,即双向Transformer的Encoder,因为decoder是不能获要预测的信息的。模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。
Bert最近很火,应该是最近最火爆的AI进展,网上的评价很高,那么Bert值得这么高的评价吗?我个人判断是值得。那为什么会有这么高的评价呢?是因为它有重大的理论或者模型创新吗?其实并没有,从模型创新角度看一般,创新不算大。但是架不住效果太好了,基本刷新了很多NLP的任务的最好性能,有些任务还被刷爆了,这个才是关键。另外一点是Bert具备广泛的通用性,就是说绝大部分NLP任务都可以采用类似的两阶段模式直接去提升效果,这个第二关键。客观的说,把Bert当做最近两年NLP重大进展的集大成者更符合事实。
## 2. 从Word Embedding到Bert模型的发展
### 2.1 图像的预训练
自从深度学习火起来后,预训练过程就是做图像或者视频领域的一种比较常规的做法,有比较长的历史了,而且这种做法很有效,能明显促进应用的效果。
![](https://pic3.zhimg.com/80/v2-4c27ee0ff1fb87f27d55b007cb4ceb06_hd.jpg)
那么图像领域怎么做预训练呢,上图展示了这个过程,
1. 我们设计好网络结构以后,对于图像来说一般是CNN的多层叠加网络结构,可以先用某个训练集合比如训练集合A或者训练集合B对这个网络进行预先训练,在A任务上或者B任务上学会网络参数,然后存起来以备后用。
2. 假设我们面临第三个任务C,网络结构采取相同的网络结构,在比较浅的几层CNN结构,网络参数初始化的时候可以加载A任务或者B任务学习好的参数,其它CNN高层参数仍然随机初始化。
3. 之后我们用C任务的训练数据来训练网络,此时有两种做法:
**一种**是浅层加载的参数在训练C任务过程中不动,这种方法被称为“Frozen”;
**另一种**是底层网络参数尽管被初始化了,在C任务训练过程中仍然随着训练的进程不断改变,这种一般叫“Fine-Tuning”,顾名思义,就是更好地把参数进行调整使得更适应当前的C任务。
一般图像或者视频领域要做预训练一般都这么做。这样做的优点是:如果手头任务C的训练集合数据量较少的话,利用预训练出来的参数来训练任务C,加个预训练过程也能极大加快任务训练的收敛速度,所以这种预训练方式是老少皆宜的解决方案,另外疗效又好,所以在做图像处理领域很快就流行开来。
**为什么预训练可行**
对于层级的CNN结构来说,不同层级的神经元学习到了不同类型的图像特征,由底向上特征形成层级结构,所以预训练好的网络参数,尤其是底层的网络参数抽取出特征跟具体任务越无关,越具备任务的通用性,所以这是为何一般用底层预训练好的参数初始化新任务网络参数的原因。而高层特征跟任务关联较大,实际可以不用使用,或者采用Fine-tuning用新数据集合清洗掉高层无关的特征抽取器。
### 2.2 Word Embedding
![](https://pic2.zhimg.com/80/v2-e2842dd9bc442893bd53dd9fa32d6c9d_hd.jpg)
神经网络语言模型(NNLM)的思路。先说训练过程。学习任务是输入某个句中单词 ![[公式]](https://www.zhihu.com/equation?tex=W_t=(Bert)) 前面句子的t-1个单词,要求网络正确预测单词Bert,即最大化:
![[公式]](https://www.zhihu.com/equation?tex=++P%28W_t%3D%E2%80%9CBert%E2%80%9D%7CW_1%2CW_2%2C%E2%80%A6W_%28t-1%29%3B%CE%B8%29)
前面任意单词 ![[公式]](https://www.zhihu.com/equation?tex=W_i) 用Onehot编码(比如:0001000)作为原始单词输入,之后乘以矩阵Q后获得向量 ![[公式]](https://www.zhihu.com/equation?tex=C%28W_i+%29) ,每个单词的 ![[公式]](https://www.zhihu.com/equation?tex=C%28W_i+%29) 拼接,上接隐层,然后接softmax去预测后面应该后续接哪个单词。这个 ![[公式]](https://www.zhihu.com/equation?tex=C%28W_i+%29) 是什么?这其实就是单词对应的Word Embedding值,那个矩阵Q包含V行,V代表词典大小,每一行内容代表对应单词的Word embedding值。只不过Q的内容也是网络参数,需要学习获得,训练刚开始用随机值初始化矩阵Q,当这个网络训练好之后,矩阵Q的内容被正确赋值,每一行代表一个单词对应的Word embedding值。所以你看,通过这个网络学习语言模型任务,这个网络不仅自己能够根据上文预测后接单词是什么,同时获得一个副产品,就是那个矩阵Q,这就是单词的Word Embedding。
2013年最火的用语言模型做Word Embedding的工具是Word2Vec,后来又出了Glove,Word2Vec。对于这两个模型不熟悉的可以参考我之前的文章,这里不再赘述:
- [Word2Vec](https://github.com/NLP-LOVE/ML-NLP/tree/master/NLP/16.1%20Word%20Embedding)
- [GloVe](https://github.com/NLP-LOVE/ML-NLP/tree/master/NLP/16.3%20GloVe)
上面这种模型做法就是18年之前NLP领域里面采用预训练的典型做法,之前说过,Word Embedding其实对于很多下游NLP任务是有帮助的,只是帮助没有大到闪瞎忘记戴墨镜的围观群众的双眼而已。那么新问题来了,为什么这样训练及使用Word Embedding的效果没有期待中那么好呢?答案很简单,因为Word Embedding有问题呗。这貌似是个比较弱智的答案,关键是Word Embedding存在什么问题?这其实是个好问题。
**这片在Word Embedding头上笼罩了好几年的乌云是什么?是多义词问题。**我们知道,多义词是自然语言中经常出现的现象,也是语言灵活性和高效性的一种体现。多义词对Word Embedding来说有什么负面影响?如上图所示,比如多义词Bank,有两个常用含义,但是Word Embedding在对bank这个单词进行编码的时候,是区分不开这两个含义的,因为它们尽管上下文环境中出现的单词不同,但是在用语言模型训练的时候,不论什么上下文的句子经过word2vec,都是预测相同的单词bank,而同一个单词占的是同一行的参数空间,这导致两种不同的上下文信息都会编码到相同的word embedding空间里去。所以word embedding无法区分多义词的不同语义,这就是它的一个比较严重的问题。
有没有简单优美的解决方案呢?ELMO提供了一种简洁优雅的解决方案。
### 2.3 ELMO
ELMO是“Embedding from Language Models”的简称,其实这个名字并没有反应它的本质思想,提出ELMO的论文题目:“Deep contextualized word representation”更能体现其精髓,而精髓在哪里?在deep contextualized这个短语,一个是deep,一个是context,其中context更关键。
在此之前的Word Embedding本质上是个静态的方式,所谓静态指的是训练好之后每个单词的表达就固定住了,以后使用的时候,不论新句子上下文单词是什么,这个单词的Word Embedding不会跟着上下文场景的变化而改变,所以对于比如Bank这个词,它事先学好的Word Embedding中混合了几种语义 ,在应用中来了�
使用numpy搭建的简单的bert模型
版权申诉
166 浏览量
2022-10-16
18:18:04
上传
评论
收藏 433KB ZIP 举报
小黑码蚁
- 粉丝: 2374
- 资源: 1760