dropout函数详解及反向传播中的梯度求导

摘要

本文给出 dropout 函数的定义, 并求解其在反向传播中的梯度

相关

配套代码, 请参考文章 :

Python和PyTorch对比实现dropout函数及反向传播

系列文章索引 :
https://blog.csdn.net/oBrightLamp/article/details/85067981

正文

1. dropout 的概念

深度神经网络结构的过拟合是指 : 在训练集上的正确率很高, 但在测试集上的准确率很低.
为了缓解网络过拟合的问题, 其中一种常见的办法是使用 dropout 函数.

dropout 是指在深度网络的训练中, 以一定的概率随机地 “临时丢弃” 一部分神经元节点. 具体来讲, dropout 作用于每份小批量训练数据, 由于其随机丢弃部分神经元的机制, 相当于每次迭代都在训练不同结构的神经网络.

– 摘抄自 <百面机器学习>

dropout 前网络结构示意 :
在这里插入图片描述
图片来源 : https://www.jianshu.com/p/2c6978b4bf74

dropout 后网络结构示意 :
在这里插入图片描述
图片来源 : https://www.jianshu.com/p/2c6978b4bf74

2. dropout 的作用

dropout 最直接的作用就是可以提升模型的泛化能力, 提高模型的健壮性, 提高通用性.

如何理解 ?

假设某公司存在一个职能稳定, 合理分工团队.

因为某些不可避免的原因, 该团队的成员每天都有 50% 概率不能参与工作.

为了完成任务, 需要其他同事加班完成缺席员工任务.

一段时间后, 该团队的成员普遍学会了其他同事的相关工作技能.

于是, 该团队拥有了更好的泛化能力.

3. 训练过程中的 dropout

为了定义 dropout, 我们需要一个随机数生成函数 rand(), 每一次调用都会重新生成一个0~1之间的小数 :
0 ⩽ r a n d ( ) &lt; 1 &ThickSpace; 0\leqslant rand() &lt; 1 \;\\ 0rand()<1

假设每一次 dropout 都以 p 的概率随机丢弃一个节点 :
0 ⩽ p &lt; 1 0\leqslant p &lt; 1 0p<1

则 dropout 函数的定义为 :
r = r a n d ( ) &ThickSpace; d r o p o u t ( x ) = { 0 , r &lt; p x / ( 1 − p ) , r ⩾ p r = rand()\\ \;\\ dropout(x) = \left\{ \begin{array}{rr} 0, &amp; r &lt; p\\ x / (1 - p), &amp; r \geqslant p \end{array} \right. r=rand()dropout(x)={0,x/(1p),r<prp

将通过的信号被放大 1 / ( 1 − p ) 1/(1 - p) 1/(1p) 倍, 保证总体信号强度不变 (加班).

dropout函数是逐个元素处理的, 并不需要写成向量的形式.
但为了方便编程实现, 这里将其进行改编成向量的形式.

考虑一个输入向量 x, 同时定义一个随机掩码函数和一个随机掩码向量 m :
x = ( x 1 , x 2 , x 3 , ⋯ &ThinSpace; , x k ) &ThickSpace; r i = r a n d ( ) &ThickSpace; r a n d o m M a s k ( x i ) = { 0 , r i &lt; p 1 / ( 1 − p ) , r i ⩾ p &ThickSpace; m i = r a n d o m M a s k ( x i ) x = (x_1,x_2,x_3,\cdots,x_k)\\ \;\\ r_i = rand()\\ \;\\ randomMask(x_i) = \left\{ \begin{array}{rr} 0, &amp; r_i &lt; p\\ 1/ (1 - p), &amp; r_i \geqslant p \end{array} \right.\\ \;\\ m_i = randomMask(x_i) x=(x1,x2,x3,,xk)ri=rand()randomMask(xi)={0,1/(1p),ri<pripmi=randomMask(xi)

dropout 函数可用向量运算表示为 :
d r o p o u t ( x ) = x ⊙ m = ( x 1 m 1 , x 2 m 2 , x 3 m 3 , ⋯ &ThinSpace; , x k m k ) dropout(x)=x \odot m = (x_1m_1,x_2m_2,x_3m_3,\cdots,x_km_k) dropout(x)=xm=(x1m1,x2m2,x3m3,,xkmk)

式子中的 ⊙ \odot 表示元素积, 即同位元素相乘.

3. 测试过程中的 dropout

训练完成后, 恢复完整的网络结构:
d r o p o u t ( x ) = x dropout(x) = x dropout(x)=x

4. 反向传播 :

考虑一个输入向量 x , 经丢弃概率为 p p p 的 dropout 函数变换后得到向量 d, 往前 forward 传播得到误差值 error (标量 e ), 求在训练过程中 e 对 x 的梯度.
x = ( x 1 , x 2 , x 3 , ⋯ &ThinSpace; , x k ) &ThickSpace; d = d r o p o u t ( x ) &ThickSpace; e = f o r w a r d ( d ) x =( x_1,x_2,x_3,\cdots,x_k) \\ \;\\ d = dropout(x)\\ \;\\ e = forward(d) x=(x1,x2,x3,,xk)d=dropout(x)e=forward(d)

求解过程 :
∇ e ( d ) = ( ∂ e ∂ d 1 , ∂ e ∂ d 2 , ∂ e ∂ d 3 , ⋯ &ThinSpace; , ∂ e ∂ d k ) &ThickSpace; ∂ e ∂ x i = ∂ e ∂ d i ∂ d i ∂ x i &ThickSpace; ∂ d i ∂ x i = { 0 , r i &lt; p 1 / ( 1 − p ) , r i ⩾ p \nabla e_{(d)} = (\frac{\partial e}{\partial d_1},\frac{\partial e}{\partial d_2},\frac{\partial e}{\partial d_3}, \cdots ,\frac{\partial e}{\partial d_k}) \\ \;\\ \frac{\partial e}{\partial x_i} = \frac{\partial e}{\partial d_i}\frac{\partial d_i}{\partial x_i} \\ \;\\ \frac{\partial d_i}{\partial x_i} = \left\{ \begin{array}{rr} 0, &amp; r_i &lt; p\\ 1 / (1 - p), &amp; r_i \geqslant p \end{array} \right. e(d)=(d1e,d2e,d3e,,dke)xie=diexidixidi={0,1/(1p),ri<prip

利用上例的掩码向量, 梯度可用向量表示为 :
∇ e ( x ) = ∇ e ( d ) ⊙ ( m 1 , m 2 , m 3 , ⋯ &ThinSpace; , m k ) \nabla e_{(x)} = \nabla e_{(d)}\odot (m_1,m_2,m_3,\cdots,m_k) e(x)=e(d)(m1,m2,m3,,mk)

向量 ∇ e ( d ) \nabla e_{(d)} e(d) 由上游负责计算, 是已知的, ⊙ \odot 表示元素积, 即同位元素相乘.

  • 35
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值