Merge pull request #1 from scutan90/master

hold-in
This commit is contained in:
SubsonBigod 2018-11-06 10:48:44 +08:00 committed by GitHub
commit dc9506142c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
462 changed files with 3383 additions and 1890 deletions

BIN
.DS_Store vendored

Binary file not shown.

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.ipynb_checkpoints
.DS_Store

View File

@ -1 +0,0 @@
待提出

View File

@ -1 +0,0 @@
问题待提出和整理

View File

@ -1,33 +0,0 @@
# 第十四章 超参数调整
> Markdown Revision 1;
> Date: 2018/10/25
> Editor: 乔成磊-同济大学
> Contact: qchl0318@163.com
> Updater: [sjsdfg](https://github.com/sjsdfg)
## 14.1 调试处理
  关于训练深度最难的事情之一是你要处理的参数的数量,从学习速率到 Momentum动量梯度下降法的参数。如果使用 Momentum 或 Adam 优化算法的参数,也许你还得选择层数,也许你还得选择不同层中隐藏单元的数量,也许你还想使用学习率衰减。所以,你使用的不是单一的学习率。接着,当然你可能还需要选择 mini-batch 的大小。
  结果证实一些超参数比其它的更为重要,我认为,最为广泛的学习应用是,学习速率是需要调试的最重要的超参数。
  除了,还有一些参数需要调试,例如 Momentum 参数0.9 就是个很好的默认值。我还会调试 mini-batch 的大小,以确保最优算法运行有效。我还会经常调试隐藏单元,我用橙色圈住的这些,这三个是我觉得其次比较重要的,相对于而言。重要性排第三位的是其他因素,层数有时会产生很大的影响,学习率衰减也是如此。当应用 Adam 算法时,事实上,我从不调试,和,我总是选定其分别为 0.90.999 和,如果你想的话也可以调试它们。
  但希望你粗略了解到哪些超参数较为重要,无疑是最重要的,接下来是我用橙色圈住的那些,然后是我用紫色圈住的那些,但这不是严格且快速的标准,我认为,其它深度学习的研究者可能会很不同意我的观点或有着不同的直觉。
## 14.2 有哪些超参数
  学习率learning rate、batch_size、optimizer、 激活函数、正则化
## 14.3 如何选择调试值?
## 14.4 为超参数选择合适的范围
## 14.5 如何搜索超参数?
  最后,关于如何搜索超参数的问题,我见过大概两种重要的思想流派或人们通常采用的两种重要但不同的方式。
  一种是你照看一个模型,通常是有庞大的数据组,但没有许多计算资源或足够的 CPU 和 GPU 的前提下,基本而言,你只可以一次负担起试验一个模型或一小批模型,在这种情况下,即使当它在试验时,你也可以逐渐改良。比如,第 0 天,你将随机参数初始化,然后开始试验,然后你逐渐观察自己的学习曲线,也许是损失函数 J或者数据设置误差或其它的东西在第 1 天内逐渐减少,那这一天末的时候,你可能会说,看,它学习得真不错。我试着增加一点学习速率,看看它会怎样,也许结果证明它做得更好,那是你第二天的表现。两天后,你会说,它依旧做得不错,也许我现在可以填充下 Momentum 或减少变量。然后进入第三天,每天,你都会观察它,不断调整你的参数。也许有一天,你会发现你的学习率太大了,所以你可能又回归之前的模型,像这样,但你可以说是在每天花时间照看此模型,即使是它在许多天或许多星期的试验过程中。所以这是一个人们照料一个模型的方法,观察它的表现,耐心地调试学习率,但那通常是因为你没有足够的计算能力,不能在同一时间试验大量模型时才采取的办法。
  另一种方法则是同时试验多种模型,你设置了一些超参数,尽管让它自己运行,或者是一天甚至多天,然后你会获得像这样的学习曲线,这可以是损失函数 J 或实验误差或损失或数据误差的损失,但都是你曲线轨迹的度量。同时你可以开始一个有着不同超参数设定的不同模型,所以,你的第二个模型会生成一个不同的学习曲线,也许是像这样的一条(紫色曲线),我会说这条看起来更好些。与此同时,你可以试验第三种模型,其可能产生一条像这样的学习曲线(红色曲线),还有另一条(绿色曲线),也许这条有所偏离,像这样,等等。或者你可以同时平行试验许多不同的模型,橙色的线就是不同的模型。用这种方式你可以试验许多不同的参数设定,然后只是最后快速选择工作效果最好的那个。在这个例子中,也许这条看起来是最好的(下方绿色曲线)。
  所以这两种方式的选择,是由你拥有的计算资源决定的,如果你拥有足够的计算机去平行试验许多模型,那绝对采用鱼子酱方式,尝试许多不同的超参数,看效果怎么样。但在一些应用领域,比如在线广告设置和计算机视觉应用领域,那里的数据太多了,你需要试验大量的模型,所以同时试验大量的模型是很困难的,它的确是依赖于应用的过程。但我看到那些应用熊猫方式多一些的组织,那里,你会像对婴儿一样照看一个模型,调试参数,试着让它工作运转。尽管,当然,甚至是在熊猫方式中,试验一个模型,观察它工作与否,也许第二或第三个星期后,也许我应该建立一个不同的模型(绿色曲线),像熊猫那样照料它,我猜,这样一生中可以培育几个孩子,即使它们一次只有一个孩子或孩子的数量很少。

517
README.md
View File

@ -1,88 +1,112 @@
##############################################################
请尊重作者的知识产权,版权所有,翻版必究。 2018.6.27 Tan
scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人,请广大伙伴儿知悉!
##############################################################
# 1. 版权声明
请尊重作者的知识产权,版权所有,翻版必究。
## 接下来将提供MD版本大家一起编辑完善敬请期待
## 希望踊跃提建议,补充修改内容!
## 希望踊跃提建议在已提交MD版本补充修改内容
为了让内容更充实完善集思广益请在修改MD文件的同时或直接留言备注自己的姓名单位大佬斯坦福大学一经采纳会在原文中显示贡献者的信息如有收益会进一步分红谢谢
例:
请大家一起维护自己的劳动成果,进行监督。
2018.6.27 Tan
# 2. 概述
本项目是大家对AI的相关知识进行整合集思广益, 以便形成 内容充实,覆盖全面的文集。
# 3. 加入以及文档规范
寻求有愿意继续完善的朋友、编辑、写手;如有意合作,完善出书(成为共同作者)。
所有提交内容的贡献者,将会在文中体现贡献者个人信息(例: 大佬-西湖大学)
为了让内容更充实完善集思广益欢迎Fork该项目并参与编写。请在修改MD文件的同时或直接留言备注自己的姓名单位大佬斯坦福大学一经采纳会在原文中显示贡献者的信息如有收益会进一步分红谢谢
例子:
```markdown
### 3.3.2 如何寻找超参数的最优值?(贡献者:大佬-斯坦福大学)
在使用机器学习算法时,总有一些难搞的超参数。例如权重衰减大小,高斯核宽度等等。算法不会设置这些参数,而是需要你去设置它们的值。设置的值对结果产生较大影响。常见设置超参数的做法有:
1. 猜测和检查:根据经验或直觉,选择参数,一直迭代。
2. 网格搜索:让计算机尝试在一定范围内均匀分布的一组值。
3. 随机搜索:让计算机随机挑选一组值。
4. 贝叶斯优化:使用贝叶斯优化超参数,会遇到贝叶斯优化算法本身就需要很多的参数的困难。
5. 在良好初始猜测的前提下进行局部优化:这就是 MITIE 的方法,它使用 BOBYQA 算法,并有一个精心选择的起始点。由于 BOBYQA 只寻找最近的局部最优解,所以这个方法是否成功很大程度上取决于是否有一个好的起点。在 MITIE 的情况下,我们知道一个好的起点,但这不是一个普遍的解决方案,因为通常你不会知道好的起点在哪里。从好的方面来说,这种方法非常适合寻找局部最优解。稍后我会再讨论这一点。
6. 最新提出的 LIPO 的全局优化方法。这个方法没有参数,而且经验证比随机搜索方法好。
### 已提交MD版本章节请查看MarkDown排名不分先后
1. 猜测和检查:根据经验或直觉,选择参数,一直迭代。
2. 网格搜索:让计算机尝试在一定范围内均匀分布的一组值。
3. 随机搜索:让计算机随机挑选一组值。
4. 贝叶斯优化:使用贝叶斯优化超参数,会遇到贝叶斯优化算法本身就需要很多的参数的困难。
5. 在良好初始猜测的前提下进行局部优化:这就是 MITIE 的方法,它使用 BOBYQA 算法,并有一个精心选择的起始点。由于 BOBYQA 只寻找最近的局部最优解,所以这个方法是否成功很大程度上取决于是否有一个好的起点。在 MITIE 的情下,我们知道一个好的起点,但这不是一个普遍的解决方案,因为通常你不会知道好的起点在哪里。从好的方面来说,这种方法非常适合寻找局部最优解。稍后我会再讨论这一点。
6. 最新提出的 LIPO 的全局优化方法。这个方法没有参数,而且经验证比随机搜索方法好。
```
# 4. 贡献与项目概览
已提交MD版本章节请查看MarkDown排名不分先后
待定:表示该章节还未匹配到合适的负责人(统筹该章节的内容修改、审核、原创性陈述)
可加:表示该章节,如果有其他合适的,可以开放权限加到负责人身份
第一章 数学基础 负责人:哈工大博士-袁笛
第二章 机器学习基础 负责人:稿定科技计算机视觉工程师-刘鹏;(待定)
第三章 深度学习基础 负责人:同济大学研究生-乔成磊;稿定科技计算机视觉工程师-刘鹏;(可加)
第四章 经典网络 负责人:(待定)
第五章 卷积神经网络CNN 负责人杜克大学硕士、data scientist李骁丹重庆大学研究生-刘畅;
------------------------------铪星创新科技联合创始人-杨文英;(可加)
第六章 循环神经网络RNN 负责人杜克大学硕士、data scientist李骁丹;(可加)
第七章 生成对抗网络GAN 负责人:牛津大学博士泽华;中科院硕士、爱奇艺算法工程师-郭晓锋
第八章 目标检测 负责人:稿定科技计算机视觉工程师-刘鹏;哈工大博士袁笛;(可加)
第九章 图像分割 负责人:华南理工研究生-黄钦建;电子科大研究生-孙洪卫、张越;中国农业科学院-杨国峰
第十章 强化学习 负责人:复旦大学研究生明杰,(可加)
第十一章 迁移学习 负责人:(待定)
第十二章 网络搭建及训练 负责人:(待定)
第十三章 优化算法 负责人:(待定)
第十四章 超参数调整 负责人:(待定)
第十五章 GPU和框架选型 负责人:平安科技算法工程师-崔永明、(可加)
第十六章 NLP 负责人:电子科技大学博士-盛泳潘深圳乌灵图明科技有限公司CTO-何建宏;
------------------------------DaoCloud研发工程师-张善干;    
可加:表示该章节,如果有其他合适的,可以开放权限加到负责人身份
寻求有愿意继续完善的朋友、编辑、写手;如有意合作,完善出书(成为共同作者)
所有提交内容的贡献者,将会在文中体现贡献者个人信息(大佬-西湖大学)
| 内容 | 负责人 | 状态|
| :--------------- | :-------- | :--------|
|<font size="1">第一章 数学基础</font>|<font size="1">哈工大博士-袁笛</font>| <font size="1">待定</font> |
|<font size="1">第二章 机器学习</font>|<font size="1">稿定科技计算机视觉工程师-刘鹏</font>|<font size="1">待定</font>|
|<font size="1">第三章 深度学习基础</font>|<font size="1">同济大学研究生-乔成磊;稿定科技计算机视觉工程师-刘鹏</font>|<font size="1">可加</font>|
|<font size="1">第四章 经典网络</font>|<font size="1">华南理工研究生-黄钦建</font>|<font size="1">可加</font>|
|<font size="1">第五章 卷积神经网络CNN</font> |<font size="1">杜克大学硕士、data scientist李骁丹重庆大学研究生-刘畅;铪星创新科技联合创始人-杨文英;</font>|<font size="2">可加</font>|
|<font size="1">第六章 循环神经网络RNN</font>|<font size="1">杜克大学硕士、data scientist李骁丹</font>|<font size="1">可加</font>|
|<font size="1">第七章 生成对抗网络GAN</font>|<font size="1">牛津大学博士泽华;中科院硕士、爱奇艺算法工程师-郭晓锋;</font>||
|<font size="1">第八章 目标检测</font>|<font size="1">稿定科技计算机视觉工程师-刘鹏;哈工大博士袁笛;上海大学研究生-陈方杰</font>||
|<font size="1">第九章 图像分割</font>|<font size="1">华南理工研究生-黄钦建;电子科大研究生-孙洪卫、张越;中国农业科学院-杨国峰</font>||
|<font size="1">第十章 强化学习</font>|<font size="1">复旦大学研究生明杰杭州启飞CTO-徐武民</font>|<font size="1">可加</font>|
|<font size="1">第十一章 迁移学习</font>|<font size="1">中科院计算技术研究所博士-王晋东</font>|<font size="1">可加</font>|
|<font size="1">第十二章 网络搭建及训练</font>| |<font size="1">待定</font>|
|<font size="1">第十三章 优化算法</font>|<font size="2">杭州启飞CTO-徐武民</font>|<font size="1">可加</font>|
|<font size="1">第十四章 超参数调整</font>|<font size="1">中兴通讯有限公司算法工程师-王超锋</font>|<font size="1">可加</font>|
|<font size="1">第十五章 GPU和框架选型</font>|<font size="1">澳洲monash大学Research Scientist/Telstra(澳洲电信)Data Scientist-钟申俊博士;平安科技算法工程师-崔永明</font>|<font size="1">可加</font>|
|<font size="1">第十六章 自然语言处理NLP</font>|<font size="1">电子科技大学博士-盛泳潘深圳乌灵图明科技有限公司CTO-何建宏;DaoCloud研发工程师-张善干澳洲monash大学Research Scientist/Telstra(澳洲电信)Data Scientist-钟申俊博士;华南理工大学&UCI博士-黄振华</font>||
|<font size="1">第十七章 移动端框架部署(新增)                                         </font>|<font size="1">川大硕士-顺丰科技-谈继勇;贵州大学硕士-三星-张达峰</font>|<font size="1">可加 </font>|
##############################################################
请联系scutjy2015@163.com (唯一官方邮箱) 加微信Tan tan_weixin88
# 5. 更多
### 进群先在MD版本增加、改善、提交内容后更容易进群。
1. 寻求有愿意继续完善的朋友、编辑、写手; 如有意合作,完善出书(成为共同作者)。
所有提交内容的贡献者,将会在文中体现贡献者个人信息(大佬-西湖大学)。
进群请加微信 委托人HQJ199508212176  委托人Xuwumin1203  委托人tianyuzy
2. 联系方式 : 请联系scutjy2015@163.com (唯一官方邮箱) 
微信交流群《深度学习500问》交流群
![《深度学习500问》交流群二维码](/img/WechatIMG3.jpeg)
2018.10.23 Tan
微信Tan tan_weixin88(进群先在MD版本增加、改善、提交内容后更容易进群。)
进群请加微信 委托人HQJ199508212176  委托人Xuwumin1203  委托人tianyuzy
![《深度学习500问》微信交流群二维码](/WechatIMG3.jpeg)
3. 注意, 现出现不法分子冒充发起人,请广大伙伴儿知悉!
4. 接下来将提供MD版本大家一起编辑完善敬请期待希望踊跃提建议补充修改内容
# 6. 目录
**第一章 数学基础 1**
1.1 标量、向量、张量之间的联系 1
1.2 张量与矩阵的区别? 1
1.3 矩阵和向量相乘结果 1
1.4 向量和矩阵的范数归纳 1
1.5 如何判断一个矩阵为正定? 2
1.6 导数偏导计算 3
1.7 导数和偏导数有什么区别? 3
1.8 特征值分解与特征向量 3
1.9 奇异值与特征值有什么关系? 4
1.10 机器学习为什么要使用概率? 4
1.11 变量与随机变量有什么区别? 4
1.12 常见概率分布? 5
1.13 举例理解条件概率 9
1.14 联合概率与边缘概率联系区别? 10
1.15 条件概率的链式法则 10
1.16 独立性和条件独立性 11
1.17 期望、方差、协方差、相关系数总结 11
**第二章 机器学习基础 14**
##############################################################
# 目录 2
## 第一章 数学基础 1
1.1标量、向量、张量之间的联系 1
1.2张量与矩阵的区别? 1
1.3矩阵和向量相乘结果 1
1.4向量和矩阵的范数归纳 1
1.5如何判断一个矩阵为正定? 2
1.6导数偏导计算 3
1.7导数和偏导数有什么区别? 3
1.8特征值分解与特征向量 3
1.9奇异值与特征值有什么关系? 4
1.10机器学习为什么要使用概率? 4
1.11变量与随机变量有什么区别? 4
1.12常见概率分布? 5
1.13举例理解条件概率 9
1.14联合概率与边缘概率联系区别? 10
1.15条件概率的链式法则 10
1.16独立性和条件独立性 11
1.17期望、方差、协方差、相关系数总结 11
## 第二章 机器学习基础 14
2.1 各种常见算法图示 14
2.2监督学习、非监督学习、半监督学习、弱监督学习? 15
2.2 监督学习、非监督学习、半监督学习、弱监督学习? 15
2.3 监督学习有哪些步骤 16
2.4 多实例学习? 17
2.5 分类网络和回归的区别? 17
@ -91,7 +115,7 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
2.8 正确率能很好的评估分类算法吗? 20
2.9 分类算法的评估方法? 20
2.10 什么样的分类器是最好的? 22
2.11大数据与深度学习的关系 22
2.11 大数据与深度学习的关系 22
2.12 理解局部最优与全局最优 23
2.13 理解逻辑回归 24
2.14 逻辑回归与朴素贝叶斯有什么区别? 24
@ -99,7 +123,7 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
2.16 代价函数作用原理  25
2.17 为什么代价函数要非负? 26
2.18 常见代价函数? 26
2.19为什么用交叉熵代替二次代价函数 28
2.19 为什么用交叉熵代替二次代价函数 28
2.20 什么是损失函数? 28
2.21 常见的损失函数 28
2.22 逻辑回归为什么使用对数损失函数? 30
@ -111,7 +135,7 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
2.24 如何对梯度下降法进行调优? 35
2.25 随机梯度和批量梯度区别? 35
2.26 各种梯度下降法性能比较 37
2.27计算图的导数计算图解? 37
2.27 计算图的导数计算图解? 37
2.28 线性判别分析LDA思想总结 39
2.29 图解LDA核心思想 39
2.30 二类LDA算法原理 40
@ -125,7 +149,7 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
2.37 PCA算法主要优缺点 45
2.38 降维的必要性及目的 45
2.39 KPCA与PCA的区别 46
2.40模型评估 47
2.40 模型评估 47
2.40.1模型评估常用方法? 47
2.40.2 经验误差与泛化误差 47
2.40.3 图解欠拟合、过拟合 48
@ -136,18 +160,18 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
2.40.8 错误率及精度 51
2.40.9 查准率与查全率 51
2.40.10 ROC与AUC 52
2.40.11如何画ROC曲线 53
2.40.12如何计算TPRFPR 54
2.40.13如何计算Auc 56
2.40.14为什么使用Roc和Auc评价分类器 56
2.40.11 如何画ROC曲线 53
2.40.12 如何计算TPRFPR 54
2.40.13 如何计算Auc 56
2.40.14 为什么使用Roc和Auc评价分类器 56
2.40.15 直观理解AUC 56
2.40.16 代价敏感错误率与代价曲线 57
2.40.17 模型有哪些比较检验方法 59
2.40.18 偏差与方差 59
2.40.19为什么使用标准差? 60
2.40.19 为什么使用标准差? 60
2.40.20 点估计思想 61
2.40.21 点估计优良性原则? 61
2.40.22点估计、区间估计、中心极限定理之间的联系? 62
2.40.22 点估计、区间估计、中心极限定理之间的联系? 62
2.40.23 类别不平衡产生原因? 62
2.40.24 常见的类别不平衡问题解决方法 62
2.41 决策树 64
@ -155,7 +179,7 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
2.41.2 决策树的三要素? 64
2.41.3 决策树学习基本算法 65
2.41.4 决策树算法优缺点 65
2.40.5熵的概念以及理解 66
2.40.5 熵的概念以及理解 66
2.40.6 信息增益的理解 66
2.40.7 剪枝处理的作用及策略? 67
2.41 支持向量机 67
@ -177,69 +201,71 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
2.26.7 什么是贝叶斯最优错误率 76
2.27 EM算法解决问题及实现流程 76
2.28 为什么会产生维数灾难? 78
2.29怎样避免维数灾难 82
2.30聚类和降维有什么区别与联系? 82
2.29 怎样避免维数灾难 82
2.30 聚类和降维有什么区别与联系? 82
2.31 GBDT和随机森林的区别 83
2.32 四种聚类方法之比较 84
## 第三章 深度学习基础 88
3.1基本概念 88
3.1.1神经网络组成? 88
3.1.2神经网络有哪些常用模型结构? 90
3.1.3如何选择深度学习开发平台? 92
3.1.4为什么使用深层表示 92
3.1.5为什么深层神经网络难以训练? 93
3.1.6深度学习和机器学习有什么不同 94
**第三章 深度学习基础 88**
3.1 基本概念 88
3.1.1 神经网络组成? 88
3.1.2 神经网络有哪些常用模型结构? 90
3.1.3 如何选择深度学习开发平台? 92
3.1.4 为什么使用深层表示 92
3.1.5 为什么深层神经网络难以训练? 93
3.1.6 深度学习和机器学习有什么不同 94
3.2 网络操作与计算 95
3.2.1前向传播与反向传播? 95
3.2.2如何计算神经网络的输出? 97
3.2.3如何计算卷积神经网络输出值? 98
3.2.4如何计算Pooling层输出值输出值 101
3.2.5实例理解反向传播 102
3.3超参数 105
3.3.1什么是超参数? 105
3.3.2如何寻找超参数的最优值? 105
3.3.3超参数搜索一般过程? 106
3.4激活函数 106
3.4.1为什么需要非线性激活函数? 106
3.4.2常见的激活函数及图像 107
3.2.1 前向传播与反向传播? 95
3.2.2 如何计算神经网络的输出? 97
3.2.3 如何计算卷积神经网络输出值? 98
3.2.4 如何计算Pooling层输出值输出值 101
3.2.5 实例理解反向传播 102
3.3 超参数 105
3.3.1 什么是超参数? 105
3.3.2 如何寻找超参数的最优值? 105
3.3.3 超参数搜索一般过程? 106
3.4 激活函数 106
3.4.1 为什么需要非线性激活函数? 106
3.4.2 常见的激活函数及图像 107
3.4.3 常见激活函数的导数计算? 109
3.4.4激活函数有哪些性质? 110
3.4.4 激活函数有哪些性质? 110
3.4.5 如何选择激活函数? 110
3.4.6使用ReLu激活函数的优点 111
3.4.7什么时候可以用线性激活函数? 111
3.4.8怎样理解Relu<0时是非线性激活函数 111
3.4.6 使用ReLu激活函数的优点 111
3.4.7 什么时候可以用线性激活函数? 111
3.4.8 怎样理解Relu<0时是非线性激活函数 111
3.4.9 Softmax函数如何应用于多分类 112
3.5 Batch_Size 113
3.5.1为什么需要Batch_Size 113
3.5.1 为什么需要Batch_Size 113
3.5.2 Batch_Size值的选择 114
3.5.3在合理范围内,增大 Batch_Size 有何好处? 114
3.5.4盲目增大 Batch_Size 有何坏处? 114
3.5.5调节 Batch_Size 对训练效果影响到底如何? 114
3.5.3 在合理范围内,增大 Batch_Size 有何好处? 114
3.5.4 盲目增大 Batch_Size 有何坏处? 114
3.5.5 调节 Batch_Size 对训练效果影响到底如何? 114
3.6 归一化 115
3.6.1归一化含义? 115
3.6.2为什么要归一化 115
3.6.3为什么归一化能提高求解最优解速度? 115
3.6.1 归一化含义? 115
3.6.2 为什么要归一化 115
3.6.3 为什么归一化能提高求解最优解速度? 115
3.6.4 3D图解未归一化 116
3.6.5归一化有哪些类型? 117
3.6.6局部响应归一化作用 117
3.6.7理解局部响应归一化公式 117
3.6.8什么是批归一化Batch Normalization 118
3.6.9批归一化BN算法的优点 119
3.6.10批归一化BN算法流程 119
3.6.11批归一化和群组归一化 120
3.6.5 归一化有哪些类型? 117
3.6.6 局部响应归一化作用 117
3.6.7 理解局部响应归一化公式 117
3.6.8 什么是批归一化Batch Normalization 118
3.6.9 批归一化BN算法的优点 119
3.6.10 批归一化BN算法流程 119
3.6.11 批归一化和群组归一化 120
3.6.12 Weight Normalization和Batch Normalization 120
3.7 预训练与微调(fine tuning) 121
3.7.1为什么无监督预训练可以帮助深度学习? 121
3.7.2什么是模型微调fine tuning 121
3.7.3微调时候网络参数是否更新? 122
3.7.1 为什么无监督预训练可以帮助深度学习? 121
3.7.2 什么是模型微调fine tuning 121
3.7.3 微调时候网络参数是否更新? 122
3.7.4 fine-tuning模型的三种状态 122
3.8权重偏差初始化 122
3.8 权重偏差初始化 122
3.8.1 全都初始化为0 122
3.8.2 全都初始化为同样的值 123
3.8.3 初始化为小的随机数 124
3.8.4用1/sqrt(n)校准方差 125
3.8.5稀疏初始化(Sparse Initialazation) 125
3.8.6初始化偏差 125
3.8.4 用1/sqrt(n)校准方差 125
3.8.5 稀疏初始化(Sparse Initialazation) 125
3.8.6 初始化偏差 125
3.9 Softmax 126
3.9.1 Softmax定义及作用 126
3.9.2 Softmax推导 126
@ -247,20 +273,22 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
3.11 常用的优化器有哪些 127
3.12 Dropout 系列问题 128
3.12.1 dropout率的选择 128
3.27 Padding 系列问题 128
## 第四章 经典网络 129
4.1LetNet5 129
4.1.1模型结构 129
4.1.2模型结构 129
3.27 Padding 系列问题 128
**第四章 经典网络 129**
4.1 LetNet5 129
4.1.1 模型结构 129
4.1.2 模型结构 129
4.1.3 模型特性 131
4.2 AlexNet 131
4.2.1 模型结构 131
4.2.2模型解读 131
4.2.3模型特性 135
4.2.2 模型解读 131
4.2.3 模型特性 135
4.3 可视化ZFNet-解卷积 135
4.3.1 基本的思想及其过程 135
4.3.2 卷积与解卷积 136
4.3.3卷积可视化 137
4.3.3 卷积可视化 137
4.3.4 ZFNe和AlexNet比较 139
4.4 VGG 140
4.1.1 模型结构 140
@ -279,62 +307,64 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
4.7.4 Inception V4 155
4.7.5 Inception-ResNet-v2 157
4.8 ResNet及其变体 158
4.8.1重新审视ResNet 159
4.8.2残差块 160
4.8.1 重新审视ResNet 159
4.8.2 残差块 160
4.8.3 ResNet架构 162
4.8.4残差块的变体 162
4.8.4 残差块的变体 162
4.8.5 ResNeXt 162
4.8.6 Densely Connected CNN 164
4.8.7 ResNet作为小型网络的组合 165
4.8.8 ResNet中路径的特点 166
4.9为什么现在的CNN模型都是在GoogleNet、VGGNet或者AlexNet上调整的 167
## 第五章 卷积神经网络(CNN) 170
4.9 为什么现在的CNN模型都是在GoogleNet、VGGNet或者AlexNet上调整的 167
**第五章 卷积神经网络(CNN) 170**
5.1 卷积神经网络的组成层 170
5.2 卷积如何检测边缘信息? 171
5.2 卷积的几个基本定义? 174
5.2.1卷积核大小 174
5.2.2卷积核的步长 174
5.2.3边缘填充 174
5.2.4输入和输出通道 174
5.2.1 卷积核大小 174
5.2.2 卷积核的步长 174
5.2.3 边缘填充 174
5.2.4 输入和输出通道 174
5.3 卷积网络类型分类? 174
5.3.1普通卷积 174
5.3.2扩张卷积 175
5.3.3转置卷积 176
5.3.4可分离卷积 177
5.3.1 普通卷积 174
5.3.2 扩张卷积 175
5.3.3 转置卷积 176
5.3.4 可分离卷积 177
5.3 图解12种不同类型的2D卷积 178
5.4 2D卷积与3D卷积有什么区别 181
5.4.1 2D 卷积 181
5.4.2 3D卷积 182
5.5 有哪些池化方法? 183
5.5.1一般池化General Pooling 183
5.5.2重叠池化OverlappingPooling 184
5.5.3空金字塔池化Spatial Pyramid Pooling 184
5.5.1 一般池化General Pooling 183
5.5.2 重叠池化OverlappingPooling 184
5.5.3 空金字塔池化Spatial Pyramid Pooling 184
5.6 1x1卷积作用 186
5.7卷积层和池化层有什么区别?  187
5.8卷积核一定越大越好? 189
5.9每层卷积只能用一种尺寸的卷积核? 189
5.10怎样才能减少卷积层参数量? 190
5.7 卷积层和池化层有什么区别?  187
5.8 卷积核一定越大越好? 189
5.9 每层卷积只能用一种尺寸的卷积核? 189
5.10 怎样才能减少卷积层参数量? 190
5.11卷积操作时必须同时考虑通道和区域吗? 191
5.12采用宽卷积的好处有什么?  192
5.12.1窄卷积和宽卷积 192
5.12 采用宽卷积的好处有什么?  192
5.12.1 窄卷积和宽卷积 192
5.12.2 为什么采用宽卷积? 192
5.13卷积层输出的深度与哪个部件的个数相同?  192
5.13 卷积层输出的深度与哪个部件的个数相同?  192
5.14 如何得到卷积层输出的深度? 193
5.15激活函数通常放在卷积神经网络的那个操作之后?  194
5.15 激活函数通常放在卷积神经网络的那个操作之后?  194
5.16 如何理解最大池化层有几分缩小? 194
5.17理解图像卷积与反卷积 194
5.17.1图像卷积 194
5.17.2图像反卷积 196
5.18不同卷积后图像大小计算? 198
5.17 理解图像卷积与反卷积 194
5.17.1 图像卷积 194
5.17.2 图像反卷积 196
5.18 不同卷积后图像大小计算? 198
5.18.1 类型划分 198
5.18.2 计算公式 199
5.19 步长、填充大小与输入输出关系总结? 199
5.19.1没有0填充单位步长 200
5.19.2零填充,单位步长 200
5.19.3不填充,非单位步长 202
5.19.4零填充,非单位步长 202
5.19.1 没有0填充单位步长 200
5.19.2 零填充,单位步长 200
5.19.3 不填充,非单位步长 202
5.19.4 零填充,非单位步长 202
5.20 理解反卷积和棋盘效应 204
5.20.1为什么出现棋盘现象? 204
5.20.1 为什么出现棋盘现象? 204
5.20.2 有哪些方法可以避免棋盘效应? 205
5.21 CNN主要的计算瓶颈 207
5.22 CNN的参数经验设置 207
@ -342,8 +372,8 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
5.23.1 主要方法 208
5.23.2 实验证明 208
5.24 CNN在CV与NLP领域运用的联系与区别 213
5.24.1联系 213
5.24.2区别 213
5.24.1 联系 213
5.24.2 区别 213
5.25 CNN凸显共性的手段 213
5.25.1 局部连接 213
5.25.2 权值共享 214
@ -351,13 +381,15 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
5.26 全卷积与Local-Conv的异同点 215
5.27 举例理解Local-Conv的作用 215
5.28 简述卷积神经网络进化史 216
## 第六章 循环神经网络(RNN) 218
**第六章 循环神经网络(RNN) 218**
6.1 RNNs和FNNs有什么区别 218
6.2 RNNs典型特点 218
6.3 RNNs能干什么 219
6.4 RNNs在NLP中典型应用 220
6.5 RNNs训练和传统ANN训练异同点 220
6.6常见的RNNs扩展和改进模型 221
6.6 常见的RNNs扩展和改进模型 221
6.6.1 Simple RNNs(SRNs) 221
6.6.2 Bidirectional RNNs 221
6.6.3 Deep(Bidirectional) RNNs 222
@ -365,21 +397,23 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
6.6.5 Gated Recurrent Unit Recurrent Neural Networks 224
6.6.6 LSTM Netwoorks 224
6.6.7 Clockwork RNNs(CW-RNNs) 225
## 第七章 目标检测 228
7.1基于候选区域的目标检测器 228
7.1.1滑动窗口检测器 228
7.1.2选择性搜索 229
**第七章 目标检测 228**
7.1 基于候选区域的目标检测器 228
7.1.1 滑动窗口检测器 228
7.1.2 选择性搜索 229
7.1.3 R-CNN 230
7.1.4边界框回归器 230
7.1.4 边界框回归器 230
7.1.5 Fast R-CNN 231
7.1.6 ROI 池化 233
7.1.7 Faster R-CNN 233
7.1.8候选区域网络 234
7.1.8 候选区域网络 234
7.1.9 R-CNN 方法的性能 236
7.2 基于区域的全卷积神经网络R-FCN 237
7.3 单次目标检测器 240
7.3.1单次检测器 241
7.3.2滑动窗口进行预测 241
7.3.2 滑动窗口进行预测 241
7.3.3 SSD 243
7.4 YOLO系列 244
7.4.1 YOLOv1介绍 244
@ -390,23 +424,25 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
7.4.6 YOLO9000 261
7.4.7 YOLOv3 263
7.4.8 YOLOv3改进 264
## 第八章 图像分割 269
**第八章 图像分割 269**
8.1 传统的基于CNN的分割方法缺点 269
8.1 FCN 269
8.1.1 FCN改变了什么? 269
8.1.2 FCN网络结构 270
8.1.3全卷积网络举例? 271
8.1.4为什么CNN对像素级别的分类很难 271
8.1.5全连接层和卷积层如何相互转化? 272
8.1.3 全卷积网络举例? 271
8.1.4 为什么CNN对像素级别的分类很难 271
8.1.5 全连接层和卷积层如何相互转化? 272
8.1.6 FCN的输入图片为什么可以是任意大小 272
8.1.7把全连接层的权重W重塑成卷积层的滤波器有什么好处 273
8.1.8反卷积层理解 275
8.1.9跳级(skip)结构 276
8.1.10模型训练 277
8.1.7 把全连接层的权重W重塑成卷积层的滤波器有什么好处 273
8.1.8 反卷积层理解 275
8.1.9 跳级(skip)结构 276
8.1.10 模型训练 277
8.1.11 FCN缺点 280
8.2 U-Net 280
8.3 SegNet 282
8.4空洞卷积(Dilated Convolutions) 283
8.4 空洞卷积(Dilated Convolutions) 283
8.4 RefineNet 285
8.5 PSPNet 286
8.6 DeepLab系列 288
@ -422,18 +458,22 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
8.8.1 Scribble标记 295
8.8.2 图像级别标记 297
8.8.3 DeepLab+bounding box+image-level labels 298
8.8.4统一的框架 299
## 第九章 强化学习 301
9.1强化学习的主要特点? 301
9.2强化学习应用实例 302
9.3强化学习和监督式学习、非监督式学习的区别 303
8.8.4 统一的框架 299
**第九章 强化学习 301**
9.1 强化学习的主要特点? 301
9.2 强化学习应用实例 302
9.3 强化学习和监督式学习、非监督式学习的区别 303
9.4 强化学习主要有哪些算法? 305
9.5深度迁移强化学习算法 305
9.6分层深度强化学习算法 306
9.7深度记忆强化学习算法 306
9.5 深度迁移强化学习算法 305
9.6 分层深度强化学习算法 306
9.7 深度记忆强化学习算法 306
9.8 多智能体深度强化学习算法 307
9.9深度强化学习算法小结 307
## 第十章 迁移学习 309
9.9 深度强化学习算法小结 307
**第十章 迁移学习 309**
10.1 什么是迁移学习? 309
10.2 什么是多任务学习? 309
10.3 多任务学习有什么意义? 309
@ -441,9 +481,11 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
10.5 端到端的深度学习举例? 311
10.6 端到端的深度学习有什么挑战? 311
10.7 端到端的深度学习优缺点? 312
## 第十三章 优化算法 314
**第十三章 优化算法 314**
13.1 CPU和GPU 的区别? 314
13.2如何解决训练样本少的问题 315
13.2 如何解决训练样本少的问题 315
13.3 什么样的样本集不适合用深度学习? 315
13.4 有没有可能找到比已知算法更好的算法? 316
13.5 何为共线性, 跟过拟合有啥关联? 316
@ -475,40 +517,65 @@ scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人
13.27 可避免偏差、几大错误率之间的关系? 332
13.28 怎样选取可避免偏差及贝叶斯错误率? 332
13.29 怎样减少方差? 333
13.30贝叶斯错误率的最佳估计 333
13.31举机器学习超过单个人类表现几个例子? 334
13.32如何改善你的模型? 334
13.30 贝叶斯错误率的最佳估计 333
13.31 举机器学习超过单个人类表现几个例子? 334
13.32 如何改善你的模型? 334
13.33 理解误差分析 335
13.34 为什么值得花时间查看错误标记数据? 336
13.35 快速搭建初始系统的意义? 336
13.36 为什么要在不同的划分上训练及测试? 337
13.37 如何解决数据不匹配问题? 338
13.38 梯度检验注意事项? 340
13.39什么是随机梯度下降? 341
13.40什么是批量梯度下降? 341
13.41什么是小批量梯度下降? 341
13.42怎么配置mini-batch梯度下降 342
13.39 什么是随机梯度下降? 341
13.40 什么是批量梯度下降? 341
13.41 什么是小批量梯度下降? 341
13.42 怎么配置mini-batch梯度下降 342
13.43 局部最优的问题 343
13.44提升算法性能思路 346
## 第十四章 超参数调整 358
13.44 提升算法性能思路 346
**第十四章 超参数调整 358**
14.1 调试处理 358
14.2 有哪些超参数 359
14.3 如何选择调试值? 359
14.4 为超参数选择合适的范围 359
14.5 如何搜索超参数? 359
## 第十五章 正则化 361
15.1 什么是正则化? 361
15.2 正则化原理? 361
15.3 为什么要正则化? 361
15.4 为什么正则化有利于预防过拟合? 361
15.5 为什么正则化可以减少方差? 362
15.6 L2正则化的理解 362
15.7 理解dropout 正则化 362
15.8 有哪些dropout 正则化方法? 362
15.8 如何实施dropout 正则化 363
15.9 Python 实现dropout 正则化 363
15.10 L2正则化和dropout 有什么不同? 363
15.11 dropout有什么缺点 363
15.12 其他正则化方法? 364
## 参考文献 366
14.5 如何搜索超参数? 359
**第十五章 异构计算, GPU和框架选型指南 361**
15.1 什么是异构计算? 361
15.2 什么是GPGPU 361
15.3 GPU架构简介 361
15.3.1 为什么要使用GPU
15.3.2 CUDA 核心是什么?
15.3.3 新图灵架构里的tensor core对深度学习有什么作用
15.3.4 GPU内存架构和应用性能的联系
15.4 CUDA 框架
15.4.1 做CUDA编程难不难
15.4.2 cuDNN
15.5 GPU硬件环境配置推荐
15.5.1 GPU主要性能指标
15.5.2 购买建议
15.6 软件环境搭建
15.6.1 操作系统选择?
15.6.2 本机安装还是使用docker
15.6.3 GPU驱动问题
15.7 框架选择
15.7.1 主流框架比较
15.7.2 框架详细信息
15.7.3 哪些框架对于部署环境友好?
15.7.4 移动平台的框架如何选择?
15.8 其他
15.8.1 多GPU环境的配置
15.8.2 是不是可以分布式训练?
15.8.3 可以在SPARK环境里训练或者部署模型吗
15.8.4 怎么进一步优化性能?
15.8.5 TPU和GPU的区别
15.8.6 未来量子计算对于深度学习等AI技术的影像
**参考文献 366**
hey you are looked like a cool developer.
Translate it in english.

View File

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 144 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 220 KiB

After

Width:  |  Height:  |  Size: 220 KiB

View File

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 188 KiB

View File

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

View File

@ -0,0 +1,24 @@
该文件用来记录修改日志:
<----shw2018-2018-10-25---->
1. 新增章节markdown文件
<----shw2018-2018-10-28---->
1. 修改错误内容和格式
2. 修改图片路径
<----shw2018-2018-10-31---->
1. 新增第九章文件夹,里面包括:
img---->用来放对应章节图片,例如路径./img/ch9/ch_*
readme.md---->章节维护贡献者信息
modify_log---->用来记录修改日志
第 * 章_xxx.md---->对应章节markdown文件
第 * 章_xxx.pdf---->对应章节生成pdf文件便于阅读
<----qjhuang-2018-11-3---->
1. 修改图片路径
其他---->待增加
2. 修改readme内容
3. 修改modify内容
4. 修改章节内容,图片路径等

View File

@ -0,0 +1,14 @@
###########################################################
### 深度学习500问-第 * 章 xxx
**负责人(排名不分先后):**
xxx研究生-xxxxxx
xxx博士生-xxx
xxx-xxx
**贡献者(排名不分先后):**
内容贡献者可自加信息
###########################################################

View File

@ -1,5 +1,5 @@
# 第章 强化学习
## 9.1强化学习的主要特点?
# 第章 强化学习
## 10.1强化学习的主要特点?
其他许多机器学习算法中学习器都是学得怎样做而RL是在尝试的过程中学习到在特定的情境下选择哪种行动可以得到最大的回报。在很多场景中当前的行动不仅会影响当前的rewards还会影响之后的状态和一系列的rewards。RL最重要的3个特定在于
(1) 基本是以一种闭环的形式;
(2) 不会直接指示选择哪种行动actions
@ -12,14 +12,15 @@
小孩想要走路,但在这之前,他需要先站起来,站起来之后还要保持平衡,接下来还要先迈出一条腿,是左腿还是右腿,迈出一步后还要迈出下一步。
小孩就是 agent他试图通过采取行动即行走来操纵环境行走的表面并且从一个状态转变到另一个状态即他走的每一步当他完成任务的子任务即走了几步孩子得到奖励给巧克力吃并且当他不能走路时就不会给巧克力。
![](../img/ch9/9-1.png)
![](./img/ch10/10-1.png)
上图中agent代表自身如果是自动驾驶agent就是车如果你玩游戏它就是你当前控制的游戏角色如马里奥马里奥往前走时环境就一直在发生变化有小怪物或者障碍物出现它需要通过跳跃来进行躲避就是要做action如向前走和跳起的动作无人驾驶的action就是车左转、右转或刹车等等它无时无刻都在与环境产生交互action会反馈给环境进而改变环境如果自动驾驶的车行驶目标是100米它向前开了10米那环境就发生了变化所以每次产生action都会导致环境改变环境的改变会反馈给自身agent就是这样的一个循环反馈又两种方式1、做的好reward即正反馈2、做得不好punishment惩罚即负反馈。Agent可能做得好也可能做的不好环境始终都会给它反馈agent会尽量去做对自身有利的决策通过反反复复这样的一个循环agent会越来越做的好就像孩子在成长过程中会逐渐明辨是非这就是强化学习。
## 9.2强化学习应用实例
## 10.2强化学习应用实例
1Manufacturing
例如一家日本公司 Fanuc工厂机器人在拿起一个物体时会捕捉这个过程的视频记住它每次操作的行动操作成功还是失败了积累经验下一次可以更快更准地采取行动。
![](../img/ch9/9-2.png)
![](./img/ch10/10-2.png)
2Inventory Management
@ -48,10 +49,11 @@
8Medical Industry
动态治疗方案DTR是医学研究的一个主题是为了给患者找到有效的治疗方法。 例如癌症这种需要长期施药的治疗,强化学习算法可以将患者的各种临床指标作为输入 来制定治疗策略。
## 9.3强化学习和监督式学习、非监督式学习的区别
## 10.3强化学习和监督式学习、非监督式学习的区别
在机器学习中,我们比较熟知的是监督式学习,非监督学习,此外还有一个大类就是强化学习:
当前的机器学习算法可以分为3种有监督的学习Supervised Learning、无监督的学习Unsupervised Learning和强化学习Reinforcement Learning结构图如下所示
![](../img/ch9/9-3.png)
![](./img/ch10/10-3.png)
### 强化学习和监督式学习的区别:
监督式学习就好比你在学习的时候,有一个导师在旁边指点,他知道怎么是对的怎么是错的,但在很多实际问题中,例如 chessgo这种有成千上万种组合方式的情况不可能有一个导师知道所有可能的结果。
@ -85,28 +87,29 @@ exploitation 会尝试过去经验中最有效的行为。
从训练样本歧义性角度进行的分类体系在近几年可望有一些扩展例如多示例学习multi-instancelearning等从训练样本歧义性方面来看很特殊的新的学习框架有可能会进入该体系。但到目前为止没有任何新的框架得到了公认的地位。另外半监督学习semi-supervisedlearning也有一定希望它的障碍是半监督学习中的歧义性并不是与生俱来的而是人为的即用户期望用未标记的样本来辅助对已标记样本的学习。这与监督学习、非监督学习、强化学习等天生的歧义性完全不同。半监督学习中人为的歧义性在解决工程问题上是需要的、有用的对大量样本进行标记的代价可能是极为昂贵的但可能不太会导致方法学或对学习问题视点的大的改变。
**强化学习和前二者的本质区别**:没有前两者具有的明确数据概念它不知道结果只有目标。数据概念就是大量的数据有监督学习、无监督学习需要大量数据去训练优化你建立的模型就像猫狗识别用n多张猫狗图片去训练模型经过训练优化后你用一张崭新的猫狗图片让模型作出判断这个模型就知道是猫还是狗。
## 9.4 强化学习主要有哪些算法?
## 10.4 强化学习主要有哪些算法?
强化学习不需要监督信号,可以在模型未知的环境中平衡探索和利用, 其主要算法有蒙特卡罗强化学习, 时间差分(temporal difference: TD)学习, 策略梯度等。典型的深度强化学习算法特点及性能比较如下图所示:
![](../img/ch9/9-4.png)
![](./img/ch10/10-4.png)
除了上述深度强化学习算法,还有深度迁移强化学习、分层深度强化学习、深度记忆强化学习以及多智能体强化学习等算法。
## 9.5深度迁移强化学习算法
## 10.5深度迁移强化学习算法
传统深度强化学习算法每次只能解决一种游戏任务, 无法在一次训练中完成多种任务. 迁移学习和强化学习的结合也是深度强化学习的一种主要思路。
Parisotto等提出了一种基于行为模拟的深度迁移强化学习算法. 该算法通过监督信号的指导, 使得单一的策略网络学习各自的策略, 并将知识迁移到新任务中. Rusa等提出策略蒸馏(policy distillation)深度迁移强化学习算法. 策略蒸馏算法中分为学习网络和指导网络, 通过这两个网络Q值的偏差来确定目标函数,引导学习网络逼近指导网络的值函数空间. 此后,Rusa等又提出了一种基于渐进神经网络(progressive neural networks, PNN)的深度迁移强化学习算法.PNN是一种把神经网络和神经网络连起来的算法. 它在一系列序列任务中, 通过渐进的方式来存储知识和提取特征, 完成了对知识的迁移. PNN最终实现多个独立任务的训练, 通过迁移加速学习过程, 避免灾难性遗忘. Fernando 等提出了路径网络(PathNet)[45].PathNet可以说是PNN的进阶版. PathNet把网络中每一层都看作一个模块, 把构建一个网络看成搭积木,也就是复用积木. 它跟PNN非常类似, 只是这里不再有列, 而是不同的路径. PathNet将智能体嵌入到神经网络中, 其中智能体的任务是为新任务发现网络中可以复用的部分. 智能体是网络之中的路径, 其决定了反向传播过程中被使用和更新的参数范围. 在一系列的Atari强化学习任务上, PathNet都实现了正迁移, 这表明PathNet在训练神经网络上具有通用性应用能力.PathNet也可以显著提高A3C算法超参数选择的鲁棒性. Schaul等提出了一种通用值函数逼近器(universalvalue function approximators, UVFAs)来泛化状态和目标空间UVFAs可以将学习到的知识迁移到环境动态特性相同但目标不同的新任务中.
## 9.6分层深度强化学习算法
## 10.6分层深度强化学习算法
分层强化学习可以将最终目标分解为多个子任务来学习层次化的策略, 并通过组合多个子任务的策略形成有效的全局策略. Kulkarni等提出了分层DQN(hierarchical deep Q-network, h--DQN) 算法. h--DQN基于时空抽象和内在激励分层, 通过在不同的时空尺度上设置子目标对值函数进行层次化处理. 顶层的值函数用于确定宏观决策, 底层的值函数用于确定具体行动Krishnamurthy等在h--DQN的基础上提出了基于内部选择的分层深度强化学习算法. 该模型结合时空抽象和深度神经网络, 自动地完成子目标的学习, 避免了特定的内在激励和人工设定中间目标,加速了智能体的学习进程, 同时也增强了模型的泛化能力. Kulkarni等基于后续状态表示法提出了深度后续强化学习(deep successor reinforcement learning,DSRL)DSRL通过阶段性地分解子目标和学习子目标策略, 增强了对未知状态空间的探索, 使得智能体更加适应那些存在延迟反馈的任务Vezhnevets等受封建(feudal)强化学习算法的启发, 提出一种分层深度强化学习的架构FeUdal网络(FuNs)[49]. FuNs框架使用一个管理员模块和一个工人模块. 管理员模块在较低的时间分辨率下工作, 设置抽象目标并传递给工人模块去执行. FuNs框架创造了一个稳定的自然层次结构, 并且允许两个模块以互补的方式学习. 实验证明, FuNs有助于处理长期信用分配和记忆任务,在Atari视频游戏和迷宫游戏中都取得了不错的效果。
## 9.7深度记忆强化学习算法
## 10.7深度记忆强化学习算法
传统的深度强化学习模型不具备记忆、认知、推理等高层次的能力, 尤其是在面对状态部分可观察和延迟奖赏的情形时. Junhyuk等通过在传统的深度强化学习模型中加入外部的记忆网络部件和反馈控制机制, 提出反馈递归记忆Q网络(feedback recurrent memory Q-network, FRMQN)). FRMQN模型具备了一定的记忆与推理功能, 通过反馈控制机制,FRMQN整合过去存储的有价值的记忆和当前时刻的上下文状态, 评估动作值函数并做出决策. FRMQN初步模拟了人类的主动认知与推理能力, 并完成了一些高层次的认知任务. 在一些未经过训练的任务中,FRMQN模型表现出了很强的泛化能力Blundell等设计出一种模型无关的情节控制算法(model-free episode control, MFEC). MFEC可以快速存储和回放状态转移序列, 并将回放的序列整合到结构化知识系统中, 使得智能体在面对一些复杂的决策任务时, 能快速达到人类玩家的水平MFEC通过反向经验回放, 使智能体拥有初步的情节记忆. 实验表明, 基于MFEC算法的深度强化学习不仅可以在Atari游戏中学习到有效策略, 还可以处理一些三维场景的复杂任务. Pritzel等在MFEC的基础上进一步提出了神经情节控制(neural episodic control, NEC),有效提高了深度强化学习智能体的记忆能力和学习效率[53]. NEC能快速吸收新经验并依据新经验来采取行动. 价值函数包括价值函数渐变状态表示和价值函数快速更新估计两部分. 大量场景下的研究表明,NEC的学习速度明显快于目前最先进的通用深度强化学习智能体.
## 9.8 多智能体深度强化学习算法
## 10.8 多智能体深度强化学习算法
在一些复杂场景中, 涉及到多智能体的感知决策问题, 这时需要将单一模型扩展为多个智能体之间相互合作、通信及竞争的多智能体深度强化学习系统.Foerster等提出了一种称为分布式深度递归Q网络(deep distributed recurrent Q-networks, DDRQN) 的模型, 解决了状态部分可观测状态下的多智能体通信与合作的挑战性难题[54]. 实验表明, 经过训练的DDRQN模型最终在多智能体之间达成了一致的通信协1536 控制理论与应用第34 卷议, 成功解决了经典的红蓝帽子问题.让智能体学会合作与竞争一直以来都是人工智能领域内的一项重要研究课题, 也是实现通用人工智能的必要条件. Lowe等提出了一种用于合作竞争混合环境的多智能体actor-critic 算法(multi-agent deepdeterministic policy gradient, MADDPG)[55]. MADDPG对DDPG强化学习算法进行了延伸, 可实现多智能体的集中式学习和分布式执行, 让智能体学习彼此合作和竞争. 在多项测试任务中, MADDPG的表现都优于DDPG.
## 9.9强化学习开源框架
## 10.9强化学习开源框架
谷歌TensorFlow Agents ---TensorFlow的加强版,它提供许多工具通过强化学习可以实现各类智能应用程序的构建与训练。这个框架能够将OpoenAI Gym接口扩展至多个并行环境并允许各代理立足TensorFlow之内实现以执行批量计算。其面向OpoenAI Gy环境的批量化接口可与TensorFlow实现全面集成从而高效执行各类算法。该框架还结合有BatchPPO一套经过优化的近端策略优化算法实现方案。其核心组件包括一个环境打包器用于在外部过程中构建OpenAI Gym环境; 一套批量集成用于实现TensorFlow图步并以强化学习运算的方式重置函数; 外加用于将TensorFlow图形批处理流程与强化学习算法纳入训练特内单一却步的组件。
RoboschoolRoboschool 提供开源软件以通过强化学习构建并训练机器人模拟。其有助于在同一环境当中对多个代理进行强化学习训练。通过多方训练机制您可以训练同一代理分别作为两方玩家因此能够自我对抗、使用相同算法训练两套代理或者设置两种算法进行彼此对抗。Roboschool由OpenAI开发完成这一非营利性组织的背后赞助者包括Elon Musk、Sam Altman、Reid Hoffman以及Peter Thiel。其与OpenAI Gym相集成后者是一套用于开发及评估强化学习算法的开源工具集。OpenAI Gym与TensorFlow、Theano以及其它多种深度学习库相兼容。OpenAI Gym当中包含用于数值计算、游戏以及物理引擎的相关代码。Roboschool基于Bullet物理引擎这是一套开源许可物理库并被其它多种仿真软件——例如Gazebo与Virtual Robot Experimentation Platform简称V-REP所广泛使用。其中包含多种强化学习算法具体以怨报德 异步深度强化学习方法、Actor-Critic with Experience Replay、Actor- Critic using Kronecker-Factored Trust Region、深度确定性策略梯度、近端策略优化以及信任域策略优化等等。
Coach英特尔公司的开源强化学习框架可以对游戏、机器人以及其它基于代理的智能应用进行智能代理的建模、训练与评估。Coach 提供一套模块化沙箱、可复用组件以及用于组合新强化学习算法并在多种应用领域内训练新智能应用的Python API。该框架利用OpenAI Gym作为主工具负责与不同强化学习环境进行交换。其还支持其它外部扩展具体包括Roboschool、gym-extensions、PyBullet以及ViZDoom。Coach的环境打包器允许用户向其中添加自定义强化学习环境从而解决其它学习问题。该框架能够在桌面计算机上高效训练强化学习代理并利用多核CPU处理相关任务。其能够为一部分强化学习算法提供单线程与多线程实现能力包括异步优势Actor-Critic、深度确定性策略梯度、近端策略优化、直接未来预测以及规范化优势函数。所有算法皆利用面向英特尔系统作出优化的TensorFLow完成其中部分算法亦适用于英特尔的Neon深度学习框架。Coach 当中包含多种强化学习代理实现方案,具体包括从单线程实现到多线程实现的转换。其能够开发出支持单与多工作程序(同步或异步)强化学习实现方法的新代理。此外,其还支持连续与离散操作空间,以及视觉观察空间或仅包含原始测量指标的观察空间。
## 9.10深度强化学习算法小结
## 10.10深度强化学习算法小结
基于值函数概念的DQN及其相应的扩展算法在离散状态、离散动作的控制任务中已经表现了卓越的性能, 但是受限于值函数离散型输出的影响, 在连续型控制任务上显得捉襟见肘. 基于策略梯度概念的,以DDPG, TRPO等为代表的策略型深度强化学习算法则更适用于处理基于连续状态空间的连续动作的控制输出任务, 并且算法在稳定性和可靠性上具有一定的理论保证, 理论完备性较强. 采用actor-critic架构的A3C算法及其扩展算法, 相比于传统DQN算法, 这类算法的数据利用效率更高, 学习速率更快, 通用性、可扩展应用性更强, 达到的表现性能更优, 但算法的稳定性无法得到保证. 而其他的如深度迁移强化学习、分层深度强化学习、深度记忆强化学习和多智能体深度强化学习等算法都是现在的研究热点, 通过这些算法能应对更为复杂的场景问题、系统环境及控制任务, 是目前深度强化学习算法研究的前沿领域.
展望未来,人工智能开发者们需要尽可能掌握上述框架以及其中所使用的各类强化学习算法。此外,还需要强化自身对于多代理强化学习架构的理解,因为其中多种框架都大量利用前沿博弈论研究成果。最后,还需要熟悉深度强化学习知识。

