循环神经网络六-Pytorch中的序列化器

目录

一.梯度消失

二.梯度爆炸

三.解决梯度消失或者爆炸

四序列化器

1.nn.sequential

2.nn.BatchNormld

3.nn.Dropout


一.梯度消失

假设我们由四层神经网络,每一次只有一个神经元X

那么在计算它的梯度的时候就有:▽w1 = x1f(a1)’w2f(b1)’w3*▽out

如果我们使用的激活函数是sigmoid,而sigmoid的导数图为:

假设每层都取得sigmoid导数的最大值1/4,那么在反向传播的时候

X1=0.5,w1=w2=w3=0.5

\nabla w1< \frac{1}{2} * \frac{1}{4}* \frac{1}{2}* \frac{1}{4}*\frac{1}{2}*\nabla out = \frac{1}{2^7} \nabla out

当权重初始过小或者使用易饱和神经元sigmoid在y=0,1处梯度接近0,而无法更新参数时神经网络在反向传播呈现指数倍缩小,产生消失现象

二.梯度爆炸

假设X2=2,w1=w2=w3=2

当权重过初始值过大时,梯度神经网络在反向传播时也呈现指数倍放大,产生爆炸现象

三.解决梯度消失或者爆炸

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) 
             )

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值