From 3e9e19a7e589201cdcf4189f76736963f16f1694 Mon Sep 17 00:00:00 2001 From: scutan90 Date: Fri, 5 Apr 2019 23:01:32 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=AC=AC=E4=BA=8C=E7=AB=A0?= =?UTF-8?q?=E3=80=81=E7=AC=AC=E4=B8=89=E7=AB=A0=E4=BC=98=E5=8C=96=E5=99=A8?= =?UTF-8?q?=E5=8F=8A=E5=AD=A6=E4=B9=A0=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\271\240\345\237\272\347\241\200.md" | 42 +++++++++++++++- ...46\344\271\240\345\237\272\347\241\200.md" | 44 +++++++--------- ...30\345\214\226\347\256\227\346\263\225.md" | 50 +++++++++++-------- 3 files changed, 88 insertions(+), 48 deletions(-) diff --git "a/ch02_\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\272\214\347\253\240_\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" "b/ch02_\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\272\214\347\253\240_\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" index 7add8208..48f50307 100644 --- "a/ch02_\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\272\214\347\253\240_\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" +++ "b/ch02_\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\272\214\347\253\240_\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" @@ -2259,7 +2259,47 @@ GBDT和随机森林的不同点: 5、随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成 6、随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能 -## 2.23 大数据与深度学习之间的关系 +## 2.23 理解 One Hot Encodeing 原理及作用? + +问题由来: + +​ 在很多**机器学习**任务中,特征并不总是连续值,而有可能是分类值。 + +例如,考虑一下的三个特征: + +``` +["male", "female"] ["from Europe", "from US", "from Asia"] +["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"] +``` + +如果将上述特征用数字表示,效率会高很多。例如: + +``` +["male", "from US", "uses Internet Explorer"] 表示为 [0, 1, 3] +["female", "from Asia", "uses Chrome"] 表示为 [1, 2, 1] +``` + +​ 但是,即使转化为数字表示后,上述数据也不能直接用在我们的分类器中。因为,分类器往往默认数据数据是连续的(可以计算距离?),并且是有序的(而上面这个 0 并不是说比 1 要高级)。但是,按照我们上述的表示,数字并不是有序的,而是随机分配的。 + +**独热编码** + +​ 为了解决上述问题,其中一种可能的解决方法是采用独热编码(One-Hot Encoding)。独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对 N 个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。 + +例如: + +``` +自然状态码为:000,001,010,011,100,101 +独热编码为:000001,000010,000100,001000,010000,100000 +``` + +​ 可以这样理解,对于每一个特征,如果它有 m 个可能值,那么经过独热编码后,就变成了 m 个二元特征(如成绩这个特征有好,中,差变成 one-hot 就是 100, 010, 001)。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。 + +这样做的好处主要有: + +1. 解决了分类器不好处理属性数据的问题; +2. 在一定程度上也起到了扩充特征的作用。 + +## 2.24 大数据与深度学习之间的关系 **大数据**通常被定义为“超出常用软件工具捕获,管理和处理能力”的数据集。 **机器学习**关心的问题是如何构建计算机程序使用经验自动改进。 diff --git "a/ch03_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\270\211\347\253\240_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.md" "b/ch03_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\270\211\347\253\240_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.md" index bdc90dad..8e6f7e12 100644 --- "a/ch03_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\270\211\347\253\240_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.md" +++ "b/ch03_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\270\211\347\253\240_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.md" @@ -998,47 +998,35 @@ $$ ### 3.9.2 Softmax 推导 -## 3.10 理解 One Hot Encodeing 原理及作用? +1. -问题由来: +## 3.11 优化器 -​ 在很多**机器学习**任务中,特征并不总是连续值,而有可能是分类值。 +### 3.11.1 优化器的作用 -例如,考虑一下的三个特征: +​ 深度学习系统中,深度神经网络模型的建立及训练,伴随着最小化损失函数的目标,优化器就是用来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值,从而最小化(或最大化)损失函数E(x),优化器算法使用各参数的梯度值来最小化或最大化损失函数E(x)。最常用的一阶优化算法是梯度下降。 -``` -["male", "female"] ["from Europe", "from US", "from Asia"] -["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"] -``` +### 3.11.2 常用的优化器有哪些? -如果将上述特征用数字表示,效率会高很多。例如: - -``` -["male", "from US", "uses Internet Explorer"] 表示为 [0, 1, 3] -["female", "from Asia", "uses Chrome"] 表示为 [1, 2, 1] -``` +​ 下面将针对常用的模型优化器方法进行介绍梳理。包含梯度下降、动量的梯度下降、Adagrad、RMSProp、Adadelta、Adam、Nadam 等方法以及学习率的衰减方式分段常数衰减、多项式衰减、指数衰减、自然指数衰减、余弦衰减、线性余弦衰减、噪声线性余弦衰减等研究进行了系统的梳理。 -​ 但是,即使转化为数字表示后,上述数据也不能直接用在我们的分类器中。因为,分类器往往默认数据数据是连续的(可以计算距离?),并且是有序的(而上面这个 0 并不是说比 1 要高级)。但是,按照我们上述的表示,数字并不是有序的,而是随机分配的。 +### 3.11.3 梯度下降 -**独热编码** +### 3.11.4 动量的梯度下降 -​ 为了解决上述问题,其中一种可能的解决方法是采用独热编码(One-Hot Encoding)。独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对 N 个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。 +### 3.11.5 Adagrad -例如: +### 3.11.6 RMSProp -``` -自然状态码为:000,001,010,011,100,101 -独热编码为:000001,000010,000100,001000,010000,100000 -``` +### 3.11.7 Adadelta -​ 可以这样理解,对于每一个特征,如果它有 m 个可能值,那么经过独热编码后,就变成了 m 个二元特征(如成绩这个特征有好,中,差变成 one-hot 就是 100, 010, 001)。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。 +### 3.11.8 Adam -这样做的好处主要有: +### 3.11.9 Nadam -1. 解决了分类器不好处理属性数据的问题; -2. 在一定程度上也起到了扩充特征的作用。 +### 3.11.10常见学习率衰减方法 -## 3.11 常用的优化器有哪些 +见desk PDF 分别列举 @@ -1183,6 +1171,8 @@ tf.train.RMSPropOptimizer [23] 吴岸城. 神经网络与深度学习[M].电子工业出版社,2016. +[24] 冯宇旭, 李裕梅. 深度学习优化器方法及学习率衰减方式综述[J]. 数据挖掘, 2018, 8(4): 186-200. + diff --git "a/ch13_\344\274\230\345\214\226\347\256\227\346\263\225/\347\254\254\345\215\201\344\270\211\347\253\240_\344\274\230\345\214\226\347\256\227\346\263\225.md" "b/ch13_\344\274\230\345\214\226\347\256\227\346\263\225/\347\254\254\345\215\201\344\270\211\347\253\240_\344\274\230\345\214\226\347\256\227\346\263\225.md" index 3721207e..4641022b 100644 --- "a/ch13_\344\274\230\345\214\226\347\256\227\346\263\225/\347\254\254\345\215\201\344\270\211\347\253\240_\344\274\230\345\214\226\347\256\227\346\263\225.md" +++ "b/ch13_\344\274\230\345\214\226\347\256\227\346\263\225/\347\254\254\345\215\201\344\270\211\347\253\240_\344\274\230\345\214\226\347\256\227\346\263\225.md" @@ -253,11 +253,7 @@ $$ 我们最终的目的是希望这个多元函数可以很好的完成输入到输出之间的映射,假设不同的输入,输出的最优解是g(x) ,那么,优化深度网络就是为了寻找到合适的权值,满足 Loss=L(g(x),F(x))取得极小值点,比如最简单的损失函数: $$ Loss = \lVert g(x)-f(x) \rVert^2_2. - -假设损失函数的数据空间是下图这样的,我们最优的权值就是为了寻找下图中的最小值点, 对于这种数学寻找最小值问题,采用梯度下降的方法再适合不过了。 -![](./img/ch13/figure_13_15_1.png) $$ - 假设损失函数的数据空间是下图这样的,我们最优的权值就是为了寻找下图中的最小值点, 对于这种数学寻找最小值问题,采用梯度下降的方法再适合不过了。 ![](./img/ch13/figure_13_15_1.png) @@ -394,23 +390,23 @@ $$ ## 13.16 如何快速构建有效初始模型? -构建一个有效的初始模型能帮助我们快速了解数据的质量和确定模型构建的方向。构建一个良好的初始模型,一般需要注意如下几点: +​ 构建一个有效的初始模型能帮助我们快速了解数据的质量和确定模型构建的方向。构建一个良好的初始模型,一般需要注意如下几点: -1、了解"对手"。这里的“对手”通常是指数据,我们在得到数据时,第一步是需要了解数据特点和使用场合。了解数据特点能帮助我们快速定位如何进行建模。确定使用场合能帮助我们进一步确定模型需要优化的方向。数据特点一般需要了解例如数据集规模、训练集和验证集是否匹配、样本的分布是否均匀、数据是否存在缺失值等等。 +​ 1、了解"对手"。这里的“对手”通常是指数据,我们在得到数据时,第一步是需要了解数据特点和使用场合。了解数据特点能帮助我们快速定位如何进行建模。确定使用场合能帮助我们进一步确定模型需要优化的方向。数据特点一般需要了解例如数据集规模、训练集和验证集是否匹配、样本的分布是否均匀、数据是否存在缺失值等等。 -2、站在巨人肩膀上。根据数据特点,我们通常能匹配到一个现有比较优秀的模型。这类模型都通常能在类似数据上表现出一个比较不错的性能。 +​ 2、站在巨人肩膀上。根据数据特点,我们通常能匹配到一个现有比较优秀的模型。这类模型都通常能在类似数据上表现出一个比较不错的性能。 -3、一切从简。初始模型的作用在于迅速了解数据质量和特点,所以模型的性能通常不需要达到很高,模型复杂度也不需要很高。例如,做图像分类时,我们在使用预训练模型时,不需要一开始就使用例如ResNet152这类模型巨大,复杂度过高的模型。这在数据量较小时,很容易造成过拟合而导致出现我们对数据产生一些误导性的判断,此外也增加了额外训练构建时间。所以使用更小更简单的模型以及损失函数来试探数据是相比更明智的选择。 +​ 3、一切从简。初始模型的作用在于迅速了解数据质量和特点,所以模型的性能通常不需要达到很高,模型复杂度也不需要很高。例如,做图像分类时,我们在使用预训练模型时,不需要一开始就使用例如ResNet152这类模型巨大,复杂度过高的模型。这在数据量较小时,很容易造成过拟合而导致出现我们对数据产生一些误导性的判断,此外也增加了额外训练构建时间。所以使用更小更简单的模型以及损失函数来试探数据是相比更明智的选择。 -4、总比瞎猜强。构建模型的意义在于建立一个高效的模型,虽然初始模型我们不对性能做过高的要求。但前提在于必须要比随机猜测好,不然构建模型的意义就不存在了。 +​ 4、总比瞎猜强。构建模型的意义在于建立一个高效的模型,虽然初始模型我们不对性能做过高的要求。但前提在于必须要比随机猜测好,不然构建模型的意义就不存在了。 -5、解剖模型。一旦确定了一个初始模型时,无论你对该模型多熟悉,当其面对一批新数据时,你永远需要重新去认识这个模型,因为你永远不确定模型内部到底发生了些什么。解剖模型一般需要在训练时注意误差变化、注意训练和验证集的差异;出现一些NAN或者INf等情况时,需要打印观察内部输出,确定问题出现的时间和位置;在完成训练后,需要测试模型的输出是否正确合理,以确认评价指标是否符合该数据场景。无论使用任何一种模型,我们都不能把它当做黑盒去看待。 +​ 5、解剖模型。一旦确定了一个初始模型时,无论你对该模型多熟悉,当其面对一批新数据时,你永远需要重新去认识这个模型,因为你永远不确定模型内部到底发生了些什么。解剖模型一般需要在训练时注意误差变化、注意训练和验证集的差异;出现一些NAN或者INf等情况时,需要打印观察内部输出,确定问题出现的时间和位置;在完成训练后,需要测试模型的输出是否正确合理,以确认评价指标是否符合该数据场景。无论使用任何一种模型,我们都不能把它当做黑盒去看待。 ## 13.17 如何通过模型重新观察数据? -对于这个问题,与其说如何做,倒不如说这个问题是用来强调这样做的重要性。如何重新观察数据其实不难,而是很多读者,会忽略这一项过程的重要性。 +​ 对于这个问题,与其说如何做,倒不如说这个问题是用来强调这样做的重要性。如何重新观察数据其实不难,而是很多读者,会忽略这一项过程的重要性。 -通过模型重新观察数据,不仅能让我们了解模型情况,也能让我们对数据质量产生进一步的理解。目前深度学习在监督学习领域成就是非常显著的。监督学习需要依赖大量的人为标注,人为标注很难确定是否使用的数据中是否存在错误标注或者漏标注等问题。这无论是哪种情况都会影响我们对模型的判断。所以通过模型重新验证数据质量是非常重要的一步。很多初学者,通常会忽略这一点,而导致出现对模型的一些误判,严重时甚至会影响整个建模方向。此外,对于若出现一些过拟合的情况,我们也可以通过观察来了解模型。例如分类任务,样本严重不平衡时,模型全预测到了一边时,其正确率仍然很高,但显然模型已经出现了问题。 +​ 通过模型重新观察数据,不仅能让我们了解模型情况,也能让我们对数据质量产生进一步的理解。目前深度学习在监督学习领域成就是非常显著的。监督学习需要依赖大量的人为标注,人为标注很难确定是否使用的数据中是否存在错误标注或者漏标注等问题。这无论是哪种情况都会影响我们对模型的判断。所以通过模型重新验证数据质量是非常重要的一步。很多初学者,通常会忽略这一点,而导致出现对模型的一些误判,严重时甚至会影响整个建模方向。此外,对于若出现一些过拟合的情况,我们也可以通过观察来了解模型。例如分类任务,样本严重不平衡时,模型全预测到了一边时,其正确率仍然很高,但显然模型已经出现了问题。 @@ -418,8 +414,7 @@ $$ ### 13.18.1 如何定位数据不匹配? -数据不匹配问题是个不容易定位和解决的问题。这个问题出现总会和模型过拟合表现很相似,即在训练集上能体现 -非常不错的性能,但在测试集上表现总是差强人意但区别在于如果遇到是数据不匹配的问题,通常在用一批和训 +​ 数据不匹配问题是个不容易定位和解决的问题。这个问题出现总会和模型过拟合表现很相似,即在训练集上能体现非常不错的性能,但在测试集上表现总是差强人意但区别在于如果遇到是数据不匹配的问题,通常在用一批和训 练集有看相同或者相似分布的数据上仍然能取得不错的结果。但很多时候,当测试集上结果表现很差时,很多初学 者可能会直接将问题定位在模型过拟合上,最后对模型尝试各种方法后,性能却始终不能得到有效提升。当遇到这 种情况时,建议先定位出是否存在数据不匹配的问题。最简单的验证方式就是可以从训练集中挑选出一部分数据作 @@ -427,16 +422,31 @@ $$ ### 13.18.2 举例常见几个数据不匹配的场景? -例如设计款识别物体的app时,实际场景的图片均来自于手机拍摄,而训练集确是来自于网上各类抓取下来的图 +​ 例如设计款识别物体的app时,实际场景的图片均来自于手机拍摄,而训练集确是来自于网上各类抓取下来的图 片。例如在图像去噪、去模糊、去雾、超分辨率等图像处理场景时,由于大量数据的难以获取,因此都会采用人为 假设合成的图像进行训练,这时候应用到实际场景中也容易出现不匹配的问题 ### 13.18.3 如何解决数据不匹配问题? -数据不匹配是个很难有固定方法来解决的问题。这里提供几条供参考的途径: -1、收集更多符合实际场最需要的数据。这似乎是最简单但也最难方式 -2、对结果做错误分析。找出数据集中出错的数据和正确数据之间的特点和区别,这对你无论是进行后续模型的分 -析或者是数据的处理提供非常有效的思路。注意,这里的数据集包括训练集和测试集 -3、数据集增强。数据集增强并不意味看数据集越大越好,其目的是丰富数据的分布以适应更多的变化当遇到数 +​ 数据不匹配是个很难有固定方法来解决的问题。这里提供几条供参考的途径: +​ 1、收集更多符合实际场最需要的数据。这似乎是最简单但也最难方式 +​ 2、对结果做错误分析。找出数据集中出错的数据和正确数据之间的特点和区别,这对你无论是进行后续模型的分析或者是数据的处理提供非常有效的思路。注意,这里的数据集包括训练集和测试集 +​ 3、数据集增强。数据集增强并不意味看数据集越大越好,其目的是丰富数据的分布以适应更多的变化当遇到数 据不匹配时,对数据处理般可以有两种方式。其一,合成或处理更多接近需要的数据特点。其二,对所有数据包 括实际场景数据都进行处理,将所有数据都统一到另一个分布上,统一出一种新的特点。 + +### 13.18.4 如何提高深度学习系统的性能 + +​ 当我们要试图提高深度学习系统的性能时,目前我们大致可以从三方面考虑: + +​ 1、提高模型的结构,比如增加神经网络的层数,或者将简单的神经元单位换成复杂的 LSTM 神经元,比如在自然语言处理领域内,利用 LSTM 模型挖掘语法分析的优势。 + +​ 2、改进模型的初始化方式,保证早期梯度具有某些有益的性质,或者具备大量的稀疏性,或者利用线性代数原理的优势。 + +​ 3、选择更强大的学习算法,比如对度梯度更新的方式,也可以是采用除以先前梯度 L2 范数来更新所有参数,甚至还可以选用计算代价较大的二阶算法。 + + + +## 参考文献 + +[1] 冯宇旭, 李裕梅. 深度学习优化器方法及学习率衰减方式综述[J]. 数据挖掘, 2018, 8(4): 186-200. \ No newline at end of file