Binary file not shown.

View File

@ -0,0 +1,2 @@
Add the corresponding chapter picture under img/ch*
在img/ch*下添加对应章节图片

View File

@ -0,0 +1,20 @@
该文件用来记录修改日志:
<----shw2018-2018-10-25---->
1. 新增章节markdown文件
<----shw2018-2018-10-28---->
1. 修改错误内容和格式
2. 修改图片路径
<----shw2018-2018-10-31---->
1. 新增第九章文件夹,里面包括:
img---->用来放对应章节图片,例如路径./img/ch9/ch_*
readme.md---->章节维护贡献者信息
modify_log---->用来记录修改日志
第 * 章_xxx.md---->对应章节markdown文件
第 * 章_xxx.pdf---->对应章节生成pdf文件便于阅读
其他---->待增加
2. 修改readme内容
3. 修改modify内容
4. 修改章节内容,图片路径等

View File

@ -0,0 +1,14 @@
###########################################################
### 深度学习500问-第 * 章 xxx
**负责人(排名不分先后):**
xxx研究生-xxxxxx
xxx博士生-xxx
xxx-xxx
**贡献者(排名不分先后):**
内容贡献者可自加信息
###########################################################

Binary file not shown.

View File

@ -0,0 +1,2 @@
Add the corresponding chapter picture under img/ch*
在img/ch*下添加对应章节图片

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -0,0 +1,20 @@
该文件用来记录修改日志:
<----shw2018-2018-10-25---->
1. 新增章节markdown文件
<----shw2018-2018-10-28---->
1. 修改错误内容和格式
2. 修改图片路径
<----shw2018-2018-10-31---->
1. 新增第九章文件夹,里面包括:
img---->用来放对应章节图片,例如路径./img/ch9/ch_*
readme.md---->章节维护贡献者信息
modify_log---->用来记录修改日志
第 * 章_xxx.md---->对应章节markdown文件
第 * 章_xxx.pdf---->对应章节生成pdf文件便于阅读
其他---->待增加
2. 修改readme内容
3. 修改modify内容
4. 修改章节内容,图片路径等

