Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

6.5 将嵌入作为神经网络分类器的输入

人工特征是设计分类器的传统方式,但多数 NLP 神经网络应用并不以人工工程特征为输入,而是把词元表示为嵌入,利用深度学习从数据中学习特征的能力。本节用第 5 章介绍的静态 word2vec 或 GloVe 嵌入表示每个词元。所谓静态,是指每个词元由一个训练一次后固定不变的向量表示,并存入大字典;需要该词元时,直接从字典取出其嵌入。

第 7 章把神经模型用于语言建模时,情况会更复杂:我们将使用更强大的上下文嵌入(contextual embedding)。一个词每次出现在不同语境中都会有不同的嵌入,而且这些嵌入会在词预测任务中由网络一同学得。

下面仍考察文本分类,但用静态嵌入取代人工特征。先聚焦推理阶段,假设所有输入词元的嵌入都已学好。嵌入是表示输入词元的 dd 维向量;存储这些静态嵌入的字典称为嵌入矩阵(embedding matrix)E\mathbf E。矩阵每一行用一个 dd 维行向量表示词表 VV 中的一个词元,因此 E\mathbf E 的形状为 [V×d][|V|\times d]。凡是把嵌入作为神经 NLP 系统输入时——包括后续章节的 Transformer 大语言模型——都会用到嵌入矩阵。

给定 dessert was great,先把词元转换为词表索引(最初用 BPE 或 SentencePiece 切分输入时创建),例如 w=[3,524,902]\mathbf w=[3,524,902];然后通过索引选择 E\mathbf E 中对应的第 3、524、902 行。

还可以把输入词元表示为形状 [1×V][1\times|V|] 的独热向量,即词表中每个词对应一个维度。独热向量除词表索引对应元素为 1 外,其余均为 0。若 dessert 的索引为 3,则 x3=1x_3=1xi=0,i3x_i=0,\forall i\ne3

[001000][0\quad0\quad1\quad0\quad0\quad\ldots\quad0]

嵌入矩阵与只有一个非零元素 xi=1x_i=1 的独热向量相乘,等价于选出词 ii 对应的行向量,即词 ii 的嵌入。

图 6.11 嵌入矩阵 E\mathbf E 与索引 3 处为 1 的独热向量相乘,从而选出词 V3V_3 的嵌入向量。

把这一思想扩展到完整输入序列,即可用独热向量矩阵表示 NN 个输入位置。

图 6.12 将词元 ID 序列 W\mathbf W 对应的独热矩阵乘嵌入矩阵 E\mathbf E,选出输入序列的嵌入矩阵。

现在要把表示 NN 个词元窗口的 NN[1×d][1\times d] 嵌入分类为一个类别(如正面或负面)。

将嵌入传给分类器有两种常见方式:拼接(concatenation)和池化(pooling)。第一种把形状为 [N×d][N\times d] 的输入中所有向量拼接成长向量,重塑为 [1×dN][1\times dN],再交给分类器。这保留了大量信息,但网络会很大。第二种把 NN 个嵌入池化为一个嵌入,再传给分类器。池化丢失部分原始信息,却更小、更高效,尤其适合不太关心原始词序的任务。下面分别以情感任务和语言建模任务为例。

为情感分析池化输入嵌入

情感分类中,输入词的确切位置——例如 great 是第一个词还是第二个词——通常不如词本身重要。池化函数(pooling function)把一组嵌入变为单个嵌入。对包含 NN 个词元 w1,,wNw_1,\ldots,w_N 的文本,要把 NNdd 维行嵌入 e(w1),,e(wN)\mathbf e(w_1),\ldots,\mathbf e(w_N) 变成一个同样为 dd 维的嵌入。

最简单的是均值池化(mean pooling):对嵌入求和后除以 NN

xmean=1Ni=1Ne(wi)(6.21)\mathbf x_{\mathrm{mean}}=\frac1N\sum_{i=1}^N\mathbf e(w_i)\tag{6.21}

使用均值池化的分类器方程为:

x=mean(e(w1),,e(wN))h=σ(xW+b)z=hUy^=softmax(z)(6.22)\begin{array}{ll}\mathbf x=&\operatorname{mean}(\mathbf e(w_1),\ldots,\mathbf e(w_N))\\\mathbf h=&\sigma(\mathbf x\mathbf W+\mathbf b)\\\mathbf z=&\mathbf h\mathbf U\\\hat{\mathbf y}=&\operatorname{softmax}(\mathbf z)\end{array}\tag{6.22}

