目录
卷积网络——专门用来处理具有类似网格结构的数据神经网络。
- 卷积计算
- 卷积:
- 二维张量上的卷积运算(没有对核进行翻转)的例子。
- 动机
- 稀疏连接:输入的图像可能包含成千上万个像素点,但是我们可以通过只占用几十到上百个像素点的核来检测一些小的有意义的特征,例如图像的边缘。
- 参数共享
- 池化
- 池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。最大池化(max pooling)函数给出相邻矩形区域内的最大值。
- 卷积与池化作为一种无限强的先验
- 先验被认为是强或者弱取决于先验中概率密度的集中程度。弱先验具有较高的熵值,例如方差很大的高斯分布。这样的先验允许数据对于参数的改变具有或多或少的自由性。强先验具有较低的熵值,例如方差很小的高斯分布。这样的先验在决定参数最终取值时起着更加积极的作用。
- 与任何其他先验类似,卷积和池化只有当先验的假设合理且正确时才有用。如果一项任务依赖于保存精确的空间信息,那么在所有的特征上使用池化将会增大训练误差。
- 把卷积神经网络想成具有无限强先验的全连接网络可以帮助我们更好地洞察卷积神经网络是如何工作的
- 其中一个关键的洞察是卷积和池化可能导致欠拟合。
- 另一个关键洞察是当我们比较卷积模型的统计学习表现时,只能以基准中的其他卷积模型作为比较的对象。
- 基本卷积函数的变体
- 有效(valid)卷积:无论怎样都不使用零填充的极端情况,并且卷积核只允许访问那些图像中能够完全包含整个核的位置。在这种情况下,输出的所有像素都是输入中相同数量像素的函数,这使得输出像素的表示更加规范。
- 相同(same)卷积:进行足够的零填充来保持输出和输入具有相同的大小。只要硬件支持,网络就能包含任意多的卷积层,这是因为卷积运算不改变下一层的结构。然而,输入像素中靠近边界的部分相比于中间部分对于输出像素的影响更小。这可能会导致边界像素存在一定程度的欠表示。
- 全(full)卷积:进行了足够多的零填充使得每个像素在每个方向上恰好被访问了 k 次,最终输出图像的宽度为 m + k − 1。在这种情况下,输出像素中靠近边界的部分相比于中间部分是更少像素的函数。
- 结构化输出
- 卷积神经网络可以用于输出高维的结构化对象,而不仅仅是预测分类任务的类标签或回归任务的实数值。
- 数据类型
- 卷积网络使用的数据通常包含多个通道,每个通道是时间上或空间中某一点的不同观测量。
- 高效的卷积算法
- 卷积等效于使用傅立叶变换将输入与核都转换到频域、执行两个信号的逐点相乘,再使用傅立叶逆变换转换回时域。
- 设计更快的执行卷积或近似卷积,而不损害模型准确性的方法,是一个活跃的研究领域。甚至仅提高前向传播效率的技术也是有用的,因为在商业环境中,通常部署网络比训练网络还要耗资源。
- 随机或无监督的特征
- 卷积网络训练中最昂贵的部分是学习特征。输出层的计算代价通常相对不高,因为在通过若干层池化之后作为该层输入的特征的数量较少。当使用梯度下降执行监督训练时,每步梯度计算需要完整地运行整个网络的前向传播和反向传播。减少卷积网络训练成本的一种方式是使用那些不是由监督方式训练得到的特征。
- 有三种基本策略可以不通过监督训练而得到卷积核。
- 简单地随机初始化它们。
- 另一种是手动设计它们,例如设置每个核在一个特定的方向或尺度来检测边缘。
- 最后,可以使用无监督的标准来学习核。例如,Coates et al. (2011) 将 k 均
值聚类算法应用于小图像块,然后使用每个学得的中心作为卷积核。
- 使用无监督的标准来学习特征,使得它们能够与位于网络结构顶层的分类层相互独立地确定。然后只需提取一次全部训练集的特征,构造用于最后一层的新训练集。假设最后一层类似逻辑回归或者 SVM,那么学习最后一层通常是凸优化问题。
序列建模:循环和递归网络
- 循环神经网络(recurrent neural network)或RNN是一类用于处理序列数据的神经网络。循环神经网络是专门用于处理序列 x(1), . . . , x(τ)的神经网络。
- 展开计算图
- 计算图是形式化一组计算结构的方式,如那些涉及将输入和参数映射到输出和
损失的计算。 - 展开过程引入的优点:
- 无论序列的长度,学成的模型始终具有相同的输入大小,因为它指定的是从一种状态到另一种状态的转移,而不是在可变长度的历史状态上操作。
- 我们可以在每个时间步使用相同参数的相同转移函数。
- 计算图是形式化一组计算结构的方式,如那些涉及将输入和参数映射到输出和
- 循环神经网络
- 循环神经网络中一些重要的设计模式包括以下几种:
- 每个时间步都有输出,并且隐藏单元之间有循环连接的循环网络
- 每个时间步都产生一个输出,只有当前时刻的输出到下个时刻的隐藏单元之间
有循环连接的循环网络 - 隐藏单元之间存在循环连接,但读取整个序列后产生单个输出的循环网络
- 导师驱动过程和输出循环网络
- 计算循环神经网络的梯度
- 基于上下文的 RNN 序列建模
- 当是一个固定大小的向量时,可以简单地将其看作产生序列RNN的额外输入。将额外输入提供到RNN的常见方法有:
- 在每个时刻作为一个额外输入,或
- 作为初始状态 h(0),或
- 结合两种方式
- 当是一个固定大小的向量时,可以简单地将其看作产生序列RNN的额外输入。将额外输入提供到RNN的常见方法有:
- 双向 RNN
- 双向 RNN 结合时间上从序列起点开始移动的 RNN 和另一个时间上从序列末尾开始移动的 RNN。图 10.11 展示了典型的双向 RNN,其中代表通过时间向前移动的子 RNN 的状态,代表通过时间向后移动的子 RNN 的状态。这允许输出单元能够计算同时依赖于过去和未来且对时刻 t 的输入值最敏感的表示,而不必指定 t 周围固定大小的窗口
- 基于编码-解码的序列到序列架构
- 用于映射可变长度序列到另一可变程度序列最简单的RNN架构在2014年被提出。这个想法非常简单:
- 编码器或读取器或输入处理输入序列。编码器输出上下文(通常是最终隐藏状态的简单函数)
- 解码器或输出RNN则以固定长度的向量为条件产生输出序列
- 用于映射可变长度序列到另一可变程度序列最简单的RNN架构在2014年被提出。这个想法非常简单:
- 深度循环网络
- 大多数 RNN 中的计算可以分解成三块参数及其相关的变换:
- 从输入到隐藏状态,
- 从前一隐藏状态到下一隐藏状态,以及
- 从隐藏状态到输出
- 大多数 RNN 中的计算可以分解成三块参数及其相关的变换:
- 长短期记忆和其他门控 RNN
- 实际应用中最有效的序列模型称为 门控 RNN(gated RNN)。包括基于 长短期记忆(long short-term memory)和基于 门控循环单元(gated recurrent unit)的网络。
- 循环神经网络中一些重要的设计模式包括以下几种:
实践方法论
- 性能度量
- 确定目标,即使用什么误差度量,是必要的第一步,因为误差度量将指导接下来的所有工作。
- 科研中,目标通常是在某个确定基准下探讨哪个算法更好,一般会固定训练集,不允许收集更多的数据。
- 性能期望:在学术界,通常我们可以根据先前公布的基准结果来估计预期错误率。
- 最重要的是首先要确定改进哪个性能度量,然后专心提高性能度量。如果没有明确的目标,那么我们很难判断机器学习系统上的改动是否有所改进。
- 默认的基准模型
- 确定性能度量和目标后,任何实际应用的下一步是尽快建立一个合理的端到端的系统。
- 选择基准方法:
- 只需正确地选择几个线性权重就可能解决问题
- 项目可以开始于一个简单的统计模型,如逻辑回归。
- 问题属于 “AI-完全’’ 类的
- 那么项目开始于一个合适的深度学习模型,效果会比较好。
- 只需正确地选择几个线性权重就可能解决问题
- 首先,根据数据的结构选择一类合适的模型。如果项目是以固定大小的向量作为输入的监督学习,那么可以使用全连接的前馈网络。如果输入有已知的拓扑结构(例如,输入是图像),那么可以使用卷积网络。
- 除非训练集包含数千万以及更多的样本,否则项目应该在一开始就包含一些温和的正则化。
- 如果我们的任务和另一个被广泛研究的任务相似,那么通过复制先前研究中已知性能良好的模型和算法,可能会得到很好的效果。甚至可以从该任务中复制一个训练好的模型。
- 决定是否收集更多数据
- 在建立第一个端到端的系统后,收集更多的数据往往比改进学习算法要有用得多。
- 如何确定是否需要收集更多数据
- 首先看训练集是否可以接受,再看测试集是否可以接受
- 收集多少数据
- 建议在对数尺度上考虑训练集的大小
- 如果收集更多的数据是不可行的,那么改进泛化误差的唯一方法是改进学习算法本身。
- 选择超参数
- 手动调整超参数
- 手动搜索超参数的目标通常是最小化受限于运行时间和内存预算的泛化误差。
- 主要目标是调整模型的有效容量以匹配任务的复杂性。
- 有效容量受限于三个因素:模型的表示容量、学习算法成功最小化训练模型代价函数的能力以及代价函数和训练过程正则化模型的程度。
- 自动超参数优化算法
- 开发出封装学习算法的超参数优化算法,并选择其超参数,从而使用者不需要指定学习算法的超参数。
- 网格搜索
- 当有三个或更少的超参数时,常见的超参数搜索方法是 网格搜grid search)。对于每个超参数,使用者选择一个较小的有限值集去探索。然后,这些超参数笛卡
尔乘积得到一组组超参数,网格搜索使用每组超参数训练模型。挑选验证集误差最小的超参数作为最好的超参数。 - 通常,网格搜索大约会在 对数尺度(logarithmic scale)下挑选合适的值,例如,一个学习率的取值集合是 {0.1, 0.01, 10−3, 10−4, 10−5},或者隐藏单元数目的取值集合 {50, 100, 200, 500, 1000, 2000}。
- 实例
-
import numpy as np from sklearn.neighbors import kneighbors_graph, KNeighborsClassifier from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split from sklearn.model_selection import GridSearchCV wine = load_wine() X_train, X_test, y_train, y_test = train_test_split(wine.data, wine.target, test_size=0.3,random_state=1) """ 在需要设置random_state的地方给其赋一个值,当多次运行此段代码能够得到完全一样的结果, 别人运行此代码也可以复现你的过程。若不设置此参数则会随机选择一个种子,执行结果也会因此而不同了。 虽然可以对random_state进行调参,但是调参后在训练集上表现好的模型未必在陌生训练集上表现好, 所以一般会随便选取一个random_state的值作为参数。 X_train, X_test, y_train, y_test 记住这个顺序!!!!!! """ knn = KNeighborsClassifier(n_neighbors=1,weights='uniform') knn.fit(X_train, y_train) print('测试数据得分: {:.2f}'.format(knn.score(X_test, y_test))) X_new = np.array([[13.2, 2.77, 2.51, 18.5, 96.6, 1.04, 2.55, 0.57, 1.47, 6.2, 1.05, 3.33, 820]]) prediction = knn.predict(X_new) print('预测新红酒的分类为: {}'.format(wine['target_names'][prediction])) #测试数据为0.74 parameters = {'n_neighbors': [1, 10],'weights':['uniform','distance']} gs = GridSearchCV(estimator=knn,param_grid=parameters, refit = True, cv = 5, verbose = 1, n_jobs = -1) gs.fit(X_train,y_train) print('最优参数: ',gs.best_params_) print('最佳性能: ', gs.best_score_) print('最佳模型: ',gs.best_estimator_) # 最优参数: {'n_neighbors': 1, 'weights': 'uniform'} # 最佳性能: 0.766 #最佳模型: KNeighborsClassifier(n_neighbors=1)
-
- 当有三个或更少的超参数时,常见的超参数搜索方法是 网格搜grid search)。对于每个超参数,使用者选择一个较小的有限值集去探索。然后,这些超参数笛卡
- 随机搜索
- 随机搜索过程如下。首先,我们为每个超参数定义一个边缘分布,例如,ernoulli
分布或范畴分布(分别对应着二元超参数或离散超参数),或者对数尺度上的均匀分布(对应着正实值超参数) - 与网格搜索不同,我们不需要离散化超参数的值。
- 与网格搜索一样,我们通常会重复运行不同版本的随机搜索,以基于前一次运
行的结果改进下一次搜索。
- 随机搜索过程如下。首先,我们为每个超参数定义一个边缘分布,例如,ernoulli
- 基于模型的超参数优化
- 超参数搜索问题可以转化为一个优化问题。决策变量是超参数。优化的代价是超
参数训练出来的模型在验证集上的误差。 - 大部分超参数优化算法比随机搜索更复杂,并且具有一个共同的缺点,在它们
能够从实验中提取任何信息之前,它们需要运行完整的训练实验。
- 超参数搜索问题可以转化为一个优化问题。决策变量是超参数。优化的代价是超
- 手动调整超参数
- 调试策略
- 可视化计算中模型的行为:当训练模型检测图像中的对象时,查看一些模型检
测到部分重叠的图像。 - 可视化最严重的错误:大多数模型能够输出运行任务时的某种置信度量。
- 根据训练和测试误差检测软件:我们往往很难确定底层软件是否是正确实现。
- 拟合极小的数据集:当训练集上有很大的误差时,我们需要确定问题是真正的欠拟合,还是软件错误。只有一个样本的分类数据可以通过正确设置输出层的偏置来拟合。
- 监控激活函数值和梯度的直方图:可视化神经网络在大量训练迭代后(也许是一个轮)收集到的激活函数值和梯度的统计量往往是有用的。
- 可视化计算中模型的行为:当训练模型检测图像中的对象时,查看一些模型检
线性因子模型
- 概率 PCA 和因子分析
- 潜变量的先验是一个方差为单位矩阵的高斯分布
- 看出 x 服从多维正态分布,并满足
- 为了将 PCA 引入到概率框架中,我们可以对因子分析模型作轻微修改,使条件方差等于同一个值。在这种情况下,的协方差简化为,这里的是一个标量。由此可以得到条件分布,如下:
- 独立成分分析
- 是一种建模线性因子的方法,旨在将观察到的信号分离成许多潜在信号,这些潜在信号通过缩放和叠加可以恢复成观察数据。这些信号是完全独立的,而不是仅仅彼此不相关。
- 一些版本在 x 的生成中添加一些噪声,而不是使用确定性的解码器。大多数方法不使用最大似然准则,而是旨在使的元素彼此独立。
- 慢特征分析
- 慢特征分析:使用来自时间信号的信息学习不变特征的线性因子模型
- 慢性原则:其基本思想是,与场景中起描述作用的单个量度相比,场景的重要特性通常变化得非常缓慢。
- 慢特征分析是慢性原则中一个特别高效的应用。由于它被应用于线性特征提取
器,并且可以通过闭式解训练,所以它是高效的。
- 慢特征分析:使用来自时间信号的信息学习不变特征的线性因子模型
- 稀疏编码
- 是一个线性因子模型,已作为一种无监督特征学习和特征提取机制得到了广泛研究。
- PCA的流形解释
- 某种程度上说,线性因子模型是最简单的生成模型和学习数据表示的最简单模型。许多模型如线性分类器和线性回归模型可以扩展到深度前馈网络,而这些线性因子模型可以扩展到自编码器网络和深度概率模型,它们可以执行相同任务但具有更强大和更灵活的模型族。
自编码器
- 自编码器:是神经网络的一种,经过训练后能尝试将输入复制到输出。
- 内部有一个隐藏层 h,可以产生 编码(code)表示输入。该网络可以看作由两部分组成:一个由函数 h = f(x) 表示的编码器和一个生成重构的解码器 r = g(h)。
- 欠完备自编码器
- 我们希望通过训练自编码器对输入进行复制而使 h 获得有用的特性。
- 从自编码器获得有用特征的一种方法是限制 h 的维度比 x 小,这种编码维度小于输入维度的自编码器称为 欠完备(undercomplete)自编码器。
- 当解码器是线性的且 L 是均方误差,欠完备的自编码器会学习出与 PCA 相同
的生成子空间。这种情况下,自编码器在训练来执行复制任务的同时学到了训练数
据的主元子空间。
- 正则自编码器
- 编码维数小于输入维数的欠完备自编码器可以学习数据分布最显著的特征
- 根据要建模的数据分布的复杂性,选择合适的编码维数和编码器、解码器容量,就可以成功训练任意架构的自编码器,正则自编码器提供这样的能力。
- 正则自编码器使用的损失函数可以鼓励模型学习其他特性(除了将输入复制到输出),而不必限制使用浅层的编码器和解码器以及小的编码维数来限制模型的容量。这些特性包括稀疏表示、表示的小导数、以及对噪声或输入缺失的鲁棒性。
- 稀疏自编码器——用来学习特征,以便用于像分类这样的任务。
- 去噪自编码器
- 除了向代价函数增加一个惩罚项,我们也可以通过改变重构误差项来获得一个
能学到有用信息的自编码器。
- 除了向代价函数增加一个惩罚项,我们也可以通过改变重构误差项来获得一个
- 惩罚导数作为正则
- 编码维数小于输入维数的欠完备自编码器可以学习数据分布最显著的特征
- 表示能力、层的大小和深度
- 万能近似定理保证至少有一层隐藏层且隐藏单元足够多的前馈神经网络能以任意精度近似任意函数(在很大范围里),这是非平凡深度(至少有一层隐藏层)的一个主要优点。这意味着具有单隐藏层的自编码器在数据域内能表示任意近似数据的恒等函数。
- 深度可以指数地降低表示某些函数的计算成本。深度也能指数地减少学习一些函数所需的训练数据量。
- 练深度自编码器的普遍策略是训练一堆浅层的自编码器来贪心地预训练相应的深度架构。所以即使最终目标是训练深度自编码器,我们也经常会遇到浅层自编码器。
- 随机编码器和解码器
- 自编码器本质上是一个前馈网络,可以使用与传统前馈网络相同的损失函数和
输出单元。 - 设计前馈网络的输出单元和损失函数普遍策略是定义一个输出分布 p(y | x) 并最小化负对数似然 − log p(y | x)。在这种情况下,y 是关于目标的向量(如类标)。在自编码器中,x 既是输入也是目标。
- 自编码器本质上是一个前馈网络,可以使用与传统前馈网络相同的损失函数和
- 去噪自编码器
- 是一类接受损坏数据作为输入,并训练来预测原始未被损坏数据作为输出的自编码器。
- 通常我们可以简单地对负对数似然 进行基于梯度法(如小批量梯度下降)的近似最小化。只要编码器是确定性的,去噪自编码器就是一个前馈网络,并且可以使用与其他前馈网络完全相同的方式进行训练。
- 使用自编码器学习流形
- 流形的一个重要特征是 切平面(tangent plane)的集合。
- 所有自编码器的训练过程涉及两种推动力的折衷:
- 学习训练样本 x 的表示 h 使得 x 能通过解码器近似地从 h 中恢复。x 是从训
练数据挑出的这一事实很关键,因为这意味着在自编码器不需要成功重构不属
于数据生成分布下的输入。 - 满足约束或正则惩罚。这可以是限制自编码器容量的架构约束,也可以是加入到重构代价的一个正则项。这些技术一般倾向那些对输入较不敏感的解。
- 学习训练样本 x 的表示 h 使得 x 能通过解码器近似地从 h 中恢复。x 是从训
- 收缩自编码器
- 收缩自编码器正则化准则的一个实际问题是,尽管它在单一隐藏层的自编码器情况下是容易计算的,但在更深的自编码器情况下会变的难以计算。
- 预测稀疏分解
- 预测稀疏分解(predictive sparse decomposition, PSD)是稀疏编码和参数化自编码器的混合模型,参数化编码器被训练为能预测迭代推断的输出。
- 预测稀疏分解是学习近似推断(learned approximate inference)的一个例子。
- 模型被部署后,参数编
码器 f 用于计算已经习得的特征。相比通过梯度下降推断 h,计算 f 是很容易的。因为 f 是一个可微带参函数,PSD 模型可堆叠,并用于初始化其他训练准则的深度网络。
- 自编码器的应用
- 降维:表示学习和深度学习的第一批应用之一,它是研究自编码器早期驱动力之一。
- 信息检索:从降维中获益更多,此任务需要找到数据库中类似查询的条目。