关于人工智能:深度学习进阶篇预训练模型3XLNetBERTGPTELMO的区别优缺点模型框架等原理详细讲解

3次阅读

共计 16343 个字符,预计需要花费 41 分钟才能阅读完成。

深度学习进阶篇 - 预训练模型[3]:XLNet、BERT、GPT,ELMO 的区别优缺点,模型框架、一些 Trick、Transformer Encoder 等原理详

1.XLNet:Generalized Autoregressive Pretraining for Language Understanding

1.1. 从 AR 和 AE 模型到 XLNet 模型

自回归模型(Autoregressive Model, AR),通过预计一串文本序列的生成概率分布进行建模。一般而言,AR 模型通过要么从前到后计算文本序列概率,要么从后向前计算文本序列概率,但不管哪种形式的建模,都是单向的。即 在预测一个单词的时候无奈同时看到该单词地位两边的信息。假如给定的文本序列 $x=(x_1, x_2, …, x_n)$,其从左到右的序列生成概率为:

$$p(x)=\prod_{t=1}^n p(x_t|x_{<t})$$

自编码模型(Autoencoding Model, AE), 通过从毁坏的输出文本序列中重建原始数据进行建模。例如 BERT 通过预测【mask】地位的词重建原始序列。它的 长处 在于在预测单词的时候可能同时捕捉该单词地位前后双向的信息;它的 毛病 是预训练过程中采纳了 mask 单词的策略,然而微调阶段并没有,因而导致了预训练阶段和微调阶段的的GAP,另外在训练过程中,对不同 mask 单词的预测是互相独立的。假如序列中被 mask 的词为 $w\in W_m$,未被 mask 的词为 $w\in W_n$,则其相应的计算概率为:

$$p(x) = \prod_{w\in Wm} p(w|W_n)$$

这里对传统的 AR 和 AE 模型简略 总结一下 ,AR 模型是生成式模型,是单向的;AE 模型是判别式模型,是双向的。鉴于传统的 AR 模型和 AE 模型本身的长处和毛病,XLNet 冀望可能交融两者的长处同时又防止两者的毛病,这就是 XLNet 的设计思路。

整体上 XLNet 是基于 AR 模型的建模思路设计的,同时防止了只能单向建模的毛病,因而它是一种能看得见双向信息的 狭义 AR 模型 。作为一个 AR 模型,XLNet 并没有采纳预测 mask 单词的形式进行建模,因而它不存在上述预训练 - 微调的 GAP,更不存在预测 mask 的独立性假如。

1.2. Permutation Language Model

Permuatation Language Mode (下文将简称为 PLM) 是 XLNet 的外围建模思路,在正式介绍之前,咱们再来回顾一下 AR 模型的建模策略,给定一串文本序列 $\text{x}=[x_1,x_2,…,x_n]$,其中每个 $x_i$ 示意一个 token,AR 模型的通过最大化下边这个似然函数进行建模:

$$\begin{split} \begin{align} \mathop{max}\limits_{\theta} \quad log \; P_{\theta}(\text{x}) &= \sum_{t=1}^{n}log\;p_{\theta}(x_t|x_{<t}) \\&=\sum_{t=1}^{n}log\;\frac{exp(h_{\theta}(x_{1:t-1})^{T}e(x_t))}{\sum_{x^{‘}}exp(h_{\theta}(x_{1:t-1})^{T}e(x^{‘}))} \end{align} \end{split}$$

这里,$\text{x}_{<t}$ 示意在 $t$ 地位前边的 token 序列,$h_{\theta}(\text{x}_{1:t-1})$ 示意数据由模型产生的上下文向量,$e(x_t)$ 示意 token $x_t$ 的 embedding。

这种建模形式是单向的,为了在预测某个地位单词的时候,可能让模型看见双向的信息,XLNet采纳了全排列的思路,容许模型在不同文本序列排列上进行建模,但模型的参数在不同序列上是共享的,相当于是模型可能看见 预测地位单词 左右两侧的信息。

举个例子,假如以后有文本序列 $\text{x}=[x_1,x_2,x_3]$,这串序列中共有 3 个 token,这三个 token 共计有 6 种排列组合形式,其相干的索引序列为:

  • $\text{z}_1 = (1,2,3)$
  • $\text{z}_2=(1,3,2)$
  • $\text{z}_3=(2,1,3)$
  • $\text{z}_4=(2,3,1)$
  • $\text{z}_5=(3,1,2)$
  • $\text{z}_6=(3,2,1)$

采纳索引序列 $\text{z}_1$ 的文本序列为 $\text{x}=[x_1, x_2, x_3]$,采纳索引序列 $\text{z}_2$ 的文本序列为 $\text{x}=[x_1, x_3, x_2]$,如果模型在训练过程中能同时看到这样的两个排列,那么在预测 $x_2$ 的时候将能够看到 $x_1$,又能够看到 $x_3$,因为训练过程中模型的参数是共享的,因而相当于模型可能看到 $x_2$ 前后双向的信息。

