Dropout正则化
目录
Dropout
在标准dropout正则化中,通过按保留(未丢弃)的节点的分数进行归一化来消除每一层的偏差。换言之,每个中间激活值h以保留概率概率p由随机变量替换(即drop经过神经元后的值代替drop神经元)
\[ h^{'}= \begin{cases} 0, \quad 概率为1-p \\\\ \frac{h}{p}, \quad 概率为p \end{cases} \]
注意期望不要变,即
\[
E[h^{'}] = (1-p)*0 + p *\frac{h}{p} = h
\]
也可以训练时非丢弃单元不除以概率p,而是测试时模型参数乘以p,这样可以保证训练集和测试集的期望相同。和上面的效果相同。
注意:正则项(Dropout)只在训练过程中使用,因为其会影响模型参数的更新
所以在推理过程中,丢弃法直接返回输入。
代码
import torch
from torch import nn
from d2l import torch as d2l
import torchvision
from torchvision import transforms
from torch.utils import data
def dropout_layer(X,dropout):
assert 0<=dropout <= 1
# 如果keep_prob设置为1,全部元素被保留
if dropout == 1:
return X
# 如果keep_prob设置为0,全部元素被丢弃
if dropout == 0:
return torch.zeros_like(X)
= (torch.rand(X.shape) < dropout).float() #使用mask而不是直接置零是为了提高计算效率
mask return mask * X/(dropout)