• 机器学习研究计算机系统如何利用经验(通常是数据)来提高特定任务的性能。它结合了统计学、数据挖掘和优化的思想。通常,它是被用作实现人工智能解决方案的一种手段。
• 表示学习作为机器学习的一类,其研究的重点是如何自动找到合适的数据表示方式。深度学习是通过学习多层次的转换来进行的多层次的表示学习。
• 深度学习不仅取代了传统机器学习的浅层模型,而且取代了劳动密集型的特征工程。
• 最近在深度学习方面取得的许多进展,大都是由廉价传感器和互联网规模应用所产生的大量数据,以及(通过GPU)算力的突破来触发的。
• 整个系统优化是获得高性能的关键环节。有效的深度学习框架的开源使得这一点的设计和实现变得非常容易。
• 深度学习存储和操作数据的主要接口是张量(n维数组)。它提供了各种功能,包括基本数学运算、广播、索引、切片、内存节省和转换其他Python对象。
pandas软件包是Python中常用的数据分析工具中,pandas可以与张量兼容。
用pandas处理缺失的数据时,我们可根据情况选择用插值法和删除法。
• 微分和积分是微积分的两个分支,前者可以应用于深度学习中的优化问题。
• 导数可以被解释为函数相对于其变量的瞬时变化率,它也是函数曲线的切线的斜率。
• 梯度是一个向量,其分量是多变量函数相对于其所有变量的偏导数。
• 链式法则可以用来微分复合函数。
深度学习框架可以自动计算导数:我们首先将梯度附加到想要对其计算偏导数的变量上,然后记录目标值的计算,执行它的反向传播函数,并访问得到的梯度。
• 我们可以从概率分布中采样。
• 我们可以使用联合分布、条件分布、Bayes定理、边缘化和独立性假设来分析多个随机变量。
• 期望和方差为概率分布的关键特征的概括提供了实用的度量形式。
官方文档提供了本书之外的大量描述和示例。
可以通过调用dir和help函数或在Jupyter记事本中使用?和??查看API的用法文档
• 机器学习模型中的关键要素是训练数据、损失函数、优化算法,还有模型本身。
• 矢量化使数学表达上更简洁,同时运行的更快。
• 最小化目标函数和执行极大似然估计等价。
• 线性回归模型也是一个简单的神经网络。
• 我们学习了深度网络是如何实现和优化的。在这一过程中只使用张量和自动微分,不需要定义层或复杂的优化器。
• 这一节只触及到了表面知识。在下面的部分中,我们将基于刚刚介绍的概念描述其他模型,并学习如何更简洁地实现其他模型。
我们可以使用PyTorch的高级API更简洁地实现模型。
在PyTorch中,data模块提供了数据处理工具,nn模块定义了大量的神经网络层和常见损失函数。
我们可以通过_结尾的方法将参数替换,从而初始化参数。
• softmax运算获取一个向量并将其映射为概率。
• softmax回归适用于分类问题,它使用了softmax运算中输出类别的概率分布。
• 交叉熵是一个衡量两个概率分布之间差异的很好的度量,它测量给定模型编码数据所需的比特数。
• 借助softmax回归,我们可以训练多分类的模型。
• 训练softmax回归循环模型与训练线性回归模型非常相似:先读取数据,再定义模型和损失函数,然后使用优化算法训练模型。大多数常见的深度学习模型都有类似的训练过程。
• 使用深度学习框架的高级API,我们可以更简洁地实现softmax回归。
• 从计算的角度来看,实现softmax回归比较复杂。在许多情况下,深度学习框架在这些著名的技巧之外采取了额外的预防措施,来确保数值的稳定性。这使我们避免了在实践中从零开始编写模型时可能遇到的陷阱。
• 多层感知机在输出层和输入层之间增加一个或多个全连接隐藏层,并通过激活函数转换隐藏层的输出。
• 常用的激活函数包括ReLU函数、sigmoid函数和tanh函数。
手动实现一个简单的多层感知机是很容易的。然而如果有大量的层,从零开始实现多层感知机会变得很麻烦(例如,要命名和记录模型的参数)。
我们可以使用高级API更简洁地实现多层感知机。
对于相同的分类问题,多层感知机的实现与softmax回归的实现相同,只是多层感知机的实现里增加了带有激活函数的隐藏层。
欠拟合是指模型无法继续减少训练误差。过拟合是指训练误差远小于验证误差。
由于不能基于训练误差来估计泛化误差,因此简单地最小化训练误差并不一定意味着泛化误差的减小。机器学习模型需要注意防止过拟合,即防止泛化误差过大。
验证集可以用于模型选择,但不能过于随意地使用它。
我们应该选择一个复杂度适当的模型,避免使用数量不足的训练样本。
• 前向传播在神经网络定义的计算图中按顺序计算和存储中间变量,它的顺序是从输入层到输出层。
• 反向传播按相反的顺序(从输出层到输入层)计算和存储神经网络的中间变量和参数的梯度。
• 在训练深度学习模型时,前向传播和反向传播是相互依赖的。
• 训练比预测需要更多的内存。
• 梯度消失和梯度爆炸是深度网络中常见的问题。在参数初始化时需要非常小心,以确保梯度和参数可以得到很好的控制。
• 需要用启发式的初始化方法来确保初始梯度既不太大也不太小。
• ReLU激活函数缓解了梯度消失问题,这样可以加速收敛。
• 随机初始化是保证在进行优化前打破对称性的关键。
• Xavier初始化表明,对于每一层,输出的方差不受输入数量的影响,任何梯度的方差不受输出数量的影响。
在许多情况下,训练集和测试集并不来自同一个分布。这就是所谓的分布偏移。
真实风险是从真实分布中抽取的所有数据的总体损失的预期。然而,这个数据总体通常是无法获得的。经验风险是训练数据的平均损失,用于近似真实风险。在实践中,我们进行经验风险最小化。
在相应的假设条件下,可以在测试时检测并纠正协变量偏移和标签偏移。在测试时,不考虑这种偏移可能会成为问题。
在某些情况下,环境可能会记住自动操作并以令人惊讶的方式做出响应。在构建模型时,我们必须考虑到这种可能性,并继续监控实时系统,并对我们的模型和环境以意想不到的方式纠缠在一起的可能性持开放态度。
• 一个块可以由许多层组成;一个块可以由许多块组成。
• 块可以包含代码。
• 块负责大量的内部处理,包括参数初始化和反向传播。
• 层和块的顺序连接由Sequential块处理。
• 我们有几种方法可以访问、初始化和绑定模型参数。
• 我们可以使用自定义初始化方法。
• 延后初始化使框架能够自动推断参数形状,使修改模型架构变得容易,避免了一些常见的错误。
• 我们可以通过模型传递数据,使框架最终初始化参数。
我们可以通过基本层类设计自定义层。这允许我们定义灵活的新层,其行为与深度学习框架中的任何现有层不同。
在自定义层定义完成后,我们就可以在任意环境和网络架构中调用该自定义层。
层可以有局部参数,这些参数可以通过内置函数创建。
save和load函数可用于张量对象的文件读写。
我们可以通过参数字典保存和加载网络的全部参数。
保存架构必须在代码中完成,而不是在参数中完成。
• 我们可以指定用于存储和计算的设备,例如CPU或GPU。默认情况下,数据在主内存中创建,然后使用CPU进行计算。
• 深度学习框架要求计算的所有输入数据都在同一设备上,无论是CPU还是GPU。
• 不经意地移动数据可能会显著降低性能。一个典型的错误如下:计算GPU上每个小批量的损失,并在命令行中将其报告给用户(或将其记录在NumPy ndarray中)时,将触发全局解释器锁,从而使所有GPU阻塞。最好是为GPU内部的日志分配内存,并且只移动较大的日志。
• 图像的平移不变性使我们以相同的方式处理局部图像,而不在乎它的位置。
• 局部性意味着计算相应的隐藏表示只需一小部分局部图像像素。
• 在图像处理中,卷积层通常比全连接层需要更少的参数,但依旧获得高效用的模型。
• 卷积神经网络(CNN)是一类特殊的神经网络,它可以包含多个卷积层。
• 多个输入和输出通道使模型在每个空间位置可以获取图像的多方面特征。
二维卷积层的核心计算是二维互相关运算。最简单的形式是,对二维输入数据和卷积核执行互相关操作,然后添加一个偏置。
我们可以设计一个卷积核来检测图像的边缘。
我们可以从数据中学习卷积核的参数。
学习卷积核时,无论用严格卷积运算或互相关运算,卷积层的输出不会受太大影响。
当需要检测输入特征中更广区域时,我们可以构建一个更深的卷积网络。
• 对于给定输入元素,最大汇聚层会输出该窗口内的最大值,平均汇聚层会输出该窗口内的平均值。
• 汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。
• 我们可以指定汇聚层的填充和步幅。
• 使用最大汇聚层以及大于1的步幅,可减少空间维度(如高度和宽度)。
• 汇聚层的输出通道数与输入通道数相同。
• 卷积神经网络(CNN)是一类使用卷积层的网络。
• 在卷积神经网络中,我们组合使用卷积层、非线性激活函数和汇聚层。
• 为了构造高性能的卷积神经网络,我们通常对卷积层进行排列,逐渐降低其表示的空间分辨率,同时增加通道数。
• 在传统的卷积神经网络中,卷积块编码得到的表征在输出之前需由一个或多个全连接层进行处理。
• LeNet是最早发布的卷积神经网络之一。
• AlexNet的架构与LeNet相似,但使用了更多的卷积层和更多的参数来拟合大规模的ImageNet数据集。
• 今天,AlexNet已经被更有效的架构所超越,但它是从浅层网络到深层网络的关键一步。
• 尽管AlexNet的代码只比LeNet多出几行,但学术界花了很多年才接受深度学习这一概念,并应用其出色的实验结果。这也是由于缺乏有效的计算工具。
• Dropout、ReLU和预处理是提升计算机视觉任务性能的其他关键步骤。
• 在模型训练过程中,批量规范化利用小批量的均值和标准差,不断调整神经网络的中间输出,使整个神经网络各层的中间输出值更加稳定。
• 批量规范化在全连接层和卷积层的使用略有不同。
• 批量规范化层和暂退层一样,在训练模式和预测模式下计算不同。
• 批量规范化有许多有益的副作用,主要是正则化。另一方面,”减少内部协变量偏移“的原始动机似乎不是一个有效的解释。
• 学习嵌套函数(nested function)是训练神经网络的理想情况。在深层神经网络中,学习另一层作为恒等映射(identity function)较容易(尽管这是一个极端情况)。
• 残差映射可以更容易地学习同一函数,例如将权重层中的参数近似为零。
• 利用残差块(residual blocks)可以训练出一个有效的深层神经网络:输入可以通过层间的残余连接更快地向前传播。
• 残差网络(ResNet)对随后的深层神经网络设计产生了深远影响。
• 在跨层连接上,不同于ResNet中将输入与输出相加,稠密连接网络(DenseNet)在通道维上连结输入与输出。
• DenseNet的主要构建模块是稠密块和过渡层。
• 在构建DenseNet时,我们需要通过添加过渡层来控制网络的维数,从而再次减少通道的数量。