上面正式演绎一下 XLNet 的指标函数,假如给定一串序列 $\text{x}=[x_1,x_2,x_3,…,x_n]$,它将有 $n!$ 个不同的排列组合 $\mathbb{Z}=[\text{z}_1,\text{z}_2,…,\text{z}_{n!}]$,令 $\text{z}\in \mathbb{Z}$ 示意某一排列形式,$z_{t}$ 示意为 $\text{z}$ 这个排列的第 $t$ 个地位,$\text{z}_{<t}$ 示意 $t$ 这个地位前边的 $t-1$ 个地位编号,$\text{x}_{\text{z}}$ 示意将序列 $\text{x}$ 依照索引 $\text{z}$ 进行排序。$\text{x}_{\text{z}<t}$ 示意将原始 $\text{x}$ 依照 $\text{z}$ 进行排列后,$\text{x}_{\text{z}}$ 前 $t-1$ 个地位的 token。另外假如排列 $\text{z}$ 呈现的概率为 $p(\text{z})$,则 XLNet 的正式指标函数根据极大似然预计为:

$$\begin{split} \begin{align} \mathop{max}_{\theta} \quad L &=\mathbb{E}_{\text{z}∼\mathbb{Z}} \left[\sum_{t=1}^n log\;p_{\theta}(x_{z_t}|\text{x}_{\text{z}_{<t}}) \right] \\ & = \sum_{_{\text{z}∼\mathbb{Z}}} p(\text{z}) \left[\sum_{t=1}^n log\;p_{\theta}(x_{z_t}|\text{x}_{\text{z}_{<t}}) \right] \end{align} \end{split}$$

然而一个长度为 $n$ 的文本序列,其排列组合数为 $n!$,数量切实宏大,不便训练,所以在理论训练过程中,XLNet 是通过采样的形式迫近指标函数的冀望,即:

$$\begin{split} \begin{align} \mathop{max}_{\theta} \quad L &=\mathbb{E}_{\text{z}∼\mathbb{Z}} \left[\sum_{t=1}^n log\;p_{\theta}(x_{z_t}|\text{x}_{z<t}) \right] \\ &\approx \frac{1}{m}\sum_{i=1}^{m}\sum_{t=1}^n log\;p_{\theta}(x_{z_{it}}|\text{x}_{\text{z}_i<t}) \end{align} \end{split}$$

其中,$z_{it}$ 示意第 $i$ 个排列的第 $t$ 个地位,$\text{x}_{\text{z}_i<t}$ 示意依照 $\text{z}_i$ 排列进行重塑后的前 $t-1$ 个 token。每次采样一个排列程序 $\text{z}$ 进行重塑原始序列 $\text{x}_{\text{z}}$,而后将 $\text{x}_\text{z}$ 进行合成组合计算:$\sum_{t=1}^n log\;p_{\theta}(x_{z_t}|\text{x}_{\text{z}<t})$。这里须要 留神 的是,XLNet 只是调整了联结概率 $p(\text{x})$ 的合成程序,然而原始 token 之间的程序是不变的,即 token 之间还是应用原始程序的 position embedding,$p(\text{x})$ 的合成程序的计算次要是通过 transformer 的 mask 机制 实现的。这样的设定也保障了预训练阶段和微调阶段之间的程序是统一的,均是失常的天然语序。

图 1 不同排列计算第 3 个单词输入的示意图

图 1 中 $mem^{(0)}$ 和 $mem^{(1)}$ 代表前一个的 segment 的缓存信息,另外,输出的序列程序都是固定的天然语序,position embedding 还是依照失常的程序确定的。只是不同的排列中,参加合成计算的内容不同。具体来讲,对第一个合成秩序 $3\rightarrow2\rightarrow4\rightarrow1$,因为 $x_3$ 位于最前边,所以在这个合成秩序中看不到其余的 token 内容,只能看到前一个 segment 的缓存信息;对第一个合成秩序 $2\rightarrow4\rightarrow3\rightarrow1$,$x_3$ 前边有 $x_2$ 和 $x_4$,所以在计算 $x_3$ 地位输入的时候应用了 $x_2$ 和 $x_4$。

这个想法就是 PLM 的建模思路,看到这里,置信你曾经很好地了解了。

1.3. Permutation Language Model 如何建模

1.3.1 应用经典的 transformer 是否能建模 PLM

上边看似找到了一个比拟好想法去让 AR 模型在预测一个单词的时候同时可能看到前后双向的信息,但具体怎么来建模实现呢?应用原始的 transformer 技术间接实现可能会带来一些问题,具体来说,假如以后有两个排列 $\text{z}^{1}$ 和 $\text{z}^2$,他们之间具备如下的关系:

