《Python深度学习》第一部分读书笔记
第1章 什么是深度学习
1.1 人工智能、机器学习与深度学习
三者关系
1.1.1 人工智能
- 简洁定义:努力将通常由人类完成的智力任务自动化
- 发展:符号主义人工智能(解决定义明确的逻辑问题) -> 机器学习(给出明确规则解决更为复杂、模糊的问题)
1.1.2 机器学习
-
机器学习和经典程序设计的区别
-
机器学习与统计学的区别
- 机器学习经常用于处理复杂的大型数据集,多以工程为导向。
- 经典的统计分析不适合处理大型数据集。
1.1.3 从数据中学习表示
- 机器学习三要素
- 输入数据点
- 预期输出的示例(标签)
- 衡量算法效果好坏的方法:运用衡量结果进行调节的过程称作学习。
- 机器学习和深度学习的核心问题:有意义地变换数据,即学习输入数据得有用表示(以便让数据更接近预期输出)
- 机器学习中的学习:寻找更好数据表示地自动搜索过程。(有多种找到更好表示数据的操作,这些操作地集合称为假设空间)
1.1.4 深度学习的深度
-
定义:是从数据中学习表示的一种数学框架。深度学习是机器学习的一个分支。其强调从连续的
层
中进行学习。其深度指一系列连续的表示层(数据模型中包含的层数)。 -
分层的实现:神经网络
-
深度学习算法表示的例子:多层网络对数字图像进行变换,以便识别图像中的数字。(将深度网络看作多级信息蒸馏操作,信息穿过连续过滤器,纯度越来越高)
1.1.5 深度学习的工作原理
-
神经网络中每层实现的变换由这一层的权重来进行参数化,学习的意思是为神经网络的所有层找到一组权重值,使得该网络能够将每个示例输入与其目标一一对应。(因此,我们需要采取措施控制权重/参数来实现最好的模型效果)
-
衡量输出与预期值之间的距离,这里引入神经网络的损失函数,用于衡量网络在某个示例上的好坏。
-
深度学习的基本技巧是利用这个距离值作为反馈信号来对权重值进行微调,以降低当前示例对应的损失值。调节由优化器来完成,它实现了所谓的反向传播算法(深度学习核心算法)。
1.2 机器学习简史
1.2.1 概率建模
- 朴素贝叶斯
- logistic回归
1.2.2 早期神经网络
Yann LeCun将卷积神经网络早期思想与反向传播算法结合(LeNet网络)应用于手写数字分类问题。
1.2.3 核方法
- 核方法指的是一组分类算法
- SVM(support vector machine)
- 目标:通过在属于两个不同类别的两组数据点之间找到良好决策边界来解决分类问题。
- 寻找决策边界的步骤
- 将数据映射到一个新的高维表示,决策边界用一个超平面表示。
- 间隔最大化:尽量让超平面与每个类别最近的数据点之间的距离最大化,从而计算出良好决边界。
1.2.4 决策树、随机森林与梯度提升机
-
决策树:类似于流程图结构,对输入数据点进行分类或根据给定输入来预测输出值。
-
随机森林(RF):构造许多决策树,然后将它们的输出集成在一起。
-
梯度提升机(GBM):将弱预测模型(通常是决策树)集成的机器学习技术,通过迭代地训练新模型来解决之前模型的弱点,从而改进任何机器学习模型的效果。
1.2.5 回到神经网络
1.2.6 深度学习的不同
- 将特征工程完全自动化:一次性学习所有特征
- 深度学习模型中的每一处变化都是为了最终目标服务。
- 深度学习从数据中进行学习的两个基本特征:
- 通过渐进的、逐层的方式形成越来越复杂的表示
- 对中间这些渐进的表示共同进行学习
第2章 神经网络的数学基础
2.2 神经网络的数据表示
2.2.1 张量
是一个数据容器。它包含的数据几乎总是数值数据。张量是矩阵向任意维度的推广(张量的维度(dimension
)通常叫做轴(axis
)
- 标量(0D张量):仅包含一个数字的张量称为标量
- 在
numpy
中一个float32
或float64
的数字就是一个标量张量。 - 可以用
ndim
属性查看一个numpy
张量轴的个数。 - 张量轴的个数也叫做阶(
rank
)。
- 在
- 向量:数字组成的数组称为向量(
vector
)或一维张量(1D张量),只有一个轴。- 维度可以表示沿着某个轴上的元素个数,也可以表示张量中轴的个数。
- 矩阵(2D张量):向量组成的数组。
- 第一个轴上的元素叫做行,第二个轴上的元素叫做列。
- 3D张量与更高维张量
- 多个矩阵组合成一个新的数组就是3D张量
2.2.2 关键属性
张量是由以下三个关键属性来定义的:
- 轴的个数(阶)
- 形状
- 数据类型
2.2.3 数据批量的概念
- 深度学习中所有数据张量的第一个轴(0轴)都是样本轴(样本维度)
- 将数据划分为小批量后,第一个轴叫做批量轴或批量维度
2.2.4 现实世界中的数据张量
- 向量数据:2D张量,形状为(samples,features)
- 时间序列数据或序列数据:3D张量,形状为(samples,timesteps,features)
- 图像:4D张量,形状为(samples,height,width,channels)或(samples,channels,height,width)
- 视频:5D张量,形状为(samples,frames,height,width,channels)或(samples,frames,channels,height,width)
2.2.5 向量数据
每个数据点被编码为一个向量,第一个轴是样本轴,第二个轴是特征轴。
2.2.6 时间序列数据或序列数据
当时间对于数据很重要时,应该将数据存储在带有时间轴的3D张量中。(时间轴始终是第2个轴)
2.2.7 图像数据
图像通常具有三个维度:高度、宽度和颜色深度。图像张量始终都是3D张量,灰度图像的彩色通道只有一维
2.3 张量运算
-
逐元素运算
-
广播机制
- 基础定义:如果两个形状不同的张量相加,较小的张量会被广播以匹配大张量的形状。
- 具体步骤:
- 向较小的张量添加轴,使其ndim与较大张量相同
- 将较小的张量沿着新轴重复,使其形状与较大张量相同
-
张量点积
-
注意:其与逐元素的运算不同,它将输入张量的元素合并在一起
-
向量之间点积:两个向量之间的点积是一个标量(只有元素个数相同的向量之间才能做点积)
-
矩阵与向量之间的点积:一个矩阵与一个向量的点积返回的还是一个向量(其中每个元素是矩阵和向量每一行之间的点积)
-
矩阵与矩阵的点积:
- 前提:第一个矩阵的列数与第二个矩阵的行数相等
- 新矩阵的元素为第一个矩阵的行与第二个矩阵的列之间的点积
-
-
张量变形
- 常规变形
- 转置:通常对矩阵的行列进行互换
-
张量运算的几何解释
-
向量加法
-
表示一个向量的常见做法是首先在二维空间中确定一个点,再将向量描绘成原点到这个点的箭头
-
两向量之和从几何上看相当于将两个向量箭头连在一起,得到的位置表示两向量之和
-
-
仿射变换、旋转、缩放等基本的几何操作都可以表示为张量运算。
- 将一个二维向量旋转
theta
角,可以通过与一个2×2
矩阵做点积实现,这个矩阵为R = [u,v]
,其中u和v都是平面向量:u = [cos(theta),sin(theta)]
,v = [-sin(theta),cos(theta)]
- 将一个二维向量旋转
-
-
深度学习的几何解释
- 简单理解:可以将神经网络解释为高维空间中非常复杂的几何变换,这种变换可以通过许多简单步骤实现。
- 三维情况:想象有两张彩纸,一张红色,一张蓝色。将其中一张纸放在另一张上2揉成小球,这个小球就是输入数据,球中的每张纸都是分类问题中的一个类别。神经网络或任何机器学习模型就是要找到可以让球恢复平整的变换,让两种颜色彩纸能够明显区分。深度网络的每一层都通过变换使数据解开一点点—许多层堆叠在一起,可以解开非常复杂的纸团。
2.4 基于梯度的优化
假设我们每个神经层都用下述方法对输入数据进行变换
$$
output = relu(dot(W,input)+b)
$$
在此表达式中,W
和b
都是张量,均为该层属性。被称为该层的权重或可训练参数。
随机初始化指的是开始这些权重矩阵取较小的随机值,即W
和b
都是随机的。下一步是根据反馈信号逐渐调节这些权重,这个过程叫做训练。
训练循环的过程
-
抽取训练样本
x
和对应目标y
组成数据批量 -
在
x
上运行网络(称作前向传播),得到预测值y_pred
-
计算网络在这批数据上的损失,用于衡量
y_pred
和y
之间的距离 -
更新网络的所有权重,使网络在这批数据上的损失略微下降
调整系数/权重的好方法是利用网络中所有运算都是可微的这一事实,计算损失相对于网络系数的梯度,然后向梯度的反方向改变系数,从而使损失降低。
2.4.1 随机梯度下降
-
梯度定义:梯度是张量运算的导数,其是导数概念向多元函数导数的推广。(多元函数是以张量作为输入的函数)
-
可微函数解析法求最小值:依靠最小值是导数为0的点,将所有导数为0的点找出来,然后计算函数在其中哪个点具有最小值。
-
小批量随机梯度下降:
- 抽取训练样本
x
和对应目标y
组成的数据批量 - 在
x
上运行网络,得到预测值y_pred
- 计算网络在这批数据上的损失,用于衡量
y_pred
和y
之间的距离 - 计算损失相对于网络参数的梯度(一次反向传播)
- 将参数沿着梯度的反方向移动一点,从而使这批数据上的损失减小一点
- 抽取训练样本
-
一维损失函数曲线的随机梯度下降
为
step
选取合适的值相当重要,取值太小会导致迭代次数增加。取值太大会导致更新权重值之后可能会出现在曲线上完全随机的位置。 -
SGD的变体与SGD的区别在于下一次权重更新时还要考虑上一次权重更新,而不是仅仅考虑当前梯度值(带动量的SGD、Adagrad、RMSProp)。这些变体叫做优化器,其中动量解决了SGD两个问题:收敛速度和局部极小点。
2.4.2 链式求导:反向传播算法
链式法则的过程类似于复合函数求导,将链式法则应用于神经网络梯度值的计算,得到的算法叫做反向传播算法。反向传播从最终损失值开始,从最顶层反向作用至最底层,利用链式法则计算每个参数对损失值的贡献大小。
现代框架如TensorFlow和Pytorch,给定一个运算链,并且已知每个运算的导数,这些框架就可以利用链式法则来计算这个运算链的梯度函数,将网络参数值映射为梯度值。
2.5 本章小结
- 学习是为了找到一组模型参数,使得在给定训练数据样本和对应目标值上的损失函数最小化。
- 学习的过程:
- 随机选取包含数据样本及其目标值的批量
- 计算批量损失相对于网络参数的梯度
- 将网络参数沿梯度反方向稍稍移动(距离由学习率决定)
第3章 神经网络剖析
训练神经网络的四个方面:
- 层,多个层组合成网络(或模型)
- 输入数据和相应的目标
- 损失函数,即用于学习的反馈信号
- 优化器,决定学习过程如何进行
四者关系:多个层链接在一起组成了网络,将输入数据映射为预测值。然后损失函数将这些预测值与目标进行比较,得到损失值,用于衡量网络预测值与预期结果的匹配程度。优化器使用这个损失值来更新网络的权重。
3.1 层:深度学习的基础组件
- 基本定义:是一个数据处理模块,将一个或多个输入张量转换为一个或多个输出张量。层是否有状态取决于该层是否有权重。
- 张量格式与层的选用:
- 简单的向量数据保存在2D张量中,通常用密集连接层(全连接层)
- 序列数据保存在3D张量中,通常用循环层。
- 图像数据保存在4D张量中,通常用二维卷积层。
层兼容性:每一层只接受特定形状的输入张量,并返回特定形状的输出张量。
3.2 模型:层构成的网络
-
基本定义:深度学习模型是层构成的有向无环图,最常见的例子就是层的线性堆叠,将单一输入映射为单一输出。
-
常见网络拓朴结构:
- 双分支网络
- 多头网络
- Inception模块
-
网络拓扑结构意味着将可能性空间限定为一系列特定的张量运算,将输入数据映射为输出数据,我们需要为这些张量运算的权重张量扎到一组合适的值。
3.3 损失函数与优化器:配置学习过程的关键
确定网络结构后要选择以下两个参数:
- 损失函数/目标函数:在训练过程中需要将其最小化,它能够衡量当前任务是否已经成功完成。
- 优化器:决定如何基于损失函数对网络进行更新,它执行的是随机梯度下降的某个变体。
注意:
- 梯度下降过程必须基于单个标量损失值,对于具有多个损失函数的网络,需要将所有损失函数取平均,变为一个标量值。
不同问题选择目标函数的简单指导原则:
- 二分类问题:二元交叉熵损失函数
- 多分类问题:分类交叉熵损失函数
- 回归问题:均方误差损失函数(
MSE
) - 序列学习问题:联结主义时序分类损失函数(
CTC
)
第4章 机器学习基础
4.1 机器学习的四个分支
4.1.1 监督学习
监督学习分类主要包括分类与回归,其变体主要包括如下几种:
- 序列生成:给定一张图像,预测描述图像的文字。序列生成有时可以被重新表示为一系列分类问题,比如反复预测序列中的单词或标记。
- 语法树预测:给定一个句子,预测其分解生成的语法树。
- 目标检测:给定一张图像,在图中特定目标的周围画一个边界框,这个问题也可以表示为分类问题(给定多个候选边界框,对每个框内的目标进行分类)或分类与回归联合问题(用向量回归来预测边界框的坐标)。
- 图像分割:给定一张图像,在特定物体上画一个像素级的掩模
4.1.2 无监督学习
定义:没有目标的情况下寻找输入数据的变换,目的在于数据可视化、数据压缩、数据去噪或更好地理解数据中的相关性。例如:降维和聚类。
4.1.3 自监督学习
-
定义:监督学习的特例,是没有人工标注的标签的监督学习(即没有人类参与的监督学习)。标签由输入数据产生(启发式算法)
-
例子:自编码器、时序监督学习
4.1.4 强化学习
定义:智能体接收有关环境地信息,学会选择使某种奖励最大化的行动。
4.2 评估机器学习模型
4.2.1 训练集、验证集和测试集
开发模型时需要不断地调节模型配置的超参数(选择层数或每层大小),超参数需要与模型参数(权重)区分。这个调节过程需要模型在验证数据上的性能作为反馈信号。
三种经典的数据划分方法:
-
留出验证
-
过程:留出一定比例的数据作为测试集,贼剩余的数据上训练模型,然后在测试集上评估模型,由于不能基于测试集来调节模型,还应该保留一个验证集。
-
缺点:如果可用数据很少,可能验证集和测试集包含的样本太少。
-
-
K折验证
-
过程:将数据划分为大小相同的
K
个分区,对于每个分区i
,在剩余的K-1
个分区上训练模型,然后在分区i
上评估模型。最终分数等于K
个分数的平均值。 -
适用场景:模型性能变化差异较大,同样需要独立的验证集进行模型校正。
-
-
带有打乱数据的重复K折验证
- 过程:多次使用K折验证,在每次将数据划分为
K
个分区之前都将数据打乱,最终分数是每次K折验证分数的平均值。 - 适用场景:可用数据相对较少,而又需要尽可能精确地评估模型。
- 缺点:一共要训练
P×K
个模型(P为重复K折验证的次数),计算代价很大。
- 过程:多次使用K折验证,在每次将数据划分为
4.2.2 评估模型的注意事项
选择模型评估方法注意的问题:
- 数据代表性:如果想确保训练集和测试集都能够代表当前数据,在将数据划分为训练集和测试集之前,应该随机打乱数据。
- 时间箭头:如果根据过去预测未来(天气、股票走势等),不应该随机打乱数据。应该确保测试集中所有数据的时间都晚于训练集数据。
- 数据冗余:要确保训练集和测试集之间没有交集。
4.3 数据预处理、特征工程和特征学习
4.3.1 神经网络的数据预处理h
-
向量化
-
流程:所有输入和目标都必须是浮点数张量(特定情况可以为整数)。无论处理什么数据都必须将其转换为张量
-
例子:用
one-hot
编码将文本表示的整数列表转换为float32格式的张量。
-
-
值标准化
- 一般来说,将取值较大的数据(比如多位整数,比网络权重初始值大很多)或异质数据(比如数据的一个特征在0-1范围内,另一个在100-200范围内)输入到神经网络中是不安全的。这么做可能导致较大的梯度更新,进而网络无法收敛。
- 输入数据应具备的特征:
- 取值较小:大部值都应该在0-1范围内。
- 同质性,所有特征的取值都应该在大致相同的范围内。
-
处理缺失值:
- 将缺失值设置为0是安全的。
- 注意:若测试数据中可能有缺失值,而网络是在没有缺失值数据上训练的,网络是不可能学会忽略缺失值的,你需要人为生成一些有缺失项的训练样本(多次复制一些样本,删除测试数据中可能缺失的某些特征)
4.3.2 特征工程
-
定义:在数据输入模型之前,利用自己关于数据和机器学习算法的知识对数据进行硬编码的变换,以改善模型的效果。
-
例子:从钟表上读取时间的特征工程
-
深度神经网络使用过程中仍需要重视特征工程的原因:
- 良好的特征仍然可以让你用更好的资源更优雅地解决问题。
- 良好地特征可以让你用更少的数据解决问题。深度学习模型自主学习特征的能力依赖于大量的训练数据。
4.4 正则化
4.4.1 减小网络大小
- 操作:减小模型中可学习参数的个数(由层数和每层单元个数决定)
- 为数据找到最佳模型大小的工作流程:开始时选择相对较少的层和参数,然后逐渐增加层的大小或增加新层,直到这种增加对验证损失的影响变得很小。
4.4.2 添加权重正则化
- 奥卡姆剃刀原理:如果一件事情有两种解释,那么最可能正确的解释就是最简单的那个,也是假设更少的那个。(简单模型比复杂模型更不容易过拟合)
- 权重正则化:强制让模型权重只能取较小的值,从而限制模型的复杂度,使得权重分布更加规则。
- 权重正则化的两种形式:
- L1正则化:添加的成本与权重系数的绝对值成正比
- L2正则化:添加的成本与权重系数的平方成正比(权重衰减)
4.5 机器学习的通用工作流程
-
定义问题,收集数据集
- 明确输入、输出以及所使用数据
- 假设输出是可以根据输入进行预测的
- 假设可用数据包含足够多的信息,足以学习输入和输出的关系
-
选择衡量成功的指标
- 平衡分类问题(每个类别的可能性相同)
- 精度
- 接收者操作特征曲线下面积(
ROC AUC
)
- 不平衡分类问题
- 准确率
- 召回率
- 排序问题或多标签分类问题
- 平均准确率均值
- 平衡分类问题(每个类别的可能性相同)
-
确定评估方法
- 留出验证集:数据量很大时使用
- K折交叉验证:如果留出验证样本量太少,无法保证可靠性时使用
- 重复的K折验证:可用数据很少,模型评估需要非常准确,使用此方法。
-
准备数据
- 数据格式化为张量
- 张量取值缩放
- 不同特征具有不同范围取值,应该做数据标准化
- 需要特征工程,尤其对于小数据问题
-
开发比基准更好的模型
- 构建工作模型的三个关键参数
- 最后一层的激活函数:它对网络输出进行有效的限制
- 损失函数:它匹配需要解决问题的类型
- 优化配置:优化器种类,学习率
- 构建工作模型的三个关键参数
-
扩大模型规模:开发过拟合的模型
- 添加更多的层
- 让每一层变得更大
- 训练更多的轮次
-
模型正则化与调节超参数
- 添加
dropout
- 尝试不同的架构:增加或减少层数
- 添加
L1
和L2
正则化 - 尝试不同的超参数,以找到最佳配置
- 反复做特征工程:添加新特征或删除没有信息量的特征
- 添加