权值初始化

一、梯度消失与爆炸

在神经网络中,梯度消失和梯度爆炸是训练过程中常见的问题。

梯度消失指的是在反向传播过程中,梯度逐渐变小,导致较远处的层对参数的更新影响较小甚至无法更新。这通常发生在深层网络中,特别是使用某些激活函数(如sigmoid函数)时。当梯度消失发生时,较浅层的权重更新较大,而较深层的权重更新较小,使得深层网络的训练变得困难。

梯度爆炸指的是在反向传播过程中,梯度逐渐变大,导致权重更新过大,网络无法收敛。这通常发生在网络层数较多,权重初始化过大,或者激活函数的导数值较大时。

为了解决梯度消失和梯度爆炸问题,可以采取以下方法:

  • 权重初始化:合适的权重初始化可以缓解梯度消失和梯度爆炸问题。常用的方法包括Xavier初始化和He初始化。
  • 使用恰当的激活函数:某些激活函数(如ReLU、LeakyReLU)可以缓解梯度消失问题,因为它们在正半轴具有非零导数。
  • 批归一化(Batch Normalization):通过在每个批次的输入上进行归一化,可以加速网络的收敛,并减少梯度消失和梯度爆炸的问题。
  • 梯度裁剪(Gradient Clipping):设置梯度的上限,防止梯度爆炸。
  • 减少网络深度:减少网络的层数,可以降低梯度消失和梯度爆炸的风险。

综上所述,梯度消失和梯度爆炸是神经网络中常见的问题,可以通过合适的权重初始化、激活函数选择、批归一化、梯度裁剪和减少网络深度等方法来缓解这些问题。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、Xavier初始化

对于具有饱和函数(如Sigmoid、Tanh)的激活函数和方差一致性的要求,可以推导出权重矩阵的初始化范围。
假设输入的维度为 n_in,权重矩阵为 W,我们希望满足方差一致性的要求:
在这里插入图片描述

方差一致性:

保持数据尺度维持在恰当范围,通常方差为1

激活函数:ReLU及其变种
在这里插入图片描述


三、十种初始化方法

以下是常用的权重初始化方法:

  1. Xavier均匀分布(Xavier Uniform Distribution):根据输入和输出的维度,从均匀分布中采样权重,范围为 [-a, a],其中 a = sqrt(6 / (n_in + n_out))。适用于具有饱和函数(如Sigmoid、Tanh)的激活函数。
  2. Xavier正态分布(Xavier Normal Distribution):根据输入和输出的维度,从正态分布中采样权重,均值为 0,标准差为 sqrt(2 / (n_in + n_out))。适用于具有饱和函数的激活函数。
  3. Kaiming均匀分布(Kaiming Uniform Distribution):根据输入维度,从均匀分布中采样权重,范围为 [-a, a],其中 a = sqrt(6 / n_in)。适用于具有ReLU激活函数的网络。
  4. Kaiming正态分布(Kaiming Normal Distribution):根据输入维度,从正态分布中采样权重,均值为 0,标准差为 sqrt(2 / n_in)。适用于具有ReLU激活函数的网络。
  5. 均匀分布(Uniform Distribution):从均匀分布中采样权重,范围为 [-a, a],其中 a 是一个常数。
  6. 正态分布(Normal Distribution):从正态分布中采样权重,均值为 0,标准差为 std。
  7. 常数分布(Constant Distribution):将权重初始化为常数。
  8. 正交矩阵初始化(Orthogonal Matrix Initialization):通过QR分解或SVD分解等方法,初始化权重为正交矩阵。
  9. 单位矩阵初始化(Identity Matrix Initialization):将权重初始化为单位矩阵。
  10. 稀疏矩阵初始化(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, bias=False) 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, std=np.sqrt(1/self.neural_num))    # normal: mean=0, std=1# 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, gain=tanh_gain)# nn.init.normal_(m.weight.data, std=np.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: mean=0, std=1output = 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.rhkb.cn/news/237219.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TDengine 签约西电电力

近年来,随着云计算和物联网技术的迅猛发展,传统电力行业正朝着数字化、信息化和智能化的大趋势迈进。在传统业务基础上,电力行业构建了信息网络、通信网络和能源网络,致力于实现发电、输电、变电、配电和用电的实时智能联动。在这…

用C#实现简单的线性回归

前言 最近注意到了NumSharp,想学习一下,最好的学习方式就是去实践,因此从github上找了一个用python实现的简单线性回归代码,然后基于NumSharp用C#进行了改写。 NumSharp简介 NumSharp(NumPy for C#)是一…

[redis] redis主从复制,哨兵模式和集群