$$\text{z}_{<t}^{1} = \text{z}_{<t}^{2}=\text{z}_{<t} \qquad but \qquad z_t^1=i \neq j= z_t^2$$

这种状况下,应用经典 transformer 的形式去预测这两个排列 $z_t$ 地位的输入,将会有:

$$\underbrace{p_{\theta}(X_{i}=x|\text{x}_{\text{z}_{<t}}) }_{z_t^1=i, \; \text{z}_{<t}^1=\text{z}_{<t}} = \underbrace{p_{\theta}(X_{j}=x|\text{x}_{\text{z}_{<t}}) }_{z_t^2=i, \; \text{z}_{<t}^2=\text{z}_{<t}} = \frac{exp\,(e(x)^T h(\text{x}_{\text{z}_{<t}}))}{\sum_{x^{‘}}exp\,(e(x^{‘})^T h(\text{x}_{\text{z}_{<t}}))}$$

显然在这种状况下,预测第 $i$ 个地位的单词和预测第 $j$ 个地位的单词的概率分布是雷同的,这必定是不对的,因而应用经典的 transformer 是无奈去做 Permutation Language Model 建模的。

为了解决这个问题,XLNet在预测指标 $z_t$ 地位的 token 时,向其引入了地位信息 $z_t$,从新定义的预测 token 概率分布的计算形式为:

$$p_{\theta}(x_{z_t}|\text{x}_{\text{z}_{<t}})=\frac{exp\,(e(x)^T g_{\theta}(\text{x}_{\text{z}_{<t}},z_{t}))}{\sum_{x^{‘}}exp\,(e(x^{‘})^T g_{\theta}(\text{x}_{\text{z}_{<t}},z_{t})))}$$

从公式中能够看到,其在预测 $z_t$ 地位 token 的时候,引入了地位信息 $z_t$。这样就能解决上述的问题,即通过这个变换后上式将变为:

$$\underbrace{p_{\theta}(X_{i}=x|\text{x}_{\text{z}_{<t}}) }_{z_t^1=i, \; \text{z}_{<t}^1=\text{z}_{<t}} =\frac{exp\,(e(x)^T g_{\theta}(\text{x}_{\text{z}_{<t}},i))}{\sum_{x^{‘}}exp\,(e(x^{‘})^T g_{\theta}(\text{x}_{\text{z}_{<t}},i)))} \neq \underbrace{p_{\theta}(X_{j}=x|\text{x}_{\text{z}_{<t}}) }_{z_t^2=i, \; \text{z}_{<t}^2=\text{z}_{<t}}= \frac{exp\,(e(x)^T g_{\theta}(\text{x}_{\text{z}_{<t}},j))}{\sum_{x^{‘}}exp\,(e(x^{‘})^T g_{\theta}(x_{\text{z}_{<t}},j)))}$$

1.3.2 应用 Two-Stream Self-Attention 建模 PLM

从上边探讨的这些能够看到,当预测 $z_t$ 地位的 token 时,最多只能应用地位信息 $z_t$,而不能应用该 $z_t$ 对应的内容 $x_{z_t}$,否则,就相当于应用 $x_{z_t}$ 来预测 $x_{z_t}$ 本人,这没有什么意义;当预测 $j>t$ 后的 token $x_{z_j}$ 时,不仅须要地位信息 $z_t$,同时还须要该地位对应的内容 $x_{z_t}$。

然而,经典的 transformer 中是将两者信息在输出层相加交融之后进行后续计算的,因而 XLNet 提出了一种双流自注意力机制:content-streamquery stream,上面咱们未来具体探讨一下它们。

content-stream 提供了内容方面的表白 content representation $h_{\theta}(\text{x}_{\text{z}_{\leq t}} )$,简记为 $h_{z_t}$,它等同经典的 transformer 的状态向量,这个向量中既蕴含了地位信息 $z_t$,又蕴含了内容信息 $x_{z_t}$。

query-stream 提供了查问方面的表白 query representation $g_{\theta}(\text{x}_{\text{z}_{<t}}, z_t)$,简记为 $g_{z_t}$,它仅仅蕴含了 $x_{z<t}$ 的内容信息和 $z_t$ 的地位信息,并不蕴含 $x_{z_t}$ 的内容。

图 2 双流机制计算图

图 2 展现了合成程序为 $3 \rightarrow 2 \rightarrow 4 \rightarrow 1$ 的 two-stream 计算过程,咱们通过这张图来具体聊聊如何去定义 $g_{\theta}(\text{x}_{\text{z}_{<t}},z_t)$。

