提交 0a8f7014 编写于 作者: W wizardforcel

2020-12-22 22:52:24

上级 835c3110
...@@ -510,4 +510,4 @@ sns.distplot(banner_selected) ...@@ -510,4 +510,4 @@ sns.distplot(banner_selected)
* [**个性化的上下文老虎机**](https://www.microsoft.com/en-us/research/blog/contextual-bandit-breakthrough-enables-deeper-personalization/) * [**个性化的上下文老虎机**](https://www.microsoft.com/en-us/research/blog/contextual-bandit-breakthrough-enables-deeper-personalization/)
* [**Netflix 如何使用情境老虎机**](https://medium.com/netflix-techblog/artwork-personalization-c589f074ad76) * [**Netflix 如何使用情境老虎机**](https://medium.com/netflix-techblog/artwork-personalization-c589f074ad76)
* [**使用 MAB 的协作过滤**](https://arxiv.org/pdf/1708.03058.pdf) * [**使用 MAB 的协同过滤**](https://arxiv.org/pdf/1708.03058.pdf)
\ No newline at end of file \ No newline at end of file
...@@ -757,7 +757,7 @@ CNN 通常包含三个主要层: ...@@ -757,7 +757,7 @@ CNN 通常包含三个主要层:
`(8 * 0) + (18 * 1) + (63 * 0) + (3 * 1) + (1 * 1) + (2 * 1) + (9 * 0) + (0 * 0) + (7 * 1) = 31` `(8 * 0) + (18 * 1) + (63 * 0) + (3 * 1) + (1 * 1) + (2 * 1) + (9 * 0) + (0 * 0) + (7 * 1) = 31`
过滤器矩阵将在整个输入矩阵上滑动,执行逐元素乘法,并生成一个称为特征或激活图的新矩阵。 该操作称为卷积,如下图所示: 过滤器矩阵将在整个输入矩阵上滑动,执行逐元素乘法,并生成一个称为特征映射或激活图的新矩阵。 该操作称为卷积,如下图所示:
![](img/00229.gif) ![](img/00229.gif)
...@@ -771,7 +771,7 @@ CNN 通常包含三个主要层: ...@@ -771,7 +771,7 @@ CNN 通常包含三个主要层:
![](img/00232.jpeg) ![](img/00232.jpeg)
因此,过滤器负责通过执行卷积运算从实际图像中提取特征。 将有多个过滤器用于提取生成特征图的图像的不同特征。 特征图的深度是我们使用的过滤器的数量。 如果我们使用 5 个滤镜提取特征并生成 5 个特征图,则特征图的深度为`5`,如下所示: 因此,过滤器负责通过执行卷积运算从实际图像中提取特征。 将有多个过滤器用于提取生成特征映射的图像的不同特征。 特征映射的深度是我们使用的过滤器的数量。 如果我们使用 5 个滤镜提取特征并生成 5 个特征映射,则特征映射的深度为`5`,如下所示:
![](img/00233.gif) ![](img/00233.gif)
...@@ -791,7 +791,7 @@ CNN 通常包含三个主要层: ...@@ -791,7 +791,7 @@ CNN 通常包含三个主要层:
# 汇聚层 # 汇聚层
在卷积层之后,我们有了池化层。 池化层用于减少特征的维数,并且仅保留必要的细节,因此可以减少计算量。 例如,要确定图像中是否有一只狗,我们不想了解狗在图像中的哪个位置,我们只需要狗的特征。 因此,池化层通过仅保留重要特征来减小空间尺寸。 有多种类型的池化操作。 最大池化是最常用的池化操作之一,我们仅从窗口内的要素图中获取最大值。 在卷积层之后,我们有了池化层。 池化层用于减少特征映射的维数,并且仅保留必要的细节,因此可以减少计算量。 例如,要确定图像中是否有一只狗,我们不想了解狗在图像中的哪个位置,我们只需要狗的特征。 因此,池化层通过仅保留重要特征来减小空间尺寸。 有多种类型的池化操作。 最大池化是最常用的池化操作之一,我们仅从窗口内的要素图中获取最大值。
带有 2 x 2 过滤器且步幅为 2 的最大池如下所示: 带有 2 x 2 过滤器且步幅为 2 的最大池如下所示:
...@@ -811,7 +811,7 @@ CNN 通常包含三个主要层: ...@@ -811,7 +811,7 @@ CNN 通常包含三个主要层:
![](img/00237.gif) ![](img/00237.gif)
首先,将图像传递到卷积层,在卷积层中我们应用卷积运算以提取特征,然后将特征传递到池化层,在其中减小尺寸。 我们可以根据用例添加任意数量的卷积和池化层。 此后,我们可以添加一个神经网络,该神经网络的末尾有一个隐藏层,称为全连接层,该层对图像进行分类。 首先,将图像传递到卷积层,在卷积层中我们应用卷积运算以提取特征,然后将特征映射传递到池化层,在其中减小尺寸。 我们可以根据用例添加任意数量的卷积和池化层。 此后,我们可以添加一个神经网络,该神经网络的末尾有一个隐藏层,称为全连接层,该层对图像进行分类。
# 使用 CNN 对时尚产品进行分类 # 使用 CNN 对时尚产品进行分类
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
![](img/00288.gif) ![](img/00288.gif)
因此,我们将游戏屏幕作为卷积层的输入。 卷积层对图像进行卷积并生成特征图。 然后将生成的特征图传递到 LSTM 层。 LSTM 层具有用于保存信息的内存。 LSTM 层保留有关重要的先前游戏状态的信息,并根据需要随时间步长更新其内存。 穿过全连接层后,它将输出`Q`值。 因此,与 DQN 不同,我们不直接估计`Q(s[t], a[t])`。 相反,我们估算`Q(h[t], a[t])`,其中`h[t]`是网络在上一个时间步长返回的输入。 即,`h[t] = LSTM(h[t-1], o[t])`。 当我们使用 RNN 时,我们通过时间的反向传播来训练我们的网络。 因此,我们将游戏屏幕作为卷积层的输入。 卷积层对图像进行卷积并生成特征映射。 然后将生成的特征映射传递到 LSTM 层。 LSTM 层具有用于保存信息的内存。 LSTM 层保留有关重要的先前游戏状态的信息,并根据需要随时间步长更新其内存。 穿过全连接层后,它将输出`Q`值。 因此,与 DQN 不同,我们不直接估计`Q(s[t], a[t])`。 相反,我们估算`Q(h[t], a[t])`,其中`h[t]`是网络在上一个时间步长返回的输入。 即,`h[t] = LSTM(h[t-1], o[t])`。 当我们使用 RNN 时,我们通过时间的反向传播来训练我们的网络。
等待。 经验回放缓冲区如何? 在 DQN 中,为避免相关的经验,我们使用了经验回放,该经验存储了游戏的转移,并使用了随机的一组经验来训练网络。 对于 DRQN,我们将整个情节存储在经验缓冲区中,并从随机的情节批次中随机采样`n`个步骤。 因此,通过这种方式,我们既可以适应随机化,又可以适应另一种实际的经验。 等待。 经验回放缓冲区如何? 在 DQN 中,为避免相关的经验,我们使用了经验回放,该经验存储了游戏的转移,并使用了随机的一组经验来训练网络。 对于 DRQN,我们将整个情节存储在经验缓冲区中,并从随机的情节批次中随机采样`n`个步骤。 因此,通过这种方式,我们既可以适应随机化,又可以适应另一种实际的经验。
...@@ -572,11 +572,11 @@ DARQN 的体系结构如下所示: ...@@ -572,11 +572,11 @@ DARQN 的体系结构如下所示:
![](img/00291.gif) ![](img/00291.gif)
它由三层组成; 卷积层,注意力层和 LSTM 循环层。 游戏屏幕作为图像被馈送到卷积网络。 卷积网络处理图像并生成特征。 然后,要素贴图会进入关注层。 注意层将它们转换为向量,并产生它们的线性组合,称为上下文向量。 然后将上下文向量以及先前的隐藏状态传递到 LSTM 层。 LSTM 层提供两个输出; 一方面,它提供 Q 值来决定在某种状态下要执行的动作;另一方面,它可以帮助注意力网络确定在下一个时间步中要关注的图像区域,从而可以生成更好的上下文向量。 。 它由三层组成; 卷积层,注意力层和 LSTM 循环层。 游戏屏幕作为图像被馈送到卷积网络。 卷积网络处理图像并生成特征映射。 然后,要素贴图会进入关注层。 注意层将它们转换为向量,并产生它们的线性组合,称为上下文向量。 然后将上下文向量以及先前的隐藏状态传递到 LSTM 层。 LSTM 层提供两个输出; 一方面,它提供 Q 值来决定在某种状态下要执行的动作;另一方面,它可以帮助注意力网络确定在下一个时间步中要关注的图像区域,从而可以生成更好的上下文向量。 。
注意有两种类型: 注意有两种类型:
* **软注意力**:我们知道,卷积层产生的特征图将作为输入提供给关注层,然后生成上下文向量。 轻描淡写地,这些上下文向量只是卷积层产生的所有输出(特征图)的加权平均值。 根据功能的相对重要性选择权重。 * **软注意力**:我们知道,卷积层产生的特征映射将作为输入提供给关注层,然后生成上下文向量。 轻描淡写地,这些上下文向量只是卷积层产生的所有输出(特征映射)的加权平均值。 根据功能的相对重要性选择权重。
* **硬注意力**:硬注意力,根据某些位置选择策略`π`,我们仅关注图像在特定时间步长`t`上的特定位置。 该策略由神经网络表示,其权重是策略参数,网络的输出是位置选择概率。 但是,硬注意力不比软注意力好多少。 * **硬注意力**:硬注意力,根据某些位置选择策略`π`,我们仅关注图像在特定时间步长`t`上的特定位置。 该策略由神经网络表示,其权重是策略参数,网络的输出是位置选择概率。 但是,硬注意力不比软注意力好多少。
# 概要 # 概要
......
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
4. RNN 不仅基于当前输入,而且还基于先前的隐藏状态来预测输出。 4. RNN 不仅基于当前输入,而且还基于先前的隐藏状态来预测输出。
5. 在网络反向传播时,如果梯度值变得越来越小,则称为消失梯度问题,如果梯度值变得更大,则它正在爆炸梯度问题。 5. 在网络反向传播时,如果梯度值变得越来越小,则称为消失梯度问题,如果梯度值变得更大,则它正在爆炸梯度问题。
6. 门是 LSTM 中的特殊结构,用于决定保留,丢弃和更新哪些信息。 6. 门是 LSTM 中的特殊结构,用于决定保留,丢弃和更新哪些信息。
7. 池化层用于减少特征的维数,并且仅保留必要的细节,因此可以减少计算量。 7. 池化层用于减少特征映射的维数,并且仅保留必要的细节,因此可以减少计算量。
# 第八章 # 第八章
......
# 前言 # 前言
*Python 人工智能项目*将帮助您利用深度学习和强化学习构建基于人工智能的智能实用系统。 本书中介绍的项目涵盖了与医疗,电子商务,专家系统,监视时尚行业,基于移动的应用程序以及使用卷积神经网络,深度强化学习, 基于 LSTM 的 RNN,受限的 Boltzmann 机器,生成对抗网络,机器翻译和迁移学习。 本书中说明的构建智能应用程序的理论方面将使读者能够以有趣的方式扩展项目,并使其快速构建具有影响力的 AI 应用程序。 到本书结尾,您将足够熟练地构建自己的智能模型,以轻松解决任何类型的问题。 《Python 人工智能项目》将帮助您利用深度学习和强化学习构建基于人工智能的智能实用系统。 本书中介绍的项目涵盖了与医疗,电子商务,专家系统,监视时尚行业,基于移动的应用程序以及使用卷积神经网络,深度强化学习, 基于 LSTM 的 RNN,受限玻尔兹曼机,生成对抗网络,机器翻译和迁移学习。 本书中说明的构建智能应用程序的理论方面将使读者能够以有趣的方式扩展项目,并使其快速构建具有影响力的 AI 应用程序。 到本书结尾,您将足够熟练地构建自己的智能模型,以轻松解决任何类型的问题。
# 这本书是给谁的 # 这本书是给谁的
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
第 5 章,“视频字幕应用程序”讨论了 CNN 和 LSTM 在视频字幕中的作用,并说明了如何利用序列到视频(视频到文本)架构来构建视频字幕系统。 第 5 章,“视频字幕应用程序”讨论了 CNN 和 LSTM 在视频字幕中的作用,并说明了如何利用序列到视频(视频到文本)架构来构建视频字幕系统。
第 6 章,“智能推荐系统”讨论了推荐器系统,这些系统是处理数字数据过载问题的信息过滤系统,以便根据这些信息或信息提取信息。 我们将使用潜在分解进行协同过滤,并使用受限的 Boltzmann 机器来构建推荐系统。 第 6 章,“智能推荐系统”讨论了推荐器系统,这些系统是处理数字数据过载问题的信息过滤系统,以便根据这些信息或信息提取信息。 我们将使用潜在分解进行协同过滤,并使用受限玻尔兹曼机来构建推荐系统。
第 7 章,“用于电影评论情感分析的移动应用程序”解释了如何使用机器学习即服务来使移动应用程序受益。 我们将使用 TensorFlow 创建一个 Android 移动应用,该应用将以电影评论作为输入并基于情感分析提供评分。 第 7 章,“用于电影评论情感分析的移动应用程序”解释了如何使用机器学习即服务来使移动应用程序受益。 我们将使用 TensorFlow 创建一个 Android 移动应用,该应用将以电影评论作为输入并基于情感分析提供评分。
......
...@@ -96,9 +96,9 @@ ...@@ -96,9 +96,9 @@
![](img/7db1c93b-6ac7-4b2c-b464-dd69836c6854.png) ![](img/7db1c93b-6ac7-4b2c-b464-dd69836c6854.png)
# 乙状结肠激活单元 # Sigmoid 激活单元
**乙状结肠** **激活单元**`y`的输出是其总输入`x`的函数,表示如下: **Sigmoid 激活单元**`y`的输出是其总输入`x`的函数,表示如下:
![](img/e72ceed8-eaaa-4d3e-bc39-256e36d389e2.png) ![](img/e72ceed8-eaaa-4d3e-bc39-256e36d389e2.png)
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
![](img/ff09283d-c4ae-42d3-8b20-5c6cb9523899.png) ![](img/ff09283d-c4ae-42d3-8b20-5c6cb9523899.png)
tanh 激活功能输出的值在[ **-1**`1`]范围内,如下图所示: tanh 激活功能输出的值在`[-1, 1]`范围内,如下图所示:
![](img/58f98f0c-6a81-4acc-bafb-9b0f683ad9c9.png) ![](img/58f98f0c-6a81-4acc-bafb-9b0f683ad9c9.png)
...@@ -246,27 +246,27 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢 ...@@ -246,27 +246,27 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
# 卷积神经网络 # 卷积神经网络
**卷积神经网络****CNN**)利用卷积运算从具有关联拓扑的数据中提取有用信息。 这最适合图像和音频数据。 输入图像在通过卷积层时会生成多个输出图像,称为**输出特征图**。 输出要素图将检测要素。 初始卷积层中的输出特征图可以学习检测基本特征,例如边缘和颜色成分变化。 **卷积神经网络****CNN**)利用卷积运算从具有关联拓扑的数据中提取有用信息。 这最适合图像和音频数据。 输入图像在通过卷积层时会生成多个输出图像,称为**输出特征映射**。 输出要素图将检测要素。 初始卷积层中的输出特征映射可以学习检测基本特征,例如边缘和颜色成分变化。
第二卷积层可以检测到稍微复杂的特征,例如正方形,圆形和其他几何结构。 随着神经网络的发展,卷积层学会了检测越来越复杂的特征。 例如,如果我们有一个 CNN 可以对图像是猫还是狗进行分类,则神经网络底部的卷积层可能会学会检测诸如头部,腿部等特征。 第二卷积层可以检测到稍微复杂的特征,例如正方形,圆形和其他几何结构。 随着神经网络的发展,卷积层学会了检测越来越复杂的特征。 例如,如果我们有一个 CNN 可以对图像是猫还是狗进行分类,则神经网络底部的卷积层可能会学会检测诸如头部,腿部等特征。
“图 1.11”显示了 CNN 的架构图,该 CNN 处理猫和狗的图像以对其进行分类。 图像通过卷积层,该卷积层有助于检测相关特征,例如边缘和颜色组合。 ReLU 激活会增加非线性。 激活层之后的合并层汇总本地邻居信息,以提供一定数量的**翻译不变性**。 在理想的 CNN 中,此卷积激活池操作在网络进入密集连接之前执行了几次: “图 1.11”显示了 CNN 的架构图,该 CNN 处理猫和狗的图像以对其进行分类。 图像通过卷积层,该卷积层有助于检测相关特征,例如边缘和颜色组合。 ReLU 激活会增加非线性。 激活层之后的合并层汇总本地邻居信息,以提供一定数量的**平移不变性**。 在理想的 CNN 中,此卷积激活池操作在网络进入密集连接之前执行了几次:
![](img/332c2f90-aae5-4b98-b417-ce942177e184.png) ![](img/332c2f90-aae5-4b98-b417-ce942177e184.png)
图 1.11:CNN 架构 图 1.11:CNN 架构
当我们经过具有多个卷积激活池操作的网络时,图像的空间分辨率会降低,而输出特征图的数量在每一层中都会增加。 卷积层中的每个输出特征图都与过滤器内核相关联,该过滤器内核的权重是通过 CNN 训练过程学习的。 当我们经过具有多个卷积激活池操作的网络时,图像的空间分辨率会降低,而输出特征映射的数量在每一层中都会增加。 卷积层中的每个输出特征映射都与过滤器内核相关联,该过滤器内核的权重是通过 CNN 训练过程学习的。
在卷积操作中,将滤镜内核的翻转版本放置在整个图像或特征图上,并为滤镜上每个位置计算滤镜内核输入值与相应图像像素或特征图值的点积。 输入图像或特征图。 已经习惯了普通图像处理的读者可能已经使用了不同的滤镜内核,例如高斯滤镜,Sobel 边缘检测滤镜等,其中许多滤镜的权重已预定义。 卷积神经网络的优点是通过训练过程确定不同的滤波器权重。 这意味着,针对卷积神经网络正在处理的问题,可以更好地定制过滤器。 在卷积操作中,将滤镜内核的翻转版本放置在整个图像或特征映射上,并为滤镜上每个位置计算滤镜内核输入值与相应图像像素或特征映射值的点积。 输入图像或特征映射。 已经习惯了普通图像处理的读者可能已经使用了不同的滤镜内核,例如高斯滤镜,Sobel 边缘检测滤镜等,其中许多滤镜的权重已预定义。 卷积神经网络的优点是通过训练过程确定不同的滤波器权重。 这意味着,针对卷积神经网络正在处理的问题,可以更好地定制过滤器。
当卷积运算涉及在输入的每个位置上覆盖滤波器内核时,该卷积被称为跨度为 1。 如果我们选择在覆盖过滤器内核时跳过一个位置,那么卷积将以两个步幅执行。 通常,如果将`n`位置跳过而将滤波器内核覆盖在输入上,则表示卷积以`n + 1`的步幅执行。 大于 1 的步幅会减小卷积输出的空间尺寸。 当卷积运算涉及在输入的每个位置上覆盖滤波器内核时,该卷积被称为跨度为 1。 如果我们选择在覆盖过滤器内核时跳过一个位置,那么卷积将以两个步幅执行。 通常,如果将`n`位置跳过而将滤波器内核覆盖在输入上,则表示卷积以`n + 1`的步幅执行。 大于 1 的步幅会减小卷积输出的空间尺寸。
通常,卷积层之后是池化层,池化层基本上总结了由池化的接收场确定的邻域中的输出特征图激活。 例如,一个 2 x 2 的接收场将收集四个相邻的输出特征图激活的本地信息。 对于最大池操作,将选择四个激活的最大值作为输出,而对于平均池化,将选择四个激活的平均值。 合并降低了特征图的空间分辨率。 例如,对于具有 2 x 2 接收场的 224 x 224 尺寸的特征图池化操作,特征图的空间尺寸将减小为 112 x 112。 通常,卷积层之后是池化层,池化层基本上总结了由池化的接收场确定的邻域中的输出特征映射激活。 例如,一个 2 x 2 的接收场将收集四个相邻的输出特征映射激活的本地信息。 对于最大池操作,将选择四个激活的最大值作为输出,而对于平均池化,将选择四个激活的平均值。 合并降低了特征映射的空间分辨率。 例如,对于具有 2 x 2 接收场的 224 x 224 尺寸的特征映射池化操作,特征映射的空间尺寸将减小为 112 x 112。
要注意的一件事是,卷积运算减少了每层要学习的权重数。 例如,如果我们有一个空间尺寸为 224 x 224 的输入图像,而下一层的期望输出为尺寸为 224 x 224 的尺寸,那么对于具有完整连接的传统神经网络来说,要学习的权重数 是 224 x 224 x 224 x 224.对于具有相同输入和输出尺寸的卷积层,我们需要学习的只是滤波器内核的权重。 因此,如果我们使用 3 x 3 过滤器内核,我们只需要学习 9 个权重即可,而不是 224 x 224 x 224 x 224 权重。 这种简化是有效的,因为局部空间邻域中的图像和音频之类的结构之间具有高度相关性。 要注意的一件事是,卷积运算减少了每层要学习的权重数。 例如,如果我们有一个空间尺寸为 224 x 224 的输入图像,而下一层的期望输出为尺寸为 224 x 224 的尺寸,那么对于具有完整连接的传统神经网络来说,要学习的权重数 是 224 x 224 x 224 x 224.对于具有相同输入和输出尺寸的卷积层,我们需要学习的只是滤波器内核的权重。 因此,如果我们使用 3 x 3 过滤器内核,我们只需要学习 9 个权重即可,而不是 224 x 224 x 224 x 224 权重。 这种简化是有效的,因为局部空间邻域中的图像和音频之类的结构之间具有高度相关性。
输入图像经过多层卷积和池化操作。 随着网络的发展,特征的数量增加,而图像的空间分辨率降低。 在卷积池层的末端,要素图的输出被馈送到全连接层,然后是输出层。 输入图像经过多层卷积和池化操作。 随着网络的发展,特征映射的数量增加,而图像的空间分辨率降低。 在卷积池层的末端,要素图的输出被馈送到全连接层,然后是输出层。
输出单位取决于手头的任务。 如果执行回归,则输出激活单位是线性的,而如果是二进制分类问题,则输出单位是 S 形的。 对于多类别分类,输出层是 softmax 单位。 输出单位取决于手头的任务。 如果执行回归,则输出激活单位是线性的,而如果是二进制分类问题,则输出单位是 S 形的。 对于多类别分类,输出层是 softmax 单位。
...@@ -274,7 +274,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢 ...@@ -274,7 +274,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
# 循环神经网络(RNN) # 循环神经网络(RNN)
**循环神经网络****RNN**)在处理顺序或时间数据时非常有用,其中给定实例或位置的数据与先前时间步长或位置中的数据高度相关。 RNN 在处理文本数据方面已经非常成功,因为给定实例中的单词与它前面的单词高度相关。 在 RNN 中,网络在每个时间步执行相同的功能,因此名称中的术语**重复出现**。 下图说明了 RNN 的体系结构: **循环神经网络****RNN**)在处理顺序或时间数据时非常有用,其中给定实例或位置的数据与先前时间步长或位置中的数据高度相关。 RNN 在处理文本数据方面已经非常成功,因为给定实例中的单词与它前面的单词高度相关。 在 RNN 中,网络在每个时间步执行相同的功能,因此名称中的术语**循环**。 下图说明了 RNN 的体系结构:
![](img/0c426b93-140c-48a7-b982-e649cbaac4e3.png) ![](img/0c426b93-140c-48a7-b982-e649cbaac4e3.png)
...@@ -488,19 +488,19 @@ Figure 1.14: GAN architecture  ...@@ -488,19 +488,19 @@ Figure 1.14: GAN architecture 
图 1.18:使用预训练的 VGG 16 网络进行迁移学习 图 1.18:使用预训练的 VGG 16 网络进行迁移学习
`x`表示的输入图像被馈送到**预训练的 VGG 16** 网络,以及`4096`维输出特征向量 **x'***是从最后一个全连接层中提取的。 提取的特征 **x'**以及相应的类别标签`y`用于训练简单的分类网络,从而减少解决问题所需的数据。* `x`表示的输入图像被馈送到**预训练的 VGG 16** 网络,以及`4096`维输出特征向量`x'`,是从最后一个全连接层中提取的。 提取的特征`x'`以及相应的类别标签`y`用于训练简单的分类网络,从而减少解决问题所需的数据。*
我们将通过使用第 2 章,“迁移学习”中的迁移学习来解决医疗保健领域中的图像分类问题。 我们将通过使用第 2 章,“迁移学习”中的迁移学习来解决医疗保健领域中的图像分类问题。
# 受限玻尔兹曼机 # 受限玻尔兹曼机
**受限玻尔兹曼机****RBM**)是一门无监督的机器学习算法,用于学习数据的内部表示。 RBM 具有可见层`v ∈ R^m`,以及隐藏层`h ∈ R^n`。 RBM 学习在可见层中将输入呈现为隐藏层中的低维表示。 给定可见层输入,所有隐藏层单元在条件上都是独立的。 类似地,给定隐藏层输入,所有可见层在条件上都是独立的。 给定隐藏层输入,这使得 RBM 可以独立地对可见单元的输出进行采样,反之亦然。 **受限玻尔兹曼机****RBM**)是一门无监督的机器学习算法,用于学习数据的内部表示。 RBM 具有可见层`v ∈ R^m`,以及隐藏层`h ∈ R^n`。 RBM 学习在可见层中将输入呈现为隐藏层中的低维表示。 给定可见层输入,所有隐藏层单元在条件上都是独立的。 类似地,给定隐藏层输入,所有可见层在条件上都是独立的。 给定隐藏层输入,这使得 RBM 可以独立地对可见单元的输出进行采样,反之亦然。
下图说明了 RBM 的体系结构: 下图说明了 RBM 的体系结构:
![](img/0c7517cc-ffec-4988-956f-e2258a4c314d.png) ![](img/0c7517cc-ffec-4988-956f-e2258a4c314d.png)
图 1.19:受限的 Boltzmann 机器 图 1.19:受限玻尔兹曼机
权重`w[ij] ∈ W`将可见单位`i`连接到隐藏单位`j`,其中`W ∈ R^(mxn)`是所有这些权重的集合,从可见单位到隐藏单位。 可见单位的偏差由`b[i] ∈ b`表示,而隐藏单位的偏差由`c[j] ∈ c`表示。 权重`w[ij] ∈ W`将可见单位`i`连接到隐藏单位`j`,其中`W ∈ R^(mxn)`是所有这些权重的集合,从可见单位到隐藏单位。 可见单位的偏差由`b[i] ∈ b`表示,而隐藏单位的偏差由`c[j] ∈ c`表示。
...@@ -530,15 +530,15 @@ Figure 1.14: GAN architecture  ...@@ -530,15 +530,15 @@ Figure 1.14: GAN architecture 
# 汽车编码器 # 汽车编码器
与 RBM 十分相似,**自编码器**是一类无监督的学习算法,旨在发现数据中的隐藏结构。 在**主成分分析****PCA**)中,我们尝试捕获输入变量之间的线性关系,并尝试通过(输入的)线性组合来表示降维空间中的数据 变量),这说明了数据的大部分差异。 但是,PCA 无法捕获输入变量之间的非线性关系。 与 RBM 十分相似,**自编码器**是一类无监督的学习算法,旨在发现数据中的隐藏结构。 在**主成分分析****PCA**)中,我们尝试捕获输入变量之间的线性关系,并尝试通过(输入的)线性组合来表示降维空间中的数据 变量),这说明了数据的大部分差异。 但是,PCA 无法捕获输入变量之间的非线性关系。
动编码器是一种神经网络,可以捕获输入变量之间的非线性相互作用,同时在隐藏层中以不同维度表示输入。 在大多数情况下,隐藏层的尺寸小于输入的尺寸。 假设存在高维数据固有的低维结构,我们跳过了这一点。 例如,高维图像可以由低维流形表示,并且自动编码器通常用于发现该结构。 下图说明了自动编码器的神经体系结构: 编码器是一种神经网络,可以捕获输入变量之间的非线性相互作用,同时在隐藏层中以不同维度表示输入。 在大多数情况下,隐藏层的尺寸小于输入的尺寸。 假设存在高维数据固有的低维结构,我们跳过了这一点。 例如,高维图像可以由低维流形表示,并且自编码器通常用于发现该结构。 下图说明了自编码器的神经体系结构:
![](img/594d3d11-05f5-4367-a760-726135cf225b.png) ![](img/594d3d11-05f5-4367-a760-726135cf225b.png)
图 1.20:自编码器架构 图 1.20:自编码器架构
动编码器有两个部分:编码器和解码器。 编码器尝试将输入数据`x`投影到隐藏层`h`中。 解码器尝试从隐藏层`h`重构输入。 通过最小化重构误差,即来自解码器和原始输入的重构输入![](img/359986dd-2b2c-43d7-a706-1730baaa010c.png)之间的误差,可以训练伴随此类网络的权重。 如果输入是连续的,则最小化重构误差的平方和,以学习自动编码器的权重。 编码器有两个部分:编码器和解码器。 编码器尝试将输入数据`x`投影到隐藏层`h`中。 解码器尝试从隐藏层`h`重构输入。 通过最小化重构误差,即来自解码器和原始输入的重构输入![](img/359986dd-2b2c-43d7-a706-1730baaa010c.png)之间的误差,可以训练伴随此类网络的权重。 如果输入是连续的,则最小化重构误差的平方和,以学习自编码器的权重。
如果我们用函数`f[W](x)`表示编码器,而解码器则用`f[U](x)`表示,其中`W``U`是与编码器和解码器关联的权重矩阵,那么情况如下: 如果我们用函数`f[W](x)`表示编码器,而解码器则用`f[U](x)`表示,其中`W``U`是与编码器和解码器关联的权重矩阵,那么情况如下:
...@@ -550,15 +550,15 @@ Figure 1.14: GAN architecture  ...@@ -550,15 +550,15 @@ Figure 1.14: GAN architecture 
![](img/5ecc227c-e830-4604-898b-f08d92be4d0a.png)(3) ![](img/5ecc227c-e830-4604-898b-f08d92be4d0a.png)(3)
通过最小化`(3)`的成本函数,可以学习自编码器的最佳权重![](img/3f710299-ee2e-40cf-b7ae-7be06074f7c9.png),如下所示: 通过最小化`(3)`的成本函数,可以学习自编码器的最佳权重![](img/3f710299-ee2e-40cf-b7ae-7be06074f7c9.png),如下所示:
![](img/1a645659-bc76-482d-9d08-7c790e29013e.png)(4) ![](img/1a645659-bc76-482d-9d08-7c790e29013e.png)(4)
动编码器用于多种目的,例如学习数据的潜在表示,降噪和特征检测。 降噪自动编码器将实际输入的噪声版本作为其输入。 他们尝试构建实际的输入,以作为重建的标签。 类似地,自动编码器可以用作生成模型。 可以用作生成模型的一类这样的自动编码器称为**变分自动编码器**。 当前,变分自动编码器和 GAN 作为图像处理的生成模型非常受欢迎。 编码器用于多种目的,例如学习数据的潜在表示,降噪和特征检测。 降噪自编码器将实际输入的噪声版本作为其输入。 他们尝试构建实际的输入,以作为重建的标签。 类似地,自编码器可以用作生成模型。 可以用作生成模型的一类这样的自编码器称为**变分自编码器**。 当前,变分自编码器和 GAN 作为图像处理的生成模型非常受欢迎。
# 概要 # 概要
现在,我们到了本章的结尾。 我们已经研究了人工神经网络的几种变体,包括用于图像处理目的的 CNN 和用于自然语言处理目的的 RNN。 此外,我们将 RBM 和 GAN 视为生成模型,将自编码器视为无监督方法,可以解决许多问题,例如降噪或解密数据的内部结构。 此外,我们还谈到了强化学习,这对机器人技术和 AI 产生了重大影响。 现在,我们到了本章的结尾。 我们已经研究了人工神经网络的几种变体,包括用于图像处理目的的 CNN 和用于自然语言处理目的的 RNN。 此外,我们将 RBM 和 GAN 视为生成模型,将自编码器视为无监督方法,可以解决许多问题,例如降噪或解密数据的内部结构。 此外,我们还谈到了强化学习,这对机器人技术和 AI 产生了重大影响。
您现在应该熟悉本书其余各章中构建智能 AI 应用程序时将要使用的核心技术。 在构建应用程序时,我们将在需要时进行一些技术上的改动。 建议不熟悉深度学习的读者探索更多有关本章涉及的核心技术的信息,以便更全面地理解。 您现在应该熟悉本书其余各章中构建智能 AI 应用程序时将要使用的核心技术。 在构建应用程序时,我们将在需要时进行一些技术上的改动。 建议不熟悉深度学习的读者探索更多有关本章涉及的核心技术的信息,以便更全面地理解。
......
...@@ -116,11 +116,11 @@ ...@@ -116,11 +116,11 @@
该用例的数据分为五类,分别与无糖尿病性视网膜病变,轻度糖尿病性视网膜病变,中度糖尿病性视网膜病变,严重糖尿病性视网膜病变和增生性糖尿病性视网膜病变有关。 因此,我们可以将其视为分类问题。 对于我们的分类问题,需要对输出标签进行一次热编码,如下所示: 该用例的数据分为五类,分别与无糖尿病性视网膜病变,轻度糖尿病性视网膜病变,中度糖尿病性视网膜病变,严重糖尿病性视网膜病变和增生性糖尿病性视网膜病变有关。 因此,我们可以将其视为分类问题。 对于我们的分类问题,需要对输出标签进行一次热编码,如下所示:
* **无糖尿病性视网膜病变**[1 0 0 0 0] <sup>T</sup> * **无糖尿病性视网膜病变**`[1 0 0 0 0]^T`
* **轻度糖尿病视网膜病变**:[0 1 0 0 0] <sup>T</sup> * **轻度糖尿病性视网膜病变**`[0 1 0 0 0]^T`
* **中度糖尿病性视网膜病变**[0 0 1 0 0] <sup>T</sup> * **中度糖尿病性视网膜病变**`[0 0 1 0 0]^T`
* **严重的糖尿病性视网膜病变**:[0 0 0 1 0] <sup>T</sup> * **严重糖尿病性视网膜病变**`[0 0 0 1 0]^T`
* **糖尿病性增生性视网膜病变**:[0 0 0 0 1] <sup>T</sup> * **增生糖尿病性视网膜病变**`[0 0 0 0 1]^T`
Softmax 将是表示输出层中不同类别的概率的最佳激活函数,而每个数据点的分类交叉熵损失之和将是优化的最佳损失。 对于具有输出标签向量`y``p`的预测概率的单个数据点,交叉熵损失由以下公式给出: Softmax 将是表示输出层中不同类别的概率的最佳激活函数,而每个数据点的分类交叉熵损失之和将是优化的最佳损失。 对于具有输出标签向量`y``p`的预测概率的单个数据点,交叉熵损失由以下公式给出:
...@@ -132,7 +132,7 @@ Softmax 将是表示输出层中不同类别的概率的最佳激活函数,而 ...@@ -132,7 +132,7 @@ Softmax 将是表示输出层中不同类别的概率的最佳激活函数,而
![](img/79a945ed-f72e-486f-9b76-d6a9a3ec21f2.png) ![](img/79a945ed-f72e-486f-9b76-d6a9a3ec21f2.png)
在训练过程中,小批量的梯度基于`(2)`给出的平均对数损失,其中`M`是所选的批量大小。 对于我们将结合验证准确性进行监视的验证日志丢失,`M`是验证集数据点的数量。 由于我们将在每个折叠中进行 **K 折交叉验证**,因此在每个折叠中我们将具有不同的验证数据集。 在训练过程中,小批量的梯度基于`(2)`给出的平均对数损失,其中`M`是所选的批量大小。 对于我们将结合验证准确性进行监视的验证日志丢失,`M`是验证集数据点的数量。 由于我们将在每个折叠中进行 **K 折交叉验证**,因此在每个折叠中我们将具有不同的验证数据集。
现在我们已经定义了训练方法,损失函数和验证指标,让我们继续进行数据探索和建模。 现在我们已经定义了训练方法,损失函数和验证指标,让我们继续进行数据探索和建模。
...@@ -155,7 +155,7 @@ Softmax 将是表示输出层中不同类别的概率的最佳激活函数,而 ...@@ -155,7 +155,7 @@ Softmax 将是表示输出层中不同类别的概率的最佳激活函数,而
我们将使用方案二,因为它不需要生成更多数据或丢弃现有数据。 如果我们将班级权重与班级频率的倒数成正比,则会得到以下班级权重: 我们将使用方案二,因为它不需要生成更多数据或丢弃现有数据。 如果我们将班级权重与班级频率的倒数成正比,则会得到以下班级权重:
| **严重级别** | **类砝码** | | **严重级别** | **类权重** |
| `Class 0` | `0.0120353863` | | `Class 0` | `0.0120353863` |
| `Class 1` | `0.1271350558` | | `Class 1` | `0.1271350558` |
| `Class 2` | `0.0586961973` | | `Class 2` | `0.0586961973` |
...@@ -303,7 +303,7 @@ Inception V1(GoogleNet)是 2014 年 ILSVRC 竞赛的获胜者。 它的最 ...@@ -303,7 +303,7 @@ Inception V1(GoogleNet)是 2014 年 ILSVRC 竞赛的获胜者。 它的最
# VGG16 迁移学习网络 # VGG16 迁移学习网络
我们将从预训练的`VGG16`网络中的最后一个合并层中获取输出,并添加一对全连接层,每个层 512 个单元,然后是输出层。 最终池化层的输出是从全局平均池化操作传递到全连接层之前的。 我们只可以展平池化层的输出,而不是执行全局平均池化-其思想是确保池化的输出不是二维晶格格式,而是一维数组格式, 非常像一个全连接层。 下图说明了基于预训练的`VGG16`的新`VGG16`***,*** 的体系结构: 我们将从预训练的`VGG16`网络中的最后一个合并层中获取输出,并添加一对全连接层,每个层 512 个单元,然后是输出层。 最终池化层的输出是从全局平均池化操作传递到全连接层之前的。 我们只可以展平池化层的输出,而不是执行全局平均池化-其思想是确保池化的输出不是二维晶格格式,而是一维数组格式, 非常像一个全连接层。 下图说明了基于预训练的`VGG16`的新`VGG16`的体系结构:
![](img/c2ef9608-eaff-46fd-990c-75a189d2463b.png) ![](img/c2ef9608-eaff-46fd-990c-75a189d2463b.png)
......
...@@ -94,7 +94,7 @@ ...@@ -94,7 +94,7 @@
![](img/5b33f286-e730-48d1-83d1-f491731ad41f.png) ![](img/5b33f286-e730-48d1-83d1-f491731ad41f.png)
根据上述公式构建语言模型将需要我们估计几个订单的条件概率,这在实际中是不可能的。 为了使问题在计算上可行,一个简单的假设是仅根据前一个单词而不是之前的所有单词来对单词进行条件处理。 该假设也称为**马尔可夫假设**,该模型称为 **bigram 模型**。 根据 bigram 模型,单词的条件概率可以表示为: 根据上述公式构建语言模型将需要我们估计几个订单的条件概率,这在实际中是不可能的。 为了使问题在计算上可行,一个简单的假设是仅根据前一个单词而不是之前的所有单词来对单词进行条件处理。 该假设也称为**马尔可夫假设**该模型称为**二元模型**。 根据二元模型,单词的条件概率可以表示为:
![](img/fed81518-1cd1-4beb-a689-4f153de98fea.png) ![](img/fed81518-1cd1-4beb-a689-4f153de98fea.png)
...@@ -238,7 +238,7 @@ NMT 与其他传统方法相比的一些优点如下: ...@@ -238,7 +238,7 @@ NMT 与其他传统方法相比的一些优点如下:
我们将通读英语和法语语料库,并确定它们各自中唯一词的数量。 我们还将通过索引来表示单词,对于该单词的单编码向量,该单词对应的索引将设置为 1,而其余索引将设置为 0。 例如,假设在英语语料库中,我们有四个词:`Global warming is real`。 我们可以如下定义每个单词的索引: 我们将通读英语和法语语料库,并确定它们各自中唯一词的数量。 我们还将通过索引来表示单词,对于该单词的单编码向量,该单词对应的索引将设置为 1,而其余索引将设置为 0。 例如,假设在英语语料库中,我们有四个词:`Global warming is real`。 我们可以如下定义每个单词的索引:
| **** | **索引** | | **单词** | **索引** |
| `global` | 0 | | `global` | 0 |
| `warming` | 1 | | `warming` | 1 |
| `is` | 2 | | `is` | 2 |
...@@ -423,7 +423,7 @@ NMT 与其他传统方法相比的一些优点如下: ...@@ -423,7 +423,7 @@ NMT 与其他传统方法相比的一些优点如下:
图 3.5:训练时机器翻译网络流程的图示 图 3.5:训练时机器翻译网络流程的图示
我们基于“图 3.5”中所示的架构,定义了用于训练功能`model_enc_dec`的编码器解码器端到端模型。 在这里,**编码器(LSTM 1)**依次获取源语言文本单词,并在**编码器(LSTM 1)的最后序列步骤中捕获源语言句子或文本的整个上下文。** 。 来自编码器的上下文将作为**解码器(** **LSTM 2)**的初始状态进行馈送,该学习器将根据当前单词来预测下一个单词,因为在训练过程中我们会得到一个句子 / text 作为目标语言,因此解码器只需将其输入移位一个时间步即可形成目标: 我们基于“图 3.5”中所示的架构,定义了用于训练功能`model_enc_dec`的编码器解码器端到端模型。 在这里,**编码器(LSTM 1)**依次获取源语言文本单词,并在**编码器(LSTM 1)**的最后序列步骤中捕获源语言句子或文本的整个上下文。来自编码器的上下文将作为**解码器(LSTM 2)**的初始状态进行馈送,该学习器将根据当前单词来预测下一个单词,因为在训练过程中我们会得到一个句子 / text 作为目标语言,因此解码器只需将其输入移位一个时间步即可形成目标:
```py ```py
def model_enc_dec(self): def model_enc_dec(self):
......
# 使用 GAN 的时尚行业样式 # 使用 GAN 的时尚行业样式
**样式移**的概念是指将产品样式渲染为另一种产品的过程。 想象一下,您的一位时尚狂朋友买了一个蓝色的手袋,想买一双类似印花的鞋子。 直到 2016 年,这还是不可能实现的,除非他们与一位时装设计师成为朋友,他们必须首先设计一款鞋子,然后才能批准生产。 然而,随着生成对抗网络的最新进展,这种设计过程可以很容易地进行。 **样式移**的概念是指将产品样式渲染为另一种产品的过程。 想象一下,您的一位时尚狂朋友买了一个蓝色的手袋,想买一双类似印花的鞋子。 直到 2016 年,这还是不可能实现的,除非他们与一位时装设计师成为朋友,他们必须首先设计一款鞋子,然后才能批准生产。 然而,随着生成对抗网络的最新进展,这种设计过程可以很容易地进行。
生成对抗网络是通过在生成器网络和鉴别器网络之间进行零和游戏来学习的网络。 假设一位时装设计师想要设计一种特定结构的手袋,并且正在探索不同的印花。 设计人员可以绘制手提包的结构草图,然后将草图图像输入到生成的对抗网络中,以得出手提包的几种可能的最终印刷品。 这种样式迁移过程可以使客户自己绘制产品设计和图案,而无需征集大量设计师的意见,从而对时尚行业产生巨大影响。 通过推荐具有类似设计和风格的产品来补充客户已经拥有的产品,时装屋也可以从中受益。 生成对抗网络是通过在生成器网络和鉴别器网络之间进行零和游戏来学习的网络。 假设一位时装设计师想要设计一种特定结构的手袋,并且正在探索不同的印花。 设计人员可以绘制手提包的结构草图,然后将草图图像输入到生成的对抗网络中,以得出手提包的几种可能的最终印刷品。 这种样式迁移过程可以使客户自己绘制产品设计和图案,而无需征集大量设计师的意见,从而对时尚行业产生巨大影响。 通过推荐具有类似设计和风格的产品来补充客户已经拥有的产品,时装屋也可以从中受益。
...@@ -189,7 +189,7 @@ the number of input images processed : 30000 ...@@ -189,7 +189,7 @@ the number of input images processed : 30000
# DiscoGAN 的发电机 # DiscoGAN 的发电机
DiscoGAN 的生成器是前馈卷积神经网络,其中输入和输出是图像。 在网络的第一部分中,图像在空间维度上按比例缩小,而输出要素图的数量随图层的进展而增加。 在网络的第二部分中,图像沿空间维度按比例放大,而输出特征的数量则逐层减少。 在最终输出层中,将生成具有与输入相同的空间尺寸的图像。 如果生成器将图像`x[A]`转换为`x[AB]`从域`A`到域`B`表示为`G[AB]`,则我们有![](img/6c5507b6-7666-4601-8730-0b89c4a198fc.png) DiscoGAN 的生成器是前馈卷积神经网络,其中输入和输出是图像。 在网络的第一部分中,图像在空间维度上按比例缩小,而输出要素图的数量随图层的进展而增加。 在网络的第二部分中,图像沿空间维度按比例放大,而输出特征映射的数量则逐层减少。 在最终输出层中,将生成具有与输入相同的空间尺寸的图像。 如果生成器将图像`x[A]`转换为`x[AB]`从域`A`到域`B`表示为`G[AB]`,则我们有![](img/6c5507b6-7666-4601-8730-0b89c4a198fc.png)
此处显示的是`build_generator`函数,我们可以使用它来构建 DiscoGAN 网络的生成器: 此处显示的是`build_generator`函数,我们可以使用它来构建 DiscoGAN 网络的生成器:
...@@ -356,7 +356,7 @@ def build_discriminator(self,image,reuse=False,name='discriminator'): ...@@ -356,7 +356,7 @@ def build_discriminator(self,image,reuse=False,name='discriminator'):
return down5 return down5
``` ```
鉴别器网络不同层中输出特征的数量为`self.df`或其倍数。 对于我们的网络,我们将`self.df`设为`64` 鉴别器网络不同层中输出特征映射的数量为`self.df`或其倍数。 对于我们的网络,我们将`self.df`设为`64`
# 建立网络并定义成本函数 # 建立网络并定义成本函数
......
...@@ -856,4 +856,4 @@ python Video_seq2seq.py process_main --path_prj '/media/santanu/9eb9b6dc-b380-48 ...@@ -856,4 +856,4 @@ python Video_seq2seq.py process_main --path_prj '/media/santanu/9eb9b6dc-b380-48
# 概要 # 概要
现在,我们已经完成了令人兴奋的视频字幕项目的结尾。 您应该能够使用 TensorFlow 和 Keras 构建自己的视频字幕系统。 您还应该能够使用本章中介绍的技术知识来开发其他涉及卷积神经网络和循环神经网络的高级模型。 下一章将使用受限的 Boltzmann 机器构建智能的推荐系统。 期待您的参与! 现在,我们已经完成了令人兴奋的视频字幕项目的结尾。 您应该能够使用 TensorFlow 和 Keras 构建自己的视频字幕系统。 您还应该能够使用本章中介绍的技术知识来开发其他涉及卷积神经网络和循环神经网络的高级模型。 下一章将使用受限玻尔兹曼机构建智能的推荐系统。 期待您的参与!
\ No newline at end of file \ No newline at end of file
...@@ -7,10 +7,10 @@ ...@@ -7,10 +7,10 @@
* 推荐系统介绍 * 推荐系统介绍
* 基于潜在分解的协同过滤 * 基于潜在分解的协同过滤
* 使用深度学习进行潜在因素协同过滤 * 使用深度学习进行潜在因素协同过滤
* 使用**受限的 Boltzmann 机****RBM**)构建推荐系统 * 使用**受限玻尔兹曼机****RBM**)构建推荐系统
* 训练 RBM 的对比差异 * 训练 RBM 的对比差异
* 使用 RBM 的协同过滤 * 使用 RBM 的协同过滤
* 使用 RBM 实施协过滤应用程序 * 使用 RBM 实施协过滤应用程序
# 技术要求 # 技术要求
...@@ -22,21 +22,21 @@ ...@@ -22,21 +22,21 @@
# 什么是推荐系统? # 什么是推荐系统?
推荐系统在当今世界无处不在。 无论是 Netflix 上的电影推荐还是亚马逊上的产品推荐,推荐器系统都产生了重大影响。 推荐系统可以大致分为基于内容的过滤系统,协过滤系统和基于潜在因子的过滤推荐系统。 **基于内容的过滤**依赖于基于项目内容的手工编码功能。 根据用户对现有商品的评分方式,创建用户个人资料,并将用户提供的排名赋予这些商品: 推荐系统在当今世界无处不在。 无论是 Netflix 上的电影推荐还是亚马逊上的产品推荐,推荐器系统都产生了重大影响。 推荐系统可以大致分为基于内容的过滤系统,协过滤系统和基于潜在因子的过滤推荐系统。 **基于内容的过滤**依赖于基于项目内容的手工编码功能。 根据用户对现有商品的评分方式,创建用户个人资料,并将用户提供的排名赋予这些商品:
![](img/eaa4391a-b8cf-42ce-bad4-c4977e83bdbc.png) ![](img/eaa4391a-b8cf-42ce-bad4-c4977e83bdbc.png)
图 6.1:基于内容的过滤插图 图 6.1:基于内容的过滤插图
如上图所示(“图 6.1”),**用户 A** 购买了名为**深度学习****神经网络**的书籍。 由于书籍**人工智能**的内容与这两本书相似,因此基于内容的推荐系统已将书籍**人工智能**推荐给**用户 A** 。 如我们所见,在基于内容的筛选中,根据用户的偏好向用户推荐项目。 这不涉及其他用户如何评价这本书。 如上图所示(“图 6.1”),用户`A`购买了名为**深度学习****神经网络**的书籍。 由于书籍**人工智能**的内容与这两本书相似,因此基于内容的推荐系统已将书籍**人工智能**推荐给用户`A`。 如我们所见,在基于内容的筛选中,根据用户的偏好向用户推荐项目。 这不涉及其他用户如何评价这本书。
**协作过滤**尝试识别属于给定用户的相似用户,然后推荐相似用户喜欢,购买或给予很高评价的用户项目。 这通常称为**用户-用户协作过滤**。 相反的是找到与给定项目相似的项目,并向也高度喜欢,购买或评价其他类似项目的用户推荐这些项目。 这就是**项目-项目协作过滤**的名称: **协同过滤**尝试识别属于给定用户的相似用户,然后推荐相似用户喜欢,购买或给予很高评价的用户项目。 这通常称为**用户-用户协同过滤**。 相反的是找到与给定项目相似的项目,并向也高度喜欢,购买或评价其他类似项目的用户推荐这些项目。 这就是**项目-项目协同过滤**的名称:
![](img/e3c4c366-a9dc-4d53-94a7-6286e1708659.png) ![](img/e3c4c366-a9dc-4d53-94a7-6286e1708659.png)
图 6.2:项目-项目协同过滤插图 图 6.2:项目-项目协同过滤插图
在上图(“图 6.2”)中,**用户 A****用户 B** 在购买书本方面非常相似。 **用户 A** 最近购买了书籍**深度学习****神经网络**。 由于**用户 B****用户 A** 非常相似,因此用户-用户协作推荐系统也将这些图书推荐给**用户 B** 在上图(“图 6.2”)中,用户`A`和用户`B`在购买书本方面非常相似。 用户`A`最近购买了书籍**深度学习****神经网络**。 由于用户`B`与用户`A`非常相似,因此用户-用户协作推荐系统也将这些图书推荐给用户`B`
# 基于潜在分解的推荐系统 # 基于潜在分解的推荐系统
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
我们可以将用户个人资料矩阵作为`US^(1/2)`,然后将项目个人资料矩阵转置为 `S^(1/2) V^T`形成潜在因子模型。 当在分级矩阵中缺少与用户未分级的电影相对应的条目时,您可能会遇到有关如何执行 SVD 的问题。 常见的方法是在执行 SVD 之前,通过用户的平均评分或总体评分的平均值来估算缺失的评分。 我们可以将用户个人资料矩阵作为`US^(1/2)`,然后将项目个人资料矩阵转置为 `S^(1/2) V^T`形成潜在因子模型。 当在分级矩阵中缺少与用户未分级的电影相对应的条目时,您可能会遇到有关如何执行 SVD 的问题。 常见的方法是在执行 SVD 之前,通过用户的平均评分或总体评分的平均值来估算缺失的评分。
# 深度学习以进行潜在因素协过滤 # 深度学习以进行潜在因素协过滤
除了使用 SVD,您还可以利用深度学习方法来导出给定尺寸的用户和商品资料向量。 除了使用 SVD,您还可以利用深度学习方法来导出给定尺寸的用户和商品资料向量。
...@@ -76,7 +76,7 @@ ...@@ -76,7 +76,7 @@
图 6.4:电影镜头 100 K 数据集上基于深度学习的潜在因子模型 图 6.4:电影镜头 100 K 数据集上基于深度学习的潜在因子模型
`user_ID``movie_ID`从其相应的嵌入矩阵中提取用户和电影嵌入向量。 在该图中, **embedding_1** 代表用户 ID 的嵌入层,而 **embedding_2** 代表电影 ID 的嵌入层。 在 **dot_1** 层中执行用户嵌入矢量和电影嵌入矢量的点积,以输出评分(一到五个)。 定义模型的代码如下所示: `user_ID``movie_ID`从其相应的嵌入矩阵中提取用户和电影嵌入向量。 在该图中,`embedding_1`代表用户 ID 的嵌入层,而`embedding_2`代表电影 ID 的嵌入层。 在`dot_1`层中执行用户嵌入矢量和电影嵌入矢量的点积,以输出评分(一到五个)。 定义模型的代码如下所示:
```py ```py
def model(max_users,max_movies,latent_factors): def model(max_users,max_movies,latent_factors):
...@@ -305,17 +305,17 @@ RMSE: 0.9320 ...@@ -305,17 +305,17 @@ RMSE: 0.9320
从前面的结果可以看出,SVD ++模型在 RMSE 为`0.93`的测试数据集上确实表现良好。 结果与我们在此之前训练的基于深度学习的模型潜在因子模型(支持`0.95`的 RMSE)相当。 从前面的结果可以看出,SVD ++模型在 RMSE 为`0.93`的测试数据集上确实表现良好。 结果与我们在此之前训练的基于深度学习的模型潜在因子模型(支持`0.95`的 RMSE)相当。
在“用于推荐的受限玻尔兹曼机”部分中,我们将介绍用于构建推荐系统的受限的玻尔兹曼机。 由于该方法可以扩展到大型数据集,因此在协作过滤中获得了很大的普及。 协作过滤域中的大多数数据集都很稀疏,从而导致困难的非凸优化问题。 与其他分解方法(例如 SVD)相比,RBM 在数据集中更不容易遭受此稀疏问题的困扰。 在“用于推荐的受限玻尔兹曼机”部分中,我们将介绍用于构建推荐系统的受限玻尔兹曼机。 由于该方法可以扩展到大型数据集,因此在协同过滤中获得了很大的普及。 协同过滤域中的大多数数据集都很稀疏,从而导致困难的非凸优化问题。 与其他分解方法(例如 SVD)相比,RBM 在数据集中更不容易遭受此稀疏问题的困扰。
# 推荐的受限玻尔兹曼机 # 推荐的受限玻尔兹曼机
受限的玻尔兹曼机器是一类属于无监督学习技术的神经网络。 众所周知,**受限玻尔兹曼机****RBM**)试图通过将输入数据投影到隐藏层中来学习数据的隐藏结构。 受限玻尔兹曼机是一类属于无监督学习技术的神经网络。 众所周知,**受限玻尔兹曼机****RBM**)试图通过将输入数据投影到隐藏层中来学习数据的隐藏结构。
隐藏层激活有望对输入信号进行编码并重新创建。 受限制的玻尔兹曼机通常可处理二进制数据: 隐藏层激活有望对输入信号进行编码并重新创建。 受限制的玻尔兹曼机通常可处理二进制数据:
<sup>![](img/f17a6b6e-bf3f-4fd9-a849-0d012a9af206.png)</sup> <sup>![](img/f17a6b6e-bf3f-4fd9-a849-0d012a9af206.png)</sup>
图 6.6:用于二进制数据的受限 Boltzmann 机器 图 6.6:用于二进制数据的受限玻尔兹曼机
只是为了刷新我们的记忆,上图(“图 6.6”)是一个 RBM,具有`m`输入或可见单位。 这被投影到具有`n`个单位的隐藏层。 给定可见层输入[H​​TG6],则隐藏单元彼此独立,因此可以如下进行采样,其中![](img/71f41038-5216-48cd-9474-3d36fd1c8758.png)表示 Sigmoid 函数: 只是为了刷新我们的记忆,上图(“图 6.6”)是一个 RBM,具有`m`输入或可见单位。 这被投影到具有`n`个单位的隐藏层。 给定可见层输入[H​​TG6],则隐藏单元彼此独立,因此可以如下进行采样,其中![](img/71f41038-5216-48cd-9474-3d36fd1c8758.png)表示 Sigmoid 函数:
...@@ -359,21 +359,21 @@ RBM 的参数是可见层单位`i`与隐藏层单位之间的广义权重连接` ...@@ -359,21 +359,21 @@ RBM 的参数是可见层单位`i`与隐藏层单位之间的广义权重连接`
# 使用 RBM 的协同过滤 # 使用 RBM 的协同过滤
提出建议时,可以使用受限的 Boltzmann 机器进行协作过滤。 我们将使用这些 RBM 向用户推荐电影。 使用不同用户为不同电影提供的分级来训练他们。 用户不会观看或评价所有电影,因此可以使用此训练模型来向用户推荐未看过的电影。 提出建议时,可以使用受限玻尔兹曼机进行协同过滤。 我们将使用这些 RBM 向用户推荐电影。 使用不同用户为不同电影提供的分级来训练他们。 用户不会观看或评价所有电影,因此可以使用此训练模型来向用户推荐未看过的电影。
我们应该首先遇到的一个问题是如何处理 RBM 中的评分,因为评分本质上是有序的,而 RBM 则针对二进制数据。 可以将评分视为二进制数据,表示评分的单位数量等于每个评分的唯一值的数量。 例如:在评级系统中,评分从 1 到 5 不等,并且将有 5 个二进制单位,其中与评分相对应的 1 个单位设置为 1,其余单位设置为 0。 RBM 可见的单位将是为用户提供给不同电影的评分。 如所讨论的,每个评分将以二进制表示,并且对于每个可见单元,来自所有二进制可见单元的权重连接都与电影评分相对应。 由于每个用户将为一组不同的电影评分,因此每个用户的输入将不同。 但是,从电影分级单位到隐藏单位的重量连接对于所有用户而言都是通用的。 我们应该首先遇到的一个问题是如何处理 RBM 中的评分,因为评分本质上是有序的,而 RBM 则针对二进制数据。 可以将评分视为二进制数据,表示评分的单位数量等于每个评分的唯一值的数量。 例如:在评级系统中,评分从 1 到 5 不等,并且将有 5 个二进制单位,其中与评分相对应的 1 个单位设置为 1,其余单位设置为 0。 RBM 可见的单位将是为用户提供给不同电影的评分。 如所讨论的,每个评分将以二进制表示,并且对于每个可见单元,来自所有二进制可见单元的权重连接都与电影评分相对应。 由于每个用户将为一组不同的电影评分,因此每个用户的输入将不同。 但是,从电影分级单位到隐藏单位的重量连接对于所有用户而言都是通用的。
下图所示(“图 6.8a”和“图 6.8b”)是**用户 A****用户 B** 的 RBM 视图。 **用户**`A`**用户 B** 为一组不同的电影评分。 但是,正如我们所看到的,每个用户到每部电影中隐藏单元的权重连接都相同。 关于**用户 A** 的 RBM 评分如下: 下图所示(“图 6.8a”和“图 6.8b”)是用户`A`和用户`B`的 RBM 视图。 **用户**`A`和用户`B`为一组不同的电影评分。 但是,正如我们所看到的,每个用户到每部电影中隐藏单元的权重连接都相同。 关于用户`A`的 RBM 评分如下:
![](img/430c8607-253c-4471-8fdd-cf581201fc71.jpg) ![](img/430c8607-253c-4471-8fdd-cf581201fc71.jpg)
图 6.8a:用于协过滤的 RBM 用户 A 视图 图 6.8a:用于协过滤的 RBM 用户 A 视图
相对于**用户 B** 的 RBM 评分如下: 相对于用户`B`的 RBM 评分如下:
![](img/d560a0d6-1532-47c4-b43c-d9f44e1f5835.jpg) ![](img/d560a0d6-1532-47c4-b43c-d9f44e1f5835.jpg)
图 6.8b:用于协过滤的 RBM 用户 B 视图 图 6.8b:用于协过滤的 RBM 用户 B 视图
还有一点要注意的是,如果有`M`个电影,并且每个电影都有`k`评分,那么 RBM 的可见单位数是`M * k`。 此外,如果二进制隐藏单元的数量为`n`,则`W`中的权重连接数等于`M * k * n`。 给定可见层输入,每个隐藏单元`h[j]`可以独立于其他隐藏单元进行采样,如下所示: 还有一点要注意的是,如果有`M`个电影,并且每个电影都有`k`评分,那么 RBM 的可见单位数是`M * k`。 此外,如果二进制隐藏单元的数量为`n`,则`W`中的权重连接数等于`M * k * n`。 给定可见层输入,每个隐藏单元`h[j]`可以独立于其他隐藏单元进行采样,如下所示:
...@@ -399,13 +399,13 @@ RBM 的参数是可见层单位`i`与隐藏层单位之间的广义权重连接` ...@@ -399,13 +399,13 @@ RBM 的参数是可见层单位`i`与隐藏层单位之间的广义权重连接`
![](img/a673373a-c431-4db8-849e-0fd1586b0482.png) ![](img/a673373a-c431-4db8-849e-0fd1586b0482.png)
现在,我们具备了创建用于协作过滤的受限 Boltzmann 机器所需的所有技术知识。 现在,我们具备了创建用于协同过滤的受限玻尔兹曼机所需的所有技术知识。
# 使用 RBM 的协过滤实现 # 使用 RBM 的协过滤实现
在接下来的几节中,我们将使用前一部分介绍的技术原理,使用受限的 Boltzmann 机器实施协作过滤系统。 我们将使用的数据集是 MovieLens 100K 数据集,其中包含用户对不同电影提供的评分(从 1 到 5)。 可以从[这里](https://grouplens.org/datasets/movielens/100k/)下载数据集。 在接下来的几节中,我们将使用前一部分介绍的技术原理,使用受限玻尔兹曼机实施协同过滤系统。 我们将使用的数据集是 MovieLens 100K 数据集,其中包含用户对不同电影提供的评分(从 1 到 5)。 可以从[这里](https://grouplens.org/datasets/movielens/100k/)下载数据集。
此协过滤系统的 TensorFlow 实现在接下来的几节中介绍。 此协过滤系统的 TensorFlow 实现在接下来的几节中介绍。
# 处理输入 # 处理输入
...@@ -472,9 +472,9 @@ python preprocess_ratings.py --path '/home/santanu/ML_DS_Catalog-/Collaborating ...@@ -472,9 +472,9 @@ python preprocess_ratings.py --path '/home/santanu/ML_DS_Catalog-/Collaborating
``` ```
# 建立用于协过滤的 RBM 网络 # 建立用于协过滤的 RBM 网络
以下函数`_network`为协过滤创建所需的 RBM 结构。 首先,我们定义输入的权重,偏差和占位符。 然后定义`sample_hidden``sample_visible`函数,以根据概率分别对隐藏的激活和可见的激活进行采样。 隐藏的单位是从 Sigmoid 函数提供的概率从伯努利分布中采样的,而与每个电影有关的可见单元是根据 softmax 函数提供的概率从多项分布中采样的。 无需创建 softmax 概率,因为`tf.multinomial`函数可以直接从 logit 采样,而不是实际概率。 以下函数`_network`为协过滤创建所需的 RBM 结构。 首先,我们定义输入的权重,偏差和占位符。 然后定义`sample_hidden``sample_visible`函数,以根据概率分别对隐藏的激活和可见的激活进行采样。 隐藏的单位是从 Sigmoid 函数提供的概率从伯努利分布中采样的,而与每个电影有关的可见单元是根据 softmax 函数提供的概率从多项分布中采样的。 无需创建 softmax 概率,因为`tf.multinomial`函数可以直接从 logit 采样,而不是实际概率。
接下来,我们根据 Gibbs 采样定义对比差异的逻辑。 `gibbs_step`函数执行 Gibbs 采样的一个步骤,然后利用它来实现`k`阶的对比散度。 接下来,我们根据 Gibbs 采样定义对比差异的逻辑。 `gibbs_step`函数执行 Gibbs 采样的一个步骤,然后利用它来实现`k`阶的对比散度。
...@@ -660,7 +660,7 @@ RBM training Completed ! ...@@ -660,7 +660,7 @@ RBM training Completed !
52.012 s: process RBM 52.012 s: process RBM
``` ```
请注意,受限 Boltzmann 机器网络已在配备 GeForce Zotac 1070 GPU 和 64 GB RAM 的 Ubuntu 机器上进行了培训。 培训时间可能会根据用于培训网络的系统而有所不同。 请注意,受限玻尔兹曼机网络已在配备 GeForce Zotac 1070 GPU 和 64 GB RAM 的 Ubuntu 机器上进行了培训。 培训时间可能会根据用于培训网络的系统而有所不同。
# 使用训练有素的 RBM 推理 # 使用训练有素的 RBM 推理
...@@ -709,10 +709,10 @@ test RMSE : 1.1999306704742303 ...@@ -709,10 +709,10 @@ test RMSE : 1.1999306704742303
从前面的屏幕快照(“图 6.9”)中的预测可以看出,RBM 在预测`userid` `1`的电影的保留集方面做得很好。 从前面的屏幕快照(“图 6.9”)中的预测可以看出,RBM 在预测`userid` `1`的电影的保留集方面做得很好。
建议您将最终收视率预测作为对每个电影收视率预测的多项式概率分布的收视率的期望值,并与采用最高收视率的方法进行比较,了解其效果如何 多项式分布的概率。 可以在[这个页面](https://www.cs.toronto.edu/~rsalakhu/papers/rbmcf.pdf)上找到用于协作过滤的 RBM 论文。受限 Boltzmann 机器有关的代码位于[这里](https://github.com/PacktPublishing/Intelligent-Projects-using-Python/blob/master/Chapter06/rbm.py) 建议您将最终收视率预测作为对每个电影收视率预测的多项式概率分布的收视率的期望值,并与采用最高收视率的方法进行比较,了解其效果如何 多项式分布的概率。 可以在[这个页面](https://www.cs.toronto.edu/~rsalakhu/papers/rbmcf.pdf)上找到用于协同过滤的 RBM 论文。受限玻尔兹曼机有关的代码位于[这里](https://github.com/PacktPublishing/Intelligent-Projects-using-Python/blob/master/Chapter06/rbm.py)
# 概要 # 概要
阅读完本章后,您现在应该能够使用受限的 Boltzmann 机器构建智能推荐系统,并根据您的领域和要求以有趣的方式对其进行扩展。 有关本章中说明的项目的详细实现,请参考[此项目的 GiHub 链接](https://github.com/PacktPublishing/Intelligent-Projects-using-Python/blob/master/Chapter06) 阅读完本章后,您现在应该能够使用受限玻尔兹曼机构建智能推荐系统,并根据您的领域和要求以有趣的方式对其进行扩展。 有关本章中说明的项目的详细实现,请参考[此项目的 GiHub 链接](https://github.com/PacktPublishing/Intelligent-Projects-using-Python/blob/master/Chapter06)
在下一章中,我们将处理移动应用程序的创建,以执行电影评论的情感分析。 我期待您的参与。 在下一章中,我们将处理移动应用程序的创建,以执行电影评论的情感分析。 我期待您的参与。
\ No newline at end of file
...@@ -207,7 +207,7 @@ records_processed 50000 ...@@ -207,7 +207,7 @@ records_processed 50000
# 建立模型 # 建立模型
我们将构建一个简单的 LSTM 版本的循环神经网络,在输入层之后有一个嵌入层。 使用预训练的尺寸为 100 的 Glove 向量初始化嵌入层字向量,并将该层定义为`trainable`,以便字向量嵌入可以根据训练数据进行更新。 隐藏状态和单元状态的维数也保持为`100`。 使用二进制交叉熵损失训练模型。 为避免过拟合,将脊正则化添加到损失函数中。 **Adam 优化器** ***,*** 用于训练模型。 我们将构建一个简单的 LSTM 版本的循环神经网络,在输入层之后有一个嵌入层。 使用预训练的尺寸为 100 的 Glove 向量初始化嵌入层字向量,并将该层定义为`trainable`,以便字向量嵌入可以根据训练数据进行更新。 隐藏状态和单元状态的维数也保持为`100`。 使用二进制交叉熵损失训练模型。 为避免过拟合,将脊正则化添加到损失函数中。 **Adam 优化器**用于训练模型。
以下代码段显示了用于在 TensorFlow 中构建模型的函数: 以下代码段显示了用于在 TensorFlow 中构建模型的函数:
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* **个性化帮助**:为所有客户创建个性化体验可能是一项繁琐的任务,但如果不这样做,则会使企业蒙受损失。 对话型聊天机器人是向每个客户提供个性化体验的便捷替代方法。 * **个性化帮助**:为所有客户创建个性化体验可能是一项繁琐的任务,但如果不这样做,则会使企业蒙受损失。 对话型聊天机器人是向每个客户提供个性化体验的便捷替代方法。
* **全天候支持**:使用客户服务代表 24/7 的费用很高。 在非工作时间使用聊天机器人提供客户服务消除了雇用额外客户代表的麻烦。 * **全天候支持**:使用客户服务代表 24/7 的费用很高。 在非工作时间使用聊天机器人提供客户服务消除了雇用额外客户代表的麻烦。
* **响应的一致性**:聊天机器人提供的响应可能是一致的,而不同客户服务代表对相同问题的响应可能会有所不同。 如果客户对客户服务代表提供的答案不满意,则无需多次拨打电话。 * **一致性响应**:聊天机器人提供的响应可能是一致的,而不同客户服务代表对相同问题的响应可能会有所不同。 如果客户对客户服务代表提供的答案不满意,则无需多次拨打电话。
* **耐心**:虽然客户服务代表在与客户打交道时可能会失去耐心,但这对于聊天机器人来说是不可能的。 * **耐心**:虽然客户服务代表在与客户打交道时可能会失去耐心,但这对于聊天机器人来说是不可能的。
* **查询记录**:与人类客户服务代表相比,聊天机器人在查询记录方面效率更高。 * **查询记录**:与人类客户服务代表相比,聊天机器人在查询记录方面效率更高。
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
然后,以![](img/35169e57-0797-4240-b4ce-2b9187aadfde.png)和![](img/2e6449ad-2e66-47ee-9242-c23ffda15fbb.png)形式的编码信息作为其初始隐藏状态和单元状态被馈送到**解码器 LSTM** 。 每个步骤中的**解码器 LSTM** 尝试预测以当前单词为条件的下一个单词。 这意味着,**解码器 LSTM** 的每个步骤的输入都是当前字。 然后,以![](img/35169e57-0797-4240-b4ce-2b9187aadfde.png)和![](img/2e6449ad-2e66-47ee-9242-c23ffda15fbb.png)形式的编码信息作为其初始隐藏状态和单元状态被馈送到**解码器 LSTM** 。 每个步骤中的**解码器 LSTM** 尝试预测以当前单词为条件的下一个单词。 这意味着,**解码器 LSTM** 的每个步骤的输入都是当前字。
为了预测第一个单词,LSTM 将提供一个虚拟的起始关键字 **< BOS >** ,它代表句子的开头。 同样, **< EOS >** 虚拟关键字表示句子的结尾,并且一旦预测到该句,就应该停止输出生成。 为了预测第一个单词,LSTM 将提供一个虚拟的起始关键字`<BOS>`,它代表句子的开头。 同样, `<EOS>`虚拟关键字表示句子的结尾,并且一旦预测到该句,就应该停止输出生成。
在训练每个目标词的序列到序列模型的过程中,我们知道`apriori`是先前的词,这是**解码器 LSTM** 的输入。 但是,在推论过程中,我们将没有这些目标词,因此我们必须将上一步作为输入。 在训练每个目标词的序列到序列模型的过程中,我们知道`apriori`是先前的词,这是**解码器 LSTM** 的输入。 但是,在推论过程中,我们将没有这些目标词,因此我们必须将上一步作为输入。
...@@ -81,7 +81,7 @@ ...@@ -81,7 +81,7 @@
# 创建用于训练聊天机器人的数据 # 创建用于训练聊天机器人的数据
要提取客户发布的所有入站推文,我们需要将具有`in_response_to_tweet_id` 字段的所有推文作为`null`提取。 如果`in_response_to_tweet_id` 字段不为空,则可以通过推文筛选出包含客户服务代表响应的出站文件。 有了入站和出站文件后,我们需要将它们合并到入站文件的`tweet_id`和出站文件的`in_response_to_tweet_id` 中。 作为回应,这将为我们提供客户在中发布的*推文以及客户服务代表在*中发布的推文。 数据创建功能可以编码如下: 要提取客户发布的所有入站推文,我们需要将具有`in_response_to_tweet_id` 字段的所有推文作为`null`提取。 如果`in_response_to_tweet_id` 字段不为空,则可以通过推文筛选出包含客户服务代表响应的出站文件。 有了入站和出站文件后,我们需要将它们合并到入站文件的`tweet_id`和出站文件的`in_response_to_tweet_id` 中。 作为回应,这将为我们提供客户发布的`tweets in`以及客户服务代表在回复中发布`tweets out`。 数据创建功能可以编码如下:
```py ```py
def process_data(self,path): def process_data(self,path):
...@@ -102,7 +102,7 @@ ...@@ -102,7 +102,7 @@
# 将文本标记为单词索引 # 将文本标记为单词索引
需要将这些推文标记化并转换为数字,然后才能将其发送到神经网络。 **计数向量器**用于确定固定数量的常见单词,这些单词构成了聊天机器人的词汇空间。 我们还引入了三个新标记,分别表示句子的开头`(START)`,句子的结尾(`PAD`)和任何未知的单词(`UNK`)。 标记推文的功能如下所示,以供参考: 需要将这些推文标记化并转换为数字,然后才能将其发送到神经网络。 **计数向量器**用于确定固定数量的常见单词,这些单词构成了聊天机器人的词汇空间。 我们还引入了三个新标记,分别表示句子的开头`(START)`,句子的结尾(`PAD`)和任何未知的单词(`UNK`)。 标记推文的功能如下所示,以供参考:
```py ```py
def tokenize_text(self,in_text,out_text): def tokenize_text(self,in_text,out_text):
...@@ -398,18 +398,19 @@ python chatbot.py --max_vocab_size 50000 --max_seq_len 30 --embedding_dim 100 -- ...@@ -398,18 +398,19 @@ python chatbot.py --max_vocab_size 50000 --max_seq_len 30 --embedding_dim 100 --
推断结果如下表所示: 推断结果如下表所示:
| **在**中发布​​的推文 | **发布** | | Tweet in | Tweet out |
| `@sprintcare`是最糟糕的客户服务。 | `@__cname__`嘿! 您可以向我们发送您帐户的电子邮件地址吗? 我们将在后台查看`/` <https://t.co/ldfdzrinat>。 | | --- | --- |
| `@__cname__`都是您*出色的*连接的谎言。 5 巴 LTE,仍然无法加载任何内容。 嗯 | `@__cname__`对此致歉。 请使用您的电子邮件地址向我们发送 dm,以便我们进行连接。 | | `@sprintcare` is the worst customer service. | `@__cname__` Hey there! Can you dm us your account's email address? We'll take a look backstage / dn https://t.co/ldfdzrinat. |
| `@__cname__`每当我与客户支持部门联系时,他们都会告诉我我已在我的帐户中启用了简码,但是在我尝试使用 <https://t.co/0G98RtNxPK> 的 4 年中,我从未这样做。 | `@__cname__`嗨,很抱歉听到这个消息。 请向我们发送包含您的电子邮件地址和电话号码的 dm,以便我们对此进行调查。 | | `@__cname__` Y'all lie about your great connection. 5 bars LTE, still won't load something. Smh. | `@__cname__` We apologize for the trouble. Please send us a dm with your email address so we can connect. |
| 实际上,这是您发送给我的链接断开,信息不正确 <https://t.co/V4yfrHR8VI>。 | `@__cname__`您好,很抱歉听到这个消息。 请给我们您的联系信息,我们将竭诚为您服务。 ^ kk | | `@__cname__` Whenever I contact customer support, they tell me I have shortcode enabled on my account, but I have never in the 4 years I've tried https://t.co/0G98RtNxPK. | `@__cname__` Hi there, we are sorry to hear this. Please send us a dm with your email address and phone number so we can look into this for. |
| `@Ask_Spectrum`,您的客户服务代表非常好,但如果你们都不能使我的服务继续下去,那就给我起个绊脚石! | `@__cname__`对此致歉。 请使用您的电子邮件地址向我们发送 dm,以便我们进行连接。 | | Actually that's a broken link you sent me and incorrect information https://t.co/V4yfrHR8VI. | `@__cname__` Hi, we are sorry to hear this. Please dm us your contact info and we'll be happy to help. ^ kk |
| 我每天在`@Ask_Spectrum`上的照片。 为什么我应该每月支付 171 美元? <https://t.co/U6ptkQa5Ik>。 | `@__cname__`您好,很抱歉听到这个消息。 请给我们您的联系信息,我们将竭诚为您服务。 ^ kk | | Yo `@Ask_Spectrum`, your customer service reps are super nice— but imma start trippin if y'all don't get my service going! | `@__cname__` We apologize for the trouble. Please send us a dm with your email address so we can connect. |
| 来自`@VerizonSupport`的人请帮助我��������我在您的客户服务中倒霉。 | `@__cname__`对此致歉。 请给我们您的联系信息和电话号码,以便我们提供帮助。 | | My picture on `@Ask_Spectrum` pretty much every day. Why should I pay $171 per month? https://t.co/U6ptkQa5Ik. | `@__cname__` Hi, we are sorry to hear this. Please dm us your contact info and we'll be happy to help. ^ kk |
| `@VerizonSupport`我的朋友没有网络,我们需要一起玩视频游戏,请每隔一段时间,我们的技能就会减少,而无需网络。 | `@__cname__`嘿! 您可以向我们发送您帐户的电子邮件地址吗? 我们将在后台`/` <https://t.co/ldfdzrinat> | | Somebody from `@VerizonSupport` please help me �������� I'm having the worst luck with your customer service. | `@__cname__` We apologize for the trouble. Please dm us your contact info and phone number so we can assist. |
| `@__cname__`试图付款 60 天。 没有服务,不礼貌的 CS 和多次转让。 查找我的设备#并给我一个帐户#! | `@__cname__`您好,很抱歉听到这个消息。 请给我们您的联系信息,我们将竭诚为您服务。 ^ kk | | `@VerizonSupport` My friend is without internet we need to play video games together please our skills diminish every moment without internetz. | `@__cname__` Hey there! Can you dm us your account's email address? we'll take a look backstage / dn https://t.co/ldfdzrinat |
| `@__cname__`是我有过的最糟糕的 ISP。 | `@__cname__`嘿! 您可以向我们发送您帐户的电子邮件地址吗? 我们将在后台查看`/` <https://t.co/ldfdzrinat> | | `@__cname__` tried to pay a bill for 60 days. No service, rude CS, and several transfers. Look up my equipment # and give me an acct #! | `@__cname__` Hi, we are sorry to hear this. Please dm us your contact info and we'll be happy to help. ^ kk |
| `@__cname__`修复您的应用程序甚至无法打开的情况。 | `@__cname__`嗨! 我们没有关于此问题的任何信息。 请向我们发送 dm,其中包含您的姓名和电话号码以及完整的服务地址。 | | `@__cname__` is the worst ISP I've ever had. | `@__cname__` Hey there! Can you dm us your account's email address? We'll take a look backstage / dn https://t.co/ldfdzrinat |
| `@__cname__` fix your app it won't even open. | `@__cname__` Hi there! We don't have any info on this issue. Please send us a dm with your name and phone number and the full service address. |
# 概要 # 概要
......
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
# 学习 Q 值功能 # 学习 Q 值功能
对于 RL 代理做出决定,重要的是代理学习 Q 值函数。 可以通过 **Bellman 方程**迭代地学习 Q 值函数。 当代理开始与环境交互时,它以随机状态`s[0]`和每个状态动作对的 Q 值的随机状态开始。 代理的动作在某种程度上也是随机的,因为它没有状态 Q 值来做出明智的决策。 对于每个采取的行动,环境将根据哪个代理开始建立 Q 值表并随着时间的推移而改善而返回奖励。 对于 RL 代理做出决定,重要的是代理学习 Q 值函数。 可以通过**贝尔曼方程**迭代地学习 Q 值函数。 当代理开始与环境交互时,它以随机状态`s[0]`和每个状态动作对的 Q 值的随机状态开始。 代理的动作在某种程度上也是随机的,因为它没有状态 Q 值来做出明智的决策。 对于每个采取的行动,环境将根据哪个代理开始建立 Q 值表并随着时间的推移而改善而返回奖励。
在任何暴露状态`s[t]`处于迭代状态`t`时,代理会采取行动`a[t]`,以最大化其长期回报。 Q 表保存长期奖励值,因此选择的`a[t]`将基于以下启发式: 在任何暴露状态`s[t]`处于迭代状态`t`时,代理会采取行动`a[t]`,以最大化其长期回报。 Q 表保存长期奖励值,因此选择的`a[t]`将基于以下启发式:
...@@ -142,11 +142,11 @@ Q 值表也通过迭代`t`进行索引,因为代理只能查看到目前为止 ...@@ -142,11 +142,11 @@ Q 值表也通过迭代`t`进行索引,因为代理只能查看到目前为止
离散化动作对于深度 Q 学习非常重要,因为三维连续动作空间可以具有无限的 Q 值,并且在深度 Q 网络的输出层中不可能为每个动作单独设置单位。 动作空间的三个维度如下: 离散化动作对于深度 Q 学习非常重要,因为三维连续动作空间可以具有无限的 Q 值,并且在深度 Q 网络的输出层中不可能为每个动作单独设置单位。 动作空间的三个维度如下:
**转向**`[-1, 1]` **Steering**`[-1, 1]`
**气体**`[0, 1]` **Gas**`[0, 1]`
**Break** `[0, 1]` **Brake**`[0, 1]`
我们将此三维动作空间转换为我们感兴趣的四个动作,如下所示: 我们将此三维动作空间转换为我们感兴趣的四个动作,如下所示:
...@@ -157,9 +157,9 @@ Sharp Right: [0.6, 0.05, 0.0] ...@@ -157,9 +157,9 @@ Sharp Right: [0.6, 0.05, 0.0]
Straight: [0.0, 0.3, 0.0] Straight: [0.0, 0.3, 0.0]
``` ```
# 实施 Double Deep Q 网络 # 实施双重深度 Q 网络
**Double Deep Q 网络**的网络架构如下所示。 网络具有 CNN 架构,可将状态处理为图像并输出所有可能动作的 Q 值。 详细代码(`DQN.py`)如下: **双重深度 Q 网络**的网络架构如下所示。 网络具有 CNN 架构,可将状态处理为图像并输出所有可能动作的 Q 值。 详细代码(`DQN.py`)如下:
```py ```py
import keras import keras
...@@ -254,7 +254,7 @@ class DQN: ...@@ -254,7 +254,7 @@ class DQN:
# 设计代理 # 设计代理
该代理将与环境交互,并在给定状态的情况下,尝试执行最佳操作。 代理最初将执行随机动作,并且随着训练的进行,动作将更多地基于给定状态的 Q 值。 **epsilon** 参数的值确定操作是随机的概率。 最初,将**ε**设置为`1`,以使操作随机。 当代理已收集指定数量的训练样本时,在每个步骤中都会减少ε,从而减少了随机动作的可能性。 这种基于ε值的作用的方案称为 Epsilon 贪婪算法。 我们定义两个代理类,如下所示: 该代理将与环境交互,并在给定状态的情况下,尝试执行最佳操作。 代理最初将执行随机动作,并且随着训练的进行,动作将更多地基于给定状态的 Q 值。 `epsilon`参数的值确定操作是随机的概率。 最初,将`ε`设置为`1`,以使操作随机。 当代理已收集指定数量的训练样本时,在每个步骤中都会减少ε,从而减少了随机动作的可能性。 这种基于ε值的作用的方案称为 Epsilon 贪婪算法。 我们定义两个代理类,如下所示:
* `Agent`:基于给定状态的 Q 值执行动作 * `Agent`:基于给定状态的 Q 值执行动作
* `RandomAgent`:执行随机动作 * `RandomAgent`:执行随机动作
...@@ -406,7 +406,7 @@ class RandomAgent: ...@@ -406,7 +406,7 @@ class RandomAgent:
# 自动驾驶汽车的环境 # 自动驾驶汽车的环境
自动驾驶汽车的环境是 **OpenAI Gym 的`CarRacing-v0`。** 从此 OpenAI 环境呈现给代理的状态是`CarRacing-v0`中来自仿真汽车正面的图像。 环境**,**也会根据代理在给定状态下采取的行动来返回奖励。 如果汽车踩在草地上,我们将对奖励进行处罚,并将奖励标准化为`(-1,1)`以进行稳定训练。 环境的详细代码如下 自动驾驶汽车的环境是 **OpenAI Gym**`CarRacing-v0` 从此 OpenAI 环境呈现给代理的状态是`CarRacing-v0`中来自仿真汽车正面的图像。 环境**,**也会根据代理在给定状态下采取的行动来返回奖励。 如果汽车踩在草地上,我们将对奖励进行处罚,并将奖励标准化为`(-1,1)`以进行稳定训练。 环境的详细代码如下
```py ```py
import gym import gym
......
# 深度学习视角的验证码 # 深度学习视角的验证码
术语 **CAPTCHA****完全自动化的公共 Turing 测试的缩写,用以区分计算机和人类**。 这是一种旨在区分人类用户与机器或机器人的计算机程序,通常是一种安全措施,可防止垃圾邮件和数据滥用。 早在 1997 年就引入了 CAPTCHA 的概念,当时互联网搜索公司 AltaVista 试图阻止向该平台歪曲其搜索引擎算法的自动 URL 提交。 为了解决这个问题,AltaVista 的首席科学家安德烈·布罗德(Andrei Broder)提出了一种算法,该算法可以随机生成文本图像,这些图像很容易被人识别,但不能被机器人识别。 后来,在 2003 年,Luis von Ahn,Manuel Blum,Nicholas J Hopper 和 John Langford 完善了这项技术,并将其称为 CAPTCHA。 验证码最常见的形式要求用户识别变形图像中的字母和数字。 进行此测试是为了希望人类能够轻松地区分变形图像中的字符,而自动化程序或漫游器将无法区分它们。 验证码测试有时称为反向图灵测试,因为它是由计算机而非人工执行的。 术语 **CAPTCHA****用于区分计算机和人类的完全自动化的公共图灵测试**的缩写。 这是一种旨在区分人类用户与机器或机器人的计算机程序,通常是一种安全措施,可防止垃圾邮件和数据滥用。 早在 1997 年就引入了 CAPTCHA 的概念,当时互联网搜索公司 AltaVista 试图阻止向该平台歪曲其搜索引擎算法的自动 URL 提交。 为了解决这个问题,AltaVista 的首席科学家安德烈·布罗德(Andrei Broder)提出了一种算法,该算法可以随机生成文本图像,这些图像很容易被人识别,但不能被机器人识别。 后来,在 2003 年,Luis von Ahn,Manuel Blum,Nicholas J Hopper 和 John Langford 完善了这项技术,并将其称为 CAPTCHA。 验证码最常见的形式要求用户识别变形图像中的字母和数字。 进行此测试是为了希望人类能够轻松地区分变形图像中的字符,而自动化程序或漫游器将无法区分它们。 验证码测试有时称为反向图灵测试,因为它是由计算机而非人工执行的。
截至最近,CAPTCHA 已开始发挥更大的作用,而不仅仅是防止机器人欺诈。 例如,当 Google 数字化《纽约时报》的档案和 Google 图书中的某些图书时,他们使用了 CAPTCHA 及其变体之一 reCAPTCHA。 通常,通过要求用户正确输入多个验证码的字符来完成此操作。 实际上只有 CAPTCHA 之一被标记并用于验证用户是否为人类。 截至最近,CAPTCHA 已开始发挥更大的作用,而不仅仅是防止机器人欺诈。 例如,当 Google 数字化《纽约时报》的档案和 Google 图书中的某些图书时,他们使用了 CAPTCHA 及其变体之一 reCAPTCHA。 通常,通过要求用户正确输入多个验证码的字符来完成此操作。 实际上只有 CAPTCHA 之一被标记并用于验证用户是否为人类。
...@@ -647,7 +647,7 @@ python captcha_gan.py train --dest_train '/home/santanu/Downloads/train_32x32.ma ...@@ -647,7 +647,7 @@ python captcha_gan.py train --dest_train '/home/santanu/Downloads/train_32x32.ma
众所周知,GAN 很难训练,因此需要调整这些参数,以使模型正常运行。 以下是一些重要参数: 众所周知,GAN 很难训练,因此需要调整这些参数,以使模型正常运行。 以下是一些重要参数:
| **参数** | **值** | **评论** | | **参数** | **值** | **注释** |
| `batch_size` | `100` | 小型批次随机梯度下降的批次大小。 | | `batch_size` | `100` | 小型批次随机梯度下降的批次大小。 |
| `gen_input_dim` | `100` | 输入随机噪声矢量维。 | | `gen_input_dim` | `100` | 输入随机噪声矢量维。 |
| `gen_lr` | `0.0001` | 发电机学习率。 | | `gen_lr` | `0.0001` | 发电机学习率。 |
......
...@@ -66,7 +66,7 @@ import pandas as pd ...@@ -66,7 +66,7 @@ import pandas as pd
%matplotlib inline %matplotlib inline
``` ```
**粗体**:表示新术语,重要单词或您在屏幕上看到的单词。 例如,菜单或对话框中的单词会出现在这样的文本中。 这是一个示例:“用于为特定数据集选择最佳估计器或为所有超参数选择最佳值的方法称为**超参数调**。” **粗体**:表示新术语,重要单词或您在屏幕上看到的单词。 例如,菜单或对话框中的单词会出现在这样的文本中。 这是一个示例:“用于为特定数据集选择最佳估计器或为所有超参数选择最佳值的方法称为**超参数调**。”
警告或重要提示如下所示。 警告或重要提示如下所示。
......
...@@ -335,4 +335,4 @@ def CMatrix(CM, labels=['pay', 'default']): ...@@ -335,4 +335,4 @@ def CMatrix(CM, labels=['pay', 'default']):
在本章中,我们介绍了不同的集成方法,例如引导程序采样,装袋,随机森林和增强方法,并通过一些示例说明了它们的工作原理。 然后,我们将它们用于回归和分类。 对于回归,我们以菱形数据集为例,还训练了一些 KNN 和其他回归模型。 后来,对它们的性能进行了比较。 为了进行分类,我们以信用卡数据集为例。 同样,我们训练了所有回归模型。 我们比较了它们的性能,发现随机森林模型的性能最佳。 在本章中,我们介绍了不同的集成方法,例如引导程序采样,装袋,随机森林和增强方法,并通过一些示例说明了它们的工作原理。 然后,我们将它们用于回归和分类。 对于回归,我们以菱形数据集为例,还训练了一些 KNN 和其他回归模型。 后来,对它们的性能进行了比较。 为了进行分类,我们以信用卡数据集为例。 同样,我们训练了所有回归模型。 我们比较了它们的性能,发现随机森林模型的性能最佳。
在下一章中,我们将研究 k 倍交叉验证和参数调整。 我们将比较具有 k 折叠交叉验证的不同集成学习模型,然后,我们将使用 k 折叠交叉验证进行超参数调整。 在下一章中,我们将研究 k 倍交叉验证和参数调整。 我们将比较具有 K 折交叉验证的不同集成学习模型,然后,我们将使用 K 折交叉验证进行超参数调整。
\ No newline at end of file \ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册