长沙做企业网站的公司wordpress加载谷歌
news/
2025/10/1 11:14:52/
文章来源:
长沙做企业网站的公司,wordpress加载谷歌,计算机专业主要学什么前景怎么样,和规划网站如何一、梯度消失与爆炸
在神经网络中#xff0c;梯度消失和梯度爆炸是训练过程中常见的问题。
梯度消失指的是在反向传播过程中#xff0c;梯度逐渐变小#xff0c;导致较远处的层对参数的更新影响较小甚至无法更新。这通常发生在深层网络中#xff0c;特别是使用某些激活函…一、梯度消失与爆炸
在神经网络中梯度消失和梯度爆炸是训练过程中常见的问题。
梯度消失指的是在反向传播过程中梯度逐渐变小导致较远处的层对参数的更新影响较小甚至无法更新。这通常发生在深层网络中特别是使用某些激活函数如sigmoid函数时。当梯度消失发生时较浅层的权重更新较大而较深层的权重更新较小使得深层网络的训练变得困难。
梯度爆炸指的是在反向传播过程中梯度逐渐变大导致权重更新过大网络无法收敛。这通常发生在网络层数较多权重初始化过大或者激活函数的导数值较大时。
为了解决梯度消失和梯度爆炸问题可以采取以下方法
权重初始化合适的权重初始化可以缓解梯度消失和梯度爆炸问题。常用的方法包括Xavier初始化和He初始化。使用恰当的激活函数某些激活函数如ReLU、LeakyReLU可以缓解梯度消失问题因为它们在正半轴具有非零导数。批归一化Batch Normalization通过在每个批次的输入上进行归一化可以加速网络的收敛并减少梯度消失和梯度爆炸的问题。梯度裁剪Gradient Clipping设置梯度的上限防止梯度爆炸。减少网络深度减少网络的层数可以降低梯度消失和梯度爆炸的风险。
综上所述梯度消失和梯度爆炸是神经网络中常见的问题可以通过合适的权重初始化、激活函数选择、批归一化、梯度裁剪和减少网络深度等方法来缓解这些问题。 二、Xavier初始化
对于具有饱和函数如Sigmoid、Tanh的激活函数和方差一致性的要求可以推导出权重矩阵的初始化范围。 假设输入的维度为 n_in权重矩阵为 W我们希望满足方差一致性的要求
方差一致性
保持数据尺度维持在恰当范围通常方差为1
激活函数ReLU及其变种 三、十种初始化方法
以下是常用的权重初始化方法
Xavier均匀分布Xavier Uniform Distribution根据输入和输出的维度从均匀分布中采样权重范围为 [-a, a]其中 a sqrt(6 / (n_in n_out))。适用于具有饱和函数如Sigmoid、Tanh的激活函数。Xavier正态分布Xavier Normal Distribution根据输入和输出的维度从正态分布中采样权重均值为 0标准差为 sqrt(2 / (n_in n_out))。适用于具有饱和函数的激活函数。Kaiming均匀分布Kaiming Uniform Distribution根据输入维度从均匀分布中采样权重范围为 [-a, a]其中 a sqrt(6 / n_in)。适用于具有ReLU激活函数的网络。Kaiming正态分布Kaiming Normal Distribution根据输入维度从正态分布中采样权重均值为 0标准差为 sqrt(2 / n_in)。适用于具有ReLU激活函数的网络。均匀分布Uniform Distribution从均匀分布中采样权重范围为 [-a, a]其中 a 是一个常数。正态分布Normal Distribution从正态分布中采样权重均值为 0标准差为 std。常数分布Constant Distribution将权重初始化为常数。正交矩阵初始化Orthogonal Matrix Initialization通过QR分解或SVD分解等方法初始化权重为正交矩阵。单位矩阵初始化Identity Matrix Initialization将权重初始化为单位矩阵。稀疏矩阵初始化Sparse Matrix Initialization将权重初始化为稀疏矩阵其中只有少数非零元素。
不同的初始化方法适用于不同的网络结构和激活函数选择合适的初始化方法可以帮助网络更好地进行训练和收敛。
nn.init.calculate_gain
nn.init.calculate_gain 是 PyTorch 中用于计算激活函数的方差变化尺度的函数。方差变化尺度是指激活函数输出值方差相对于输入值方差的比例。这个比例对于初始化神经网络的权重非常重要可以影响网络的训练和性能。
主要参数如下
nonlinearity激活函数的名称用字符串表示比如 ‘relu’、‘leaky_relu’、‘tanh’ 等。param激活函数的参数这是一个可选参数用于指定激活函数的特定参数比如 Leaky ReLU 的 negative_slope。
这个函数的返回值是一个标量表示激活函数的方差变化尺度。在初始化网络权重时可以使用这个尺度来缩放权重以确保网络在训练过程中具有良好的数值稳定性。
例如可以在初始化网络权重时使用 nn.init.xavier_uniform_ 或 nn.init.xavier_normal_并通过 calculate_gain 函数计算激活函数的方差变化尺度将其作为相应初始化方法的参数。这样可以根据激活函数的特性来调整权重的初始化范围有助于更好地训练神经网络。
小案例
import os
import torch
import random
import numpy as np
import torch.nn as nn
from tools.common_tools import set_seedset_seed(1) # 设置随机种子class MLP(nn.Module):def __init__(self, neural_num, layers):super(MLP, self).__init__()self.linears nn.ModuleList([nn.Linear(neural_num, neural_num, biasFalse) for i in range(layers)])self.neural_num neural_numdef forward(self, x):for (i, linear) in enumerate(self.linears):x linear(x)x torch.relu(x)print(layer:{}, std:{}.format(i, x.std()))if torch.isnan(x.std()):print(output is nan in {} layers.format(i))breakreturn xdef initialize(self):for m in self.modules():if isinstance(m, nn.Linear):# nn.init.normal_(m.weight.data, stdnp.sqrt(1/self.neural_num)) # normal: mean0, std1# a np.sqrt(6 / (self.neural_num self.neural_num))## tanh_gain nn.init.calculate_gain(tanh)# a * tanh_gain## nn.init.uniform_(m.weight.data, -a, a)# nn.init.xavier_uniform_(m.weight.data, gaintanh_gain)# nn.init.normal_(m.weight.data, stdnp.sqrt(2 / self.neural_num))nn.init.kaiming_normal_(m.weight.data)flag 0
# flag 1if flag:layer_nums 100neural_nums 256batch_size 16net MLP(neural_nums, layer_nums)net.initialize()inputs torch.randn((batch_size, neural_nums)) # normal: mean0, std1output net(inputs)print(output)# calculate gain # flag 0
flag 1if flag:# 生成随机张量并通过tanh激活函数计算输出x torch.randn(10000)out torch.tanh(x)# 计算激活函数增益gain x.std() / out.std()print(gain:{}.format(gain))# 使用PyTorch提供的calculate_gain函数计算tanh激活函数的增益tanh_gain nn.init.calculate_gain(tanh)print(tanh_gain in PyTorch:, tanh_gain)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923787.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!