图 2a展现了 content-stream 的自注意力计算,其中 $h_i^{(0)}$ 是由 token 的 embedding 进行初始化,能够看到它的计算和经典的 transormer 是统一的,因为在合成程序中 1 位于最初,因而它能看见前边所有的 token 内容,最终计算得出的 $h_1^{(1)}$ 同时蕴含了第 $1$ 个地位的内容信息。

图 2b展现了 query-stream 的自注意力计算,其中 $g_i^{(0)}$ 由可学习的参数进行初始化,因为它能看见 token 3,2,4 的内容信息,所以这里用的是内容信息 $h_3^{(0)},h_2^{(0)},h_4^{(0)}$,同时对于第 1 个地位,只能应用地位信息,而不能应用内容信息,所以这里应用的是 $g_1^{(0)}$,它并不蕴含第 1 个地位的内容信息。这样就能比拟好地建模 $g_{\theta}(\text{x}_{\text{z}_{<t}},z_t)$。

图 2c展现了整体的计算流程,最初一层输入的 query 向量就是咱们想要的 $g_{\theta}(\text{x}_{\text{z}_{<t}},z_t)$。左边的两个矩阵别离展现了 content-streamquery-stream的 mask 矩阵内容,就是应用这样的 mask 矩阵来计算序列合成式的。对于这两个流的 Self-Attention 计算公式如下:

$$\begin{split} \begin{align} g_{z_t}^{(m)} & \leftarrow \text{Attention}(Q=g_{z_t}^{(m-1)},\, KV=h_{\text{z}_{<t}}^{(m-1)};\theta), \qquad \text{(query stream: use $z_t$ but cannot see $x_{z_t}$)} \\ h_{z_t}^{(m)} & \leftarrow \text{Attention}(Q=h_{z_t}^{(m-1)},\, KV=h_{\text{z}_{\leq t}}^{(m-1)};\theta), \qquad \text{(content stream: use both $z_t$ and $x_{z_t}$)} \end{align} \end{split}$$

以上是 XLNet 在 预训练 阶段的计算过程,这里须要留神的是,在 微调 阶段,XLNet仅仅应用 content respresentation 进行 fine-tune 上游工作。

1.3.3 引入 Transformer-XL 的想法

因为 XLNet 自身是个 AR 模型,它能够完满融入 Transformer-XL 的思维:绝对地位编码 segment 循环机制 。这两者的原理局部感兴趣的同学能够去浏览 Transformer-XL 内容,本文重点讨论一下segment 循环机制XLNet的融入过程。

顾名思义,segment 循环机制 是指长序列切分成 $n$ 个 segment (文本片段),而后将每个segment 顺次传入模型之中,同时传入到模型中,同时传入到模型中还有上一个 segment 的产生的输入,这个操作有点像 RNN,接管上一步的输入和以后步骤的输出,而后依据两者计算产生以后步骤的输入,只不过 RNN 的循环单位是单词,XLNet的循环单位是segment

给定一个长序列 $\text{s}$,上一个 segment 为 $\tilde{\text{x}}=s_{1:n}$,其对应的排列用 $\tilde{\text{z}}$ 示意;以后的 segment 为 $\text{x}=s_{n+1:2n}$,其对应的排列用 $\text{z}$ 示意。基于排列 $\tilde{\text{z}}$ 解决第 1 个 segment,并将其输入进行缓存,第 $m$ 层的输入用 $\tilde{h^{(m)}}$ 示意。则第 2 个segment 的计算能够依照如下形式进行:

$$\begin{split} \begin{align} g_{z_t}^{(m)} & \leftarrow \text{Attention}(Q=g_{z_t}^{(m-1)},\, KV=[\tilde{h}^{(m-1)},h_{\text{z}_{<t}}^{(m-1)}];\, \theta), \qquad \text{(query stream: use $z_t$ but cannot see $x_{z_t}$)} \\ h_{z_t}^{(m)} & \leftarrow \text{Attention}(Q=h_{z_t}^{(m-1)},\, KV=[\tilde{h}^{(m-1)},h_{\text{z}_{\leq t}}^{(m-1)}];\, \theta), \qquad \text{(content stream: use both $z_t$ and $x_{z_t}$)} \end{align} \end{split}$$

行将前一个 segment 的输入和以后地位 $z_t$ 能看到的内容进行拼接,而后进行 Self-Attention 交融计算。

这里须要留神的是,因为序列中的 position embedding 仅仅依赖于原始序列(输出序列)的地位,而不是排列的程序,所以一旦前一个segment 的输入 $\tilde{h}^{(m)}$ 确定,上述的 Attention 计算和前一个 segment 的合成程序无关。这容许咱们去缓存或者复用前一个 segment 的输入,而不必去管前一个 segment 的合成程序。

1.3.4 对于 XLNet 的一些 Trick

