概念
- 一种正则化方法
- 在训练过程中随机丢弃神经元节点和输入输出的连接
- 对于大小固定的模型,最好的正则化手段是对所有可能的参数集合做平均预测,根据训练数据的后验概率对每个集合做weighting。
- 对每层设置一个dropout probability
- 对每个batch随机决定一个神经元是否被移除
- Inverse dropout当dropout在预测时被关闭时,用设置好的probability scale activtions 以保持总体的度量一致。
具体实现
- 定义
m
i
m^i
mi矩阵,纬度和每层一致,神经元随机被移除的概率p服从伯努利分布,每次迭代
m
i
m^i
mi会变化
- 训练时,用隐层和m矩阵做点积运算再除以p。
- 测试时关闭dropout
- 除了输出层都可以被应用
- 训练时的梯度是m/p和该隐藏梯度的哈达玛积
Code
keep_prob = 0.5
def train_step(X):
hidden_layer_1 =np.maximum(0, np.dot(W1, X) +b1)
dropout_mask_1 =np.random.binomial(1, keep_prob, hidden_layer_1.shape) /keep_prob
hidden_layer_1 *=dropout_mask_1
hidden_layer_2 =np.maximum(0, np.dot(W2, hidden_layer_1) +b2)
dropout_mask_2 =np.random.binomial(1, keep_prob, hidden_layer_2.shape) /keep_prob
hidden_layer_2 *=dropout_mask_2
out =np.dot(W3, hidden_layer_2) +b3
# backward pass: compute gradients... (not shown)
# perform parameter update... (not shown)
def predict(X):
# ensembled forward pass
hidden_layer_1 =np.maximum(0, np.dot(W1, X) +b1)
hidden_layer_2 =np.maximum(0, np.dot(W2, hidden_layer_1) +b2)
out =np.dot(W3, hidden_layer_2) +b3
why work?
- 打破了神经元间的共同适应,从而找到更general的feature
- 通过ensembling(averaging)多个networks,每个network relying on 不同的feature,从而得到更有效的模型(集成学习)