我目前正在构建一个卷积神经网络来玩2048游戏。它包含卷积层和6个隐藏层。网上的所有指南都提到丢弃率大约为50%。我即将开始训练,但我担心在6个层上都使用50%的丢弃率有点过头,会导致欠拟合。
我非常希望能得到一些指导。你们建议在丢弃率上如何起步?我也想了解你们为什么会给出这样的建议。
回答:
首先,请记住丢弃(dropout)是一种对抗过拟合的技术,并改善神经网络的泛化能力。因此,好的起点是关注训练性能,一旦明确看到过拟合,再去处理它。例如,在一些机器学习领域,如强化学习,学习的主要问题可能是缺乏及时的奖励,状态空间非常大,泛化能力根本不是问题。
以下是实践中过拟合的近似图示:
顺便说一下,丢弃并不是唯一的技术,最新的卷积神经网络倾向于使用批量和权重归一化来替代丢弃。
无论如何,假设过拟合确实是一个问题,并且你特别想应用丢弃。虽然建议使用dropout=0.5
作为默认值,但这一建议源自于Hinton等人在原始丢弃论文中的推荐,当时他们的关注点在于全连接或密集层。此外,这一建议隐含地假设研究人员会通过超参数调优来找到最佳的丢弃值。
对于卷积层,我认为你是对的:dropout=0.5
似乎过于严厉,研究也支持这一观点。例如,Park和Kwak在“卷积神经网络中丢弃效果的分析”论文中发现,较低的丢弃水平dropout=0.1
和dropout=0.2
效果更好。在我自己的研究中,我使用贝叶斯优化进行超参数调优(见这个问题),它经常选择从第一个卷积层向下逐渐增加丢弃概率。这是有道理的,因为滤波器的数量也在增加,共适应的几率也在增加。因此,架构通常看起来像这样:
- CONV-1:
filter=3x3
,size=32
, 丢弃率在0.0-0.1
之间 - CONV-2:
filter=3x3
,size=64
, 丢弃率在0.1-0.25
之间 - …
这种架构在分类任务中表现良好,但它肯定不是通用的架构,你应该为你的问题进行交叉验证和优化超参数。你可以通过简单的随机搜索或贝叶斯优化来实现。如果你选择贝叶斯优化,有一些很好的库可以使用,比如这个。