Partial Prediction

最开始的时候有提到,AR 模型 通过预计一串文本序列的生成概率分布进行建模:$\sum_{t=1}^n log\;p_{\theta}(x_{z_t}|\text{x}_{\text{z}<t})$。PLM 尽管解决了 AR 模型建模过程中的双向问题,然而因为通过这种排列组合的模式训练,导致 XLNet 收敛会比较慢。

因而 XLNet 在训练过程中,只抉择预测序列最初面的局部地位的 token,这里波及到一个切分点地位 $c$,它将批示不预测在 $c$ 前边的地位 $\text{z}_{\leq c}$,只预测 $c$ 后边的地位 ${\text{z}_{>c}}$。XLNet中切分点 $c$ 的抉择由超参数 $K$ 来确定,$K \approx \frac{n}{n-c}$,其中 $n$ 为序列长度。$K$ 越大,则须要预测的 token 数量越少。

这就是 Partial Prediction 局部预测,对于切分点 $c$ 之前的 token 无需计算 query representation,这会大大节俭内存,放慢模型训练速度。退出切分点后,XLNet的指标函数将变为:

$$\begin{align} \mathop{max}_{\theta} \quad \mathbb{E}_{\text{z}∼\mathbb{Z}} log \, p_{\theta}(\text{x}_{z_{>c}}|\text{x}_{\leq c}) = \mathop{max}_{\theta}\quad \mathbb{E}_{\text{z}∼\mathbb{Z}} \left[\sum_{t=c+1}^n log\;p_{\theta}(x_{z_t}|\text{x}_{\text{z}_{<t}}) \right] \end{align}$$

Multiple Segment Input

许多上游工作存在多段输出的状况,比方 QA 工作中蕴含 query(简记为 A)和 answer (简记为 B)两个局部,数据的输出模式同 BERT 统一:$\text{[CLS, A, SEP, B, SEP]}$。

然而在 segment 循环的时候,每个局部仅仅应用对应上下文的状态缓存。

Relative Segment Encoding

Relative Segment Encoding (绝对段编码),这里的 Segment 不是上边将的将序列划分为固定的 Segment,而是指输出数据的不同局部,例如 $\text{[CLS, A, SEP, B, SEP]}$,$\text{A}$ 和 $\text{B}$ 别离属于不同的 Segment。

BERT 间接应用了相对编码,间接给 $\text{A}$ 和 $\text{B}$ 中的 token 顺次设置了 0 和 1,用来批示整个序列中 $\text{A}$ 和 $\text{B}$ 是不同的segment,即是不同的文本段,例如一个是 query,另一个是 answer。

XLNet与 BERT 不同,它应用了绝对编码,给定序列中的两个地位 $i$ 和 $j$,判断这两个地位对应的 token 是否在同一个 segment 外面,如果两者在同一个 segment 外面,$s_{ij}=s_+$,否则 $s_{ij}=s_-$。当预测第 $i$ 个地位 token 的时候,须要计算用 $i$ 地位的向量向另一地位 $j$ 做 attention 获取分数,其依照如下公式计算:

$$\alpha_{i,j} = (q_i+b)^T s_{ij}$$

其中 $q_i$ 为第 $i$ 个地位的查问向量,$b$ 是一个可学习的参数。最终 $a_{i,j}$ 将被加到失常 Self-Attention 的注意力分数上。

应用绝对段编码有这样的劣势:

  • 模型的泛化成果会更好;
  • 在微调工作上,它反对超过两个 segment 输出的上游工作(尽管预训练过程中应用了两个segment);

相干材料

  1. XLNet:Generalized Autoregressive Pretraining for Language Understanding
  2. XLNet Github

2.BERT

2.1 BERT 介绍

  • BERT(Bidirectional Encoder Representation from Transformers)是 2018 年 10 月由 Google AI 研究院提出的一种预训练模型,该模型在机器浏览了解顶级程度测试 SQuAD1.1 中体现出惊人的问题: 全副两个掂量指标上全面超过人类,并且在 11 种不同 NLP 测试中创出 SOTA 体现,包含将 GLUE 基准推高至 80.4% (相对改良 7.6%),MultiNLI 准确度达到 86.7% (相对改良 5.6%),成为 NLP 发展史上的里程碑式的模型成就。
  • BERT 的网络架构应用的是《Attention is all you need》中提出的多层 Transformer 构造,如 图 1 所示。其最大的特点是摈弃了传统的 RNN 和 CNN,通过 Attention 机制将任意地位的两个单词的间隔转换成 1,无效的解决了 NLP 中辣手的长期依赖问题。Transformer 的构造在 NLP 畛域中曾经失去了广泛应用。

2.2 BERT 框架

