随机失活,dropout,2012年于AlexNet中被提出。
Note :
按概率p 随机 将神经元 置 0 [如下(b)图]
,以 缓解 神经元之间 隐形的协同适应,从而达到降低模型复杂度的目的:
别看dropout之后的网络只是原网络的一个 子网络 ,复杂度不比原网络。但由于每个神经元的dropout是 随机dropout,因此每一轮都相当于在一个 新的 子网络上训练。那么最终得到的模型便是 无数个 子网络 共同训练 的成果,效果自然会更好。
然后麻烦也来了,训练阶段的每个神经元要事先添加一道概率流程:
对应的公式变化如下如下:
Tensorflow 中的 dropout API 如下:
tf.nn.dropout
其中,根据 keep_prob参数项 随机进行 dropout 。
# coding=utf-8
import tensorflow as tf
import numpy as np
inputs = np.random.uniform(-10, 10, size=[3, 3])
features = tf.placeholder_with_default(input=inputs, shape=[3, 3])
# 随机失活
output_dropout = tf.nn.dropout(features, keep_prob=0.5)
with tf.Session() as sess:
print ("\nfeatures :\n{}".format(sess.run(features)))
print ("\n----------\n")
print ("\ndropout :\n{}".format(sess.run(output_dropout)))
features :
[[ 0.53874537 -3.09047282 -2.88714205]
[-1.92602402 -1.56025457 3.64309646]
[-9.13147387 8.37367913 -7.9849204 ]]
----------
dropout :
[[ 0. -6.18094565 -5.77428411]
[ -0. -3.12050914 7.28619293]
[-18.26294775 16.74735827 -0. ]]
所有 神经元均呈 激活态,但其权重 需乘上 ppp 以保证各权重能有和 训练阶段 相同的 期望值 :
[1] 解析卷积神经网络—深度学习实践手册 [2] 理解dropout