第8章:神经网络

在本章中,我们构建一个基于神经网络的分类器,以解决第6章中的新闻分类任务。编写程序时,请活用PyTorch, TensorFlow, Chainer等深度学习库。

70. 基于词向量之和来生成特征Permalink

考虑将第50问中构建的训练集、验证集与测试集表示为矩阵或向量的形式。具体地,对于每一个数据集,分别构建:

  • 特征矩阵X,由所有实例的特征向量xi拼接而成;
  • 标签向量Y,由所有实例所对应的真实类别标注yi排列而成。

即:

X=(x1x2xn)Rn×d,Y=(y1y2yn)Nn

上式中,n代表数据集中的实例总数。 xiRdyiN 分别代表第i1,...,n个实例所对应的特征向量及真实类别标签。 设 N4 代表小于4的自然数(包括0),本次任务中,我们进行{“Business”, “Science”, “Entertainment”, “Health”}的四分类,则任一实例的真实类别标签yi均可用yiN4表示。下文以L代表类别的种数(这里L=4)。

i个实例的特征向量xi可以通过下式计算:

xi=1TiTit=1emb(wi,t),

其中第i个实例由单词序列(wi,1,...,wi,Ti)构成,共Ti个词,对应该实例的标题;每个词w对应的词向量为emb(w)Rd(维度为d)。 我们直接使用60问中所提供的预训练词向量,因此维度为300(即d=300)。

i个实例的真实类别标签yi通过下式定义(保证类别名与其标签一一对应即可):

yi={0(if article xi belongs to Business category)1(if article xi belongs to Science category)2(if article xi belongs to Entertainment category)3(if article xi belongs to Health category)

基于上述要求, 创建以下矩阵和向量,并保存至文件:

  • 训练集的特征矩阵: XtrainRNt×d
  • 训练集的标签向量: YtrainNNt
  • 验证集的特征矩阵: XvalidRNv×d
  • 验证集的标签向量: YvalidNNv
  • 测试集的特征矩阵: XtestRNe×d
  • 测试集的标签向量: YtestNNe

其中Nt,Nv,Ne分别代表训练集,验证集,测试集中的实例总数。

71. 基于单层神经网络的预测Permalink

读取第70问中所保存的矩阵与向量,在训练集上进行如下计算:

ˆy1=softmax(x1W),ˆY=softmax(X[1:4]W)

其中,softmax代表softmax函数,X[1:4]R4×d代表由x1,x2,x3,x4纵向连接而成的矩阵,即:

X[1:4]=(x1x2x3x4)

WRd×L是单层神经网络的权重矩阵。本问的计算中,暂时直接使用随机初始化的值(第73问中将通过机器学习更新此权重矩阵)。 注意ˆy1RL代表使用未经学习的权重矩阵W计算后,实例x1所属类别的概率分布。 类似地,ˆYRn×L代表训练集中的实例x1,x2,x3,x4所属类别的概率分布。

72. 计算损失(loss)及梯度(gradients)Permalink

在训练集中的实例x1与实例集合x1,x2,x3,x4上分别计算交叉熵损失(cross-entropy loss)及对矩阵W的梯度。对于单个实例x1,使用下式计算损失:

li=log[样本xi被分类为yi的概率]

对于一个实例集合,求集合中各实例损失的平均值,作为该集合的交叉熵损失。

73. 基于随机梯度下降法(SGD)的训练Permalink

使用随机梯度下降法(Stochastic Gradient Descent)更新矩阵W。 选用适当的基准终止训练(如“100个epochs后终止”)。

74. 计算正确率Permalink

使用第73问中训练所得的矩阵对训练集与验证集进行分类,并分别计算正确率。

75. 损失与正确率的可视化Permalink

修改第73问中的代码,使得每个epoch完成训练后,以折线图的方式记录模型当前:

  • 在训练集上的损失;
  • 在训练集上的正确率;
  • 在验证集上的损失;
  • 在验证集上的正确率。

通过该组折线图监控训练的进程。

76. 检查点(Checkpoints)Permalink

修改第75问中的代码,使得每个epoch训练结束后,保存检查点(模型参数的值,优化算法的状态等)至文件。

77. Mini-batchesPermalink

修改第76问中的代码,使得以每B个实例为单位计算损失和梯度,并更新权重矩阵W(mini-batch化)。改变B的值为1,2,4,8,,比较不同情况下训练一个epoch所耗费的时间。

78. GPU训练Permalink

修改77问中的代码,使得训练能够在GPU上进行。

79. 多层神经网络Permalink

修改第78问中的代码,通过引入偏置项(bias)、增加网络层数等操作,改变神经网络的架构,以构建一个高性能的分类器。