BERT 整体框架蕴含 pre-train 和 fine-tune 两个阶段。pre-train 阶段模型是在无标注的标签数据上进行训练,fine-tune 阶段,BERT 模型首先是被 pre-train 模型参数初始化,而后所有的参数会用上游的有标注的数据进行训练。

图 1 BERT 构造

BERT 是用了 Transformer 的 encoder 侧的网络,encoder 中的 Self-attention 机制在编码一个 token 的时候同时利用了其上下文的 token,其中‘同时利用上下文’即为双向的体现,而并非想 Bi-LSTM 那样把句子倒序输出一遍。

在它之前是 GPT,GPT 应用的是 Transformer 的 decoder 侧的网络,GPT 是一个单向语言模型的预训练过程,更实用于文本生成,通过前文去预测以后的字。

2.2.1Embedding

Embedding 由三种 Embedding 求和而成:

  • Token Embeddings 是词向量,第一个单词是 CLS 标记,能够用于之后的分类工作
  • Segment Embeddings 用来区别两种句子,因为预训练不光做 LM 还要做以两个句子为输出的分类工作
  • Position Embeddings 和之前文章中的 Transformer 不一样,不是三角函数而是学习进去的

其中 [CLS] 示意该特色用于分类模型,对非分类模型,该符号能够省去。[SEP]示意分句符号,用于断开输出语料中的两个句子。

BERT 在第一句前会加一个 [CLS] 标记,最初一层该位对应向量能够作为整句话的语义示意,从而用于上游的分类工作等。因为与文本中已有的其它词相比,这个无显著语义信息的符号会更“偏心”地交融文本中各个词的语义信息,从而更好的示意整句话的语义。具体来说,self-attention 是用文本中的其它词来加强指标词的语义示意,然而指标词自身的语义还是会占次要局部的,因而,通过 BERT 的 12 层(BERT-base 为例),每次词的 embedding 交融了所有词的信息,能够去更好的示意本人的语义。而 [CLS] 位自身没有语义,通过 12 层,句子级别的向量,相比其余失常词,能够更好的表征句子语义。

2.2.2Transformer Encoder

BERT 是用了 Transformer 的 encoder 侧的网络,如上图的 transformer 的 Encoder 局部,对于 transformer 的 encoder 的具体介绍能够参考链接:https://paddlepedia.readthedocs.io/en/latest/tutorials/pretra…

在 Transformer 中,模型的输出会被转换成 512 维的向量,而后分为 8 个 head,每个 head 的维度是 64 维,然而 BERT 的维度是 768 维度,而后分成 12 个 head,每个 head 的维度是 64 维,这是一个渺小的差异。Transformer 中 position Embedding 是用的三角函数,BERT 中也有一个 Postion Embedding 是随机初始化,而后从数据中学进去的。

BERT 模型分为 24 层和 12 层两种,其差异就是应用 transformer encoder 的层数的差别,BERT-base 应用的是 12 层的 Transformer Encoder 构造,BERT-Large 应用的是 24 层的 Transformer Encoder 构造。

2.2.3 BERT 可视化

如上图将注意力看做不同的连线,它们用来连贯被更新的地位(左半边)与被留神的地位(右半边)。不同的色彩别离代表相应的留神头,而线条色彩的深浅代表被留神的强度。

2.2.4 注意力六种模式

为了不便演示,这里采纳以下例句:

句子 A:I went to the store. 句子 B:At the store, I bought fresh strawberries.

BERT 用 WordPiece 工具来进行分词,并插入非凡的拆散符([CLS],用来分隔样本)和分隔符([SEP],用来分隔样本内的不同句子)。

因而理论输出序列为:[CLS] i went to the store . [SEP] at the store , i bought fresh straw ##berries . [SEP]

模式 1:留神下一个词

在这种模式中,每个地位次要留神序列中的下一个词(token)。上面将看到第 2 层 0 号头的一个例子。(所选头部由顶部色彩条中突出的显示色块示意。)

模式 1:留神下一个词。

左:所有词的注意力。右:所选词的注意力权重(“i”)

右边显示了所有词的注意力,而右侧图显示一个特定词(“i”)的注意力。在这个例子中,“i”简直所有的注意力都集中在“went”上,即序列中的下一个词。

在左侧,能够看到 [SEP]符号不合乎这种注意力模式,因为 [SEP] 的大多数注意力被疏导到了 [CLS] 上,而不是下一个词。因而,这种模式仿佛次要在每个句子外部呈现。

该模式与后向 RNN 无关,其状态的更新是从右向左顺次进行。模式 1 呈现在模型的多个层中,在某种意义上模仿了 RNN 的循环更新。

模式 2:留神前一个词

在这种模式中,大部分注意力都集中在句子的前一个词上。例如,下图中“went”的大部分注意力都指向前一个词“i”。

