前言
写这一个系列的动因就是本人想深刻理解一下 BERT 的原理。BERT 是怎么被构想进去的?比拟适宜刚入门的小白浏览,读完之后会发现其实不过如此。那么既然是架构级的,本系列不会过多的波及代码级的或者说公式级的,更多的是设计形式以及设计的起因。本系列将分成以下几个模块,
- 逃不掉的 RNN
- 探究机翻的底细:Seq2Seq
- Attention is ALL you need
- Transformer 是谁?
- This is BERT
时序数据
回忆咱们晓得的全连贯层,他实际上做的就是将一 堆input 转换为一堆 output,这些 input 之间没有工夫上的关系,而是将所有 input 揉在一起输出到模型中。而对于时序数据,比方一段话,人在浏览的时候是单向的、随着工夫将 input 一一输出,并且很多时候 input 的长度是未知的。所以咱们就须要一个新的架构来解决这一类的时序数据。
Simple RNN
为什么须要 RNN?假如咱们须要解决一个文本分类工作。
要想对文本进行分类,那么咱们必须将这个文本数字化或者说向量化,并且须要保障这个向量可能表征这句话,蕴含了这句话中所有的特色。而通过 RNN 就可能将一个句子中的所有信息都交融起来,表征成一个向量。
下面就是 RNN 的架构图,咱们一步一步来讲。首先是咱们的输出,显然是一串文本:the cat sat … mat。那么对于某个单词而言,比方 the,想要参加后续的运算,首先须要将其向量化,这里能够用到 word2vec 等算法,通过语义的形式将单词转化为一个向量 x0。而后将 x0 输出矩阵 A,外部过程如下,
将 x0 与 ht-1(此处因为 x0 是第一个,ht- 1 实践上来说不存在,那么能够通过一些解决比方将其置零之类代替)连接起来,和矩阵 A 相乘,再进行 tanh 激活函数计算,失去 h0。而后将 h0 和 x1 输出到矩阵 A 又反复上述计算,周而复始(所以 RNN 叫循环神经网络,上一步的输入又作为下一步的输出)。显然,h0 中存储着 x0 的状态,h1 中存储着 x0 和 x1 的状态,以此类推,最初一个输入 ht 中应该存储着后面所有 x i(单词)的信息。这样,ht 相当于征集了所有村民的意见,就能够作为代表拿去评估,实现二分类的工作。
此处思考一个问题:为什么须要 tanh 激活?
假如没有 tanh,为不便探讨,咱们假如所有的 x 都是零向量,那么 ht ≈ A×ht-1。易得 h 100 = A100h0。易得 Ax = λx,A100x = λ100x,若 A 的特征值 λ 稍大于 1,那么 A 100就间接爆炸了;若 λ 稍小于 1,那么 A 100预计就间接变成零矩阵了。所以须要 tanh 进行一个相似于正则化的工作。
毛病使人提高,RNN 存在什么毛病呢?=>RNN 的记忆力特地短,什么是记忆力?之前咱们说“最初一个输入 ht 中应该存储着后面所有 x i(单词)的信息”,的确,然而当序列长度变大,对于最后面的 x 所遗留下来的特色可能曾经被笼罩掉了。能够通过计算 h~100~ 对于 x0 的导数来判断之间的相关性,计算可得,导数靠近于 0。
所以咱们能够发现,simpleRNN 在解决短距离的文本时成果较好,当序列长度变大之后,成果就不太好了。所以引出 LSTM。
革新 SimpleRNN => LSTM
可见 LSTM 其实也是一类 RNN 罢了,此处我不会具体解释其原理,因为 Attention is ALL you need,RNN 能够被 attention 取代了。
首先来看 LSTM 的架构,
仔细观察发现,其实和简略 RNN 没有很大区别,其实就是把之前单纯的乘矩阵 A 转化为一系列更为简单的操作。所以 SimpleRNN 能够被 LSTM 齐全替换掉,就像替换某个整机一样。外部的大抵过程如下。
为了补救 SimpleRNN 记忆力失落的问题,LSTM 将记忆放在一个传输带上,也就是下图中的 Conveyor Belt,也就是左下方的 C~t-1~,记忆的更新形式如图右下方所示,其中能够发现 f 向量,这是 LSTM 中的忘记门,他能够管制哪些信息疏忽,哪些信息保留。忘记门也保障了长距离记忆始终存在。
最初是 LSTM 的输入,在记忆信息 C 的根底上进行肯定的加工之后失去 ht。同样和 SimpleRNN 相似,将上一步的输入作为输出传入下一层。