目录
一.梯度消失
二.梯度爆炸
三.解决梯度消失或者爆炸
四序列化器
1.nn.sequential
2.nn.BatchNormld
3.nn.Dropout
一.梯度消失
假设我们由四层神经网络,每一次只有一个神经元X
那么在计算它的梯度的时候就有:▽w1 = x1f(a1)’w2f(b1)’w3*▽out
如果我们使用的激活函数是sigmoid,而sigmoid的导数图为:
假设每层都取得sigmoid导数的最大值1/4,那么在反向传播的时候
当权重初始过小或者使用易饱和神经元sigmoid在y=0,1处梯度接近0,而无法更新参数时神经网络在反向传播呈现指数倍缩小,产生消失现象
二.梯度爆炸
假设
当权重过初始值过大时,梯度神经网络在反向传播时也呈现指数倍放大,产生爆炸现象
三.解决梯度消失或者爆炸
1.替换易训练神经元
2.改进优化算法,使用adam算法
3.使用 batch normalization
四序列化器
1.nn.sequential
这是一个有序的容器,其中传入的是构造器类(各种用来处理输入数据的类),最终输入数据会被sequential中的构造类依次执行
layer = nn.Sequential(
nn.Linear(input_dim, n_hidden_1),
nn.ReLU(True), #inplace=False 是否对输入进行就地修改,默认为False
nn.Linear(n_hidden_1, n_hidden_2),
nn.ReLU(True),
nn.Linear(n_hidden_2, output_dim) # 最后一层不需要添加激活函数
)
在上述构造中,可以直接调用layer(x),得到的输出x的倍执行顺序就是Sequential中定义的顺序:
1.倍隐层1执行,形状改变为[batch_size ,n_hidden_1]
2.倍relu执行,形状不变
3.被隐层2执行,形状变成[batch_size, n_hidden_2]
4.被relu执行,形状不变
5.被最后一层执行,形状变成[batch_size,output_dim]
2.nn.BatchNormld
翻译成中文就是批量规范化,就是在每个样本训练的过程中,对参数进行归一化处理,从而达到加快训练速度的效果
以sigmoid为例,在反向传播的过程中,在值为0,1的时候,梯度接近0,导致参数被更新的幅度很小,训练速度很漫,但是如果对数据进行归一化处理,将数据压缩在[0-1]之间,从而让参数更新的幅度变大,提高训练速度
batchNorm一般会放到激活函数之后,即对输入进行激活处理之后再进入batchNorm
layer = nn.Sequential(
nn.Linear(input_dim, n_hidden_1),
nn.ReLU(True),
nn.BatchNorm1d(n_hidden_1)
nn.Linear(n_hidden_1, n_hidden_2),
nn.ReLU(True),
nn.BatchNorm1d(n_hidden_2)
nn.Linear(n_hidden_2, output_dim)
)
3.nn.Dropout
dropout在前面已经介绍过,可以理解为对参数的随机失活
1.增加模型的稳定性
2.解决过拟合问题
3.可理解为训练后的模型是多个模型组合之后的结果,类似随机森林
layer = nn.Sequential(
nn.Linear(input_dim, n_hidden_1),
nn.ReLU(True),
nn.BatchNorm1d(n_hidden_1)
nn.Dropout(0.3) #0.3 为dropout的比例,默认值为0.5
nn.Linear(n_hidden_1, n_hidden_2),
nn.ReLU(True),
nn.BatchNorm1d(n_hidden_2)
nn.Dropout(0.3)
nn.Linear(n_hidden_2, output_dim)
)