这个模式不像上一个那样显著。有一些注意力也扩散到其余词上了,特地是 [SEP] 符号。与模式 1 一样,这与 RNN 有些相似,只是这种状况下更像前向 RNN。

模式 2:留神前一个词。

左:所有词的注意力。右:所选词的注意力权重(“went”)

模式 3:留神雷同或相干的单词

这种模式留神雷同或相干的单词,包含其自身。在上面的例子中,第一次呈现的“store”的大部分注意力都是针对本身和第二次呈现的“store”。这种模式并不像其余一些模式那样显著,注意力会扩散在许多不同的词上。

模式 3:留神雷同 / 相干的词。

左:所有词的注意力。右:所选词的留神权重(“store”)

模式 4:留神“其余”句子中雷同或相干词

这种模式留神另一个句子中雷同或相干的单词。例如,第二句中“store”的大部分注意力都指向第一句中的“store”。能够设想这对于下句预测工作(BERT 预训练任务的一部分)特地有用,因为它有助于辨认句子之间的关系。

模式 4:留神其余句子中雷同 / 相干的单词。

左:所有词的注意力。右:所选词的留神权重(“store”)

模式 5:留神能预测该词的其余单词

这种模式仿佛是更留神能预测该词的词,而不包含该词自身。在上面的例子中,“straw”的大部分注意力都集中在“##berries”上(strawberries 草莓,因为 WordPiece 离开了),而“##berries”的大部分注意力也都集中在“straw”上。

模式 5:留神能预测该单词的其余单词。

左:所有词的注意力。右:所选词的注意力(“## berries”)

这个模式并不像其余模式那样显著。例如,词语的大部分注意力都集中在定界符([CLS])上,而这是上面探讨的模式 6 的特色。

模式 6:留神分隔符

在这种模式中,词语的大部分注意力都集中在分隔符 [CLS] 或 [SEP]上。在上面的示例中,大部分注意力都集中在两个 [SEP]符号上。这可能是模型将句子级状态流传到单个词语上的一种形式。

模式 6:留神分隔符。左:所有词的注意力。右:所选词的留神权重(“store”)

2.3 BERT 的预训练任务

BERT 是一个多任务模型,它的预训练(Pre-training)工作是由两个自监督工作组成,即 MLM 和 NSP,如 图 2 所示。

图 2 BERT 预训练过程示意图

2.3.1MLM

  • MLM 是指在训练的时候随即从输出语料上 mask 掉一些单词,而后通过的上下文预测该单词,该工作十分像咱们在中学期间常常做的完形填空。正如传统的语言模型算法和 RNN 匹配那样,MLM 的这个性质和 Transformer 的构造是十分匹配的。在 BERT 的试验中,15% 的 WordPiece Token 会被随机 Mask 掉。在训练模型时,一个句子会被屡次喂到模型中用于参数学习,然而 Google 并没有在每次都 mask 掉这些单词,而是在确定要 Mask 掉的单词之后,做以下解决。

    • 80% 的时候会间接替换为[Mask],将句子“my dog is cute”转换为句子“my dog is [Mask]”。
    • 10% 的时候将其替换为其它任意单词,将单词“cute”替换成另一个随机词,例如“apple”。将句子“my dog is cute”转换为句子“my dog is apple”。
    • 10% 的时候会保留原始 Token,例如放弃句子为“my dog is cute”不变。

这么做的起因是如果句子中的某个 Token 100% 都会被 mask 掉,那么在 fine-tuning 的时候模型就会有一些没有见过的单词。退出随机 Token 的起因是因为 Transformer 要放弃对每个输出 token 的分布式表征,否则模型就会记住这个 [mask] 是 token’cute‘。至于单词带来的负面影响,因为一个单词被随机替换掉的概率只有 15%*10% =1.5%,这个负面影响其实是能够忽略不计的。另外文章指出每次只预测 15% 的单词,因而模型收敛的比较慢。

长处

  • 1)被随机抉择 15% 的词当中以 10% 的概率用任意词替换去预测正确的词,相当于文本纠错工作,为 BERT 模型赋予了肯定的文本纠错能力;
  • 2)被随机抉择 15% 的词当中以 10% 的概率放弃不变,缓解了 finetune 时候与预训练时候输出不匹配的问题(预训练时候输出句子当中有 mask,而 finetune 时候输出是完整无缺的句子,即为输出不匹配问题)。

毛病

  • 针对有两个及两个以上间断字组成的词,随机 mask 字割裂了间断字之间的相关性,使模型不太容易学习到词的语义信息。次要针对这一短板,因而 google 尔后发表了 BERT-WWM,国内的哈工大联结讯飞发表了中文版的 BERT-WWM。

