---
schema_version: "library-reader-v1"
source_type: "original_book"
title: "人工智能与大数据技术导论"
author: null
edition: null
publisher: null
year: null
isbn: "9787302517986"
library_document_id: "cd4f7678-cd9b-4971-bde0-e9ad46a6cc71"
source_sha256: "5011cdcf83cd5e047c93a1ce7465f970fc88be69c93b94be3d7fa5fbddbb43f0"
pdf_physical_page_count: 490
pdf_physical_page_index_base: 0
range_start: 370
range_count: 10
html_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71?start=370&limit=10"
markdown_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=370&limit=10"
previous_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=360&limit=10"
next_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=380&limit=10"
---

# 人工智能与大数据技术导论

> 页码规则：PDF_PHYSICAL_PAGE_INDEX 是从 0 开始的权威文件物理页索引；PRINTED_PAGE 是页面中识别出的印刷页码，可能为空，二者不得混用。

## PDF_PHYSICAL_PAGE_INDEX=370 | PRINTED_PAGE=354

人工智能与大数据技术导论

354

## PDF_PHYSICAL_PAGE_INDEX=371 | PRINTED_PAGE=355

第10章 神经网络

!wget https://storage.googleapis.com/mledu-datasets/mnist\_test.csv -0 /tmp/mnist\_test.csv

执行过程与结果如图10-49、图10-50所示。

355

## PDF_PHYSICAL_PAGE_INDEX=372 | PRINTED_PAGE=356

最后，可视化第一个隐藏层的权重。我们先看看模型的weights属性，以深入探索神经网络，并了解它学到了哪些规律。模型的输入层有784个权重，对应于28×28像素的输入图片。第一个隐藏层将有784×N个权重，其中N指的是该层中的节点数。我们可以将这些权重重新变回28×28像素的图片，具体方法是将N个1×784权重的数组变形为N个28×28大小的数组。运行以下单元格，绘制权重曲线图。注意，此单元格要求名为classifier的DNNClassifier已经过训练。

356

## PDF_PHYSICAL_PAGE_INDEX=373 | PRINTED_PAGE=357

结果如图10-52所示。

神经网络的第一个隐藏层应该会对一些级别特别低的特征进行建模，因此可视化权重可能只显示一些模糊的区域，也可能只显示数字的某几个部分。此外，你可能还会看到一些基本上是噪点（这些噪点要么不收敛，要么被更高的层忽略）的神经元。在迭代不同的次数后，停止训练并查看效果，你可能会发现有趣的结果。建议读者分别用10、100和1000步训练分类器。然后重新运行此可视化代码。我们应该能看到不同级别的收敛之间有直观的差异。

10.4 嵌套

嵌套（embedding）广泛应用于推荐系统中。嵌套是一种相对低维的空间，可以将高维矢量映射到低维空间里。通过使用嵌套，可以使得在大型输入（比如代表字词的稀疏矢量）上进

第10章 神经网络

357

## PDF_PHYSICAL_PAGE_INDEX=374 | PRINTED_PAGE=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_PHYSICAL_PAGE_INDEX=375 | PRINTED_PAGE=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_PHYSICAL_PAGE_INDEX=376 | PRINTED_PAGE=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_PHYSICAL_PAGE_INDEX=377 | PRINTED_PAGE=361

我们可以用它来检索数据集。

首先，我们来配置输入管道，将数据导入TensorFlow模型中。我们使用以下函数来解析训练数据和测试数据（格式为TFRecord），然后返回一个由特征和相应标签组成的字典。

第10章 神经网络

361

## PDF_PHYSICAL_PAGE_INDEX=378 | PRINTED_PAGE=362

为了确认函数是否能正常运行，我们为训练数据构建一个TFRecordDataset,并使用上述函数将数据映射到特征和标签：

结果如图10-57所示。

运行以下单元，以从训练数据集中获取第一个样本：

结果如图10-58所示。

人工智能与大数据技术导论

362

## PDF_PHYSICAL_PAGE_INDEX=379 | PRINTED_PAGE=363

现在，我们构建一个正式的输入函数，可以将其传递给TensorFlowEstimator对象的train()方法。

下面根据这些数据训练一个情感分析模型，以预测某条评价总体上是好评（标签为1）还是差评（标签为0）。为此，我们会使用词汇表，词汇表中的每个术语都与特征矢量中的一个坐标相对应。为了将样本的字符串值terms转换为这种矢量格式，我们按以下方式处理字符串值：若该术语没有出现在样本字符串中，则坐标值将为0；若出现在样本字符串中，则坐标值为1。未出现在该词汇表中的样本中的术语将被弃用。

1. 线性模型

对干第一个模型，我们将使用54个信息性术语来构建LinearClassifier模型。这是一个使用具有稀疏输入和显式词汇表的线性模型。以下代码将为我们的术语构建特征列。categorical\_column\_with\_vocabulary\_list函数可使用“字符串-特征矢量”映射来创建特征列。

第10章 神经网络

363

下一段：[继续读取](https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=380&limit=10)
