deep learning 中的正则化之drop

本文介绍Dropout方法,一种有效防止神经网络过拟合的技术。通过随机失活部分神经元,减少模型复杂度,提高泛化能力。实验证明其能显著降低测试错误率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


目录(?)[+]


原文地址:http://blog.youkuaiyun.com/u010402786/article/details/46812677

一:引言

  因为在机器学习的一些模型中,如果模型的参数太多,而训练样本又太少的话,这样训练出来的模型很容易产生过拟合现象。在训练bp网络时经常遇到的一个问题,过拟合指的是模型在训练数据上损失函数比较小,预测准确率较高(如果通过画图来表示的话,就是拟合曲线比较尖,不平滑,泛化能力不好),但是在测试数据上损失函数比较大,预测准确率较低。

  常用的防治过拟合的方法是在模型的损失函数中,需要对模型的参数进行“惩罚”,这样的话这些参数就不会太大,而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。因此在添加权值惩罚项后,应用梯度下降算法迭代优化计算时,如果参数theta比较大,则此时的正则项数值也比较大,那么在下一次更新参数时,参数削减的也比较大。可以使拟合结果看起来更平滑,不至于过拟合。

  Dropout是hintion最近2年提出的;为了防止模型过拟合,Dropout可以作为一种trikc供选择。在hinton的论文摘要中指出,在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。

二 Dropout方法

训练阶段:

  1.Dropout是在标准的bp网络的的结构上,使bp网的隐层激活值,以一定的比例v变为0,即按照一定比例v,随机地让一部分隐层节点失效;在后面benchmark实验测试时,部分实验让隐层节点失效的基础上,使输入数据也以一定比例(试验用20%)是部分输入数据失效(这个有点像denoising autoencoder),这样得到了更好的结果。

  2.去掉权值惩罚项,取而代之的事,限制权值的范围,给每个权值设置一个上限范围;如果在训练跟新的过程中,权值超过了这个上限,则把权值设置为这个上限的值(这个上限值得设定作者并没有说设置多少最好,后面的试验中作者说这个上限设置为15时,最好;为啥?估计是交叉验证得出的实验结论)。

  这样处理,不论权值更新量有多大,权值都不会过大。此外,还可以使算法使用一个比较大的学习率,来加快学习速度,从而使算法在一个更广阔的权值空间中搜索更好的权值,而不用担心权值过大。

测试阶段:

  在网络前向传播到输出层前时隐含层节点的输出值都要缩减到(1-v)倍;例如正常的隐层输出为a,此时需要缩减为a(1-v)

  这里我的解释是:假设比例v=0.5,即在训练阶段,以0.5的比例忽略隐层节点;那么假设隐层有80个节点,每个节点输出值为1,那么此时只有40个节点正常工作;也就是说总的输出为40个1和40个0;输出总和为40;而在测试阶段,由于我们的权值已经训练完成,此时就不在按照0.5的比例忽略隐层输出,假设此时每个隐层的输出还是1,那么此时总的输出为80个1,明显比dropout训练时输出大一倍(由于dropout比例为0.5);所以为了得到和训练时一样的输出结果,就缩减隐层输出为a(1-v);即此时输出80个0.5,总和也为40.这样就使得测试阶段和训练阶段的输出“一致”了。(个人见解)

三 Dropout原理分析

  Dropout可以看做是一种模型平均,所谓模型平均,顾名思义,就是把来自不同模型的估计或者预测通过一定的权重平均起来,在一些文献中也称为模型组合,它一般包括组合估计和组合预测。

  Dropout中哪里体现了“不同模型”;这个奥秘就是我们随机选择忽略隐层节点,在每个批次的训练过程中,由于每次随机忽略的隐层节点都不同,这样就使每次训练的网络都是不一样的,每次训练都可以单做一个“新”的模型;此外,隐含节点都是以一定概率随机出现,因此不能保证每2个隐含节点每次都同时出现,这样权值的更新不再依赖于有固定关系隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况。

  这样dropout过程就是一个非常有效的神经网络模型平均方法,通过训练大量的不同的网络,来平均预测概率。不同的模型在不同的训练集上训练(每个批次的训练数据都是随机选择),最后在每个模型用相同的权重来“融合”,介个有点类似boosting算法。

