Python 深度学习算法实用指南(六)
原文:
zh.annas-archive.org/md5/844a6ce45a119d3197c33a6b5db2d7b1译者:飞龙
第十一章:探索 Few-Shot Learning 算法
恭喜!我们终于来到了最后一章。我们已经走过了很长的路。我们首先学习了神经网络是什么,以及它们如何用于识别手写数字。然后我们探索了如何使用梯度下降算法训练神经网络。我们还学习了递归神经网络用于序列任务,以及卷积神经网络用于图像识别。接着,我们研究了如何使用单词嵌入算法理解文本的语义。然后我们熟悉了几种不同类型的生成对抗网络和自编码器。
到目前为止,我们已经了解到,当我们有一个相当大的数据集时,深度学习算法表现得非常出色。但是当我们没有大量数据点可以学习时,我们该如何处理?对于大多数使用情况,我们可能得不到一个大型数据集。在这种情况下,我们可以使用 few-shot learning 算法,它不需要大量数据集进行学习。在本章中,我们将理解 few-shot learning 算法如何从较少数量的数据点中学习,并探索不同类型的 few-shot learning 算法。首先,我们将学习一个名为siamese network的流行 few-shot learning 算法。接下来,我们将直观地学习其他几种 few-shot learning 算法,如 prototypical、relation 和 matching networks。
在本章中,我们将学习以下主题:
-
什么是 few-shot learning?
-
Siamese 网络
-
Siamese 网络的架构
-
Prototypical networks
-
Relation 网络
-
Matching networks
什么是 few-shot learning?
从少量数据点中学习被称为few-shot学习或k-shot learning,其中 k 指定数据集中每个类别中的数据点数量。
假设我们正在执行图像分类任务。假设我们有两个类别 - 苹果和橙子 - 我们试图将给定的图像分类为苹果或橙子。当我们的训练集中恰好有一个苹果图像和一个橙子图像时,这被称为 one-shot learning;也就是说,我们仅从每个类别中的一个数据点中学习。如果我们有,比如,11 张苹果图像和 11 张橙子图像,那就称为 11-shot learning。因此,k-shot learning 中的 k 指的是每个类别中我们拥有的数据点数。
还有zero-shot learning,其中我们没有任何类别的数据点。等等,什么?没有任何数据点怎么学习?在这种情况下,我们不会有数据点,但我们会有关于每个类别的元信息,我们将从这些元信息中学习。
由于我们的数据集中有两个类别,即苹果和橙子,我们可以称其为two-way k-shot learning。所以,在 n-way k-shot learning 中,n-way 表示数据集中类别的数量,k-shot 表示每个类别中的数据点数。
我们需要我们的模型仅从少数数据点中学习。为了达到这个目标,我们以同样的方式训练它们;也就是说,我们在非常少的数据点上训练模型。假设我们有一个数据集,。我们从数据集中每个类别中抽取少量数据点,并称之为支持集。同样地,我们从每个类别中抽取一些不同的数据点,并称之为查询集。
我们使用支持集训练模型,并使用查询集进行测试。我们以每集方式训练模型,也就是说,在每一集中,我们从数据集中抽取几个数据点,,准备支持集和查询集,并在支持集上训练,查询集上测试。
孪生网络
孪生网络是一种特殊类型的神经网络,是最简单和最流行的一次学习算法之一。正如我们在前面的章节中所学到的,一次学习是一种技术,我们仅从每个类别中学习一个训练示例。因此,孪生网络主要用于那些每个类别数据点不多的应用场景。
例如,假设我们想为我们的组织构建一个人脸识别模型,并且说我们的组织有大约 500 人。如果我们想要从头开始使用卷积神经网络(CNN)构建我们的人脸识别模型,那么我们需要这 500 人的许多图像来训练网络并获得良好的准确性。但是,显然,我们不会为这 500 人拥有足够多的图像,因此,除非我们有足够的数据点,否则使用 CNN 或任何深度学习算法构建模型是不可行的。因此,在这些情况下,我们可以借助一种复杂的一次学习算法,如孪生网络,它可以从较少的数据点中学习。
但是孪生网络是如何工作的呢?孪生网络基本上由两个对称的神经网络组成,它们共享相同的权重和结构,并且在末端使用能量函数连接在一起,。我们的孪生网络的目标是学习两个输入是相似还是不相似。
假设我们有两幅图像, 和
,我们想要学习这两幅图像是否相似或不相似。如下图所示,我们将图像
输入网络
,将图像
输入网络
。这两个网络的作用是为输入图像生成嵌入(特征向量)。因此,我们可以使用任何能够给我们嵌入的网络。由于我们的输入是图像,我们可以使用卷积网络来生成这些嵌入:也就是用于提取特征。请记住,在这里 CNN 的作用仅仅是提取特征而不是分类。
我们知道这些网络应该具有相同的权重和架构,如果网络 是一个三层 CNN,那么网络
也应该是一个三层 CNN,并且我们必须为这两个网络使用相同的权重集。因此,网络
和 网络
将分别为输入图像
和
提供嵌入。然后,我们将这些嵌入馈送到能量函数中,该函数告诉我们两个输入图像的相似程度。能量函数基本上是任何相似性度量,如欧氏距离和余弦相似度:
孪生网络不仅用于人脸识别,还广泛应用于我们没有多个数据点和需要学习两个输入之间相似性的任务中。孪生网络的应用包括签名验证、相似问题检索和物体跟踪。我们将在下一节详细研究孪生网络。
孪生网络的架构
现在我们对孪生网络有了基本的理解,接下来我们将详细探讨它们。孪生网络的架构如下图所示:
正如您可以在前面的图中看到的那样,siamese 网络由两个相同的网络组成,两者共享相同的权重和架构。假设我们有两个输入, 和
。我们将 Input
输入到 Network
,即
,我们将 Input
输入到 Network
,即
。
正如您可以看到的,这两个网络具有相同的权重,,它们将为我们的输入
和
生成嵌入。然后,我们将这些嵌入传入能量函数,
,它将给出两个输入之间的相似度。可以表达如下:
假设我们使用欧氏距离作为能量函数;那么当 和
相似时,
的值将很低。当输入值不相似时,
的值将很大。
假设您有两个句子,句子 1 和句子 2。我们将句子 1 输入到网络 ,句子 2 输入到网络
。假设我们的网络
和网络
都是长短期记忆(LSTM)网络,并且它们共享相同的权重。因此,网络
和网络
将分别为句子 1 和句子 2 生成嵌入。
然后,我们将这些嵌入传入能量函数,该函数给出两个句子之间的相似度分数。但我们如何训练我们的 siamese 网络呢?数据应该如何?特征和标签是什么?我们的目标函数是什么?
Siamese 网络的输入应该是成对的,,以及它们的二进制标签,
,指示输入对是真实对(相同)还是伪造对(不同)。正如您可以在下表中看到的那样,我们有作为对的句子和标签,表明句子对是真实(1)还是伪造(0)的:
那么,我们的 siamese 网络的损失函数是什么?
由于孪生网络的目标不是执行分类任务而是理解两个输入值之间的相似性,我们使用对比损失函数。可以表达如下:
在上述方程中, 的值是真实标签,如果两个输入值相似则为 1,如果两个输入值不相似则为 0,
是我们的能量函数,可以是任何距离度量。术语边界用于保持约束,即当两个输入值不相似且它们的距离大于一个边界时,它们不会产生损失。
原型网络
原型网络是另一种简单、高效且流行的学习算法。与孪生网络类似,它们试图学习度量空间以执行分类。
原型网络的基本思想是为每个类别创建一个原型表示,并基于类原型与查询点之间的距离对查询点(新点)进行分类。
假设我们有一个支持集,其中包含狮子、大象和狗的图像,如下图所示:
我们有三个类别(狮子、大象和狗)。现在我们需要为这三个类别中的每一个创建一个原型表示。如何建立这三个类的原型?首先,我们将使用某个嵌入函数学习每个数据点的嵌入。嵌入函数,,可以是任何用于提取特征的函数。由于我们的输入是图像,我们可以使用卷积网络作为我们的嵌入函数,它将从输入图像中提取特征,如下所示:
一旦我们学习了每个数据点的嵌入,我们就取每个类中数据点的平均嵌入并形成类原型,如下所示。因此,类原型基本上是类中数据点的平均嵌入:
当一个新的数据点出现时,即我们希望预测标签的查询点时,我们将使用与创建类原型相同的嵌入函数生成这个新数据点的嵌入:也就是说,我们使用卷积网络生成我们的查询点的嵌入:
一旦我们有了查询点的嵌入,我们比较类原型和查询点嵌入之间的距离来确定查询点属于哪个类。我们可以使用欧氏距离作为测量类原型与查询点嵌入之间距离的距离度量,如下所示:
在计算类原型与查询点嵌入之间的距离后,我们对这个距离应用 softmax,并得到概率。由于我们有三类,即狮子、大象和狗,我们将得到三个概率。具有高概率的类将是我们查询点的类别。
由于我们希望我们的网络只从少量数据点学习,也就是说,我们希望进行少样本学习,我们以相同的方式训练我们的网络。我们使用情节式训练;对于每个情节,我们从数据集中的每个类中随机抽样一些数据点,并称之为支持集,并且我们仅使用支持集训练网络,而不是整个数据集。类似地,我们随机从数据集中抽样一个点作为查询点,并尝试预测其类别。通过这种方式,我们的网络学习如何从数据点中学习。
原型网络的整体流程如下图所示。正如您所看到的,首先,我们将为支持集中的所有数据点生成嵌入,并通过取类中数据点的平均嵌入来构建类原型。我们还生成查询点的嵌入。然后我们计算类原型与查询点嵌入之间的距离。我们使用欧氏距离作为距离度量。然后我们对这个距离应用 softmax,并得到概率。
如下图所示,由于我们的查询点是狮子,狮子的概率最高,为 0.9:
原型网络不仅用于一次性/少样本学习,还用于零样本学习。考虑一个情况,我们没有每个类的数据点,但我们有包含每个类高级描述的元信息。
在这些情况下,我们学习每个类的元信息的嵌入以形成类原型,然后使用类原型进行分类。
关系网络
关系网络包括两个重要的函数:嵌入函数,用表示,以及关系函数,用
表示。嵌入函数用于从输入中提取特征。如果我们的输入是图像,那么我们可以使用卷积网络作为我们的嵌入函数,它将给出图像的特征向量/嵌入。如果我们的输入是文本,那么我们可以使用 LSTM 网络来获取文本的嵌入。假设我们有一个包含三类的支持集,{狮子,大象,狗}如下所示:
假设我们有一个查询图像 ,如下图所示,我们想要预测这个查询图像的类别:
首先,我们从支持集中每个图像 中取出,并通过嵌入函数
提取特征。由于我们的支持集包含图像,我们可以将卷积网络作为我们的嵌入函数,用于学习嵌入。嵌入函数将为支持集中每个数据点提供特征向量。类似地,我们通过将查询图像
传递给嵌入函数
来学习查询图像的嵌入。
一旦我们有了支持集的特征向量 和查询集的特征向量
,我们使用某些运算符
将它们组合起来。这里,
可以是任何组合运算符。我们使用串联作为运算符来组合支持集和查询集的特征向量:
如下图所示,我们将组合支持集的特征向量,,以及查询集的特征向量,
。但是,这样组合有什么用呢?嗯,这将帮助我们理解支持集中图像的特征向量与查询图像的特征向量之间的关系。
在我们的例子中,这将帮助我们理解狮子的特征向量如何与查询图像的特征向量相关联,大象的特征向量如何与查询图像的特征向量相关联,以及狗的特征向量如何与查询图像的特征向量相关联:
但是我们如何衡量这种相关性呢?嗯,这就是为什么我们使用关系函数 。我们将这些组合特征向量传递给关系函数,它将生成关系分数,范围从 0 到 1,表示支持集
中样本与查询集
中样本之间的相似度。
下面的方程显示了我们如何在关系网络中计算关系分数,:
在这里, 表示关系分数,表示支持集中每个类别与查询图像的相似度。由于支持集中有三个类别和一个查询集中的图像,我们将得到三个分数,表示支持集中所有三个类别与查询图像的相似度。
在一次性学习设置中,关系网络的整体表示如下图所示:
匹配网络
匹配网络是谷歌 DeepMind 发布的又一种简单高效的一次性学习算法。它甚至可以为数据集中未观察到的类别生成标签。假设我们有一个支持集 ,包含
个例子作为
。当给出一个查询点(新的未见示例)
时,匹配网络通过与支持集比较来预测
的类别。
我们可以将其定义为 ,其中
是参数化的神经网络,
是查询点
的预测类别,
是支持集。
将返回
属于支持集中每个类的概率。然后我们选择具有最高概率的类作为
的类别。但这究竟是如何工作的?这个概率是如何计算的?让我们现在看看。查询点
的类别
可以预测如下:
让我们解析这个方程。这里 和
是支持集的输入和标签。
是查询输入,即我们希望预测标签的输入。同时
是
和
之间的注意力机制。但是我们如何执行注意力?这里,我们使用了一个简单的注意力机制,即
和
之间的余弦距离上的 softmax:
我们不能直接计算原始输入 和
之间的余弦距离。因此,首先,我们将学习它们的嵌入并计算嵌入之间的余弦距离。我们使用两种不同的嵌入,
和
,分别用于学习
和
的嵌入。我们将在接下来的部分详细学习这两个嵌入函数
和
如何学习这些嵌入。因此,我们可以重写我们的注意力方程如下:
我们可以将上述方程重写如下:
计算注意力矩阵 后,我们将注意力矩阵乘以支持集标签
。但是我们如何将支持集标签与我们的注意力矩阵相乘呢?首先,我们将支持集标签转换为独热编码值,然后将它们与我们的注意力矩阵相乘,结果得到我们的查询点
属于支持集各类的概率。然后我们应用 argmax 并选择具有最大概率值的
。
如果对匹配网络还不清楚?看看以下图表;您可以看到我们的支持集中有三类(狮子、大象和狗),我们有一个新的查询图像 。
首先,我们将支持集输入到嵌入函数 ,将查询图像输入到嵌入函数
,学习它们的嵌入并计算它们之间的余弦距离,然后我们在这个余弦距离上应用 softmax 注意力。然后,我们将我们的注意力矩阵乘以支持集标签的独热编码,并得到概率。接下来,我们选择概率最高的
。正如您在以下图表中看到的那样,查询集图像是一只大象,我们在索引 1 处具有很高的概率,因此我们预测
的类别为 1(大象):
我们已经学到我们使用两个嵌入函数, 和
,分别学习
和
的嵌入。现在我们将看看这两个函数如何学习嵌入。
支持集嵌入函数
我们使用嵌入函数 来学习支持集的嵌入。我们将双向 LSTM 作为我们的嵌入函数
。我们可以定义我们的嵌入函数
如下:
def g(self, x_i):
forward_cell = rnn.BasicLSTMCell(32)
backward_cell = rnn.BasicLSTMCell(32)
outputs, state_forward, state_backward = rnn.static_bidirectional_rnn(forward_cell, backward_cell, x_i, dtype=tf.float32)
return tf.add(tf.stack(x_i), tf.stack(outputs))
查询集嵌入函数
我们使用嵌入函数 来学习我们查询点
的嵌入。我们使用 LSTM 作为我们的编码函数。连同输入
,我们还会传递支持集嵌入的嵌入 g(x),并且还会传递一个称为 K 的参数,该参数定义了处理步骤的数量。让我们逐步看看如何计算查询集嵌入。首先,我们将初始化我们的 LSTM 单元:
cell = rnn.BasicLSTMCell(64)
prev_state = cell.zero_state(self.batch_size, tf.float32)
然后,在处理步骤的数量上,我们执行以下操作:
for step in xrange(self.processing_steps):
我们通过将其馈送到 LSTM 单元来计算查询集 的嵌入:
output, state = cell(XHat, prev_state)
h_k = tf.add(output, XHat)
现在,我们对支持集嵌入 g_embeddings 执行 softmax 注意力:即,它帮助我们避免不需要的元素:
content_based_attention = tf.nn.softmax(tf.multiply(prev_state[1], g_embedding))
r_k = tf.reduce_sum(tf.multiply(content_based_attention, g_embedding), axis=0)
我们更新 previous_state 并重复这些步骤,执行 K 次处理步骤:
prev_state = rnn.LSTMStateTuple(state[0], tf.add(h_k, r_k))
计算 f_embeddings 的完整代码如下:
def f(self, XHat, g_embedding):
cell = rnn.BasicLSTMCell(64)
prev_state = cell.zero_state(self.batch_size, tf.float32)
for step in xrange(self.processing_steps):
output, state = cell(XHat, prev_state)
h_k = tf.add(output, XHat)
content_based_attention = tf.nn.softmax(tf.multiply(prev_state[1], g_embedding))
r_k = tf.reduce_sum(tf.multiply(content_based_attention, g_embedding), axis=0)
prev_state = rnn.LSTMStateTuple(state[0], tf.add(h_k, r_k))
return output
匹配网络的架构
匹配网络的整体流程如下图所示,与我们已经看到的图像不同。您可以看到如何通过嵌入函数 和
计算支持集
和查询集
。
正如您所看到的,嵌入函数 将查询集
与支持集嵌入一起作为输入:
再次祝贺您学习了所有重要和流行的深度学习算法!深度学习是一个非常有趣和流行的 AI 领域,它已经改变了世界。现在您已经完成了书籍的阅读,可以开始探索深度学习的各种进展,并开始尝试各种项目。学习和深入学习!
摘要
我们从理解 k-shot 学习开始本章。我们了解到在 n-way k-shot 学习中,n-way 表示数据集中的类别数,k-shot 表示每个类别中的数据点数量;支持集和查询集相当于训练集和测试集。然后我们探索了孪生网络。我们学习了孪生网络如何使用相同的网络学习两个输入的相似度。
接着,我们学习了原型网络,它创建每个类的原型表示,并基于类原型与查询点之间的距离对查询点(新点)进行分类。我们还学习了关系网络如何使用两个不同的函数,嵌入函数和关系函数来分类图像。
在本章末尾,我们学习了匹配网络以及它如何使用支持集和查询集的不同嵌入函数来分类图像。
深度学习是人工智能领域中最有趣的分支之一。现在您已经了解了各种深度学习算法,可以开始构建深度学习模型,创建有趣的应用,并为深度学习研究做出贡献。
问题
让我们通过回答以下问题来评估从本章中获得的知识:
-
什么是少样本学习?
-
什么是支持集和查询集?
-
定义孪生网络。
-
定义能量函数。
-
孪生网络的损失函数是什么?
-
原型网络是如何工作的?
-
在关系网络中使用的不同类型函数是什么?
进一步阅读
要了解如何从少量数据点中学习更多,请查看 Sudharsan Ravichandiran 撰写、由 Packt 出版的Hands-On Meta Learning with Python,可在www.packtpub.com/big-data-and-business-intelligence/hands-meta-learning-python获取。
第十二章:评估
以下是每章末尾提到的问题的答案。
第一章 - 深度学习简介
-
机器学习的成功在于正确的特征集合。特征工程在机器学习中扮演了关键角色。如果我们手工设计了正确的特征集合来预测某种结果,那么机器学习算法可以表现良好,但是找到和设计出正确的特征集合并不是一件容易的任务。有了深度学习,我们不需要手工设计这样的特征。由于深度人工神经网络(ANNs)使用了多层,它们自己学习数据的复杂内在特征和多级抽象表示。
-
这基本上是由于 ANN 的结构。ANN 由一些n个层组成,以执行任何计算。我们可以构建一个有多层的 ANN,其中每一层负责学习数据中的复杂模式。由于计算技术的进步,我们甚至可以构建深层次的网络,拥有数百甚至数千层。由于 ANN 使用深层进行学习,我们称其为深度学习;当 ANN 使用深层进行学习时,我们称其为深度网络。
-
激活函数用于向神经网络引入非线性。
-
当我们向 ReLU 函数输入任何负值时,它会将它们转换为零。对于所有负值变为零的问题称为dying ReLU。
-
从输入层到输出层的整个预测输出过程称为前向传播。在这个传播过程中,输入会在每一层被其相应的权重乘以,并在其上应用激活函数。
-
从输出层向输入层反向传播网络,并使用梯度下降更新网络权重以最小化损失的整个过程称为反向传播。
-
梯度检查基本上用于调试梯度下降算法,并验证我们是否有正确的实现。
第二章 - 了解 TensorFlow
-
TensorFlow 中的每个计算都由计算图表示。它由多个节点和边组成,其中节点是数学操作,如加法、乘法等,边是张量。计算图在优化资源方面非常高效,也促进了分布式计算。
-
一个计算图包含了节点上的操作和其边上的张量,只有创建了这个图,我们才能使用 TensorFlow 会话来执行它。
-
可以使用
tf.Session()来创建 TensorFlow 会话,并且它将分配内存以存储变量的当前值。 -
变量是用来存储值的容器。变量将作为计算图中多个操作的输入。我们可以将占位符视为变量,其中我们只定义类型和维度,但不分配值。占位符的值将在运行时提供。我们通过占位符将数据馈送给计算图。占位符被定义为没有值。
-
TensorBoard 是 TensorFlow 的可视化工具,可以用来可视化计算图。它还可以用来绘制各种定量指标和几个中间计算的结果。当我们训练一个非常深的神经网络时,如果我们不得不调试模型,情况可能变得混乱。通过在 TensorBoard 中可视化计算图,我们可以轻松理解、调试和优化这样复杂的模型。它还支持共享。
-
作用域用于减少复杂性,并通过将相关节点分组来帮助我们更好地理解模型。在图中具有名称作用域有助于我们组织类似操作。当我们构建复杂的架构时,这非常方便。作用域可以使用
tf.name_scope()创建。 -
TensorFlow 中的急切执行更符合 Python 风格,并允许快速原型设计。与图模式不同,我们无需每次执行操作时都构建一个图表,急切执行遵循命令式编程范例,可以立即执行任何操作,就像在 Python 中一样。
第三章 - 梯度下降及其变体
-
与梯度下降不同,在 SGD 中,为了更新参数,我们不必遍历训练集中的所有数据点。相反,我们只需遍历单个数据点。也就是说,与梯度下降不同,在遍历训练集中的所有数据点之后等待更新模型参数是不必要的。我们只需在遍历训练集中的每个单一数据点之后更新模型的参数。
-
在小批量梯度下降中,我们不是在遍历每个训练样本后更新参数,而是在遍历一些数据点批次后更新参数。假设批量大小为 50,这意味着我们在遍历 50 个数据点后更新模型的参数,而不是在遍历每个单独数据点后更新参数。
-
使用动量执行小批量梯度下降有助于减少梯度步骤中的振荡,并更快地达到收敛。
-
Nesterov 动量背后的基本动机是,我们不是在当前位置计算梯度,而是在动量将我们带到的位置计算梯度,我们称这个位置为前瞻位置。
-
在 Adagrad 中,当过去梯度值较高时,我们将学习率设置为较小的值,当过去梯度值较小时,我们将其设置为较高的值。因此,我们的学习率值根据参数过去梯度的更新而改变。
-
Adadelta 的更新方程如下:
-
RMSProp 是为了解决 Adagrad 的学习率衰减问题而引入的。因此,在 RMSProp 中,我们计算梯度的指数衰减运行平均值如下:
我们不是采用过去所有梯度的平方和,而是使用这些梯度的运行平均值。因此,我们的更新方程如下:
-
Adam 的更新方程如下:
第四章 - 使用 RNN 生成歌词
-
一个普通的前馈神经网络仅基于当前输入预测输出,但是循环神经网络基于当前输入和前一个隐藏状态预测输出,前者充当内存并存储到目前为止网络所见的上下文信息(输入)。
-
在时间步长为
时,隐藏状态
可以计算如下:
换句话说,这是一个时间步长 t 时的隐藏状态,tanh([输入到隐藏层权重 x 输入] + [隐藏到隐藏层权重 x 上一个隐藏状态])。
-
RNN 广泛应用于涉及序列数据的用例,如时间序列、文本、音频、语音、视频、天气等。它们在各种自然语言处理(NLP)任务中得到广泛应用,如语言翻译、情感分析、文本生成等。
-
在反向传播 RNN 时,我们在每个时间步长乘以权重和tanh函数的导数。当我们在向后移动时在每一步乘以较小的数字时,我们的梯度变得微小,导致计算机无法处理的数值;这就是所谓的梯度消失问题。
-
当我们将网络的权重初始化为非常大的数时,梯度将在每一步变得非常大。在反向传播时,我们在每个时间步长都乘以一个大数,这会导致梯度变为无穷大。这就是所谓的梯度爆炸问题。
-
我们使用梯度裁剪来规避梯度爆炸问题。在这种方法中,我们根据向量范数(比如,L2)对梯度进行归一化,并将梯度值裁剪到一定范围内。例如,如果我们将阈值设为 0.7,那么我们将梯度保持在-0.7 到+0.7 的范围内。如果梯度值超过-0.7,则将其更改为-0.7;同样地,如果超过了 0.7,则将其更改为+0.7。
-
不同类型的 RNN 架构包括一对一、一对多、多对一和多对多,并且它们用于各种应用。
第五章 - RNN 的改进
-
长短期记忆(LSTM)单元是 RNN 的一种变体,通过使用称为门的特殊结构解决了梯度消失问题。门控制信息在记忆中保持所需的时间。它们学习保留哪些信息和丢弃哪些信息。
-
LSTM 由三种类型的门组成,即遗忘门、输入门和输出门。遗忘门负责决定从细胞状态(记忆)中移除哪些信息。输入门负责决定将哪些信息存储在细胞状态中。输出门负责决定从细胞状态中提取哪些信息作为输出。
-
细胞状态也称为内部记忆,所有信息都将存储在这里。
-
在反向传播 LSTM 网络时,我们需要在每次迭代中更新太多的参数。这增加了我们的训练时间。因此,我们引入了作为 LSTM 单元简化版本的门控循环单元(GRU)单元。与 LSTM 不同,GRU 单元只有两个门和一个隐藏状态。
-
在双向 RNN 中,我们有两个不同的隐藏单元层。这两个层从输入连接到输出层。在一个层中,隐藏状态从左到右共享,在另一个层中,从右到左共享。
-
深度 RNN 通过使用前一个隐藏状态和前一层的输出来计算隐藏状态。
-
编码器学习给定输入句子的表示(嵌入)。一旦编码器学习到嵌入,它将嵌入发送给解码器。解码器将这个嵌入(思维向量)作为输入,并尝试构建目标句子。
-
当输入句子很长时,上下文向量并不能捕获整个句子的完整含义,因为它只是最终时间步的隐藏状态。因此,我们不是将最后的隐藏状态作为上下文向量并在解码器中使用注意力机制,而是取所有隐藏状态的总和作为上下文向量。
第六章 - 解密卷积网络
-
CNN 的不同层包括卷积、池化和全连接层。
-
我们通过一个像素滑动输入矩阵和过滤矩阵,并执行卷积操作。但我们不仅可以通过一个像素滑动输入矩阵,还可以通过任意数量的像素滑动输入矩阵。我们通过过滤矩阵滑动输入矩阵的像素数称为步长。
-
在卷积操作中,我们用一个过滤器矩阵滑动在输入矩阵上。但在某些情况下,过滤器不能完全适应输入矩阵。也就是说,当我们将我们的过滤器矩阵移动两个像素时,它会到达边界,过滤器不适合输入矩阵,也就是说,我们的过滤器矩阵的某些部分在输入矩阵之外。在这种情况下,我们进行填充。
-
池化层通过保留重要特征来减少空间维度。不同类型的池化操作包括最大池化、平均池化和总和池化。
-
VGGNet 是最广泛使用的 CNN 架构之一。它由牛津大学的视觉几何组(VGG)发明。VGG 网络的架构由卷积层和池化层组成。它在整个网络中使用 3 x 3 卷积和 2 x 2 池化。
-
通过分解卷积层,我们将具有较大过滤器尺寸的卷积层分解为具有较小过滤器尺寸的一堆卷积层。因此,在 inception 块中,具有 5 x 5 过滤器的卷积层可以分解为两个具有 3 x 3 过滤器的卷积层。
-
类似于 CNN,胶囊网络检查某些特征的存在以对图像进行分类,但除了检测特征外,它还会检查它们之间的空间关系 - 也就是说,它学习特征的层次结构。
-
在胶囊网络中,除了计算概率之外,我们还需要保留向量的方向,因此我们使用一种称为压缩函数的不同激活函数。它如下所示:
第七章 - 学习文本表示
-
在连续词袋(CBOW)模型中,我们试图预测给定上下文词的目标词,而在 skip-gram 模型中,我们试图预测给定目标词的上下文词。
-
CBOW 模型的损失函数如下所示:
-
当我们的词汇表中有数百万个单词时,我们需要执行大量的权重更新,直到预测正确的目标词。这是耗时且不高效的方法。因此,我们不是这样做,而是将正确的目标词标记为正类,并从词汇表中随机抽取几个词并标记为负类,这被称为负采样。
-
PV-DM 类似于连续词袋模型,其中我们试图预测给定上下文词的目标词。在 PV-DM 中,除了词向量外,我们引入了另一个向量,称为段落向量。顾名思义,段落向量学习整个段落的向量表示,并捕捉段落的主题。
-
编码器的作用是将句子映射到向量,解码器的作用是生成周围的句子;即前面和后面的句子。
-
在 QuickThoughts 中,有一个有趣的算法用于学习句子嵌入。在 quick-thoughts 中,我们试图学习一个给定句子是否与候选句子相关。因此,我们使用分类器而不是解码器来学习是否一个给定的输入句子与候选句子相关。
第八章 - 使用 GAN 生成图像
-
辨别模型学习如何以最佳方式找到分隔类别的决策边界,而生成模型则学习每个类别的特征。也就是说,辨别模型预测输入条件下的标签,
,而生成模型学习联合概率分布,
。
-
生成器学习数据集中图像的分布。它学习训练集中手写数字的分布。我们向生成器输入随机噪声,它将把随机噪声转换成与训练集中类似的新手写数字。
-
判别器的目标是执行分类任务。给定一幅图像,它将其分类为真实或虚假;也就是说,图像是来自训练集还是生成器生成的。
-
判别器的损失函数如下所示:
生成器的损失函数如下所示:
-
DCGAN 使用卷积网络扩展了 GAN 的设计。也就是说,我们用卷积神经网络替换了生成器和判别器中的前馈网络,卷积神经网络(CNN)。
-
Kullback-Leibler(KL)散度是用于确定一个概率分布与另一个概率分布之间差异的最常用度量之一。假设我们有两个离散概率分布,
和
,那么 KL 散度可以表达如下:
-
瓦瑟斯坦距离,也被称为地球移动距离(EM)距离,在最优传输问题中是最常用的距离度量之一,用于从一种配置移动物品到另一种配置。
-
利普希茨连续函数是一种必须处处连续且几乎处处可微的函数。因此,对于任何利普希茨连续函数,函数图形斜率的绝对值不能超过一个常数,
。这个常数,
,称为利普希茨常数。
第九章 - 深入学习 GAN
-
与普通 GAN 不同,**条件生成对抗网络(CGAN)**对生成器和鉴别器都施加条件。这个条件告诉 GAN 我们期望生成器生成什么图像。因此,我们的两个组件——鉴别器和生成器——都基于这个条件进行操作。
-
代码 c 基本上是可解释的解缠信息。假设我们有一些 MNIST 数据,那么,代码 c1 表示数字标签,代码 c2 表示数字的宽度,代码 c3 表示数字的笔画等。我们用术语 c 统称它们。
-
两个随机变量之间的互信息告诉我们通过一个随机变量可以从另一个随机变量获取的信息量。随机变量 x 和 y 之间的互信息可以表示如下:
它基本上是 y 的熵和在给定 x 的条件下 y 的条件熵之间的差异。
-
代码 c 给出了关于图像的可解释的解缠信息。因此,我们试图在不知道后验分布
的情况下找到 c,因此,我们使用辅助分布
来学习 c。
-
仅仅靠对抗损失并不能确保图像的正确映射。例如,生成器可以将源域中的图像映射到与目标域中的目标分布相匹配的随机排列图像中。因此,为了避免这种情况,我们引入了一种额外的损失,称为循环一致性损失。它强制生成器 G 和 F 都保持循环一致。
-
我们有两个生成器:
和
。
的作用是学习从
到
的映射,生成器
的作用是学习从 y 到
的映射。
-
Stack GANs 将文本描述转换为图像分为两个阶段。在第一阶段,艺术家绘制基本形状,并创建形成图像初始版本的基本轮廓。在下一个阶段,他们通过使图像更加真实和吸引人来增强图像。
第十章 - 使用自编码器重建输入
-
自编码器是一种无监督学习算法。与其他算法不同,自编码器学习重建输入,也就是说,自编码器接受输入并学习以输出形式复制输入。
-
我们可以将我们的损失函数定义为实际输入和重构输入之间的差异,如下所示:
在这里,
是训练样本的数量。
-
卷积自编码器(CAE)使用卷积网络而不是普通的神经网络。在普通自编码器中,编码器和解码器基本上是前馈网络。但在 CAE 中,它们基本上是卷积网络。这意味着编码器由卷积层组成,解码器由转置卷积层组成,而不是原始的前馈网络。
-
去噪自编码器(DAE)是自编码器的另一个小变体。它们主要用于从图像、音频和其他输入中去除噪声。因此,我们将损坏的输入提供给自编码器,它学习重构原始的未损坏输入。
-
隐藏层中的神经元
的平均激活可以计算为整个训练集上的以下值:
-
对抗自编码器的损失函数可以数学表示如下:
第一项代表重构误差,第二项代表惩罚项或正则化器,基本上是Jacobian 矩阵的Frobenius 范数。
-
矩阵的 Frobenius 范数,也称为Hilbert-Schmidt 范数,定义为其元素的绝对平方和的平方根。由向量值函数的偏导组成的矩阵称为Jacobian 矩阵。
第十一章 - 探索少样本学习算法
-
从少量数据点中学习称为少样本学习或k-样本学习,其中k指定数据集中每个类中的数据点数。
-
我们需要我们的模型仅从少量数据点中学习。为了实现这一点,我们以相同的方式训练它们;也就是说,我们在很少的数据点上训练模型。假设我们有一个数据集,
:我们从每个类别中取样少量数据点,并称之为支持集。类似地,我们从每个类别中取样一些不同的数据点,并称之为查询集。
-
Siamese 网络基本上由两个对称的神经网络组成,两者共享相同的权重和架构,并在末端使用某种能量函数
连接在一起。我们 Siamese 网络的目标是学习两个输入是否相似或不相似。
-
能量函数
,它将为我们提供两个输入之间的相似度。它可以表达如下:
-
由于 Siamese 网络的目标不是执行分类任务,而是理解两个输入值之间的相似性,因此我们使用对比损失函数。它可以表达如下:
-
原型网络是另一种简单、高效且广泛使用的少样本学习算法。原型网络的基本思想是为每个类别创建一个原型表示,并根据类别原型与查询点(新点)之间的距离对查询点进行分类。
-
关系网络由两个重要函数组成:一个嵌入函数,用
表示,和一个关系函数,用
表示。