PDF 物理页索引 370
文件中的第 371 页 · 印刷页码:354
人工智能与大数据技术导论
354
PDF 物理页索引 371
文件中的第 372 页 · 印刷页码:355
第10章 神经网络
!wget https://storage.googleapis.com/mledu-datasets/mnist\_test.csv -0 /tmp/mnist\_test.csv
执行过程与结果如图10-49、图10-50所示。
355
PDF 物理页索引 372
文件中的第 373 页 · 印刷页码:356
最后,可视化第一个隐藏层的权重。我们先看看模型的weights属性,以深入探索神经网络,并了解它学到了哪些规律。模型的输入层有784个权重,对应于28×28像素的输入图片。第一个隐藏层将有784×N个权重,其中N指的是该层中的节点数。我们可以将这些权重重新变回28×28像素的图片,具体方法是将N个1×784权重的数组变形为N个28×28大小的数组。运行以下单元格,绘制权重曲线图。注意,此单元格要求名为classifier的DNNClassifier已经过训练。
356
PDF 物理页索引 373
文件中的第 374 页 · 印刷页码:357
结果如图10-52所示。
神经网络的第一个隐藏层应该会对一些级别特别低的特征进行建模,因此可视化权重可能只显示一些模糊的区域,也可能只显示数字的某几个部分。此外,你可能还会看到一些基本上是噪点(这些噪点要么不收敛,要么被更高的层忽略)的神经元。在迭代不同的次数后,停止训练并查看效果,你可能会发现有趣的结果。建议读者分别用10、100和1000步训练分类器。然后重新运行此可视化代码。我们应该能看到不同级别的收敛之间有直观的差异。
10.4 嵌套
嵌套(embedding)广泛应用于推荐系统中。嵌套是一种相对低维的空间,可以将高维矢量映射到低维空间里。通过使用嵌套,可以使得在大型输入(比如代表字词的稀疏矢量)上进
第10章 神经网络
357
PDF 物理页索引 374
文件中的第 375 页 · 印刷页码:358
行机器学习变得更加容易。在理想情况下,嵌套可以将语义上相似的不同输入映射到嵌套空间里的邻近处,以此来捕获输入的语义。一个模型学习到的嵌套也可以被其他模型重用。
10.4.1 协同过滤
假设我们是爱奇艺的开发小组,上面有一百万部电影和几十万用户,而且知道每个用户观看过哪些电影。我们的任务很简单:基于观看记录向用户推荐电影。比如,小李观看了一部电影,那么相似的其他电影也是一部值得推荐的好电影。在机器学习中,这叫协同过滤(CollaborativeFiltering),这是一项可以预测用户兴趣(根据很多其他用户的兴趣)的任务。为了解决电影推荐的问题,我们必须首先能够判断哪些电影是相似的。那么,怎么设计电影的相似性呢?比如,是儿童动画片还是适合大人的电影,是否是卖座电影,是否是偏艺术类的电影,等等。如图10-53所示,我们可以将每个电影“嵌入”与用户偏爱相关的维度的空间中。我们将维度接近的电影放在相互邻近的位置,它们都是非常类似的电影。最后,需要很多维度,比如20、50甚至100个维度来进行嵌入。
我们先讨论二维,可以将二维模型画出来(见图10-53),x轴的左侧是比较适合儿童的电影,右侧则是比较适合大人的电影。v轴的顶部是比较卖座的电影,底部则是偏艺术类(不太卖座)的电影。再向这个模型添加一些电影。这时,会看到位置相邻的电影比较类似,而这正是我们想要实现的目标。每部电影在这个二维空间中都只是单个点,我们使用x轴上的一个值和y轴上的一个值来表示这些点。现在可以通过这些点之间的距离来了解电影之间的相似性。显然,二维不足以表达电影与电影之间的相似性,在实际工作中,我们需要在N维空间中建模。比如,选择N个不同的方面,然后可以在N个维度中移动某个电影。使用这种方法将类似电影放在相互邻近的位置。现在,每部电影都只是N维中的一个点,我们能够以N维实值的形式记下每部电影。
在上面的例子中,我们所做的是将这些影片映射到一个嵌套空间,其中每部电影都由一组二维坐标来表示。通常情况下,在学习N维嵌套时,每部影片都由N个实值数字表示,其中每个数字都分别表示在一个维度中的坐标。在上面的示例中,我们为每个维度指定了名称。在学习嵌套时,每个维度的学习跟它们的名字无关。有时我们可以查看嵌套并为维度赋予语义,但有时则无法做到这一点。通常,每个此类维度都称为一个潜在维度(latentdimension),因为它代表的特征没有明确显示在数据中,而是要根据数据推断得出。最终,真正有意义的是嵌套空间中各个影片之间的距离,而不是单个影片在任意指定维度上的坐标。
人工智能与大数据技术导论
358
PDF 物理页索引 375
文件中的第 376 页 · 印刷页码:359
10.4.2 稀疏数据
分类数据(CategoricalData)是指用于表示一组有限选项(比如100万部电影)中的一个或多个离散项(已经观看过的电影)的输入特征。例如,可以是某用户观看过的一部影片、某文档中使用的一系列单词或某人从事的职业。分类数据的表示方式是使用稀疏张量(sparsetensors,一种含有极少非零元素的张量)。例如,要构建一个影片推荐模型,可以为每部影片分配一个唯一ID(ID为0、1、2、3、..、999999),然后通过用户已观看影片的稀疏张量来表示每个用户(看过的电影那里打勾),如图10-54所示。
在图10-54的矩阵中,用一行表示一个用户,一列表示一部电影,打一个勾表示用户看过这部电影。那么,每一行都是一个显示用户的影片观看记录的样本。如果有一百万部电影,要列出一个用户没有看过的所有电影可不容易,所以,只是记下看过的电影会更高效。正是因为每个用户只会观看所有可能的影片中的极小部分,所以我们以稀疏张量的形式表示。根据影片图标上方所示的索引,最后一行对应于稀疏张量[1,3,999999],表示用户看过的3部电影的索引。
那么,对于机器学习中的输入数据,我们如何将电影表示为数字矢量呢?最简单的方法是:定义一个巨型输入层,并在其中为100万部电影中的每部电影设定一个节点。因为100万部电影是独一无二的电影,所以使用长度为100万的矢量来表示每部电影,并将每部电影分配到相应矢量中对应的索引位置。如果为“教父”电影分配的索引是1234,那么可以将第1234个输入节点设成1,其余节点设成0。这种表示法称为独热编码,因为只有一个索引具有非零值。上述方法得到的输入矢量比较稀疏,即矢量很大,但非零值相对较少。稀疏表示法存在多项问题,这些问题可能会致使模型很难高效地学习。
●网络的规模
巨型输入矢量意味着神经网络的对应权重数目会极其庞大。如果有M部电影,而神经网络输入层上方的第一层内有N个节点,则需要为该层训练M×N个权重。权重数目过大会进
第10章 神经网络
359
PDF 物理页索引 376
文件中的第 377 页 · 印刷页码:360
一步引发数据量(模型中的权重越多,高效训练所需的数据就越多)和计算量问题(权重越大,训练和使用模型所需的计算就越多,这很容易超出硬件的能力范围)。
●矢量之间缺乏有意义的联系
对于在索引1234处设为1以表示“教父”的矢量而言,与在索引238处设为1以表示“红楼梦”的矢量以及与在索引50430处设为1以表示“美国往事”的矢量,看不出有什么“邻近”的意思。
上述问题的解决方案是使用嵌套,也就是将大型稀疏矢量映射到一个保留语义关系的低维空间,将语义上相似的项归到一起,并将相异项分开。
10.4.3 获取嵌套
一般来说,当我们具有稀疏数据时,可以创建一个嵌套单元,这个嵌套单元其实是大小为d的一个特殊类型的隐藏单元。此嵌套层可与任何其他特征和隐藏层组合。和任何DNN中一样,最终层将是要进行优化的损失函数。例如,假设我们正在执行协同过滤,目标是根据其他用户的兴趣预测某位用户的兴趣。我们可以将这个问题作为监督式学习问题进行建模,具体做法是随机选取(或留出)用户观看过的一小部分影片作为正类别标签,再优化Softmax损失,如图10-55所示。
10.4.4 代码实例
在本节中,我们使用影评文本数据(来自ACL2011IMDB数据集)进行嵌入。这些数据已被处理成tf.Example格式。我们将影评字符串数据转换为稀疏特征矢量,使用稀疏特征矢量实现情感分析线性模型。我们通过将数据投射到二维空间的嵌入来实现情感分析DNN模型。将嵌入可视化,以便查看模型学到的词语之间的关系。
先导入依赖项,并下载训练数据和测试数据。tf.keras中包含一个文件下载和缓存工具,
人工智能与大数据技术导论
360
PDF 物理页索引 377
文件中的第 378 页 · 印刷页码:361
我们可以用它来检索数据集。
首先,我们来配置输入管道,将数据导入TensorFlow模型中。我们使用以下函数来解析训练数据和测试数据(格式为TFRecord),然后返回一个由特征和相应标签组成的字典。
第10章 神经网络
361
PDF 物理页索引 378
文件中的第 379 页 · 印刷页码:362
为了确认函数是否能正常运行,我们为训练数据构建一个TFRecordDataset,并使用上述函数将数据映射到特征和标签:
结果如图10-57所示。
运行以下单元,以从训练数据集中获取第一个样本:
结果如图10-58所示。
人工智能与大数据技术导论
362
PDF 物理页索引 379
文件中的第 380 页 · 印刷页码:363
现在,我们构建一个正式的输入函数,可以将其传递给TensorFlowEstimator对象的train()方法。
下面根据这些数据训练一个情感分析模型,以预测某条评价总体上是好评(标签为1)还是差评(标签为0)。为此,我们会使用词汇表,词汇表中的每个术语都与特征矢量中的一个坐标相对应。为了将样本的字符串值terms转换为这种矢量格式,我们按以下方式处理字符串值:若该术语没有出现在样本字符串中,则坐标值将为0;若出现在样本字符串中,则坐标值为1。未出现在该词汇表中的样本中的术语将被弃用。
- 线性模型
对干第一个模型,我们将使用54个信息性术语来构建LinearClassifier模型。这是一个使用具有稀疏输入和显式词汇表的线性模型。以下代码将为我们的术语构建特征列。categorical\_column\_with\_vocabulary\_list函数可使用“字符串-特征矢量”映射来创建特征列。
第10章 神经网络
363