2.3.2NSP

  • Next Sentence Prediction(NSP)的工作是判断句子 B 是否是句子 A 的下文。如果是的话输入’IsNext‘,否则输入’NotNext‘。训练数据的生成形式是从平行语料中随机抽取的间断两句话,其中 50% 保留抽取的两句话,它们合乎 IsNext 关系,另外 50% 的第二句话是随机从预料中提取的,它们的关系是 NotNext 的。这个关系保留在图 4 中的 [CLS] 符号中。

留神

  • 在尔后的钻研(论文《Crosslingual language model pretraining》等)中发现,NSP 工作可能并不是必要的,打消 NSP 损失在上游工作的性能上可能与原始 BERT 持平或略有进步。这可能是因为 Bert 以单句子为单位输出,模型无奈学习到词之间的近程依赖关系。针对这一点,后续的 RoBERTa、ALBERT、spanBERT 都移去了 NSP 工作。

BERT 预训练模型最多只能输出 512 个词,这是因为在 BERT 中,Token,Position,Segment Embeddings 都是通过学习来失去的。在间接应用 Google 的 BERT 预训练模型时,输出最多 512 个词(还要除掉 [CLS] 和[SEP]),最多两个句子合成一句。这之外的词和句子会没有对应的 embedding。

如果有足够的硬件资源本人从新训练 BERT,能够更改 BERT config,设置更大 max_position_embeddings 和 type_vocab_size 值去满足本人的需要。

2.4 BERT 的微调

在海量的语料上训练完 BERT 之后,便能够将其利用到 NLP 的各个工作中了。微调 (Fine-Tuning) 的工作包含:基于句子对的分类工作,基于单个句子的分类工作,问答工作,命名实体辨认等。

  • 基于句子对的分类工作:

    • MNLI:给定一个前提 (Premise),依据这个前提去推断假如 (Hypothesis) 与前提的关系。该工作的关系分为三种,蕴含关系 (Entailment)、矛盾关系 (Contradiction) 以及中立关系 (Neutral)。所以这个问题实质上是一个分类问题,咱们须要做的是去挖掘前提和假如这两个句子对之间的交互信息。
    • QQP:基于 Quora,判断 Quora 上的两个问题句是否示意的是一样的意思。
    • QNLI:用于判断文本是否蕴含问题的答案,相似于咱们做浏览了解定位问题所在的段落。
    • STS-B:预测两个句子的相似性,包含 5 个级别。
    • MRPC:也是判断两个句子是否是等价的。
    • RTE:相似于 MNLI,然而只是对蕴含关系的二分类判断,而且数据集更小。
    • SWAG:从四个句子中抉择为可能为前句下文的那个。
  • 基于单个句子的分类工作

    • SST-2:电影评估的情感剖析。
    • CoLA:句子语义判断,是否是可承受的(Acceptable)。
  • 问答工作

    • SQuAD v1.1:给定一个句子(通常是一个问题)和一段形容文本,输入这个问题的答案,相似于做浏览了解的简答题。
  • 命名实体辨认

    • CoNLL-2003 NER:判断一个句子中的单词是不是 Person,Organization,Location,Miscellaneous 或者 other(无命名实体)。

图 3 BERT 用于不同的 NLP 工作

2.5 BERT,GPT,ELMO 的区别

如上图所示,图中的 Trm 代表的是 Transformer 层,E 代表的是 Token Embedding,即每一个输出的单词映射成的向量,T 代表的是模型输入的每个 Token 的特征向量示意。

BERT 应用的是双向的 Transformer,OpenAI GPT 应用的是从左到右的 Transformer。ELMo 应用的是独自的从左到右和从右到左的 LSTM 拼接而成的特色。其中只有 BERT 在所有的层思考了左右上下文。除此之外,BERT 和 OpenAI GPT 是微调(fine-tuning)的办法,而 ELMo 是一个基于特色的办法。

2.5.1 BERT 比 ELMo 成果好的起因

从网络结构以及最初的试验成果来看,BERT 比 ELMo 成果好次要集中在以下几点起因:

  1. LSTM 抽取特色的能力远弱于 Transformer
  2. 拼接形式双向交融的特色交融能力偏弱
  3. BERT 的训练数据以及模型参数均多于 ELMo

2.5.2 优缺点

  • 长处

    • BERT 相较于原来的 RNN、LSTM 能够做到并发执行,同时提取词在句子中的关系特色,并且能在多个不同档次提取关系特色,进而更全面反映句子语义。
    • 相较于 word2vec,其又能依据句子上下文获取词义,从而防止歧义呈现。
  • 毛病

    • 模型参数太多,而且模型太大,大量数据训练时,容易过拟合。
    • BERT 的 NSP 工作成果不显著,MLM 存在和上游工作 mismathch 的状况。
    • BERT 对生成式工作和长序列建模反对不好。
正文完
 0