丢弃法
- 动机:一个好的模型需要对输入进行扰动
- 使用有噪音得数据等价于Tikhonov正则
- 丢弃法:在层之间加入噪音
- 无偏差地加入噪音(加入噪音之后,期望不变)
- 正则项只在训练中使用:他们影响的是模型参数的更新,在预测/推理过程中,丢弃法直接返回输出
- 总结
- 丢弃法将一些输出项随机置0来控制模型的复杂度
- 常作用在多层感知机的隐藏层的输出上
- 丢弃的概率是控制模型复杂度的超参数
代码讲解
class Net(nn.Module):
#is_training的作用在于判断是在训练还是预测 预测的时候不会使用dropout
def __init__(self,num_inputs,num_outputs,num_hiddens1,num_hiddens2,is_training=True):
super(Net,self).__init__()
self.num_inputs = num_inputs
self.training = is_training
self.lin1 = nn.Linear(num_inputs,num_hiddens1)
self.lin2 = nn.Linear(num_hiddens1,num_hiddens2)
self.lin3 = nn.Linear(num_hiddens2,num_outputs)
self.relu = nn.ReLU()
def forward(self,X):
H1 = self.relu(self.lin1(X.reshape((-1, self.num_inputs))))
if self.training == True:
H1 = dropout_layer(H1,dropout1)
H2 = self.relu(self.lin2(H1))
if self.training == True:
H2 = dropout_layer(H2,dropout2)
out = self.lin3(H2)
return out
数值稳定性
- 梯度爆炸和梯度消失问题,常发生在深度模型中
- 如何让训练更加稳定
- 将乘法变加法:ResNet、Lstm
- 归一化
- 合理的权重初始和激活函数
- 让每层的方差是一个常数
- 让每层的输出和梯度都看作随机变量
- 让它们的均值和方差都保持一致