四 代码详解

  首先先介绍一个基于matlab deeplearning toolbox版本的dropout代码,主要参考(tornadomeet大牛博客),如果了解DenoisingAutoencoder的训练过程,则这个dropout的训练过程如出一辙;不需要怎么修改,就可以直接运行,因为在toolbox中已经修改完成了。

  这个过程比较简单,而且也没有使用L2规则项,来限制权值的范围;主要是用于理解dropout网络,在训练样本比较少的情况下,dropout可以很好的防止网络过拟合。

训练步骤:

1.提取数据(只提取2000个训练样本)

2 初始化网络结构:这里主要利用nnsetup函数构建一个[784 100 10]的网络。由于是练习用途,所以不进行pre_training。

3 采用minibatch方法,设置dropout比例nn.dropoutFraction=0.5;利用nntrain函数训练网络。

  按比例随机忽略隐层节点:

<code class="hljs matlab has-numbering"><span class="hljs-keyword">if</span>(<span class="hljs-transposed_variable">nn.</span>dropoutFraction > <span class="hljs-number">0</span>)

           <span class="hljs-keyword">if</span>(<span class="hljs-transposed_variable">nn.</span>testing)<span class="hljs-comment">%测试阶段实现mean network,详见上篇博文</span>

                <span class="hljs-transposed_variable">nn.</span>a<span class="hljs-cell">{i}</span> = <span class="hljs-transposed_variable">nn.</span>a<span class="hljs-cell">{i}.</span>*(<span class="hljs-number">1</span> - <span class="hljs-transposed_variable">nn.</span>dropoutFraction);

           <span class="hljs-keyword">else</span><span class="hljs-comment">%训练阶段使用</span>
                <span class="hljs-transposed_variable">nn.</span>dropOutMask<span class="hljs-cell">{i}</span> =(<span class="hljs-built_in">rand</span>(<span class="hljs-built_in">size</span>(<span class="hljs-transposed_variable">nn.</span>a<span class="hljs-cell">{i}</span>))><span class="hljs-transposed_variable">nn.</span>dropoutFraction);

                <span class="hljs-transposed_variable">nn.</span>a<span class="hljs-cell">{i}</span> =<span class="hljs-transposed_variable">nn.</span>a<span class="hljs-cell">{i}.</span>*<span class="hljs-transposed_variable">nn.</span>dropOutMask<span class="hljs-cell">{i}</span>;
           <span class="hljs-keyword">end</span>
<span class="hljs-keyword">en</span></code>d
<code class="hljs livecodeserver has-numbering">>> <span class="hljs-operator">a</span>=rand(<span class="hljs-number">1</span>,<span class="hljs-number">6</span>)

>> temp=(rand(size(<span class="hljs-operator">a</span>))><span class="hljs-number">0.5</span>)

>> dropout_a=<span class="hljs-operator">a</span>.*temp
</code>

误差delta反向传播实现:

% delta(i)=delta(i+1)W(i)*a(i)(1-a(i)) ;之后再进行dropout

<code class="hljs mathematica has-numbering">if(nn.dropoutFraction><span class="hljs-number">0</span>)

   d<span class="hljs-list">{i}</span> = d<span class="hljs-list">{i}</span> .* [ones(size(d<span class="hljs-list">{i}</span>,<span class="hljs-number">1</span>),<span class="hljs-number">1</span>) nn.dropOutMask<span class="hljs-list">{i}</span>];

end</code>

权值更新值delta_w实现:

