第9章: RNN 与 CNN
80. 将单词转换为数字IDPermalink
考虑第51问中所创建的数据,试将其中的单词按如下规则转化为ID:
- 按在数据集中的词频对这些单词降序排序,ID与词频的排名相对应(词频最高的单词ID为
1
,词频第二高的单词ID为2
,以此类推); - 对于所有词频为1的单词,令它们的ID为
0
。
实现一个函数以满足上述要求,接收单词的序列作为输入,返回其对应ID的序列作为输出。
81. 使用RNN进行预测Permalink
现有一个ID的序列\boldsymbol{x} = (x_1, x_2, \dots, x_T),与某个单词的序列相对应。 其中,T表示该序列中单词的总数,x_t \in \mathbb{R}^{V}表示第t个单词所对应的ID的one-hot编码向量(V表示词表中单词的总数)。 使用循环神经网络(RNN, Recurrent Neural Network)构建一个模型,按下式通过ID的序列\boldsymbol{x}预测其所属的类别y:
\overrightarrow{h}_0 = 0, \\ \overrightarrow{h}_t = {\rm \overrightarrow{RNN}}(\mathrm{emb}(x_t), \overrightarrow{h}_{t-1}), \\ y = {\rm softmax}(W^{(yh)} \overrightarrow{h}_T + b^{(y)}),其中,\mathrm{emb}(x) \in \mathbb{R}^{d_w}表示词嵌入,是一个将one-hot编码向量(稀疏,高维)映射到词向量(密集,低维)的函数。\overrightarrow{h}_t \in \mathbb{R}^{d_h}表示时序上t时刻的隐状态(hidden state)。{\rm \overrightarrow{RNN}}(x,h)表示一个RNN单元,利用当前时刻t的输入x与前一时刻的隐状态h计算下一个时刻的隐状态。 W^{(yh)} \in \mathbb{R}^{L \times d_h} 是一个线性映射矩阵,从隐状态的空间映射到用于预测类别的空间,b^{(y)} \in \mathbb{R}^{L}是偏置项(d_w, d_h 和 L分别表示词向量的维度,隐状态的维度与类别数量)。RNN单元{\rm \overrightarrow{RNN}}(x,h)可以有各种不同的构成,如:
{\rm \overrightarrow{RNN}}(x,h) = g(W^{(hx)} x + W^{(hh)}h + b^{(h)}),其中,W^{(hx)} \in \mathbb{R}^{d_h \times d_w},W^{(hh)} \in \mathbb{R}^{d_h \times d_h}, b^{(h)} \in \mathbb{R}^{d_h}是RNN单元的参数,g表示激活函数(如\tanh,ReLU等)。
这里暂不需要训练模型,只需随机初始化模型参数并计算分类y即可。合理设置参数的维度,如d_w = 300, d_h=50。后续问题将沿用本问的设定。
82. 使用随机梯度下降法进行训练Permalink
使用随机梯度下降法(SGD,Stochastic Gradient Descent)训练第81问中的模型,训练过程中,打印出模型在训练集与验证集上的损失与正确率。选用适当的基准终止训练(如“10个Epochs后停止”)。
83. Mini-batch, GPU训练Permalink
修改第82问中的代码,使其以每B个实例为单位计算损失与梯度,并在GPU上进行训练(适当选择B的值)。
84. 使用预训练词向量Permalink
使用预训练词向量(如Google News embeddings,在约1,000亿单词上训练所得)初始化词嵌入\mathrm{emb}(x),并训练模型。
85. 双向RNN与多层RNNPermalink
使用前向和反向RNN对输入文本进行编码,并训练模型。
\overleftarrow{h}_{T+1} = 0, \\ \overleftarrow{h}_t = {\rm \overleftarrow{RNN}}(\mathrm{emb}(x_t), \overleftarrow{h}_{t+1}), \\ y = {\rm softmax}(W^{(yh)} [\overrightarrow{h}_T; \overleftarrow{h}_1] + b^{(y)})其中,\overrightarrow{h}_t \in \mathbb{R}^{d_h}, \overleftarrow{h}_t \in \mathbb{R}^{d_h}分别代表时刻t时,在前向和反向RNN上求得的隐状态向量。 {\rm \overleftarrow{RNN}}(x,h)使用当前时刻的输入x与下一时刻的隐状态h计算前一时刻的隐状态,W^{(yh)} \in \mathbb{R}^{L \times 2d_h}是一个线性映射矩阵,从隐状态的空间映射到用于预测类别的空间,b^{(y)} \in \mathbb{R}^{L}是偏置项。 [a; b]表示两个向量a与b的拼接(concatenation)。
在此基础上,增加双向RNN的层数,并重复此实验。
86. 卷积神经网络 (CNN)Permalink
现有一个ID的序列\boldsymbol{x} = (x_1, x_2, \dots, x_T),与某个单词的序列相对应。 其中,T表示该序列中单词的总数,x_t \in \mathbb{R}^{V}表示第t个单词所对应的ID的one-hot编码向量(V表示词表中单词的总数)。使用卷积神经网络(CNN, Convolutional Neural Network)构建一个模型,通过ID的序列\boldsymbol{x}预测其所属的类别y。
CNN的设定如下:
- 词嵌入向量的维度: d_w
- 卷积核(Filter):3个词
- 卷积步长(Stride):1个词
- 卷积填充(Padding):启用
- 每次卷积操作后产生的向量维度:d_h
- 每次卷积操作后,使用最大池化(max-pooling)将输入句子表示为d_h维的向量
即,t时刻的特征向量p_t \in \mathbb{R}^{d_h}以下述公式计算:
p_t = g(W^{(px)} [\mathrm{emb}(x_{t-1}); \mathrm{emb}(x_t); \mathrm{emb}(x_{t+1})] + b^{(p)})其中, W^{(px)} \in \mathbb{R}^{d_h \times 3d_w}, b^{(p)} \in \mathbb{R}^{d_h}代表CNN的参数, g是激活函数(如\tanh,ReLU等),[a; b; c]表示向量a,b,c的拼接。矩阵W^{(px)}的列数为3d_w,因为需要对3个拼接后的词向量进行线性映射。
最大池化操作中,取所有时刻的特征向量在各个维度上的最大值,获得输入文章的特征向量c \in \mathbb{R}^{d_h}。假设c[i]代表向量c的第i个维度,最大池化以下述公式计算:
c[i] = \max_{1 \leq t \leq T} p_t[i]最后,使用矩阵W^{(yc)} \in \mathbb{R}^{L \times d_h}及偏置b^{(y)} \in \mathbb{R}^{L}对输入文章的特征向量进行线性映射,然后使用softmax函数预测其所属类别y:
y = {\rm softmax}(W^{(yc)} c + b^{(y)})这里暂不需要训练模型,只需随即初始化模型参数并计算y即可。
87. 使用随机梯度下降法进行CNN训练Permalink
使用随机梯度下降法(SGD)训练第86问中的模型,训练过程中,打印出模型在训练集与验证集上的损失与正确率。选用适当的基准终止训练(如“10个Epochs后停止”)。
88. 超参数调节Permalink
修改第85问或第87问中的代码,改变神经网络的架构或调节超参数,以构建一个高性能的分类器。
89. 基于预训练语言模型的迁移学习Permalink
从预训练的语言模型(如BERT等)出发,构建一个能对新闻标题进行分类的模型。