forward过程
假设以概率 p p p丢弃 K K K维输入向量 x = [ x 1 , x 2 , , , x K ] x=[x_1, x_2, ,, x_K] x=[x1,x2,,,xK]的某些值。
那么经过dropout之后的向量定义为 d d d,有
x ′ = d r o p o u t ( x ) x' = dropout(x) x′=dropout(x)
这个过程相当于生成一个随机的 K K K维的mask,这个mask的生成过程如下:
r = r a n d ( K ) = [ r 1 , r 2 , , , r K ] , 其 中 0 < r i < 1 。 m a s k = { 0 r i < p 1 r i ≥ p r = rand(K) = [r_1, r_2, ,,r_K], 其中0<r_i <1。 \\ mask = \left\{ \begin{aligned} 0 \ \ \ \ r_i < p \\ 1 \ \ \ \ r_i \ge p \end{aligned} \right. r=rand(K)=[r1,r2,,,rK],其中0<ri<1。mask={
0 ri<p1 ri≥p
然后 x x x与 m a s k mask mask做对应元素点乘(这个操作记为 @ @ @)。也就是
x ′ = d r o p o u t ( x ) = x @ m a s k x' = dropout(x) = x@mask x′=dropout(x)=x@mask
这样的设计的dropout会出现一些问题。在训练的时候,dropout工作, x x x经过dropout之后的期望为
E [ x ] = p ∗ 0 + ( 1 − p ) ∗ x = ( 1 − p ) x E[x] = p*0 + (1-p)*x = (1-p)x E[x]=p∗0+(1−p)∗x=(1−p)x
在测试的时候,dropout是不工作的,此时 x x x的期望是 x x x。这样导致训练和测试的期望不一样,模型会不稳定。为了让训练时候 x x x的期望和测试时一直,一种做法是在训练时将dropout后的结果除以 1 − p 1-p 1−p。这时也就相当于将mask变为:
r = r a n d ( K ) = [ r 1 , r 2 , , , r K ] , 其 中 0 < r i < 1 。 m a s k = { 0 r i < p 1 1 − p r i ≥ p r = rand(K) = [r_1, r_2, ,,r_K], 其中0<r_i <1。 \\ mask = \left\{ \begin{aligned} 0 \ \ \ \ r_i < p \\ {1 \over 1-p} \ \ \ \ r_i \ge p \end{aligned} \right. r=rand(K)=[r1,r2,,,rK],其中0<ri<1。mask=⎩⎪⎨⎪⎧0 ri<p1−p1 ri≥p
backward
假设模型forward之后的loss是 l l l,如何求反向传播时 l l l对 x x x的梯度?
x = [ x 1 , x 2 , . . . , x K ] x ′ = d r o p o u t ( x ) = x @ m a s k l = f o r w a r d ( x ′ ) x = [x_1, x_2, ..., x_K] \\ x' = dropout(x) = x@mask \\ l = forward(x') x=[x1,x2,...,xK]x′=dropout(x)=x@maskl=forward(x′)
那么 d l d x = d l d x ′ d x ′ d x {dl \over dx} = {dl \over dx'}{dx' \over dx} dxdl=dx′dldxdx′
其中
d x ′ d x = { 0 r i < p 1 1 − p r i ≥ p {dx' \over dx} = \left\{ \begin{aligned} 0 \ \ \ \ r_i < p \\ {1 \over 1-p} \ \ \ \ r_i \ge p \end{aligned} \right. dxdx′=⎩⎪⎨⎪⎧0 ri<p1−p1 ri≥p