View File

@ -0,0 +1,14 @@
###########################################################
### 深度学习500问-第 * 章 xxx
**负责人(排名不分先后):**
xxx研究生-xxxxxx
xxx博士生-xxx
xxx-xxx
**贡献者(排名不分先后):**
内容贡献者可自加信息
###########################################################

View File

@ -0,0 +1,98 @@
10.1 网络搭建有什么原则?
10.1.1新手原则。
刚入门的新手不建议直接上来就开始搭建网络模型。比较建议的学习顺序如下:
- 1.了解神经网络工作原理,熟悉基本概念及术语。
- 2.阅读经典网络模型论文+实现源码(深度学习框架视自己情况而定)。
- 3.找数据集动手跑一个网络,可以尝试更改已有的网络模型结构。
- 4.根据自己的项目需要设计网络。
10.1.2深度优先原则。
通常增加网络深度可以提高准确率,但同时会牺牲一些速度和内存。
10.1.3卷积核size一般为奇数。
卷积核为奇数有以下好处:
- 1 保证锚点刚好在中间,方便以 central pixel为标准进行滑动卷积避免了位置信息发生偏移 。
- 2 保证在填充Padding在图像之间添加额外的零层图像的两边仍然对称。
10.1.4卷积核不是越大越好。
AlexNet中用到了一些非常大的卷积核比如11×11、5×5卷积核之前人们的观念是卷积核越大感受野越大看到的图片信息越多因此获得的特征越好。但是大的卷积核会导致计算量的暴增不利于模型深度的增加计算性能也会降低。于是在VGG、Inception网络中利用2个3×3卷积核的组合比1个5×5卷积核的效果更佳同时参数量3×3×2+1=19<26=5×5×1+1被降低因此后来3×3卷积核被广泛应用在各种模型中
10.2 有哪些经典的网络模型值得我们去学习的?
提起经典的网络模型就不得不提起计算机视觉领域的经典比赛ILSVRC .其全称是 ImageNet Large Scale Visual Recognition Challenge.正是因为ILSVRC 2012挑战赛上的AlexNet横空出世使得全球范围内掀起了一波深度学习热潮。这一年也被称作“深度学习元年”。而在历年ILSVRC比赛中每次刷新比赛记录的那些神经网络也成为了人们心中的经典成为学术界与工业届竞相学习与复现的对象并在此基础上展开新的研究。
| 序号 | 年份 | 网络名称 | 获得荣誉 |
| ----- | --------- | ----------- | ------- |
| 1 | 2012 | AlexNet | ILSVRC图像分类冠军 |
| 2 | 2014 | VGGNet | ILSVRC图像分类亚军 |
| 3 | 2014 | GoogLeNet| ILSVRC图像分类冠军 |
| 4 | 2015 | ResNet | ILSVRC图像分类冠军 |
| 5 | 2017 | SeNet | ILSVRC图像分类冠军 |
> - 1 AlexNet
论文:[ImageNet Classification with Deep Convolutional Neural Networks](https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)
代码实现:[tensorflow](https://github.com/tensorflow/tensorflow/blob/361a82d73a50a800510674b3aaa20e4845e56434/tensorflow/contrib/slim/python/slim/nets/alexnet.py)
主要特点:
>> - 1.第一次使用非线性激活函数ReLU。
>> - 2.增加防加过拟合方法Droupout层,提升了模型鲁棒性。
>> - 3.首次使用数据增强。
>> - 4.首次使用GPU加速运算。
>- 2 VGGNet
论文:[Very Deep Convolutional Networks for Large-Scale Image Recognition](https://arxiv.org/abs/1409.1556)
代码实现:[tensorflow]https://github.com/tensorflow/tensorflow/blob/361a82d73a50a800510674b3aaa20e4845e56434/tensorflow/contrib/slim/python/slim/nets/vgg.py)
主要特点:
>> - 1.网络结构更深。
>> - 2.普遍使用小卷积核。
>- 3 GoogLeNet
论文:[Going Deeper with Convolutions](https://arxiv.org/abs/1409.4842)
代码实现:[tensorflow](https://github.com/tensorflow/tensorflow/blob/361a82d73a50a800510674b3aaa20e4845e56434/tensorflow/contrib/slim/python/slim/nets/inception_v1.py)
主要特点:
>> - 1.增强卷积模块功能。
>>主要的创新在于他的Inception这是一种网中网Network In Network的结构即原来的结点也是一个网络。Inception一直在不断发展目前已经V2、V3、V4。其中1*1卷积主要用来降维用了Inception之后整个网络结构的宽度和深度都可扩大能够带来2-3倍的性能提升。
>> - 2.连续小卷积代替大卷积,保证感受野不变的同时,减少了参数数目。
>- 4 ResNet
论文:[Deep Residual Learning for Image Recognition](https://arxiv.org/abs/1512.03385)
代码实现:[tensorflow](https://github.com/tensorflow/tensorflow/blob/361a82d73a50a800510674b3aaa20e4845e56434/tensorflow/contrib/slim/python/slim/nets/inception_v1.py)
主要特点:
>> 解决了“退化”问题,即当模型的层次加深时,错误率却提高了。
>- 5 SeNet
论文:[Squeeze-and-Excitation Networks](https://arxiv.org/abs/1709.01507)
代码实现:[tensorflow](https://github.com/ry/tensorflow-resnet)
主要特点:
>> 提出了feature recalibration通过引入 attention 重新加权,可以得到抑制无效特征,提升有效特征的权重,并很容易地和现有网络结合,提升现有网络性能,而计算量不会增加太多。
**CV领域网络结构演进历程**
![CV领域网络结构演进历程](http://wx2.sinaimg.cn/mw690/005B3ViFly1fwthh0jw58j30q80aldgw.jpg)
**ILSVRC挑战赛历年冠军:**
![ILSVRC挑战赛历年冠军](http://wx4.sinaimg.cn/mw690/005B3ViFly1fwswhzquw2j31810or78b.jpg)
此后ILSVRC挑战赛的名次一直是衡量一个研究机构或企业技术水平的重要标尺。
ILSVRC 2017 已是最后一届举办.2018年起将由WebVision竞赛Challenge on Visual Understanding by Learning from Web Data来接棒。因此即使ILSVRC挑战赛停办了但其对深度学习的深远影响和巨大贡献将永载史册。
10.3 网络训练有哪些技巧吗?
10.3.1.合适的数据集。
- 1 没有明显脏数据(可以极大避免Loss输出为NaN)。
- 2 样本数据分布均匀。
10.3.2.合适的预处理方法。
关于数据预处理在Batch Normalization未出现之前预处理的主要做法是减去均值然后除去方差。在Batch Normalization出现之后减均值除方差的做法已经没有必要了。对应的预处理方法主要是数据筛查、数据增强等。
10.3.3.网络的初始化。
网络初始化最粗暴的做法是参数赋值为全0这是绝对不可取的。因为如果所有的参数都是0那么所有神经元的输出都将是相同的那在back propagation的时候同一层内所有神经元的行为也是相同的这可能会直接导致模型失效无法收敛。吴恩达视频中介绍的方法是将网络权重初始化均值为0、方差为1符合的正态分布的随机数据。
10.3.4.小规模数据试练。
在正式开始训练之前,可以先用小规模数据进行试练。原因如下:
- 1 可以验证自己的训练流程对否。
- 2 可以观察收敛速度,帮助调整学习速率。
- 3 查看GPU显存占用情况最大化batch_size(前提是进行了batch normalization只要显卡不爆尽量挑大的)。
10.3.5.设置合理Learning Rate。
- 1 太大。Loss爆炸、输出NaN等。
- 2 太小。收敛速度过慢,训练时长大大延长。
- 3 可变的学习速率。比如当输出准确率到达某个阈值后可以让Learning Rate减半继续训练。

View File

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 157 KiB

View File

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 119 KiB

View File

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 171 KiB

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 182 KiB

View File

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

View File

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

View File

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 119 KiB

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 125 KiB

View File

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 149 KiB

View File

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

View File

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 107 KiB

View File

@ -0,0 +1,24 @@
该文件用来记录修改日志:
<----shw2018-2018-10-25---->
1. 新增章节markdown文件
<----shw2018-2018-10-28---->
1. 修改错误内容和格式
2. 修改图片路径
<----shw2018-2018-10-31---->
1. 新增第九章文件夹,里面包括:
img---->用来放对应章节图片,例如路径./img/ch9/ch_*
readme.md---->章节维护贡献者信息
modify_log---->用来记录修改日志
第 * 章_xxx.md---->对应章节markdown文件
第 * 章_xxx.pdf---->对应章节生成pdf文件便于阅读
<----qjhuang-2018-11-3---->
1. 修改图片路径
其他---->待增加
2. 修改readme内容
3. 修改modify内容
4. 修改章节内容,图片路径等

View File

@ -0,0 +1,14 @@
###########################################################
### 深度学习500问-第 * 章 xxx
**负责人(排名不分先后):**
xxx研究生-xxxxxx
xxx博士生-xxx
xxx-xxx
**贡献者(排名不分先后):**
内容贡献者可自加信息
###########################################################

View File

@ -67,7 +67,7 @@ CPU 除了负责浮点整形运算外,还有很多其他的指令集的负载
&emsp;&emsp;
没有免费的午餐定理:
<center><img src="../img/ch13/figure_13_4_1.png" alt="没有免费的午餐定理"></center>
<center><img src="./img/ch13/figure_13_4_1.png" alt="没有免费的午餐定理"></center>
<center>图 13.4 没有免费的午餐(黑点:训练样本;白点:测试样本)</center>
&emsp;&emsp;
@ -103,7 +103,7 @@ CPU 除了负责浮点整形运算外,还有很多其他的指令集的负载
神经网络的训练中,通过改变神经元的权重,使网络的输出值尽可能逼近标签以降低误差 值,训练普遍使用 BP 算法,核心思想是,计算出输出与标签间的损失函数值,然后计算其相 对于每个神经元的梯度,进行权值的迭代。
&emsp;&emsp;
梯度消失会造成权值更新缓慢,模型训练难度增加。造成梯度消失的一个原因是,许多激 活函数将输出值挤压在很小的区间内,在激活函数两端较大范围的定义域内梯度为 $0$。造成学 习停止。
<center><img src="../img/ch13/figure_13_7_1.png" alt="sigmoid 函数与其导数"></center>
<center><img src="./img/ch13/figure_13_7_1.png" alt="sigmoid 函数与其导数"></center>
<center>图 13.7 sigmoid 函数的梯度消失</center>
## 13.8 权值初始化方法有哪些?
@ -348,7 +348,7 @@ $$
&emsp;&emsp;
假设损失函数的数据空间是下图这样的,我们最优的权值就是为了寻找下图中的最小值点, 对于这种数学寻找最小值问题,采用梯度下降的方法再适合不过了。
<center><img src="../img/ch13/figure_13_15_1.png"></center>
<center><img src="./img/ch13/figure_13_15_1.png"></center>
<center>图 13.15.1 </center>
### 13.15.2 梯度消失、爆炸原因?
@ -367,7 +367,7 @@ $$
2激活函数角度
&emsp;&emsp;
计算权值更新信息的时候需要计算前层偏导信息,因此如果激活函数选择不合适,比如使用 sigmoid梯度消失就会很明显了原因看下图左图是sigmoid的损失函数图右边是其倒数的图像如果使用 sigmoid 作为损失函数,其梯度是不可能超过 $0.25$ 的,这样经过链式求导之后,很容易发生梯度消失。
<center><img src="../img/ch13/figure_13_15_2.png"></center>
<center><img src="./img/ch13/figure_13_15_2.png"></center>
<center>图 13.15.2 sigmod函数与其导数</center>
### 13.15.3 梯度消失、爆炸的解决方案
@ -454,14 +454,14 @@ LSTM全称是长短期记忆网络long-short term memory networks是不
&emsp;&emsp;
我发现很多机器学习团队就是这样,有一个定义明确的开发集用来测量查准率和查全率,再加上这样一个单一数值评估指标,有时我叫单实数评估指标,能让你快速判断分类器或者分类器更好。所以有这样一个开发集,加上单实数评估指标,你的迭代速度肯定会很快,它可以加速改进您的机器学习算法的迭代过程。
<center><img src="../img/ch13/figure_13_18_1.png"></center>
<center><img src="./img/ch13/figure_13_18_1.png"></center>
<center>图 13.8.1 </center>
## 13.19 满足和优化指标Satisficing and optimizing metrics
&emsp;&emsp;
要把你顾及到的所有事情组合成单实数评估指标有时并不容易,在那些情况里,我发现有时候设立满足和优化指标是很重要的,让我告诉你是什么意思吧。
<center><img src="../img/ch13/figure_13_19_1.png"></center>
<center><img src="./img/ch13/figure_13_19_1.png"></center>
<center>图 13.9.1 </center>
&emsp;&emsp;
@ -668,7 +668,7 @@ ILSRVRCImageNet 图像分类大赛) 比赛设置如下:$1000$类图像分
&emsp;&emsp;
深度学习算法对训练数据的胃口很大,当你收集到足够多带标签的数据构成训练集时,算法效果最好,这导致很多团队用尽一切办法收集数据,然后把它们堆到训练集里,让训练的数据量更大,即使有些数据,甚至是大部分数据都来自和开发集、测试集不同的分布。在深度学习时代,越来越多的团队都用来自和开发集、测试集分布不同的数据来训练,这里有一些微妙的地方,一些最佳做法来处理训练集和测试集存在差异的情况,我们来看看。
<center><img src="../img/ch13/figure_13_36_1.png" ></center>
<center><img src="./img/ch13/figure_13_36_1.png" ></center>
<center>图 13.36 Cat app example</center>
&emsp;&emsp;
@ -822,7 +822,7 @@ batch size和学习率几乎不受其他超参数的影响因此可以放到
&emsp;&emsp;
在深度学习研究早期,人们总是担心优化算法会困在极差的局部最优,不过随着深度学习理论不断发展,我们对局部最优的理解也发生了改变。我向你展示一下现在我们怎么看待局部最优以及深度学习中的优化问题。
<center><img src="../img/ch13/figure_13_43_1.png"></center>
<center><img src="./img/ch13/figure_13_43_1.png"></center>
<center>图 13.43.1 </center>
&emsp;&emsp;
@ -831,27 +831,27 @@ batch size和学习率几乎不受其他超参数的影响因此可以放到
全局最优。如果你要作图计算一个数字,比如说这两个维度,就容易出现有多个不同局部最优的图,而这些低维的图
曾经影响了我们的理解,但是这些理解并不正确。事实上,如果你要创建一个神经网络,通常梯度为零的点并不是这
个图中的局部最优点,实际上成本函数的零梯度点,通常是鞍点。
<center><img src="../img/ch13/figure_13_43_2.png"></center>
<center><img src="./img/ch13/figure_13_43_2.png"></center>
<center>图 13.43.2 </center>
&emsp;&emsp;
也就是在这个点,这里是和,高度即成本函数的值。
<center><img src="../img/ch13/figure_13_43_3.png"></center>
<center><img src="./img/ch13/figure_13_43_3.png"></center>
<center>图 13.43.3 </center>
&emsp;&emsp;
但是一个具有高维度空间的函数,如果梯度为$0$,那么在每个方向,它可能是凸函数,也可能是凹函数。如果你在$2$万维空间中,那么想要得到局部最优,所有的$2$万个方向都需要是这样,但发生的机率也许很小,也许是,你更有可能遇到有些方向的曲线会这样向上弯曲,另一些方向曲线向下弯,而不是所有的都向上弯曲,因此在高维度空间,你更可能碰到鞍点。
<center><img src="../img/ch13/figure_13_43_4.png"></center>
<center><img src="./img/ch13/figure_13_43_4.png"></center>
<center>图 13.43.4 </center>
&emsp;&emsp;
就像下面的这种:
<center><img src="../img/ch13/figure_13_43_5.png"></center>
<center><img src="./img/ch13/figure_13_43_5.png"></center>
<center>图 13.43.5 </center>
&emsp;&emsp;
而不会碰到局部最优。至于为什么会把一个曲面叫做鞍点,你想象一下,就像是放在马背上的马鞍一样,如果这是马,这是马的头,这就是马的眼睛,画得不好请多包涵,然后你就是骑马的人,要坐在马鞍上,因此这里的这个点,导数为$0$的点,这个点叫做鞍点。我想那确实是你坐在马鞍上的那个点,而这里导数为$0$。
<center><img src="../img/ch13/figure_13_43_6.png"></center>
<center><img src="./img/ch13/figure_13_43_6.png"></center>
<center>图 13.43.6 </center>
&emsp;&emsp;
@ -859,12 +859,12 @@ batch size和学习率几乎不受其他超参数的影响因此可以放到
&emsp;&emsp;
如果局部最优不是问题,那么问题是什么?结果是平稳段会减缓学习,平稳段是一块区域,其中导数长时间接近于$0$,如果你在此处,梯度会从曲面从从上向下下降,因为梯度等于或接近$0$,曲面很平坦,你得花上很长时间慢慢抵达平稳段的这个点,因为左边或右边的随机扰动,我换个笔墨颜色,大家看得清楚一些,然后你的算法能够走出平稳段(红色笔)。
<center><img src="../img/ch13/figure_13_43_7.png"></center>
<center><img src="./img/ch13/figure_13_43_7.png"></center>
<center>图 13.43.7 </center>
&emsp;&emsp;
我们可以沿着这段长坡走,直到这里,然后走出平稳段。
<center><img src="../img/ch13/figure_13_43_8.png"></center>
<center><img src="./img/ch13/figure_13_43_8.png"></center>
<center>图 13.43.8 </center>
&emsp;&emsp;

Binary file not shown.

View File

@ -0,0 +1,2 @@
Add the corresponding chapter picture under img/ch*
在img/ch*下添加对应章节图片

View File

@ -0,0 +1,16 @@
该文件用来记录修改日志:
<----shw2018-2018-10-31---->
新增问答modify by 王超锋
14.2 神经网络中一般包含哪些超参数
14.3 模型优化寻找最优解和正则项之间的关系
14.4 超参数的重要性顺序
<----shw2018-2018-11-04---->
新增问答modify by 王超锋
14.1 写在前面
14.5 超参数如何影响模型性能
14.6 为超参数选择合适的范围
14.7 为什么卷积核设计尺寸都是奇数
14.8 权重共享的形式有哪些,为什么要权重共享

View File

@ -0,0 +1,12 @@
###########################################################
### 深度学习500问-第十四章 超参数调整
**负责人(排名不分先后):**
王超锋-算法工程师
**贡献者(排名不分先后):**
内容贡献者可自加信息
###########################################################

View File

@ -0,0 +1,113 @@
# 第十四章 超参数调整
> Markdown Revision 1;
> Date: 2018/10/25
> Editor: 乔成磊-同济大学
> Contact: qchl0318@163.com
> Updater: [sjsdfg](https://github.com/sjsdfg),王超锋
## 14.1 写在前面
  关于训练深度学习模型最难的事情之一是你要处理的参数的数量。无论是从网络本身的层宽(宽度)、层数(深度)、连接方式,还是损失函数的超参数设计和调试,亦或者是学习率、批样本数量、优化器参数等等。这些大量的参数都会有网络模型最终的有效容限直接或者间接的影响。面对如此众多的参数,如果我们要一一对其优化调整,所需的无论是时间、资源都是不切实际。结果证实一些超参数比其它的更为重要,因此认识各个超参数的作用和其可能会造成的影响是深度学习训练中必不可少的一项重要技能。
目前,超参数调整一般分为手动调整和自动优化超参数两种。本章节不会过多阐述所有超参数的详细原理,如果需要了解这部分,您可以翻阅前面的基础章节或者查阅相关文献资料。当然,下面会讲到的一些超参数优化的建议是根据笔者们的实践以及部分文献资料得到认知建议,并不是非常严格且一定有效的,很多研究者可能会很不同意某些的观点或有着不同的直觉,这都是可保留讨论的,因为这很依赖于数据本身情况。
## 14.2 参数和超参数的区别
区分两者最大的一点就是是否通过数据来进行调整,模型参数通常是有数据来驱动调整,超参数则不需要数据来驱动,而是在训练前或者训练中人为的进行调整的参数。例如卷积核的具体核参数就是指模型参数,这是有数据驱动的。而学习率则是人为来进行调整的超参数。这里需要注意的是,通常情况下卷积核数量、卷积核尺寸这些也是超参数,因为网络设计完以后,这些参数同样不是由数据驱动的,注意与卷积核的核参数区分。
## 14.2 神经网络中一般包含哪些超参数
   通常可以将超参数分为三类:网络参数、优化参数、正则化参数。
网络参数:可指网络层与层之间的交互方式(相加、相乘或者串接等)、卷积核数量和卷积核尺寸、网络层数(也称深度)和激活函数等。
优化参数一般指学习率learning rate、批样本数量batch size、不同优化器的参数以及部分损失函数的可调参数。
正则化权重衰减系数丢弃法比率dropout
## 14.3 模型优化寻找最优解和正则项之间的关系
网络模型优化调整的目的是为了寻找到全局最优解(或者相比更好的局部最优解),而正则项又希望模型尽量拟合到最优。两者通常情况下,存在一定的对立,但两者的目标是一致的,即最小化期望风险。模型优化希望最小化经验风险,而容易陷入过拟合,正则项用来约束模型复杂度。所以如何平衡两者之间的关系,得的最优或者较优的解就是超参数调整优化的目的。
## 14.4 超参数的重要性顺序
- 首先, 学习率,损失函数上的可调参数。在网络参数、优化参数、正则化参数中最重要的超参数可能就是学习率了。学习率直接控制着训练中网络梯度更新的量级,直接影响着模型的**有效容限能力**损失函数上的可调参数这些参数通常情况下需要结合实际的损失函数来调整大部分情况下这些参数也能很直接的影响到模型的的有效容限能力。这些损失一般可分成三类第一类辅助损失结合常见的损失函数起到辅助优化特征表达的作用。例如度量学习中的Center loss通常结合交叉熵损失伴随一个权重完成一些特定的任务。这种情况下一般建议辅助损失值不高于或者不低于交叉熵损失值的两个数量级第二类多任务模型的多个损失函数每个损失函数之间或独立或相关用于各自任务这种情况取决于任务之间本身的相关性目前笔者并没有一个普适的经验由于提供参考第三类独立损失函数这类损失通常会在特定的任务有显著性的效果。例如RetinaNet中的focal loss其中的参数***γ******α***,对最终的效果会产生较大的影响。这类损失通常论文中会给出特定的建议值。
- 其次批样本数量动量优化器Gradient Descent with Momentum的动量参数***β***。批样本决定了数量梯度下降的方向。过小的批数量极端情况下例如batch size为1即每个样本都去修正一次梯度方向样本之间的差异越大越难以收敛。若网络中存在批归一化batchnormbatch size过小则更难以收敛甚至垮掉。这是因为数据样本越少统计量越不具有代表性噪声也相应的增加。而过大的batch size会使得梯度方向基本稳定容易陷入局部最优解降低精度。一般参考范围会取在[1:1024]之间,当然这个不是绝对的,需要结合具体场景和样本情况;动量衰减参数 ***β***是计算梯度的指数加权平均数,并利用该值来更新参数,设置为 0.9 是一个常见且效果不错的选择;
- 最后Adam优化器的超参数、权重衰减系数、丢弃法比率dropout和网络参数。在这里说明下这些参数重要性放在最后**并不等价于这些参数不重要**。而是表示这些参数在大部分实践中**不建议过多尝试**例如Adam优化器中的***β1β2ϵ***,常设为 0.9、0.999、108就会有不错的表现。权重衰减系数通常会有个建议值例如0.0005 使用建议值即可不必过多尝试。dropout通常会在全连接层之间使用防止过拟合建议比率控制在[0.2,0.5]之间。使用dropout时需要特别注意两点一、在RNN中如果直接放在memory cell中,循环会放大噪声扰乱学习。一般会建议放在输入和输出层二、不建议dropout后直接跟上batchnormdropout很可能影响batchnorm计算统计量导致方差偏移这种情况下会使得推理阶段出现模型完全垮掉的极端情况网络参数通常也属于超参数的范围内通常情况下增加网络层数能增加模型的容限能力但模型真正有效的容限能力还和样本数量和质量、层之间的关系等有关所以一般情况下会选择先固定网络层数调优到一定阶段或者有大量的硬件资源支持可以在网络深度上进行进一步调整。
## 14.5 超参数如何影响模型性能
| 超参数 | 如何影响模型容量 | 原因 | 注意事项 |
| :----------------: | :------------------------------: | :----------------------------------------------------------: | :----------------------------------------------------------: |
| 学习率 | 调至最优,提升有效容量 | 过高或者过低的学习率,都会由于优化失败而导致降低模型有效容限 | 学习率最优点,在训练的不同时间点都可能变化,所以需要一套有效的学习率衰减策略 |
| 损失函数部分超参数 | 调至最优,提升有效容量 | 损失函数超参数大部分情况都会可能影响优化,不合适的超参数会使即便是对目标优化非常合适的损失函数同样难以优化模型,降低模型有效容限。 | 对于部分损失函数超参数其变化会对结果十分敏感,而有些则并不会太影响。在调整时,建议参考论文的推荐值,并在该推荐值数量级上进行最大最小值调试该参数对结果的影响。 |
| 批样本数量 | 过大过小,容易降低有效容量 | 大部分情况下,选择适合自身硬件容量的批样本数量,并不会对模型容限造成。 | 在一些特殊的目标函数的设计中如何选择样本是很可能影响到模型的有效容限的例如度量学习metric learning中的N-pair loss。这类损失因为需要样本的多样性可能会依赖于批样本数量。 |
| 丢弃法 | 比率降低会提升模型的容量 | 较少的丢弃参数意味着模型参数量的提升,参数间适应性提升,模型容量提升,但不一定能提升模型有效容限 | |
| 权重衰减系数 | 调至最优,提升有效容量 | 权重衰减可以有效的起到限制参数变化的幅度,起到一定的正则作用 | |
| 优化器动量 | 调至最优,可能提升有效容量 | 动量参数通常用来加快训练,同时更容易跳出极值点,避免陷入局部最优解。 | |
| 模型深度 | 同条件下,深度增加,模型容量提升 | 同条件,下增加深度意味着模型具有更多的参数,更强的拟合能力。 | 同条件下,深度越深意味着参数越多,需要的时间和硬件资源也越高。 |
| 卷积核尺寸 | 尺寸增加,模型容量提升 | 增加卷积核尺寸意味着参数量的增加,同条件下,模型参数也相应的增加。 | |
## 14.6 为超参数选择合适的范围
| 超参数 | 建议范围 | 注意事项 |
| :----------------: | :----------------------------------------------------------: | :----------------------------------------------------------: |
| 初始学习率 | SGD: [1e-2, 1e-1]<br />momentum: [1e-3, 1e-2]<br />Adagrad: [1e-3, 1e-2]<br />Adadelta: [1e-2, 1e-1]<br />RMSprop: [1e-3, 1e-2]<br />Adam: [1e-3, 1e-2]<br />Adamax: [1e-3, 1e-2]<br />Nadam: [1e-3, 1e-2] | 这些范围通常是指从头开始训练的情况。<br />若是微调,初始学习率可在降低一到两个数量级。 |
| 损失函数部分超参数 | 多个损失函数之间,损失值之间尽量相近,不建议超过或者低于两个数量级 | 这是指多个损失组合的情况,不一定完全正确。单个损失超参数需结合实际情况。 |
| 批样本数量 | [1:1024] | |
| 丢弃法比率 | [0, 0.5] | |
| 权重衰减系数 | [0, 1e-4] | |
| 卷积核尺寸 | [7x7],[5x5],[3x3],[1x1], [7x1,1x7] | |
## 14.7 为什么卷积核设计尺寸都是奇数
主要原因有两点:
- 保证像素点中心位置,避免位置信息偏移
- 填充边缘时能保证两边都能填充,原矩阵依然对称
## 14.8 权重共享的形式有哪些,为什么要权重共享
权重共享的形式:
- 深度学习中,权重共享最具代表性的就是卷积网络的卷积操作。卷积相比于全连接神经网络参数大大减少;
- 多任务网络中,通常为了降低每个任务的计算量,会共享一个骨干网络。
- 一些相同尺度下的结构化递归网络
权重共享的好处:
权重共享一定程度上能增强参数之间的联系,获得更好的共性特征。同时很大程度上降低了网络的参数,节省计算量和计算所需内存(当然,结构化递归并不节省计算量)。此外权重共享能起到很好正则的作用。正则化的目的是为了降低模型复杂度,防止过拟合,而权重共享则正好降低了模型的参数和复杂度。因此一个设计优秀的权重共享方式,在降低计算量的同时,通常会较独享网络有更好的效果。
## 14.9 如何选取卷积核
## 14.10 微调为什么需要冻结部分参数
## 14.11 微调有哪些不同方法
## 14.12 如何搜索超参数?
  最后,关于如何搜索超参数的问题,我见过大概两种重要的思想流派或人们通常采用的两种重要但不同的方式。
  一种是你照看一个模型,通常是有庞大的数据组,但没有许多计算资源或足够的 CPU 和 GPU 的前提下,基本而言,你只可以一次负担起试验一个模型或一小批模型,在这种情况下,即使当它在试验时,你也可以逐渐改良。比如,第 0 天,你将随机参数初始化,然后开始试验,然后你逐渐观察自己的学习曲线,也许是损失函数 J或者数据设置误差或其它的东西在第 1 天内逐渐减少,那这一天末的时候,你可能会说,看,它学习得真不错。我试着增加一点学习速率,看看它会怎样,也许结果证明它做得更好,那是你第二天的表现。两天后,你会说,它依旧做得不错,也许我现在可以填充下 Momentum 或减少变量。然后进入第三天,每天,你都会观察它,不断调整你的参数。也许有一天,你会发现你的学习率太大了,所以你可能又回归之前的模型,像这样,但你可以说是在每天花时间照看此模型,即使是它在许多天或许多星期的试验过程中。所以这是一个人们照料一个模型的方法,观察它的表现,耐心地调试学习率,但那通常是因为你没有足够的计算能力,不能在同一时间试验大量模型时才采取的办法。
  另一种方法则是同时试验多种模型,你设置了一些超参数,尽管让它自己运行,或者是一天甚至多天,然后你会获得像这样的学习曲线,这可以是损失函数 J 或实验误差或损失或数据误差的损失,但都是你曲线轨迹的度量。同时你可以开始一个有着不同超参数设定的不同模型,所以,你的第二个模型会生成一个不同的学习曲线,也许是像这样的一条(紫色曲线),我会说这条看起来更好些。与此同时,你可以试验第三种模型,其可能产生一条像这样的学习曲线(红色曲线),还有另一条(绿色曲线),也许这条有所偏离,像这样,等等。或者你可以同时平行试验许多不同的模型,橙色的线就是不同的模型。用这种方式你可以试验许多不同的参数设定,然后只是最后快速选择工作效果最好的那个。在这个例子中,也许这条看起来是最好的(下方绿色曲线)。
  所以这两种方式的选择,是由你拥有的计算资源决定的,如果你拥有足够的计算机去平行试验许多模型,那绝对采用鱼子酱方式,尝试许多不同的超参数,看效果怎么样。但在一些应用领域,比如在线广告设置和计算机视觉应用领域,那里的数据太多了,你需要试验大量的模型,所以同时试验大量的模型是很困难的,它的确是依赖于应用的过程。但我看到那些应用熊猫方式多一些的组织,那里,你会像对婴儿一样照看一个模型,调试参数,试着让它工作运转。尽管,当然,甚至是在熊猫方式中,试验一个模型,观察它工作与否,也许第二或第三个星期后,也许我应该建立一个不同的模型(绿色曲线),像熊猫那样照料它,我猜,这样一生中可以培育几个孩子,即使它们一次只有一个孩子或孩子的数量很少。

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

View File

@ -0,0 +1,20 @@
该文件用来记录修改日志:
<----shw2018-2018-10-25---->
1. 新增章节markdown文件
<----shw2018-2018-10-28---->
1. 修改错误内容和格式
2. 修改图片路径
<----shw2018-2018-10-31---->
1. 新增第九章文件夹,里面包括:
img---->用来放对应章节图片,例如路径./img/ch9/ch_*
readme.md---->章节维护贡献者信息
modify_log---->用来记录修改日志
第 * 章_xxx.md---->对应章节markdown文件
第 * 章_xxx.pdf---->对应章节生成pdf文件便于阅读
其他---->待增加
2. 修改readme内容
3. 修改modify内容
4. 修改章节内容,图片路径等

View File

@ -0,0 +1,14 @@
###########################################################
### 深度学习500问-第 15 章 异构运算、GPU及框架选型
**负责人(排名不分先后):**
研究生-崔永明
博士生-钟申俊
**贡献者(排名不分先后):**
内容贡献者可自加信息
###########################################################

View File

@ -1,4 +1,133 @@
# 第十五章 GPU和框架选型指南
# 第十五章 异构计算, GPU和框架选型指南
深度学习训练和推理的过程中,会涉及到大量的向量(vector),矩阵(matrix)和张量(tensor)操作通常需要大量的浮点计算包括高精度在训练的时候和低精度在推理和部署的时候。GPU 作为一种通用可编程的加速器最初设计是用来进行图形处理和渲染功能但是从2007年开始英伟达(NVIDIA)公司提出了第一个可编程通用计算平台GPGPU同时提出了CUDA框架从此开启了GPU用于通用计算的新纪元。此后不计其数的科研人员和开发者对各种不同类型的算法用CUDA进行部分改写从而达到几倍到数百倍的加速效果。尤其是在机器学习特别是深度学习的浪潮来临后GPU加速已经是各类工具实现的基本底层构架之一。本章里会简单介绍GPU的基本架构性能指标框架选择等等和深度学习相关的内容。
## 15.1 什么是异构计算?
## 15.2 什么是GPGPU
## 15.3 GPU架构简介
(架构内容)
### 15.3.1 为什么要使用GPU
和CPU的区别 + 图示)
### 15.3.2 CUDA 核心是什么?
### 15.3.3 新图灵架构里的tensor core对深度学习有什么作用
### 15.3.4 GPU内存架构和应用性能的联系
## 15.4 CUDA 框架
### 15.4.1 做CUDA编程难不难
### 15.4.2 cuDNN
## 15.5 GPU硬件环境配置推荐
### 15.5.1 GPU主要性能指标
### 15.5.2 购买建议
## 15.6 软件环境搭建
### 15.6.1 操作系统选择?
### 15.6.2 本机安装还是使用docker
### 15.6.3 GPU驱动问题
## 15.7 框架选择
### 15.7.1 主流框架比较
(一个大表格比较)
### 15.7.2 框架详细信息
* Tensorflow
* PyTorch
* Keras
* Sonnet
* Caffe
* Caffe2
* MxNet
MxNet是dmlc社区推出的深度学习框架MXNet由学术界发起包括数个顶尖大学的多个学科的研究人员的贡献在2017年被亚马逊指定为官方框架。
mxnet的最知名的优点就是其对多GPU的支持和扩展性强其优秀的性能使之在工业界占有一席之地在amazon支持之后其文档和开发进度明显好很多。除了高可扩展性MXNet 还提供混合编程模型(命令式和声明式),同时兼容多种编程语言(包括 Python、C ++、R、Scala、Julia、Matlab 和 JavaScript的代码目前主要在推python高层接口gluon
优点:
1多GPU支持好扩展性强支持多种编程语言接口主要是由华人团队开发中文社区活跃中文文档资源和课程丰富
2针对两大热门领域推出gluoncv和gluonNLP模块复现经典论文达到State-of-the-art接口设计简单文档齐全拿来就可以用
缺点:
1现在mxnet官方社区主要在推gluon接口接口稍有混乱坑较多入手门槛稍高
2偏小众经典网络和项目的开源实现相对于tensorflow和pytorch还是比较少很多还是需要自己手动实现
相关资源链接:
1官方教程http://mxnet.incubator.apache.org 提供有快速入门教程和详细文档说明
2中文教程http://zh.gluon.ai/ 官方的中文教程,此课程有对应的中文版视频,主要由李沐大神讲课
3中文论坛https://discuss.gluon.ai/ 官方发中文论坛mxnet的主要作者都在这里论坛比较活跃可及时得到作者的回答
4基于mxnet的开源实现https://github.com/chinakook/Awesome-MXNet 这里主要列举了mxnet在各个领域的项目的开源实现
* CNTK
* PaddlePaddle
* 其他国内自主开发开源框架
### 15.7.3 哪些框架对于部署环境友好?
* Tensorflow Serving
* ONNX 标准
* TensorRT
* ONNPACK
* Clipper
### 15.7.4 移动平台的框架如何选择?
* Tensorflow Lite
* Caffe2
## 15.8 其他
### 15.8.1 多GPU环境的配置
* Tensorflow
* PyTorch
### 15.8.2 是不是可以分布式训练?
### 15.8.3 可以在SPARK环境里训练或者部署模型吗
### 15.8.4 怎么进一步优化性能?
* TVM
* nGraph
### 15.8.5 TPU和GPU的区别
### 15.8.6 未来量子计算对于深度学习等AI技术的影像
-------
## 15.1 GPU购买指南
@ -47,7 +176,7 @@ GPU的性能主要由以下三个参数构成
下图描绘了GTX 900和1000系列里各个型号的32位浮点计算能力和价格的对比。其中价格为Wikipedia的建议价格。
![浮点计算能力和价格的对比。](../img/gtx.png)
![浮点计算能力和价格的对比。](./img/ch15/gtx.png)
我们可以从图中读出两点信息:
@ -76,32 +205,6 @@ GPU的性能主要由以下三个参数构成
* 在预算范围之内尽可能买较新的GPU。
* 整机配置需要考虑到GPU的功耗、散热和体积。
一般来说我会推荐GTX 1080 TiGTX 1080或GTX 1070.他们都是优秀的显卡如果你有钱应该购买GTX 1080 Ti。GTX 1070比普通的GTX Titan XMaxwell便宜一些。GTX 1080的性价比比GTX 1070低一些但是自GTX 1080 Ti推出以来价格大幅下滑现在GTX 1080的性价比已经能够与GTX 1070比拟。所有这三款显卡应该比GTX 980 Ti要好因为它们具有11GB和8GB而不是6GB的内存。
8GB的内存可能看起来有点小但是对于许多任务来说这已经足够了。例如对于Kaggle比赛大多数图像数据deep style和自然语言理解任务这些你可能会遇到几个问题。
对于入门级的人来或是偶尔想用GPU来参加类似Kaggle比赛的人GTX 1060是一个不错的选择。我不推荐内存只有3GB的GTX 1060 variant产品因为6G的内存就已经很有限了。但是对于许多应用来说6GB就足够了。GTX 1060比普通的Titan X慢但与GTX 980具有可比的性价比。
就综合性价比而言10系列设计得非常好。GTX 1050 TiGTX 1060GTX 1070GTX 1080和GTX 1080 Ti都非常出色。GTX 1060和GTX 1050 Ti适用于初学者GTX 1070和GTX 1080是适合于初创公司部分研究和工业部门而性能突出的GTX 1080 Ti对于以上应用都合适。
不推荐NVIDIA Titan Xp因为它的性价比太昂贵了。可以用GTX 1080 Ti代替。然而NVIDIA Titan Xp在计算机视觉研究领域中仍然有一定的使用用于处理大数据集或视频数据。在这些领域中按照每GB的内存数量计算NVIDIA Titan Xp只比GTX 1080 Ti多1GB但在这种情况下也具有一定的优势。不推荐NVIDIA Titan XPascal因为NVIDIA Titan Xp速度更快但价格几乎相同。但由于市场上这些GPU的稀缺性如果你找不到NVIDIA Titan Xp也可以购买Titan XPascal
如果你已经有了GTX Titan XMaxwellGPU那么升级到NVIDIA Titan XPascal或NVIDIA Titan Xp就没有必要了。
如果你缺钱但是你需要12GB内存来开展你的研究那么GTX Titan XMaxwell也是一个很好的选择。
对于大多数研究人员来说GTX 1080 Ti已经完全够用了。大多数研究和大多数应用GTX 1080 Ti的内存完全够用。
在NLP中内存限制并不像计算机视觉领域那么严格所以GTX 1070 / GTX 1080也是不错的选择。通常是需要解决什么样的任务以及如何进行试验决定了需要选择哪一款GPU无论是GTX 1070还是GTX 1080。当你选择GPU时应该按照类似的方式推理。考虑一下你在做什么任务如何运行你的实验然后尝试找到适合这些要求的GPU。
对于预算有限的人来说选择条件则更加有限。亚马逊网络服务上的GPU相当昂贵和缓慢如果只有少量的资金也是一个不错的选择。我不推荐GTX 970因为它很慢即使在某些限制条件下也是相当昂贵的在eBay上150美元并且存在与卡启动相关的内存问题。相反建议花更多一点的钱购买更快有更大的内存没有内存问题的GTX 1060。如果实在买不起GTX 1060我建议选择配备4GB内存的GTX 1050 Ti。4GB内存可能有限但至少可以开展进行你的研究只是需要你对模型进行一些调整也可以得到良好的性能。
GTX 1050 Ti一般来说也是一个不错的选择如果你只是想尝试一下深度学习而没有其他更多的需求。
结论
有了这篇文章中提供的所有信息你应该能够考虑选择哪一种合适的GPU综合考虑所需的内存大小带宽GB/s大小和GPU的价格这一思路在未来很久也适用。最后如果有足够的资金建议购买GTX 1080 TiGTX 1070或者GTX 1080。如果刚刚开始研究深度学习或者资金有限可以购买GTX 1060。如果资金实在有限可以购买GTX 1050 ti如果想要从事计算机视觉研究可以购买Titan Xp。
## 15.2 框架选型

View File

@ -0,0 +1,2 @@
Add the corresponding chapter picture under img/ch*
在img/ch*下添加对应章节图片

View File

@ -0,0 +1,20 @@
该文件用来记录修改日志:
<----shw2018-2018-10-25---->
1. 新增章节markdown文件
<----shw2018-2018-10-28---->
1. 修改错误内容和格式
2. 修改图片路径
<----shw2018-2018-10-31---->
1. 新增第九章文件夹,里面包括:
img---->用来放对应章节图片,例如路径./img/ch9/ch_*
readme.md---->章节维护贡献者信息
modify_log---->用来记录修改日志
第 * 章_xxx.md---->对应章节markdown文件
第 * 章_xxx.pdf---->对应章节生成pdf文件便于阅读
其他---->待增加
2. 修改readme内容
3. 修改modify内容
4. 修改章节内容,图片路径等

View File

@ -0,0 +1,14 @@
###########################################################
### 深度学习500问-第 * 章 xxx
**负责人(排名不分先后):**
xxx研究生-xxxxxx
xxx博士生-xxx
xxx-xxx
**贡献者(排名不分先后):**
内容贡献者可自加信息
###########################################################

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

View File

@ -0,0 +1,2 @@
Add the corresponding chapter picture under img/ch*
在img/ch*下添加对应章节图片

View File

@ -0,0 +1,23 @@
该文件用来记录修改日志:
<----shw2018-2018-10-25---->
1. 新增章节markdown文件
<----shw2018-2018-10-28---->
1. 修改错误内容和格式
2. 修改图片路径
<----shw2018-2018-10-31---->
1. 新增第九章文件夹,里面包括:
img---->用来放对应章节图片,例如路径./img/ch9/ch_*
readme.md---->章节维护贡献者信息
modify_log---->用来记录修改日志
第 * 章_xxx.md---->对应章节markdown文件
第 * 章_xxx.pdf---->对应章节生成pdf文件便于阅读
其他---->待增加
2. 修改readme内容
3. 修改modify内容
4. 修改章节内容,图片路径等
<----shw2018-2018-11-34---->
1.增加现有移动端开源框架目录及链接

View File

@ -0,0 +1,14 @@
###########################################################
### 深度学习500问-第十七章 移动端框架部署
**负责人(排名不分先后):**
谈继勇-硕士
贵州大学硕士张达峰
xxx-xxx
**贡献者(排名不分先后):**
2018-11-04 新增移动端开源框架部署,细节内容有待完善
###########################################################

View File

@ -0,0 +1,366 @@
# 第十七章 模型压缩及移动端部署
Markdown Revision 1;
Date: 2018/11/4
Editor: 谈继勇
Contact: scutjy2015@163.com
updata:贵州大学硕士张达峰
## 17.1 为什么需要模型压缩和加速?
1对于在线学习和增量学习等实时应用而言如何减少含有大量层级及结点的大型神经网络所需要的内存和计算量显得极为重要。
2智能设备的流行提供了内存、CPU、能耗和宽带等资源使得深度学习模型部署在智能移动设备上变得可行。
3高效的深度学习方法可以有效的帮助嵌入式设备、分布式系统完成复杂工作在移动端部署深度学习有很重要的意义。
https://blog.csdn.net/Touch_Dream/article/details/78441332
## 17.2 目前有哪些深度学习模型压缩方法?
https://blog.csdn.net/wspba/article/details/75671573
https://blog.csdn.net/Touch_Dream/article/details/78441332
### 17.2.1 前端压缩
1知识蒸馏简单介绍
2紧凑的模型结构设计简单介绍
3滤波器层面的剪枝简单介绍
参考链接 https://blog.csdn.net/JNingWei/article/details/79218745 补充优缺点
### 17.2.2 后端压缩
1低秩近似 (简单介绍,参考链接补充优缺点)
2未加限制的剪枝 (简单介绍,参考链接补充优缺点)
3参数量化 (简单介绍,参考链接补充优缺点)
4二值网络 (简单介绍,参考链接补充优缺点)
目前深度学习模型压缩方法的研究主要可以分为以下几个方向:
1更精细模型的设计。目前很多网络基于模块化设计思想在深度和宽度两个维度上都很大导致参数冗余。因此有很多关于模型设计的研究如SqueezeNet、MobileNet等使用更加细致、高效的模型设计能够很大程度的减少模型尺寸并且也具有不错的性能。
2模型裁剪。结构复杂的网络具有非常好的性能其参数也存在冗余因此对于已训练好的模型网络可以寻找一种有效的评判手段将不重要的connection或者filter进行裁剪来减少模型的冗余。
3核的稀疏化。在训练过程中对权重的更新进行诱导使其更加稀疏对于稀疏矩阵可以使用更加紧致的存储方式如CSC但是使用稀疏矩阵操作在硬件平台上运算效率不高容易受到带宽的影响因此加速并不明显。
4量化
5Low-rank分解
6迁移学习
## 17.3 目前有哪些深度学习模型优化加速方法?
https://blog.csdn.net/nature553863/article/details/81083955
模型优化加速能够提升网络的计算效率,具体包括:
1Op-level的快速算法FFT Conv2d (7x7, 9x9), Winograd Conv2d (3x3, 5x5) 等;
2Layer-level的快速算法Sparse-block net [1] 等;
3优化工具与库TensorRT (Nvidia), Tensor Comprehension (Facebook) 和 Distiller (Intel) 等;
原文https://blog.csdn.net/nature553863/article/details/81083955
## 17.4 影响神经网络速度的4个因素再稍微详细一点
1. FLOPs(FLOPs就是网络执行了多少multiply-adds操作)
2. MAC(内存访问成本)
3. 并行度(如果网络并行度高,速度明显提升)
4. 计算平台(GPUARM)
## 17.5 改变网络结构设计为什么会实现模型压缩、加速?
### 1. Group convolution
Group convolution最早出现在AlexNet中是为了解决单卡显存不够将网络部署到多卡上进行训练。Group convolution可以减少单个卷积1/g的参数量。
假设输入特征的的维度为H \* W \* c1卷积核的维度为h1 \* w1 \* c1共c2个输出特征的维度为 H1 \* W1 \* c2。
传统卷积计算方式如下:
![image](C:/Users/zhang-pc/Desktop/tu/1.png)
传统卷积运算量为:
```math
A = H * W * h1 * w1 * c1 * c2
```
Group convolution是将输入特征的维度c1分成g份每个group对应的channel数为c1/g特征维度H \* W \* c1/g每个group对应的卷积核的维度也相应发生改变为h1 \* w1 \* c1/9共c2/g个每个group相互独立运算最后将结果叠加在一起。
Group convolution计算方式如下
![image](C:/Users/zhang-pc/Desktop/tu/2.png)
Group convolution运算量为
```math
B = H * W * h1 * w1 * c1/g * c2/g * g
```
Group卷积相对于传统卷积的运算量
```math
\dfrac{B}{A} = \dfrac{ H * W * h1 * w1 * c1/g * c2/g * g}{H * W * h1 * w1 * c1 * c2} = \dfrac{1}{g}
```
由此可知group卷积相对于传统卷积减少了1/g的参数量。
### 2. Depthwise separable convolution
Depthwise separable convolution是由depthwise conv和pointwise conv构成。
depthwise conv(DW)有效减少参数数量并提升运算速度。但是由于每个feature map只被一个卷积核卷积因此经过DW输出的feature map不能只包含输入特征图的全部信息而且特征之间的信息不能进行交流导致“信息流通不畅”。
pointwise conv(PW)实现通道特征信息交流解决DW卷积导致“信息流通不畅”的问题。
假设输入特征的的维度为H \* W \* c1卷积核的维度为h1 \* w1 \* c1共c2个输出特征的维度为 H1 \* W1 \* c2。
传统卷积计算方式如下:
![image](C:/Users/zhang-pc/Desktop/tu/3.jpg)
传统卷积运算量为:
```math
A = H * W * h1 * w1 * c1 * c2
```
DW卷积的计算方式如下
![image](C:/Users/zhang-pc/Desktop/tu/4.jpg)
DW卷积运算量为
```math
B_DW = H * W * h1 * w1 * 1 * c1
```
PW卷积的计算方式如下
![image](C:/Users/zhang-pc/Desktop/tu/5.jpg)
```math
B_PW = H_m * W_m * 1 * 1 * c1 * c2
```
Depthwise separable convolution运算量为
```math
B = B_DW + B_PW
```
Depthwise separable convolution相对于传统卷积的运算量
```math
\dfrac{B}{A} = \dfrac{ H * W * h1 * w1 * 1 * c1 + H_m * W_m * 1 * 1 * c1 * c2}{H * W * h1 * w1 * c1 * c2}
= \dfrac{1}{c2} + \dfrac{1}{h1 * w1}
```
由此可知随着卷积通道数的增加Depthwise separable convolution的运算量相对于传统卷积更少。
### 3. 输入输出的channel相同时MAC最小
**卷积层的输入和输出特征通道数相等时MAC最小此时模型速度最快。**
假设feature map的大小为h*w输入通道c1输出通道c2。
已知:
```math
FLOPs = B = h * w * c1 * c2
=> c1 * c2 = \dfrac{B}{h * w}
MAC = h * w * (c1 + c2) + c1 * c2
c1 + c2 \geq 2 * \sqrt{c1 * c2}
=> MAC \geq 2 * h * w \sqrt{\dfrac{B}{h * w}} + \dfrac{B}{h * w}
```
根据均值不等式得到(c1-c2)^2>=0等式成立的条件是c1=c2也就是输入特征通道数和输出特征通道数相等时在给定FLOPs前提下MAC达到取值的下界。
### 4. 减少组卷积的数量
**过多的group操作会增大MAC从而使模型速度变慢**
由以上公式可知group卷积想比与传统的卷积可以降低计算量提高模型的效率如果在相同的FLOPs时group卷积为了满足FLOPs会是使用更多channels可以提高模型的精度。但是随着channel数量的增加也会增加MAC。
FLOPs
```math
B = \dfrac{h * w * c1 * c2}{g}
```
MAC
```math
MAC = h * w * (c1 + c2) + \dfrac{c1 * c2}{g}
```
由MACFLOPs可知
```math
MAC = h * w * c1 + \dfrac{B*g}{c1} + \dfrac{B}{h * w}
```
当FLOPs固定(B不变)时g越大MAC越大。
### 5. 减少网络碎片化程度(分支数量)
**模型中分支数量越少,模型速度越快**
此结论主要是由实验结果所得。
以下为网络分支数和各分支包含的卷积数目对神经网络速度的影响。
![image](C:/Users/zhang-pc/Desktop/tu/6.png)
实验中使用的基本网络结构分别将它们重复10次然后进行实验。实验结果如下
![image](C:/Users/zhang-pc/Desktop/tu/7.png)
由实验结果可知随着网络分支数量的增加神经网络的速度在降低。网络碎片化程度对GPU的影响效果明显对CPU不明显但是网络速度同样在降低。
### 6. 减少元素级操作
**元素级操作所带来的时间消耗也不能忽视**
ReLU Tensor 相加Bias相加的操作分离卷积depthwise convolution都定义为元素级操作。
FLOPs大多数是对于卷积计算而言的因为元素级操作的FLOPs相对要低很多。但是过的元素级操作也会带来时间成本。ShuffleNet作者对ShuffleNet v1和MobileNet v2的几种层操作的时间消耗做了分析发现元素级操作对于网络速度的影响也很大。
![image](C:/Users/zhang-pc/Desktop/tu/8.png)
## 17.6 常用的轻量级网络有哪些?(再琢磨下语言和排版)
* **SqueezeNet**
* **MobileNet**
* **ShuffleNet**
* **Xception**
### 1. SequeezeNet
SqueenzeNet出自F. N. Iandola, S.Han等人发表的论文《SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and < 0.5MB model size作者在保证精度不损失的同时将原始AlexNet压缩至原来的510倍
#### 1.1 设计思想
在网络结构设计方面主要采取以下三种方式:
* 用1\*1卷积核替换3\*3卷积
* 理论上一个1\*1卷积核的参数是一个3\*3卷积核的1/9可以将模型尺寸压缩9倍。
* 减小3\*3卷积的输入通道数
* 根据上述公式减少输入通道数不仅可以减少卷积的运算量而且输入通道数与输出通道数相同时还可以减少MAC。
* 延迟降采样
* 分辨率越大的输入能够提供更多特征的信息,有利于网络的训练判断,延迟降采样可以提高网络精度。
#### 1.2 网络架构
SqueezeNet提出一种多分支结构——fire model其中是由Squeeze层和expand层构成。Squeeze层是由s1个1\*1卷积组成主要是通过1\*1的卷积降低expand层的输入维度expand层利用e1个1\*1和e3个3\*3卷积构成多分支结构提取输入特征以此提高网络的精度(其中e1=e3=4*s1)。
![image](C:/Users/zhang-pc/Desktop/tu/9.png)
SqueezeNet整体网络结构如下图所示
![image](C:/Users/zhang-pc/Desktop/tu/10.png)
#### 1.3实验结果
不同压缩方法在ImageNet上的对比实验结果
![image](C:/Users/zhang-pc/Desktop/tu/11.png)
由实验结果可知SqueezeNet不仅保证了精度而且将原始AlexNet从240M压缩至4.8M压缩50倍说明此轻量级网络设计是可行。
### 2. MobileNet
MobileNet 是Google团队于CVPR-2017的论文《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》中针对手机等嵌入式设备提出的一种轻量级的深层神经网络该网络结构在VGG的基础上使用DW+PW的组合在保证不损失太大精度的同时降低模型参数量。
#### 2.1 设计思想
* 采用深度可分离卷积代替传统卷积
* 采用DW卷积在减少参数数量的同时提升运算速度。但是由于每个feature map只被一个卷积核卷积因此经过DW输出的feature map不能只包含输入特征图的全部信息而且特征之间的信息不能进行交流导致“信息流通不畅”。
* 采用PW卷积实现通道特征信息交流解决DW卷积导致“信息流通不畅”的问题。
* 使用stride=2的卷积替换pooling
* 直接在卷积时利用stride=2完成了下采样从而节省了需要再去用pooling再去进行一次下采样的时间可以提升运算速度。同时因为pooling之前需要一个stride=1的 conv而与stride=2 conv的计算量想比要高近4倍(**个人理解**)。
#### 2.2 网络架构
* DW conv和PW conv
MobileNet的网络架构主要是由DW conv和PW conv组成相比于传统卷积可以降低`$\dfrac{1}{N} + \dfrac{1}{Dk}$`倍的计算量。
标准卷积与DW conv和PW conv如图所示:
![image](C:/Users/zhang-pc/Desktop/tu/12.png)
深度可分离卷积与传统卷积运算量对比:
![image](C:/Users/zhang-pc/Desktop/tu/13.png)
网络结构:
![image](C:/Users/zhang-pc/Desktop/tu/14.png)
* MobileNets的架构
![image](C:/Users/zhang-pc/Desktop/tu/15.png)
#### 2.3 实验结果
![image](C:/Users/zhang-pc/Desktop/tu/16.png)
由上表可知使用相同的结构深度可分离卷积虽然准确率降低1%但是参数量减少了6/7。
### 3. MobileNet-v2
MobileNet-V2是2018年1月公开在arXiv上论文《Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation》是对MobileNet-V1的改进同样是一个轻量化卷积神经网络。
#### 3.1 设计思想
* 采用Inverted residuals
* 为了保证网络可以提取更多的特征在residual block中第一个1\*1 Conv和3*3 DW Conv之前进行通道扩充
* Linear bottlenecks
* 为了避免Relu对特征的破坏在residual block的Eltwise sum之前的那个 1\*1 Conv 不再采用Relu
* stride=2的conv不使用shot-cotstride=1的conv使用shot-cut
#### 3.2 网络架构
* Inverted residuals
ResNet中Residuals block先经过1\*1的Conv layer把feature map的通道数降下来再经过3\*3 Conv layer最后经过一个1\*1 的Conv layer将feature map 通道数再“扩张”回去。即采用先压缩,后扩张的方式。而 inverted residuals采用先扩张后压缩的方式。
MobileNet采用DW conv提取特征由于DW conv本身提取的特征数就少再经过传统residuals block进行“压缩”此时提取的特征数会更少因此inverted residuals对其进行“扩张”保证网络可以提取更多的特征。
![image](C:/Users/zhang-pc/Desktop/tu/17.png)
* Linear bottlenecks
ReLu激活函数会破坏特征。ReLu对于负的输入输出全为0而本来DW conv特征通道已经被“压缩”再经过ReLu的话又会损失一部分特征。采用Linear目的是防止Relu破坏特征。
![image](C:/Users/zhang-pc/Desktop/tu/18.png)
* shortcut
stride=2的conv不使用shot-cotstride=1的conv使用shot-cut
![image](C:/Users/zhang-pc/Desktop/tu/19.png)
* 网络架构
![image](C:/Users/zhang-pc/Desktop/tu/20.png)
### 4. Xception
Xception是Google提出的arXiv 的V1 于2016年10月公开《Xception: Deep Learning with Depthwise Separable Convolutions 》Xception是对Inception v3的另一种改进主要是采用depthwise separable convolution来替换原来Inception v3中的卷积操作。
#### 4.1设计思想
* 采用depthwise separable convolution来替换原来Inception v3中的卷积操作
与原版的Depth-wise convolution有两个不同之处
* 第一个原版Depth-wise convolution先逐通道卷积再1*1卷积; 而Xception是反过来先1\*1卷积再逐通道卷积
* 第二个原版Depth-wise convolution的两个卷积之间是不带激活函数的而Xception在经过1\*1卷积之后会带上一个Relu的非线性激活函数
#### 4.2网络架构
feature map在空间和通道上具有一定的相关性通过Inception模块和非线性激活函数实现通道之间的解耦。增多3\*3的卷积的分支的数量使它与1\*1的卷积的输出通道数相等此时每个3\*3的卷积只作用与一个通道的特征图上作者称之为“极致的InceptionExtream Inception”模块这就是Xception的基本模块。
![image](C:/Users/zhang-pc/Desktop/tu/21.png)
### 5. ShuffleNet-v1
ShuffleNet 是Face++团队提出的晚于MobileNet两个月在arXiv上公开《ShuffleNet An Extremely Efficient Convolutional Neural Network for Mobile Devices 》用于移动端前向部署的网络架构。ShuffleNet基于MobileNet的group思想将卷积操作限制到特定的输入通道。而与之不同的是ShuffleNet将输入的group进行打散从而保证每个卷积核的感受野能够分散到不同group的输入中增加了模型的学习能力。
#### 5.1 设计思想
* 采用group conv减少大量参数
* roup conv与DW conv存在相同的“信息流通不畅”问题
* 采用channel shuffle解决上述问题
* MobileNet中采用PW conv解决上述问题SheffleNet中采用channel shuffle
* 采用concat替换add操作
* avg pooling和DW conv(s=2)会减小feature map的分辨率采用concat增加通道数从而弥补分辨率减小而带来信息的损失
#### 5.2 网络架构
MobileNet中1\*1卷积的操作占据了约95%的计算量所以作者将1\*1也更改为group卷积使得相比MobileNet的计算量大大减少。
![image](C:/Users/zhang-pc/Desktop/tu/22.png)
group卷积与DW存在同样使“通道信息交流不畅”的问题MobileNet中采用PW conv解决上述问题SheffleNet中采用channel shuffle。
ShuffleNet的shuffle操作如图所示
![image](C:/Users/zhang-pc/Desktop/tu/24.png)
avg pooling和DW conv(s=2)会减小feature map的分辨率采用concat增加通道数从而弥补分辨率减小而带来信息的损失实验表明多多使用通道(提升通道的使用率),有助于提高小模型的准确率。
![image](C:/Users/zhang-pc/Desktop/tu/23.png)
网络结构:
![image](C:/Users/zhang-pc/Desktop/tu/25.png)
### 6. ShuffleNet-v2
huffleNet-v2 是Face++团队提出的《ShuffleNet V2: Practical Guidelines for Ecient CNN Architecture Design》旨在设计一个轻量级但是保证精度、速度的深度网络。
#### 6.1 设计思想
* 文中提出影响神经网络速度的4个因素
* a. FLOPs(FLOPs就是网络执行了多少multiply-adds操作)
* b. MAC(内存访问成本)
* c. 并行度(如果网络并行度高,速度明显提升)
* d. 计算平台(GPUARM)
* ShuffleNet-v2 提出了4点网络结构设计策略
* G1.输入输出的channel相同时MAC最小
* G2.过度的组卷积会增加MAC
* G3.网络碎片化会降低并行度
* G4.元素级运算不可忽视
#### 6.2 网络结构
depthwise convolution 和 瓶颈结构增加了 MAC用了太多的 group跨层连接中的 element-wise Add 操作也是可以优化的点。所以在 shuffleNet V2 中增加了几种新特性。
所谓的 channel split 其实就是将通道数一分为2化成两分支来代替原先的分组卷积结构G2并且每个分支中的卷积层都是保持输入输出通道数相同G1其中一个分支不采取任何操作减少基本单元数G3最后使用了 concat 代替原来的 elementy-wise add并且后面不加 ReLU 直接G4再加入channle shuffle 来增加通道之间的信息交流。 对于下采样层,在这一层中对通道数进行翻倍。 在网络结构的最后,即平均值池化层前加入一层 1x1 的卷积层来进一步的混合特征。
![image](C:/Users/zhang-pc/Desktop/tu/26.png)
网络结构
![image](C:/Users/zhang-pc/Desktop/tu/27.png)
#### 6.4 ShuffleNet-v2具有高精度的原因
* 由于高效可以增加更多的channel增加网络容量
* 采用split使得一部分特征直接与下面的block相连特征复用(DenseNet)
## 17.7 现有移动端开源框架及其特点(介绍开源者及时间,特点、功能、优势)
### 17.7.1 NCNN
ncnn GitHub地址https://github.com/Tencent/ncnn
https://cloud.tencent.com/developer/article/1005805
特点:
NCNN其架构设计以手机端运行为主要原则考虑了手机端的硬件和系统差异以及调用方式。无第三方依赖跨平台手机端 CPU 的速度快于目前所有已知的开源框架。基于 ncnn开发者能够将深度学习算法轻松移植到手机端高效执行开发出人工智能 APP将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如 QQQzone微信天天P图等。
功能:
1、NCNN支持卷积神经网络、多分支多输入的复杂网络结构如主流的 vgg、googlenet、resnet、squeezenet 等。
2、NCNN无需依赖任何第三方库。
3、NCNN全部使用C/C++实现以及跨平台的cmake编译系统可轻松移植到其他系统和设备上。
4、汇编级优化计算速度极快。使用ARM NEON指令集实现卷积层全连接层池化层等大部分 CNN 关键层。
5、精细的数据结构设计内存占用极低。没有采用需构造出非常大的矩阵消耗大量内存的通常框架——im2col + 矩阵乘法。
6、支持多核并行计算优化CPU调度。
7、整体库体积小于500K可精简到小于300K。
8、可扩展的模型设计支持8bit 量化和半精度浮点存储。
9、支持直接内存引用加载网络模型。
10、可注册自定义层实现并扩展。
### 17.7.2 QNNPACK
特点:
Facebook开源高性能内核库QNNPACK
https://baijiahao.baidu.com/s?id=1615725346726413945&wfr=spider&for=pc
http://www.sohu.com/a/272158070_610300
###
支持移动端深度学习的几种开源框架
https://blog.csdn.net/zchang81/article/details/74280019
### 17.7.3 mobile-deep-learning
百度开源移动端深度学习框架mobile-deep-learning 2017 年 9 月 25 日
https://yq.aliyun.com/ziliao/303275
移动端开源深度学习框架
https://blog.csdn.net/kazehouri/article/details/80672672
### 17.7.4 MACE
小米开源移动端深度学习框架MACE自主研发专为IoT设备优化
https://baijiahao.baidu.com/s?id=1604593002655309086&wfr=spider&for=pc
移动端深度学习框架小结
https://blog.csdn.net/yuanlulu/article/details/80857211?utm_source=blogxgwz7
### 17.7.5 PocketFlow
腾讯AI Lab开源模型压缩与加速框架PocketFlow
https://mp.weixin.qq.com/s?src=11&timestamp=1541335410&ver=1224&signature=JbHfKmuDNQ6E2cWFUu4*xLU0z4yXa3btbsqCrLpI20U8QAHX6-O*vIgwch159sclcBKb7qzAM4dro2S1n2Mk7a**KqXqTQSRi8i5xGWEIZbw7ZDIkpacRdxB0EHAX1Bo&new=1
### 17.7.6 其他几款支持移动端深度学习的开源框架
https://blog.csdn.net/zchang81/article/details/74280019
## 17.8 移动端开源框架部署
### 17.8.1 以NCNN为例
部署步骤
### 17.8.2 以QNNPACK为例
部署步骤
## 17.9 移动端开源框架部署疑难

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 281 KiB

After

Width:  |  Height:  |  Size: 281 KiB

View File

Before

Width:  |  Height:  |  Size: 311 KiB

After

Width:  |  Height:  |  Size: 311 KiB

View File

Before

Width:  |  Height:  |  Size: 284 KiB

After

Width:  |  Height:  |  Size: 284 KiB

View File

Before

Width:  |  Height:  |  Size: 347 KiB

After

Width:  |  Height:  |  Size: 347 KiB

View File

Before

Width:  |  Height:  |  Size: 367 KiB

After

Width:  |  Height:  |  Size: 367 KiB

View File

Before

Width:  |  Height:  |  Size: 696 KiB

After

Width:  |  Height:  |  Size: 696 KiB

View File

Before

Width:  |  Height:  |  Size: 863 KiB

After

Width:  |  Height:  |  Size: 863 KiB

View File

@ -0,0 +1,20 @@
该文件用来记录修改日志:
<----shw2018-2018-10-25---->
1. 新增章节markdown文件
<----shw2018-2018-10-28---->
1. 修改错误内容和格式
2. 修改图片路径
<----shw2018-2018-10-31---->
1. 新增第九章文件夹,里面包括:
img---->用来放对应章节图片,例如路径./img/ch9/ch_*
readme.md---->章节维护贡献者信息
modify_log---->用来记录修改日志
第 * 章_xxx.md---->对应章节markdown文件
第 * 章_xxx.pdf---->对应章节生成pdf文件便于阅读
其他---->待增加
2. 修改readme内容
3. 修改modify内容
4. 修改章节内容,图片路径等

Some files were not shown because too many files have changed in this diff Show More