第8章:神经网络
在本章中,我们构建一个基于神经网络的分类器,以解决第6章中的新闻分类任务。编写程序时,请活用PyTorch, TensorFlow, Chainer等深度学习库。
70. 基于词向量之和来生成特征Permalink
考虑将第50问中构建的训练集、验证集与测试集表示为矩阵或向量的形式。具体地,对于每一个数据集,分别构建:
- 特征矩阵X,由所有实例的特征向量xi拼接而成;
- 标签向量Y,由所有实例所对应的真实类别标注yi排列而成。
即:
X=(x1x2…xn)∈Rn×d,Y=(y1y2…yn)∈Nn上式中,n代表数据集中的实例总数。 xi∈Rd 及 yi∈N 分别代表第i∈1,...,n个实例所对应的特征向量及真实类别标签。 设 N4 代表小于4的自然数(包括0),本次任务中,我们进行{“Business”, “Science”, “Entertainment”, “Health”}的四分类,则任一实例的真实类别标签yi均可用yi∈N4表示。下文以L代表类别的种数(这里L=4)。
第i个实例的特征向量xi可以通过下式计算:
xi=1TiTi∑t=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)基于上述要求, 创建以下矩阵和向量,并保存至文件:
- 训练集的特征矩阵: Xtrain∈RNt×d
- 训练集的标签向量: Ytrain∈NNt
- 验证集的特征矩阵: Xvalid∈RNv×d
- 验证集的标签向量: Yvalid∈NNv
- 测试集的特征矩阵: Xtest∈RNe×d
- 测试集的标签向量: Ytest∈NNe
其中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)W∈Rd×L是单层神经网络的权重矩阵。本问的计算中,暂时直接使用随机初始化的值(第73问中将通过机器学习更新此权重矩阵)。 注意ˆy1∈RL代表使用未经学习的权重矩阵W计算后,实例x1所属类别的概率分布。 类似地,ˆY∈Rn×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)、增加网络层数等操作,改变神经网络的架构,以构建一个高性能的分类器。