1. 第一章
1.1 K最邻近分类算法(K-NearestNeighbor,KNN)
这是最容易想到、最朴素的图像分类算法。主要步骤有两步:
在训练期间,分类器记住所有的训练数据。
在测试过程中,kNN通过与所有训练图像进行比较,对每张测试图像进行分类,对于每张测试图像在训练数据中选择K个最相似的训练数据,并且将标签置为k中类别数最大的类。
注意:上述步骤中的k可以通过交叉验证得到。
数据集:CIFAR-10
1.2 支持向量机(Support Vector Machine, SVM)
将训练样本分开的超平面很多,哪一个更好呢?
正中间的:泛化性能最好
最大间隔:寻找参数,使得间隔最大
若不存在一个能正确划分两类样本的超平面,怎么办?
将样本从原始空间映射到一个更高维的特征空间,使样本在这个特征空间内线性可分。
如果原始空间是有限维,那么一定存在一个高维特征空间使得样本可分。
软间隔
现实中很难确定合适的核函数,使训练样本在特征空间中线性可分,即便貌似线性可分,也很难断定是否是因过拟合造成的。因此引入软间隔(soft margin),允许在一些样本上不满足约束:
**基本思路:**最大化间隔的同时,让不满足约束
1.3 Softmax(非严格最大化)
假设我们有一个数组V,Vi表示V中的第i个元素,那么这个元素的Softmax值就是
好处是:可以把每个值映射成一个概率总和为1,并且是平滑的;计算也便利。
1.4 全连接的神经网络(Fully Connected Neural Network)
前馈网络中各个神经元按接收信息的先后分为不同的组。每一组可以看作一个神经层.每一层中的神经元接收前一层神经元的输出,并输出到下一层神经元。整个网络中的信息是朝一个方向传播,没有反向的信息传播,可以用一个有向无环路图表示。前馈网络包括全连接前馈网络和卷积神经网络等。
层内无连接,层间全连接
第二章
2.1 卷积神经网络(Convolutional Neural Network)
全连接前馈网络缺点:参数太多;难以提取局部不变性特征。
目前的卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的前馈神经网络。全连接层一般在卷积网络的最顶层。卷积神经网络有三个结构上的特性:局部连接、权重共享以及汇5.1 卷积 聚.这些特性使得卷积神经网络具有一定程度上的平移、缩放和旋转不变性。和前馈神经网络相比,卷积神经网络的参数更少。
真正的卷积需要180度翻转,但是在机器学习和图像处理领域这种翻转并无益处,因此实际上采用的不翻转卷积也称互相关,在机器学习领域也直接称之为卷积。
从上图一维卷积示例不难看出:卷积可以提取出与卷积核相同的特征。第一个提取出低频,第二个提取出高频。
注意:这个是真正的卷积。
卷积的变种
步长(Stride)是指卷积核在滑动时的时间间隔。
零填充(Zero Padding)是在输入向量两端进行补零。
经过卷积后张量大小计算: (𝑀 − 𝐾 +2𝑃)/𝑆 + 1。
卷积网络的整体结构
一个卷积块为连续M个卷积层和b个汇聚层( M通常设置为2~ 5,b为0或1)。一个卷积网络中可以堆叠N个连续的卷积块,然后在后面接着K个全连接层( N的取值区间比较大,比如1 ~ 100或者更大;K一般为0~2)。
2.2 批标准化(Batch Normalization)
让深度网络更容易训练的一种方法是使用更复杂的优化程序,如SGD+momentum、RMSProp或Adam。另一个策略是改变网络的结构,使其更容易训练。沿着这些思路的一个想法是批量规范化。
这个想法相对直接。当机器学习方法的输入数据由均值为零、单位方差的不相关特征组成时,其效果往往更好。在训练神经网络时,我们可以在将数据送入网络之前对其进行预处理,以明确修饰其特征;这将确保网络的第一层看到遵循良好分布的数据。然而,即使我们对输入数据进行了预处理,网络较深层的激活也很可能不再是去关联的,不再具有零均值或单位方差,因为它们是由网络中较早层的输出。更糟糕的是,在训练过程中,网络各层的特征分布将随着各层权重的更新而发生变化。
【1】的作者假设,深度神经网络内部特征分布的移动可能会使深度网络的训练更加困难。为了克服这个问题,【1】提出在网络中插入批量规范化层。在训练时,批量归一化层使用迷你批次的数据来估计每个特征的平均值和标准差。这些估计的平均数和标准差然后被用来对迷你批的特征进行中心化和规范化。在训练过程中,这些平均值和标准差被保留下来,在测试时,这些运行平均值被用于中心化和规范化特征。
这种归一化策略可能会降低网络的代表性,因为有时某些层的特征不是零均值或单位方差,可能是最佳的。为此,批量归一化层包括每个特征维度的可学习的移动和缩放参数。
计算
我们首先计算出平均值𝜇和方差𝑣。有了𝜇和𝑣的计算结果,我们就可以计算出标准差𝜎和归一化数据𝑌。下面的公式和图形说明描述了计算过程(𝑦𝑖是向量𝑌的第i个元素)。
2.3 丢弃法(Dropout)
当训练一个深度神经网络时,我们可以随机丢弃一部分神经元(同时丢弃其对应的连接边)来避免过拟合,这种方法称为丢弃法(Dropout Method)。Dropout是一种规范化神经网络的技术,它在前向传递过程中随机地将一些输出激活设置为零。
解释
集成学习角度的解释 每做一次丢弃,相当于从原始的网络中采样得到一个子网络。如果一个神经网络有 𝑛 个神经元,那么总共可以采样出 2𝑛 个子网络.每次迭代都相当于训练一个不同的子网络,这些子网络都共享原始网络的参数。那么,最终的网络可以近似看作集成了指数级个不同网络的组合模型。
贝叶斯学习角度的解释 丢弃法也可以解释为一种贝叶斯学习的近似。用𝑦 = 𝑓(𝒙; 𝜃)来表示要学习的神经网络,贝叶斯学习是假设参数𝜃 为随机向量,并且先验分布为𝑞(𝜃),贝叶斯方法的预测为
其中𝑓(𝒙, 𝜃𝑚)为第𝑚次应用丢弃方法后的网络,其参数𝜃𝑚 为对全部参数𝜃 的一次采样。
2.4 PyTorch
PyTorch是一个在Tensor对象上执行动态计算图的系统,其行为类似于numpy ndarray。它配备了一个强大的自动分化引擎,消除了手动反向传播的需要。
为什么使用PyTorch?
我们的代码现在将在GPU上运行! 更快的训练。当使用像PyTorch或TensorFlow这样的框架时,你可以利用GPU的力量来实现你自己的定制神经网络架构,而不需要直接编写CUDA代码。
我们希望你能准备好为你的项目使用这些框架之一,这样你就能比手工编写每一个你想使用的功能更有效地进行实验。
我们希望你能站在巨人的肩膀上! TensorFlow和PyTorch都是优秀的框架,它们会让你的生活变得更加轻松,现在你已经了解了它们的内涵,你可以自由地使用它们了。
我们希望你能接触到你可能在学术界或工业界遇到的那种深度学习代码。
第三章
3.1 使用RNN的图像说明(Image Captioning with RNNs)
图片说明问题:给出一张图片输出对图片内容的文字描述。常用数据集:COCO Dataset。
循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络。在循环神经网络中,神经元不但可以接受其他神经元的信息,也可以接受自身的信息,形成具有环路的网络结构。
简单循环网络(Simple Recurrent Network,SRN)是一个非常简单的循环神经网络,只有一个隐藏层的神经网络.在一个两层的前馈神经网络中,连接存在相邻的层与层之间,隐藏层的节点之间是无连接的.而简单循环网络增加了从隐藏层到隐藏层的反馈连接。
基于门控的循环神经网络:
长短期记忆网络(Long Short-Term Memory Network,LSTM)
遗忘门𝒇𝑡 控制上一个时刻的内部状态𝒄𝑡−1 需要遗忘多少信息
输入门𝒊𝑡 控制当前时刻的候选状态𝒄t有多少信息需要保存
输出门 𝒐𝑡 控制当前时刻的内部状态 𝒄𝑡 有多少信息需要输出给外部状
门控循环单元(Gated Recurrent Unit,GRU)网络是一种比LSTM网络更加简单的循环神经网络。
3.2 生成式对抗网络(Generative Adversarial Networks)
参考文献
2014年,Goodfellow等人提出了一种训练生成模型的方法,称为生成对抗网络(简称GANs)。在一个GAN中,我们建立了两个不同的神经网络。我们的第一个网络是一个传统的分类网络,称为判别器。我们将训练判别器来获取图像,并将它们分类为真实(属于训练集)或虚假(不存在于训练集)。我们的另一个网络,称为生成器,将采取随机噪声作为输入,并使用神经网络将其转换为图像。生成器的目标是欺骗判别器,使其认为它产生的图像是真的。
我们可以把生成器(𝐺)试图愚弄判别器(𝐷),以及判别器试图正确分类真假图像的这个来回过程看作是一个最小化游戏。
其中𝑧∼𝑝(𝑧)是随机噪声样本,𝐺(𝑧)是使用神经网络发生器𝐺生成的图像,而𝐷是判别器的输出,指定一个输入是真实的概率。在Goodfellow等人的文章中,他们分析了这个最小化游戏,并展示了它与训练数据分布和从𝐺生成的样本之间的Jensen-Shannon分歧最小化的关系。
为了优化这个最小化游戏,我们将在对𝐺的目标采取梯度下降步骤和对𝐷的目标采取梯度上升步骤之间进行权衡。
更新生成器(𝐺),使判别器做出正确选择的概率最小。
更新判别器(𝐷),使判别器做出正确选择的概率最大化。
虽然这些更新对分析很有用,但在实践中却表现不佳。相反,当我们更新发生器时,我们将使用一个不同的目标:最大限度地提高鉴别器做出错误选择的概率。这一微小的变化有助于避免当鉴别器有信心时生成器梯度消失的问题。这是大多数GAN论文中使用的标准更新,在Goodfellow等人的原始论文中也使用过。
在这项任务中,我们将交替进行以下更新。
更新生成器( 𝐺 ),使判别器在生成的数据上做出错误选择的概率最大化
更新判别器(𝐷),使判别器在真实和生成的数据上做出正确选择的概率最大化
3.3 自我监督的对比性学习(Self-Supervised Contrastive Learning)
什么是自我监督学习?
现代的机器学习需要大量的标记数据。但很多时候,获得大量的人类标记的数据是具有挑战性和/或昂贵的。有没有一种方法,我们可以要求机器自动学习一个模型,在没有标记数据集的情况下产生良好的视觉表现?是的,这就是自我监督学习!
自我监督学习(SSL)允许模型使用给定数据集中的数据自动学习一个 "好的 "表示空间,而不需要它们的标签。具体来说,如果我们的数据集是一堆图像,那么自我监督学习允许模型学习并为图像生成一个 "好的 "表示向量。
SSL方法之所以大受欢迎,是因为学到的模型在其他数据集上也能继续表现良好,即在模型没有被训练过的新数据集上也能表现良好。
什么是 "好 "的表示?
一个 "好的 "表示向量需要捕捉图像的重要特征,因为它与数据集的其他部分有关。这意味着数据集中代表语义相似实体的图像应该有相似的表示向量,而数据集中的不同图像应该有不同的表示向量。例如,两个苹果的图像应该有类似的表示向量,而一个苹果的图像和一个香蕉的图像应该有不同的表示向量。
对比性学习:SimCLR
最近,SimCLR引入了一个新的架构,使用对比学习来学习好的视觉表征。对比学习的目的是为相似的图像学习相似的表示,为不同的图像学习不同的表示。正如我们在这个笔记本中所看到的,这个简单的想法使我们能够在不使用任何标签的情况下训练出一个令人惊讶的好模型。
具体来说,对于数据集中的每张图片,SimCLR会生成该图片的两个不同的增强视图,称为正对。然后,鼓励模型为这对图像生成类似的表示向量。请看下面的架构图。
给定一个图像x,SimCLR使用两种不同的数据增强方案t和t’来生成正对的图像𝑥̂𝑖和𝑥̂𝑗。 𝑓是一个基本的编码器网,从增强的数据样本中提取表示向量,分别得到ℎ𝑖和ℎ𝑗。最后,一个小的神经网络投影头𝑔将表示向量映射到应用对比性损失的空间中。对比损失的目标是使最终的向量𝑧𝑖=𝑔(ℎ𝑖)和𝑧=𝑔(ℎ𝑗)之间的一致性最大化。我们将在后面更详细地讨论对比性损失,你会得到实现它。
训练完成后,我们扔掉投影头𝑔,只用𝑓和表示ℎ来执行下游任务,如分类。你将有机会在训练好的SimCLR模型上微调一个层,用于分类任务,并将其性能与基线模型(没有自监督学习)进行比较。