其他方法包括最大池化(max pooling):对每个维度分别取全部输入中的元素最大值。NN 个向量的逐元素最大值是一个新向量,其第 kk 个元素为原来 NN 个向量第 kk 个元素的最大值。

图 6.13 使用输入词池化嵌入的前馈网络情感分析。在每个时间步,网络通过独热向量乘嵌入矩阵 E\mathbf E,为每个语境词计算 dd 维嵌入,再池化所得 NN 个嵌入,形成代表语境窗口的单个嵌入,作为 x\mathbf x 层。

为语言建模拼接输入嵌入

情感分析把 NN 个输入词元的嵌入先池化为单个向量,再输出正面、负面、中性三类概率。现在考虑语言建模(language modeling):根据先前词预测后续词。输入仍是 NN 个词元的窗口,但任务变成预测窗口之后的下一个词元。下面根据 Bengio et al.(2003)最早提出的算法,概述简单的前馈神经语言模型。它引出了第 7 章大语言建模中的许多重要概念。

神经语言模型相比第 3 章的 n 元语法模型有许多优点:能处理更长的历史,对含相似词的语境泛化得更好,词预测也准确得多。另一方面,它速度更慢、更复杂、训练能耗巨大、可解释性更差,因此某些小任务仍适合 n 元语法模型。

前馈神经语言模型在时刻 tt 接收若干先前词 (wt1,wt2,)(w_{t-1},w_{t-2},\ldots) 的表示,输出所有可能下一词的概率分布。与 n 元语法模型一样,它用前 N1N-1 个词近似给定完整历史的概率:

P(wtw1,,wt1)P(wtwtN+1,,wt1)(6.23)P(w_t\mid w_1,\ldots,w_{t-1})\approx P(w_t\mid w_{t-N+1},\ldots,w_{t-1})\tag{6.23}

下面使用四元语法例子,即估计 P(wt=iwt3,wt2,wt1)P(w_t=i\mid w_{t-3},w_{t-2},w_{t-1})

神经语言模型用嵌入表示先前语境中的词,而非像 n 元语法模型那样只用词身份,因此能更好地泛化到未见数据。假设训练时见过:

I have to make sure that the cat gets fed.

却从未在 dog 之后见过 gets fed。测试前缀为 “I forgot to make sure that the dog gets”,下一个词是什么?n 元语法模型会在 that the cat gets 后预测 fed,却不会在 that the dog gets 后这样预测;神经模型知道 cat 与 dog 的嵌入相似,因而能从 cat 语境泛化,在 dog 之后也给 fed 足够高的概率。

语言建模的输出向量包含 VV 个概率,每个可能的下一词元一个。词表可能有 60,000 到 300,000 个词元,所以输出远长于情感分类的三个元素。另一个区别是:这里不把 NN 个输入嵌入池化为一个嵌入,而将它们拼接成很长的输入向量;预测下一词元时,知道每个前置词元及其顺序很重要。

图 6.14 前馈神经语言模型的前向推理。时刻 tt,网络为 N=3N=3 个语境词元分别计算 dd 维嵌入,并拼接为嵌入层 e\mathbf ee\mathbf e 乘权重矩阵 W\mathbf W,逐元素应用激活函数得到隐藏层 h\mathbf h,再乘权重矩阵 U\mathbf U。softmax 输出节点 ii 预测下一词 wtw_t 为词表词 ViV_i 的概率。为适应页面,图中窗口大小仅为 3;实际语言建模需要长得多的语境。

图 6.14 中三个嵌入向量拼接成 e\mathbf e;它乘 W\mathbf W 产生隐藏层,再乘 U\mathbf U 产生输出层,softmax 给出词上的概率分布。例如输出节点 42 的值 y42y_{42},就是下一词 wtw_t 为词表索引 42 所对应词(例中为 fish)的概率。

窗口大小为 3、每个输入语境词均以独热向量给出的简单前馈神经语言模型方程为:

e=[Ext3;Ext2;Ext1]h=σ(We+b)z=Uhy^=softmax(z)(6.24)\begin{array}{ll}\mathbf e=&[\mathbf E\mathbf x_{t-3};\mathbf E\mathbf x_{t-2};\mathbf E\mathbf x_{t-1}]\\\mathbf h=&\sigma(\mathbf W\mathbf e+\mathbf b)\\\mathbf z=&\mathbf U\mathbf h\\\hat{\mathbf y}=&\operatorname{softmax}(\mathbf z)\end{array}\tag{6.24}

分号表示向量拼接,因此嵌入层 e\mathbf e 由三个语境向量的嵌入拼接而成。第 7 章介绍 Transformer 语言模型时,将回到用神经网络进行语言建模的思想。