假设以概率
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
假设模型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