文章目录
- 第一十三章 优化算法
-
- 13.1 CPU 和 GPU 的区别?
- 13.2 如何解决训练样本少的问题
- 13.3 什么样的样本集不适合深度学习?
- 13.4 有没有可能找到比已知算法更好的算法?
- 13.5 什么是共线性, 跟过拟合有什么关系?
- 13.6 广义线性模型是如何应用于深度学习的?
- 13.7 梯度消失的原因
- 13.8 权值初始化的方法有哪些?
- 13.9 如何避免在启发式优化算法中陷入局部最优解?
- 13.10 如何改进凸优化? GD 防止陷入局部最优解的方法
- 13.11 常见的损失函数
- 13.14 如何选择特征?(feature selection)?
-
- 13.14.1 如何考虑特征选择
- 13.14.2 特征选择方法分类
- 13.14.3 特征选择目的
- 13.15 梯度消失/梯度爆炸原因,以及解决方法
-
- 13.15.1 梯度更新规则为何使用?
- 13.15.2 梯度消失,爆炸原因
- 13.15.3 梯度消失、爆炸解决方案
- 13.16 为什么深度学习不需要二阶优化?
- 13.17 如何优化您的深度学习系统?
- 13.18 为什么要设置单一的数字评估指标?
- 13.19 满足和优化指标(Satisficing and optimizing metrics)
- 13.20 怎样划分训练/开发/测试集
- 13.21 如何划分开发/测试
- 13.22 开发/测试集和指标什么时候应该改变?
- 13.23 设置评估指标的意义?
- 13.24 偏差的可避免性是什么?
- 13.25 什么是TOP5错误率?
- 13.26 人类水平的错误率是多少?
- 13.27 偏差和几个错误率之间的关系可以避免吗?
- 13.28 如何选择可差和贝叶斯错误率?
- 13.29 如何减少方差?
- 13.30 最好估计贝叶斯错误率
- 13.31 举机学习比单个人类表现多少个例子?
- 13.如何改进你的模型?
- 13.33 理解误差分析
- 13.34 为什么值得花时间查看错误的标记数据?
- 13.35 初始系统快速构建的意义?
- 13.36 为什么要训练和测试不同的划分?
- 13.37 如何解决数据不匹配的问题?
- 13.38 梯度检查注意事项?
- 13.39随机梯度下降是什么?
- 13.什么是批量梯度下降?
- 13.小批量梯度下降是什么?
- 13.42怎么配置mini-batch梯度下降
- 13.43 局部最佳问题
- 13.44 提高算法性能思路
第一十三章 优化算法
13.1 CPU 和 GPU 的区别?
?? ?? CPU 全称是 central processing unit,CPU 它是一个超大型集成电路,是计算机的运输 其主要功能是解释计算机指令,处理计算机软件中的数据。
?? GPU 全称是 graphics processing unit,GPU 转换计算机系统所需的显示信息 驱动示器提供扫描信号,控制显示器的正确显示,连接显示器和个人电脑主板 是人机对话的重要设备之一。
?? ?? CPU 缓存结构多,目前主流 CPU 芯片上有四级缓存,消耗了大量的缓存结构 运行时需要大量的电力来测量晶体管。反观 GPU 缓存很简单,目前主流 GPU 芯 最多有两层缓存片。CPU 晶体管上消耗的空间和能耗,GPU 可用于制作 ALU 单元,也 因此 GPU 比 CPU 效率更高。
?? ?? 对 CPU 就实时响应而言,对单个任务的速度要求很高,因此需要多层缓存 确保单个任务的速度。对 GPU 我们不在乎第一个像素什么时候计算完成,而是关闭 心的最后一个像素是什么时候计算出来的? GPU 安排所有任务,然后批处理,这样 缓存的要求很低。举个不恰当的例子,点击 10 次鼠标的时候,CPU 每次点击 及时响应 GPU 会等第 10 点击后,再次批处理响应。
?? ?? CPU 除浮点整形外,还有许多其他指令集的负载,如多媒体解码、硬解码等 所以 CPU 多才多艺的东西, GPU 基本上只做浮点操作,也正是因为 只做浮点运算,所以设计结构简单,也就可以做的更快。另外显卡的 GPU 简单地跑浮点 高性能操作 GPU 还是不一样,显卡 GPU 还要考虑图形输出显示等方面,还有一些特殊的 用 GPU 设备,就是一个 PCI 卡上面有一个性能很强的浮点运算 GPU,没有显示输出,所以 的 GPU 只是为了加快某些程序的浮点计算能力。CPU 注重单线程的性能,即延迟, 对于 CPU 因此,要确保指令流不中断, CPU 控制部分需要消耗更多的晶体管和能耗, 于是CPU浮点计算中分配的功耗会减少。GPU注意吞吐量,单个指令可以驱动更多的计算, 所以相比之下 GPU 在控制部分消耗的能耗相对较少,因此节省的资源可以浮动 点计算使用。
?? ?? 像操作系统这样的应用程序需要快速响应实时信息和优化延迟。因此,晶体管的数量和能耗需要用于分支预测、乱序执行、低延迟缓存等控制部件 CPU 擅长的。 对于像矩阵这样的运算,它具有很高的可预测性和大量的类似运算,这种高延迟、高吞吐量的结构 非常适合操作 GPU。
?? ?? 一块 CPU 相当于数学教授,一块 GPU 相当于 100 个小学生。 ?? 第一轮,四个运算,一百个问题。教授拿到试卷一起计算。 小学生各拿一道题。 当教授开始计算第二个问题时,小学生集体交卷。 ?? 第二轮,高等函数,100个问题。教授完成后。100名小学生可能不知道该怎么办。 ?? 这两个回合就是 CPU 和 GPU 的区别了。
13.2 如何解决训练样本少的问题
?? 训练一个好的 CNN 模型通常需要大量的训练数据,特别是当模型结构复杂时, 比如 ImageNet 在数据集上训练的模型。虽然深度学习是 ImageNet 但一个取得了巨大的成功 实际问题是,许多应用程序的培训集很小。在这种情况下,如何应用深度学习?有三种方法 可供读者参考。
?? (1)可以将 ImageNet 以上训练获得的模型为起点,利用目标训练集和反向传播进入 继续训练,适应特定的应用程序。ImageNet 起到预训练的作用。 ?? (2)目标训练集不够大的话,也可以固定低层网络参数,沿用 ImageNet 上的训练集 因此,只更新上层。这是因为底层的网络参数是最难更新的 ImageNet 学习得到 底层滤波器通常描述不同的局部边缘和纹理信息,这些滤波器对一般图像有更好的效果 的普适性。 ?? (3)直接使用 ImageNet 训练获得的模型以最高隐含层的输出为特征表达 替代常用手工设计的特点。
13.3 什么样的样本集不适合深度学习?
?? (1)当数据集太小,数据样本不足时,与其他机器学习算法相比,深度学习没有明显优势。 ?? (2)数据集没有局部相关特征,目前深度学习表现较好的领域主要是图像/语音 这些领域的一个共性是局部相关性,如自然语言处理。图像中的像素组成物体,语音 一旦这些特征元素的组合被打乱,信号中的音位组合成单词,文本数据中的单词组合成句子, 同时,意义也发生了变化。对于没有这种局部相关性的数据集,不适合深度学习计算 处理方法。例如:预测一个人的健康状况,相关参数将包括年龄、职业、收入、家庭 打乱这些元素,如法庭状况,不会影响相关结果。
13.4 有没有可能找到比已知算法更好的算法?
?? 没免费的午餐定理: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ZiuiXOO-1575791537827)(./img/ch13/figure_13_4_1.png)]
对于训练样本(黑点),不同的算法 A/B 在不同的测试样本(白点)中有不同的表现,这表示:对于一个学习算法A,若它在某些问题上比学习算法B更好,则必然存在一些问题, 在那里B比A好。 也就是说:对于所有问题,无论学习算法 A 多聪明,学习算法 B 多笨拙,它们的期望性 能相同。 但是:没有免费午餐定力假设所有问题出现几率相同,实际应用中,不同的场景,会有不 同的问题分布,所以,在优化算法时,针对具体问题进行分析,是算法优化的核心所在。
13.5 何为共线性, 跟过拟合有啥关联?
共线性:多变量线性回归中,变量之间由于存在高度相关关系而使回归估计不准确。 产生问题:共线性会造成冗余,导致过拟合。 解决方法:排除变量的相关性、加入权重正则。
13.6 广义线性模型是怎被应用在深度学习中?
深度学习从统计学角度,可以看做递归的广义线性模型。 广义线性模型相对于经典的线性模型 ( y = w x + b ) (y=wx+b) (y=wx+b),核心在于引入了连接函数 g ( ⋅ ) g(\cdot) g(⋅),形式变为: y = g − 1 ( w x + b ) y=g-1(wx+b) y=g−1(wx+b)。 深度学习时递归的广义线性模型,神经元的激活函数,即为广义线性模型的链接函数。逻 辑回归(广义线性模型的一种)的 Logistic 函数即为神经元激活函数中的 Sigmoid 函数,很多 类似的方法在统计学和神经网络中的名称不一样,容易引起困惑。
13.7 造成梯度消失的原因?
神经网络的训练中,通过改变神经元的权重,使网络的输出值尽可能逼近标签以降低误差 值,训练普遍使用 BP 算法,核心思想是,计算出输出与标签间的损失函数值,然后计算其相 对于每个神经元的梯度,进行权值的迭代。 梯度消失会造成权值更新缓慢,模型训练难度增加。造成梯度消失的一个原因是,许多激 活函数将输出值挤压在很小的区间内,在激活函数两端较大范围的定义域内梯度为 0 0 0。造成学 习停止。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2OiSVvHW-1575791537830)(./img/ch13/figure_13_7_1.png)]
13.8 权值初始化方法有哪些?
权值初始化的方法主要有:常量初始化(constant)、高斯分布初始化(gaussian)、 positive_unitball 初始化、均匀分布初始化(uniform)、xavier 初始化、msra 初始化、双线性初 始化(bilinear)。
把权值或者偏置初始化为一个常数,具体是什么常数,可以自己定义。
需要给定高斯函数的均值与标准差。
让每一个神经元的输入的权值和为 1 1 1,例如:一个神经元有 100 100 100 个输入,让这 100 100 100 个输入 的权值和为 1 1 1. 首先给这 100 100 100 个权值赋值为在 ( 0 , 1 ) (0,1) (0,1)之间的均匀分布,然后,每一个权值再 除以它们的和就可以啦。这么做,可以有助于防止权值初始化过大,从而防止激活函数(sigmoid 函数)进入饱和区。所以,它应该比较适合 simgmoid 形的激活函数。
将权值与偏置进行均匀分布的初始化,用 min 与 max 控制它们的的上下限,默认为 ( 0 , 1 ) (0,1) (0,1)。
对于权值的分布:均值为 0 0 0,方差为( 1 1 1 / 输入的个数)的均匀分布。如果我们更注重前 向传播的话,我们可以选择 fan_in,即正向传播的输入个数;如果更注重后向传播的话,我们选择 fan_out, 因为在反向传播的时候,fan_out 就是神经元的输入个数;如果两者都考虑的话, 就选 average = (fan_in + fan_out) / 2 2 2。对于 ReLU 激活函数来说,XavierFiller 初始化也是很适合。关于该初始化方法,具体可以参考文章1、文章2,该方法假定激活函数是线性的。
对于权值的分布:基于均值为 0 0 0,方差为( 2 2 2/输入的个数)的高斯分布;它特别适合 ReLU 激活函数,该方法主要是基于 Relu 函数提出的,推导过程类似于 xavier。
常用在反卷积神经网络里的权值初始化。
13.9 启发式优化算法中,如何避免陷入局部最优解?
启发式算法中,局部最优值的陷入无法避免。启发式,本质上是一种贪心策略,这也在客 观上决定了不符合贪心规则的更好(或者最优)解会错过。 简单来说,避免陷入局部最优就是两个字:随机。 具体实现手段上,可以根据所采用的启发式框架来灵活地加入随机性。比如遗传里面,可 以在交叉变异时,可以在控制人口策略中,也可以在选择父本母本样本时;禁忌里面,可以在 禁忌表的长度上体现,也可以在解禁策略中使用,等等。这些都要结合具体问题特定的算例集, 需要反复尝试摸索才行。参数的敏感性是一个问题,建议不要超过 3 3 3 个参数,参数越不敏感越好。不同算例集用不同种子运行多次( 100 100 100 次左右才有统计意义),统计平均性能即可。需注 意全局的随机重启通常来说不是一个好办法,因为等于主动放弃之前搜索结果,万不得已不要 用,或者就是不用。
没有随机性,一定会陷入局部最优。为了获得更大的找到最优解的期望,算法中一定要有 足够的随机性。具体体现为鲁棒性较好,搜索时多样性较好。算法的每一步选择都可以考虑加入随机性,但要控制好概率。比如,某个贪心策略下,是以概率 $1 $做某一动作,可以考虑将其 改为以概率 0.999 0.999 0.999 做之前的操作,以剩余概率做其他操作。具体参数设置需调试。
随机性往往是对问题内在规律的一种妥协。即没有找到其内在规律,又不知道如何是好, 为了获得更好的多样性,逼不得已加入随机。因此,对给定问题的深入研究才是根本:分辨出 哪些时候,某个动作就是客观上能严格保证最优的——这点至关重要,直接决定了算法性能。 最好的算法一定是和问题结构紧密相连的,范范地套用某个启发式的框架不会有出色的性能。 当然,如果不是追求性能至上,而是考虑到开发效率实现成本这些额外因素,则另当别论。
通常情况下,做好第一点,可以略微改善算法性能;做好第二点,有希望给算法带来质的提高。而二者调和后的平衡则会带来质的飞跃。
贪心是“自强不息”的精进,不放过任何改进算法的机会;多样性的随机是“厚德载物”的一分包 容,给那些目前看似不那么好的解一些机会。调和好二者,不偏颇任何一方才能使算法有出色 的性能。要把握这种平衡,非一朝一夕之功,只能在反复试验反思中去细细品味。 要结合具体问题而言,范范空谈无太大用。
13.10 凸优化中如何改进 GD 方法以防止陷入局部最优解?
在对函数进行凸优化时,如果使用导数的方法(如:梯度下降法/GD,牛顿法等)来寻找最优解,有可能陷入到局部最优解而非全局最优解。 为了防止得到局部最优,可以对梯度下降法进行一些改进,防止陷入局部最优。 但是请注意,这些方法只能保证以最大的可能找到全局最优,无法保证 100 % 100\% 100%得到全局最优。
在 GD 中,是需要遍历所有的点之后才计算 w w w 的变化的;但是,在 stochastic GD 中,每输入一个点,就根据该点计算下一步的 w w w,这样,不仅可以从 batch training 变成 online training 方法,而且每次是按照单点的最优方向而不是整体的最优方向前进,从而相当于在朝目标前进的路上多拐了好多弯,有可能逃出局部最优。
momentum 相当与记忆住上一次的更新。在每次的更新中,都要加一个 k k k 倍的上一次更新 量。这样,也不再是按照标准路线前进,每次的步骤都容易受到上一次的影响,从而可能会逃 出局部最优。另外,也会加大步长,从而加快收敛。
13.11 常见的损失函数?
机器学习通过对算法中的目标函数进行不断求解优化,得到最终想要的结果。分类和回归 问题中,通常使用损失函数或代价函数作为目标函数。 损失函数用来评价预测值和真实值不一样的程度。通常损失函数越好,模型的性能也越好。 损失函数可分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和 实际结果的差别,结构风险损失函数是在经验风险损失函数上加上正则项。
下面介绍常用的损失函数:
如果预测值和目标值相等,值为 0 0 0,如果不相等,值为 1 1 1: Cannot read property 'type' of undefined
一般的在实际使用中,相等的条件过于严格,可适当放宽条件: Cannot read property 'type' of undefined
和 0 − 1 0-1 0−1 损失函数相似,绝对值损失函数表示为: L ( Y , f ( x ) ) = ∣ Y − f ( x ) ∣ . L(Y,f(x))=|Y-f(x)|. L(Y,f(x))=∣Y−f(x)∣.
L ( Y ∣ f ( x ) ) = ∑ N ( Y − f ( x ) ) 2 . L(Y|f(x))=\sum_{N}(Y-f(x))^2. L(Y∣f(x))=N∑(Y−f(x))2.
这点可从最小二乘法和欧几里得距离角度理解。最小二乘法的原理是,最优拟合曲线应该 使所有点到回归直线的距离和最小。
L ( Y , P ( Y ∣ X ) ) = − l o g P ( Y ∣ X ) . L(Y,P(Y|X))=-logP(Y|X). L(Y,P(Y∣X))=−logP(Y∣X).
常见的逻辑回归使用的就是对数损失函数,有很多人认为逻辑回归的损失函数式平方损失, 其实不然。逻辑回归它假设样本服从伯努利分布,进而求得满足该分布的似然函数,接着取对 数求极值等。逻辑回归推导出的经验风险函数是最小化负的似然函数,从损失函数的角度看, 就是 l o g log log 损失函数。
指数损失函数的标准形式为: L ( Y ∣ f ( x ) ) = e x p [ − y f ( x ) ] . L(Y|f(x))=exp[-yf(x)]. L(Y∣f(x))=exp[−yf(x)].
例如 AdaBoost 就是以指数损失函数为损失函数。
Hinge 损失函数的标准形式如下: L ( y ) = m a x ( 0 , 1 − t y ) . L(y)=max(0, 1-ty). L(y)=max(0,1−ty).
其中 y y y 是预测值,范围为 ( − 1 , 1 ) (-1,1) (−1,1), t t t 为目标值,其为 − 1 -1 −1 或 1 1 1。 在线性支持向量机中,最优化问题可等价于: m i n w , b ∑ i = 1 N ( 1 − y i ( w x i + b ) ) + λ ∥ w 2 ∥ \underset{w,b}{min}\sum_{i=1}^{N}(1-y_i(wx_i+b))+\lambda \lVert w^2 \rVert w,bmini=1∑N(1−yi(wxi+b))+λ∥w2∥
1 m ∑ i = 1 N l ( w x i + b y i ) ) + ∥ w 2 ∥ \frac{1}{m}\sum_{i=1}^{N}l(wx_i+by_i))+\lVert w^2 \rVert m1i=1∑Nl(wxi+byi))+∥w2∥
其中 l ( w x i + b y i ) ) l(wx_i+by_i)) l(wxi+byi))是Hinge损失函数, ∥ w 2 ∥ \lVert w^2 \rVert ∥w2∥可看做为正则化项。
13.14 如何进行特征选择(feature selection)?
13.14.1 如何考虑特征选择
当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:
(1)特征是否发散:如果一个特征不发散,例如方差接近于 0 0 0,也就是说样本在这个特 征上基本上没有差异,这个特征对于样本的区分并没有什么用。 (2)特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除移除低方差法外,本文介绍的其他方法均从相关性考虑。
13.14.2 特征选择方法分类
根据特征选择的形式又可以将特征选择方法分为 3 3 3 种:
(1)Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择 阈值的个数,选择特征。 (2)Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或 者排除若干特征。 (3)Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于 Filter 方法,但是是通过训练来确定特征的优劣。
13.14.3 特征选择目的
(1)减少特征数量、降维,使模型泛化能力更强,减少过拟合; (2)增强对特征和特征值之间的理解。拿到数据集,一个特征选择方法,往往很难同时完成这两个目的。通常情况下,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的)。 本文将结合 Scikit-learn 提供的例子介绍几种常用的特征选择方法,它们各自的优缺点和问题。
13.15 梯度消失/梯度爆炸原因,以及解决方法
13.15.1 为什么要使用梯度更新规则?
在介绍梯度消失以及爆炸之前,先简单说一说梯度消失的根源—–深度神经网络和反向传 播。目前深度学习方法中,深度神经网络的发展造就了我们可以构建更深层的网络完成更复杂 的任务,深层网络比如深度卷积网络,LSTM 等等,而且最终结果表明,在处理复杂任务上, 深度网络比浅层的网络具有更好的效果。但是,目前优化神经网络的方法都是基于反向传播的 思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。 这样做是有一定原因的,首先,深层网络由许多非线性层堆叠而来,每一层非线性层都可以视 为是一个非线性函数 f ( x ) f(x) f(x)( f ( x ) f(x) f(x)非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数: F ( x ) = f n ( ⋯ f 3 ( f 2 ( f 1 ( x ) ∗ θ 1 + b ) ∗ θ 2 + b ) ⋯ ) F(x)=f_n(\cdots f_3(f_2(f_1(x)*\theta_1+b)*\theta_2+b)\cdots) F(x)=fn(⋯f3(f2(f1