<code class="hljs matlab has-numbering"><span class="hljs-comment">%  delta_w(i)=delta(i+1)*a(i) </span>
<span class="hljs-keyword">for</span> <span class="hljs-built_in">i</span> = <span class="hljs-number">1</span> : (n - <span class="hljs-number">1</span>)
    <span class="hljs-keyword">if</span> <span class="hljs-built_in">i</span>+<span class="hljs-number">1</span>==n
       <span class="hljs-transposed_variable">nn.</span>dW<span class="hljs-cell">{i}</span> = (d<span class="hljs-cell">{i + <span class="hljs-number">1</span>}'</span> * <span class="hljs-transposed_variable">nn.</span>a<span class="hljs-cell">{i}</span>) / <span class="hljs-built_in">size</span>(d<span class="hljs-cell">{i + <span class="hljs-number">1</span>}</span>, <span class="hljs-number">1</span>);
    <span class="hljs-keyword">else</span>
   <span class="hljs-transposed_variable">nn.</span>dW<span class="hljs-cell">{i}</span> = (d<span class="hljs-cell">{i + <span class="hljs-number">1</span>}</span>(:,<span class="hljs-number">2</span>:<span class="hljs-keyword">end</span>)<span class="hljs-string">' * nn.a{i}) / size(d{i + 1}, 1);
    end
end</span></code>

测试样本错误率:15.500% without dropout

测试样本错误率:12.100% with dropout

参考文献:

http://www.cnblogs.com/tornadomeet/p/3258122.html

<think>好的,我现在需要处理用户关于深度学习技术的查询。首先,用户的问题比较广泛,只是提到“deep learning technology”,所以需要先确定用户的具体需求。根据用户提供的引用内容,可能涉及生成式AI在心理咨询的应用、DropBlock技术、行人重识别以及注意力机制等方面。 接下来,我需要整理这些引用中的关键点。引用[1]讨论了生成式AI在青少年心理健康中的应用,强调其辅助筛查和识别问题的能力。引用[2]详细介绍了DropBlock,一种卷积正则化方法,对比了其他Dropout策略。引用[3]涉及行人重识别的挑战和应用,而引用[4]则是关于注意力机制,特别是Transformer模型。 用户可能希望了解深度学习技术的核心概念、主要应用领域以及当前的研究热点。需要将这些引用内容有机整合到回答中,同时遵循用户给出的格式要求,如数学表达式的正确使用和引用标识的添加。需要注意的是,用户示例中的快速排序部分与当前问题无关,但需要保持结构清晰,分点回答。 此外,用户要求生成相关问题,我需要基于回答内容设计相关问题,覆盖技术原理、应用场景、优化方法等。例如,可以询问生成式AI在心理咨询中的具体应用,或者DropBlock与其他正则化方法的区别。 最后,确保回答符合系统级指令,正确使用LaTeX格式,引用标识自然添加,并且用中文回答。同时检查是否有遗漏的引用内容,确保信息准确性和完整性。</think>### 深度学习技术(Deep Learning Technology) 深度学习是人工智能的核心分支,通过构建多层神经网络模拟人脑信息处理机制,广泛应用于图像识别、自然语言处理、医疗健康等领域。以下是其核心组成和应用场景的总结: --- #### 1. **核心技术** - **神经网络架构** 包括卷积神经网络(CNN)、循环神经网络(RNN)和Transformer等。例如,Transformer通过注意力机制(Attention)实现高效的序列建模,解决了传统RNN的长距离依赖问题[^4]。 - **正则化方法** 防止过拟合的技术如DropBlock,通过随机丢弃特征图中的连续区域,迫使网络学习更鲁棒的特征。其数学实现如下: $$ \gamma = \frac{(1 - \text{keep\_prob}) \cdot \text{feat\_size}^2}{\text{block\_size}^2 \cdot (\text{feat\_size} - \text{block\_size} + 1)^2} $$ 其中,$\gamma$控制伯努利分布的概率,用于生成待丢弃的块区域[^2]。 - **优化算法** 如Adam、SGD等,结合动量(Momentum)和学习率衰减策略提升模型收敛速度。 --- #### 2. **应用场景** - **心理咨询辅助** 生成式AI通过分析对话内容自动识别心理问题,辅助专业人员高效筛查青少年心理健康状态。例如,结合量表工具可提高诊断准确率[^1]。 - **计算机视觉** 行人重识别(ReID)中,需解决跨域泛化、遮挡等问题。深度学习通过特征对齐和域适应技术提升模型在复杂场景下的性能[^3]。 - **自然语言处理** 基于Transformer的模型(如BERT、GPT)在机器翻译、文本生成等任务中表现突出,依赖多头注意力机制捕捉上下文语义[^4]。 --- #### 3. **挑战与优化** - **数据效率** 无监督学习和弱监督学习成为研究热点,例如利用对比学习减少对标注数据的依赖[^3]。 - **模型泛化** 正则化技术(如DropBlock、Cutout)通过结构化丢弃增强泛化能力[^2]。 - **计算资源** 模型轻量化方法(如知识蒸馏、剪枝)和硬件加速(GPU/TPU)是关键优化方向。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值