一、redis的高可用 1.1 redis高可用的概念 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 高可用的计算公式是1-(宕机时间)/(宕机时…

leetcode17 电话号码的字母组合

方法1 if-else方法 if-else方法的思路及其简单粗暴,如下图所示,以数字234为例,数字2所对应的字母是abc,数字3所对应的是def,数字4所对应的是ghi,最后所产生的结果就类似于我们中学所学过的树状图一样&…

opencv-4.8.0编译及使用

1 编译 opencv的编译总体来说比较简单,但必须记住一点:opencv的版本必须和opencv_contrib的版本保持一致。例如opencv使用4.8.0,opencv_contrib也必须使用4.8.0。 进入opencv和opencv_contrib的github页面后,默认看到的是git分支&…

浅析三种Anaconda虚拟环境创建方式和第三方包的安装

目录 引言 一、Anaconda虚拟环境创建方式 1. 使用conda命令创建虚拟环境 2. 使用conda-forge创建虚拟环境 3. 使用Miniconda创建虚拟环境 二、第三方包的安装和管理 1. 使用 pip 安装包: 2. 使用 conda 安装包: 三、结论与建议 引言 在当今的数…

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》 写在最前面私钥加密与伪随机性 第一部分密码学的计算方法论计算安全加密的定义:对称加密算法 伪随机性伪随机生成器(PRG) 规约法规约证明 构造安全…

Nacos和Eureka比较、统一配置管理、Nacos热更新、多环境配置共享、Nacos集群搭建步骤

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Nacos和eureka的对比二、统一配置管理二、Nacos热更新方式一方式二 三、多环境配置共享四、Nacos集群搭建步骤(黑马springCloud的p29&#xff0…

深度学习笔记(五)——网络优化(1):学习率自调整、激活函数、损失函数、正则化

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 通过学习已经掌握了主要的基础函数之后具备了搭建一个网络并使其正常运行的能力,那下一步我们还…

JavaScript基础(26)_dom增删改练习

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><title>DOM增删改练习</title><link rel"stylesheet" href"../browser_default_style/reset.css"><style>table {borde…

vue路由及参数router

目录 vue项目版本1、创建一个vue项目步骤 &#xff08;windows环境下&#xff09;。创建vue项目前&#xff0c;检查系统是否具备创建项目的条件&#xff08;是否已经安装好了node.js、webpack、vue-cli&#xff09;。cmd打开终端。2、vue路由vue-router解说2.1 路由视图<rou…

【GDAL】Windows下VS+GDAL开发环境搭建

Step.0 环境说明&#xff08;vs版本&#xff0c;CMake版本&#xff09; 本地的IDE环境是vs2022&#xff0c;安装的CMake版本是3.25.1。 Step.1 下载GDAL和依赖的组件 编译gdal之前需要安装gdal依赖的组件&#xff0c;gdal所依赖的组件可以在官网文档找到&#xff0c;可以根据…

Kafka(七)可靠性

目录 1 可靠的数据传递1.1 Kafka的可靠性保证1.2 复制1.3 Broker配置1.3.1 复制系数1.3.2 broker的位置分布1.3.3 不彻底的首领选举1.3.4 最少同步副本1.3.5 保持副本同步1.3.6 持久化到磁盘flush.messages9223372036854775807flush.ms9223372036854775807 1.2 在可靠的系统中使…

Netty开篇——基础介绍与准备(一)

I/O篇 Netty的介绍 Netty 是由JBOSS提供的一个Java开源框架在Github上Netty 是一个异步的、基于事件驱动的网络应用框架&#xff0c;用以快速开发高性能、高可靠性的网络IO程序。Netty 主要针对在TCP协议下面向客户端的高并发应用&#xff0c;或者Peer-to-Peer/P2P场景下的大量…

day17 平衡二叉树 二叉树的所有路径 左叶子之和

题目1&#xff1a;110 平衡二叉树 题目链接&#xff1a;110 平衡二叉树 题意 判断二叉树是否为平衡二叉树&#xff08;每个节点的左右两个子树的高度差绝对值不超过1&#xff09; 递归遍历 递归三部曲 1&#xff09;确定递归函数的参数和返回值 2&#xff09;确定终止条…

数据结构链表完整实现(负完整代码)

文章目录 前言引入1、链表定义及结构链表的分类3、单向不带头链表实现实现完整代码 4、带头双向循环链表实现实现完整代码 前言 引入 在上一篇文章中&#xff0c;我们认识了顺序表&#xff0c;但是在许多情况中&#xff0c;顺序表在处理一些事件时还存在许多问题&#xff0c;比…

鸿鹄电子招投标系统:企业战略布局下的采购寻源解决方案

在数字化采购领域&#xff0c;企业需要一个高效、透明和规范的管理系统。通过采用Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;我们打造了全过程数字化采购管理平台。该平台具备内外协同的能力&#xff0c;通过待办消息、招标公告、中标公告和信息发布等功能模块…

数据分析——快递电商

一、任务目标 1、任务 总体目的——对账 本项目解决同时使用多个快递发货&#xff0c;部分隔离区域出现不同程度涨价等情形下&#xff0c;如何快速准确核对账单的问题。 1、在订单表中新增一列【运费差异核对】来表示订单运费实际有多少差异&#xff0c;结果为数值。 2、将…

【无标题】关于异常处理容易犯的错

一般项目是方法打上 try…catch…捕获所有异常记录日志&#xff0c;有些会使用 AOP 来进行类似的“统一异常处理”。 其实&#xff0c;这种处理异常的方式非常不可取。那么今天&#xff0c;我就和你分享下不可取的原因、与异常处理相关的坑和最佳实践。 捕获和处理异常容易犯…

Feature Fusion for Online Mutual KD

paper&#xff1a;Feature Fusion for Online Mutual Knowledge Distillation official implementation&#xff1a;https://github.com/Jangho-Kim/FFL-pytorch 本文的创新点 本文提出了一个名为特征融合学习&#xff08;Feature Fusion Learning, FFL&#xff09;的框架&…