Skip to content

Commit

Permalink
Merge pull request scutan90#151 from ChaofWang/master
Browse files Browse the repository at this point in the history
update 第十四章问答
  • Loading branch information
ChaofWang authored Nov 7, 2018
2 parents a299f66 + c2bdfd2 commit efe71f8
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 4 deletions.
7 changes: 7 additions & 0 deletions ch14_超参数调整/modify_log.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,11 @@
14.7 为什么卷积核设计尺寸都是奇数
14.8 权重共享的形式有哪些,为什么要权重共享

<----shw2018-2018-11-07---->
新增问答:modify by 王超锋
14.9 什么是微调(fine-tune)
14.10 微调有哪些不同方法?
14.11 微调先冻结底层,训练顶层的原因?
14.12 不同的数据集特性下如何微调?


39 changes: 35 additions & 4 deletions ch14_超参数调整/第十四章_超参数调整.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,44 @@

权重共享一定程度上能增强参数之间的联系,获得更好的共性特征。同时很大程度上降低了网络的参数,节省计算量和计算所需内存(当然,结构化递归并不节省计算量)。此外权重共享能起到很好正则的作用。正则化的目的是为了降低模型复杂度,防止过拟合,而权重共享则正好降低了模型的参数和复杂度。因此一个设计优秀的权重共享方式,在降低计算量的同时,通常会较独享网络有更好的效果。

## 14.9 如何选取卷积核
## 14.9 什么是微调(fine-tune)

## 14.10 微调为什么需要冻结部分参数
​ 微调(fine-tune),顾名思义指稍微调整参数即可得到优秀的性能,是迁移学习的一种实现方式。微调和从头训练(train from scratch)的本质区别在于模型参数的初始化,train from scratch通常指对网络各类参数进行随机初始化(当然随机初始化也存在一定技巧),随机初始化模型通常不具有任何预测能力,通常需要大量的数据或者特定域的数据进行从零开始的训练,这样需要训练到优秀的模型通常是稍困难的。而微调的网络,网络各类参数已经在其他数据集(例如ImageNet数据集)完成较好调整的,具备了较优秀的表达能力。因此,我们只需要以较小的学习速率在自己所需的数据集领域进行学习即可得到较为优秀的模型。微调通常情况下,无须再重新设计网络结构,预训练模型提供了优秀的结构,只需稍微修改部分层即可。在小数据集上,通常微调的效果比从头训练要好很多,原因在于数据量较小的前提下,训练更多参数容易导致过度拟合。

## 14.11 微调有哪些不同方法
## 14.10 微调有哪些不同方法

## 14.12 如何搜索超参数?
​ 以图像分类为例,通常情况下由于不同数据集需要的类别数不同,我们需要修改网络的输出顶层。这种情况下有两种微调方式:

- 不冻结网络模型的任何层,对最后的改动层使用较大的学习率,对未改动层以较小的学习率进行训练全模型训练,进行多轮训练即可。即一步完成训练。

- 冻结除了顶部改动层以外的所有层参数,即不对冻结部分的层进行参数训练更新,进行若干轮的微调训练后,放开顶部层以下的若干层或者全部放开所有层的参数,再次进行若干轮训练即可。即分多步训练。

以上两种都属于微调。目前由于存在大量优秀的预训练模型,如何确定哪个模型适合自己的任务并能得到最佳性能需要花大量的时间探索。此时,上述的前者是种不错训练方式,你无须进行过多分步的操作。而当探索到一个比较适合的模型时,你不妨可以再次重新尝试下以第二种方式进行训练,或许能得到相比于前者稍高些的性能,因为小数据集上调整过多的参数过拟合的机率也会增大,当然这并不是绝对的。

## 14.11 微调先冻结底层,训练顶层的原因?

​ 14.10中第二种冻结多步训练的方式。首先冻结除了顶部改动层以外的所有层参数,对顶层进行训练,这个过程可以理解为顶层的域适应训练,主要用来训练适应模型的现有特征空间,防止顶层糟糕的初始化,对已经具备一定表达能力的层的干扰和破坏,影响最终的性能。之后,在很多深度学习框架教程中会使用放开顶层往下一半的层数,继续进行微调。这样的好处在于越底层的特征通常是越通用的特征,越往上其整体的高层次语义越完备,这通过感受野很容易理解。所以,若预训练模型的数据和微调训练的数据语义差异越大(例如ImageNet的预模型用于医学图像的训练),那越往顶层的特征语义差异就越大,因此通常也需要进行相应的调整。

## 14.12 不同的数据集特性下如何微调?

- 数据集数据量少,数据和原数据集类似。这是通常做法只需修改最后的输出层,训练即可,训练过多参数容易过拟合。
- 数据集数据量少,数据和原数据集差异较大。由于数据差异较大,可以在完成输出顶层的微调后,微调顶层往下一半的层数,进行微调,原因见14.11。
- 数据集数据量大,数据与原数据集差异较大。这种情况下,通常已经不需要用预训练模型进行微调,通常直接重新训练即可。
- 数据集数据量大,数据与原数据类似。这时预训练模型的参数是个很好的初始化,可利用预训练模型放开所有层以较小的学习率微调即可。

## 14.13 自动化超参数搜索方法有哪些?

目前自动化搜索主要包含网格搜索,随机搜索,基于模型的超参优化



## 14.14 GAN常用调参策略



## 14.15 调试策略

#

  最后,关于如何搜索超参数的问题,我见过大概两种重要的思想流派或人们通常采用的两种重要但不同的方式。

Expand Down
Binary file modified ch14_超参数调整/第十四章_超参数调整.pdf
Binary file not shown.

0 comments on commit efe71f8

Please sign in to comment.