神经网络系列---权重初始化方法


文章目录

    • 权重初始化方法
      • Xavier初始化(Xavier initialization)
      • Kaiming初始化,也称为He初始化
      • LeCun 初始化
      • 正态分布与均匀分布
      • Orthogonal Initialization
      • Sparse Initialization
      • n_in和n_out
      • 代码实现


权重初始化方法

Xavier初始化(Xavier initialization)

是一种用于初始化神经网络权重的方法,也称为Glorot初始化。更有效地传播信号并减少梯度消失或梯度爆炸的问题。适用于激活函数为tanh或sigmoid的情况。

Xavier初始化的计算方法如下:

  1. Glorot(或 Xavier)初始化
    • 适用于激活函数如sigmoid和tanh。
    • 初始化公式: σ = 2 n in + n out \sigma = \sqrt{\frac{2}{n_{\text{in}} + n_{\text{out}}}} σ=nin+nout2
      其中, n in n_{\text{in}} nin 是输入单元数, n out n_{\text{out}} nout 是输出单元数。

对于单个神经元的权重w,从均匀分布正态分布中随机采样,具体取决于所选择的激活函数:

在这里插入图片描述

  1. 如果使用tanh激活函数,从均匀分布采样:
    • 采样范围:[-sqrt(6 / (n_in + n_out)), sqrt(6 / (n_in + n_out))]
    • 其中n_in是上一层的输入节点数量,n_out是当前层的输出节点数量。

在这里插入图片描述

  1. 如果使用sigmoid激活函数,从正态分布采样:
    • 均值:0
    • 方差:sqrt(2 / (n_in + n_out))
    • 其中n_in是上一层的输入节点数量,n_out是当前层的输出节点数量。

Kaiming初始化,也称为He初始化

  1. He 初始化
    • 适用于ReLU及其变种(如LeakyReLU)激活函数。
    • 初始化公式: σ = 2 n in \sigma = \sqrt{\frac{2}{n_{\text{in}}}} σ=nin2

这种初始化方法主要用于修正线性单元(Rectified Linear Units,ReLU)激活函数的神经网络。

与Xavier初始化适用于tanh和sigmoid等S型激活函数不同,Kaiming初始化专门针对ReLU激活函数的特性进行优化。ReLU是一个常用的非线性激活函数,它在输入大于零时保持不变,在输入小于等于零时输出为零。

Kaiming初始化的计算方法如下:

对于单个神经元的权重w,从均匀分布或正态分布中随机采样,具体取决于所选择的激活函数:

  1. 如果使用ReLU激活函数,从正态分布采样:

    • 均值:0
    • 方差:sqrt(2 / n_in)
    • 其中n_in是上一层的输入节点数量。
  2. 对于带有ReLU激活的卷积层,可以使用相同的初始化方法,只是需要考虑卷积层的输入通道数量(即n_in)。

LeCun 初始化

  • 适用于Sigmoid激活函数。
  • 初始化公式: σ = 1 n in \sigma = \sqrt{\frac{1}{n_{\text{in}}}} σ=nin1

正态分布与均匀分布

  • 使用较小的标准差(如0.01)从正态分布中采样权重。
  • 使用较小的范围(如-0.01到0.01)从均匀分布中采样权重。

Orthogonal Initialization

  • 使用正交矩阵初始化权重。这种初始化方法对于某些任务和模型架构可能很有益。

Sparse Initialization

  • 将大部分权重初始化为0,只初始化一小部分非零的权重。

n_in和n_out

n_inn_out分别表示神经网络层的输入节点数量和输出节点数量。这些节点也称为神经元,它们是网络的基本组成部分。

  • n_in:代表上一层(前一层)的节点数量,也就是当前层的输入数量。在神经网络中,每个神经元都会接收来自上一层所有节点的输入,这些输入被加权和后传递给当前神经元的激活函数。因此,n_in指的是上一层与当前层之间的连接数量。

  • n_out:代表当前层的节点数量,也就是当前层的输出数量。每个神经元会将经过激活函数处理后的结果传递给下一层所有节点,形成下一层的输入。因此,n_out指的是当前层与下一层之间的连接数量。

代码实现

#include <iostream>
#include <Eigen/Dense>
#include <random>
#include <cmath>Eigen::MatrixXd glorotInitialize(int rows, int cols);
Eigen::MatrixXd heInitialize(int rows, int cols);
Eigen::MatrixXd lecunInitialize(int rows, int cols);
Eigen::MatrixXd normalDistributionInitialize(int rows, int cols, double std_dev=0.01);
Eigen::MatrixXd uniformDistributionInitialize(int rows, int cols, double limit=0.01);
Eigen::MatrixXd orthogonalInitialize(int rows, int cols);
// Sparse Initialization需要额外参数来确定稀疏度,这里我们使用一个简化版本,指定一个非零的权重数。
Eigen::MatrixXd sparseInitialize(int rows, int cols, int nonZeroCount);//1. **Glorot (Xavier) Initialization**:Eigen::MatrixXd glorotInitialize(int rows, int cols) {std::random_device rd;std::mt19937 gen(rd());double limit = sqrt(6.0 / (rows + cols));std::uniform_real_distribution<> dis(-limit, limit);Eigen::MatrixXd matrix(rows, cols);for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {matrix(i, j) = dis(gen);}}return matrix;
}//**He Initialization**:Eigen::MatrixXd heInitialize(int rows, int cols) {std::random_device rd;std::mt19937 gen(rd());double std_dev = sqrt(2.0 / rows);std::normal_distribution<> dis(0, std_dev);Eigen::MatrixXd matrix(rows, cols);for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {matrix(i, j) = dis(gen);}}return matrix;
}//3. **LeCun Initialization**:Eigen::MatrixXd lecunInitialize(int rows, int cols) {std::random_device rd;std::mt19937 gen(rd());double std_dev = sqrt(1.0 / rows);std::normal_distribution<> dis(0, std_dev);Eigen::MatrixXd matrix(rows, cols);for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {matrix(i, j) = dis(gen);}}return matrix;
}//4. **Normal Distribution Initialization**:Eigen::MatrixXd normalDistributionInitialize(int rows, int cols, double std_dev) {std::random_device rd;std::mt19937 gen(rd());std::normal_distribution<> dis(0, std_dev);Eigen::MatrixXd matrix(rows, cols);for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {matrix(i, j) = dis(gen);}}return matrix;
}//5. **Uniform Distribution Initialization**:Eigen::MatrixXd uniformDistributionInitialize(int rows, int cols, double limit) {std::random_device rd;std::mt19937 gen(rd());std::uniform_real_distribution<> dis(-limit, limit);Eigen::MatrixXd matrix(rows, cols);for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {matrix(i, j) = dis(gen);}}return matrix;
}//6. **Orthogonal Initialization**:
Eigen::MatrixXd orthogonalInitialize(int rows, int cols) {// 创建一个随机矩阵std::random_device rd;std::mt19937 gen(rd());std::normal_distribution<> dis(0, 1);Eigen::MatrixXd randomMatrix(rows, cols);for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {randomMatrix(i, j) = dis(gen);}}// 使用QR分解获得正交矩阵Eigen::HouseholderQR<Eigen::MatrixXd> qr(randomMatrix);Eigen::MatrixXd orthogonalMatrix = qr.householderQ();// 如果您需要一个具有特定维度的正交矩阵(例如rows != cols),您可以选择一个子矩阵return orthogonalMatrix.block(0, 0, rows, cols);
}//7. **Sparse Initialization**:Eigen::MatrixXd sparseInitialize(int rows, int cols, int nonZeroCount) {Eigen::MatrixXd matrix = Eigen::MatrixXd::Zero(rows, cols);std::random_device rd;std::mt19937 gen(rd());std::uniform_real_distribution<> dis(-1, 1);for(int i = 0; i < nonZeroCount; i++) {int r = rand() % rows;int c = rand() % cols;matrix(r, c) = dis(gen);}return matrix;
}
int main() {int rows = 5;int cols = 5;// Glorot InitializationEigen::MatrixXd weights_glorot = glorotInitialize(rows, cols);std::cout << "Glorot Initialized Weights:" << std::endl << weights_glorot << std::endl << std::endl;// He InitializationEigen::MatrixXd weights_he = heInitialize(rows, cols);std::cout << "He Initialized Weights:" << std::endl << weights_he << std::endl << std::endl;// LeCun InitializationEigen::MatrixXd weights_lecun = lecunInitialize(rows, cols);std::cout << "LeCun Initialized Weights:" << std::endl << weights_lecun << std::endl << std::endl;// Normal Distribution InitializationEigen::MatrixXd weights_normal = normalDistributionInitialize(rows, cols);std::cout << "Normal Distribution Initialized Weights:" << std::endl << weights_normal << std::endl << std::endl;// Uniform Distribution InitializationEigen::MatrixXd weights_uniform = uniformDistributionInitialize(rows, cols);std::cout << "Uniform Distribution Initialized Weights:" << std::endl << weights_uniform << std::endl << std::endl;// Sparse Initializationint nonZeroCount = 10; // As an example, set 10 weights to non-zero valuesEigen::MatrixXd weights_sparse = sparseInitialize(rows, cols, nonZeroCount);std::cout << "Sparse Initialized Weights with " << nonZeroCount << " non-zero values:" << std::endl << weights_sparse << std::endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/700353.shtml

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

相关文章

关于uniapp H5应用无法在触摸屏正常显示的处理办法

关于uniapp H5应用无法在触摸屏正常显示的处理办法 1、问题2、处理3、建议 1、问题 前几天&#xff0c; 客户反馈在安卓触摸大屏上无法正确打开web系统&#xff08;uni-app vue3开发的h5 应用&#xff09;&#xff0c;有些页面显示不出内容。该应用在 pc 端和手机端都可以正常…

【递归版】归并排序算法(1)

目录 MergeSort归并排序 整体思想 图解分析 代码实现 时间复杂度 递归&归并排序VS快速排序 MergeSort归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法&#xff08;Divide and Conquer&a…

元宇宙与大模型的关系

元宇宙与大模型之间存在密切的关系&#xff0c;它们可以相辅相成&#xff0c;共同构建一个更加复杂、真实和全面的虚拟世界。 元宇宙的概念&#xff1a;元宇宙是一个包容性的虚拟世界&#xff0c;涵盖了虚拟现实、增强现实和混合现实等多种技术&#xff0c;以及人工智能、区块…

Golang性能分析神器:pprof与火焰图实战揭秘

文章目录 性能分析的重要性性能分析的维度 pprof简介pprof的作用pprof的工作原理 使用pprof进行性能分析采样方式数据分析实战案例火焰图 深入理解pprof的采样机制CPU采样如何启动CPU采样 Goroutine采样如何启动Goroutine采样 内存采样如何启动内存采样 阻塞和锁竞争采样如何启…

Linux第65步_学习“Makefie”

学习“Makefie”&#xff0c;为后期学习linux驱动开发做铺垫。 1、在“/home/zgq/linux/atk-mp1”创建一个“Test_MakeFile”目录用于学习“Makefie”。 打开终端 输入“cd /home/zgq/linux/回车”&#xff0c;切换到“/home/zgq/linux/”目录 输入“mkdir Linux_Drivers回…

window: C++ 获取自己写的dll的地址

我自己用C写了一个插件,插件是dll形式的,我的插件式在dll的目录下有个config文件夹,里面是我用json写的插件配置文件,当插件运行的时候我需要读取到json配置文件,所有最重要的就是如何获取dll的路径. 大概就是这么个结构, 我自己封装了一个函数.只适用于window编程,因为里面用…

node 之 fs文件系统模块

1.什么是fs文件系统模块 fs模块是Node.js官方提供的、用来操作文件的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对文件的操作需求 fs.readFile(),用来读取制定文件中的内容 fs.writeFile(),用来向制定的文件中写入内容 如果要在JavaScript代码中&#xff0c;使…

论文是怎么一回事

最近找到女朋友了&#xff0c;她还挺关心我毕业和论文的事情&#xff0c;我开始着手弄论文了~ 说来惭愧&#xff0c;我一直以为读研就是做东西当作工作来完成&#xff0c;结果一直陷入如何实现的问题&#xff0c;结果要论文时不知道怎么弄创新点&#xff0c;这才转过头来弄论文…

Python实现歌曲下载程序, 打包exe应用程序

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.10 Pycharm 模块使用: import requests >>> pip install requests import parsel >>> pip install parsel import pr…

Vue30 自定义指令 函数式 对象式

实例 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>自定义指令</title><script type"text/javascript" src"../js/vue.js"></script></head><body><!-- 需求1&…

使用向量数据库pinecone构建应用06:日志系统异常检测 Anomaly Detection

Building Applications with Vector Databases 下面是这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

spring.factories 和@ComponentScan的使用小结

spring.factories和ComponentScan是Spring框架中两个不同的概念&#xff0c;它们在功能和作用上有一些区别。 spring.factories&#xff1a;通过SPI机制扫描META-INF/spring.factories文件中配置加载组件 spring.factories是Spring Boot项目中的一个特殊文件&#xff0c;用于自…

excel文件数据上传到MySQL数据库

方法1&#xff1a;使用MySQL的LOAD DATA语句 如果Excel文件已经保存为CSV格式&#xff0c;可以使用MySQL的LOAD DATA INFILE语句将数据导入表中。例如&#xff1a; LOAD DATA LOCAL INFILE path/to/your/file.csv INTO TABLE your_table_name FIELDS TERMINATED BY , …

1004: 【C1】【一维数组】【入门】输出奇数和偶数

题目描述 输入n个整数&#xff0c;将其中的奇数和偶数分别显示出来&#xff08;1 < n < 30&#xff09; 输入 第一行&#xff1a;一个整数n。第二行&#xff1a;n个空格隔开的整数。 输出 第一行&#xff1a;若干个奇数。第二行&#xff1a;若干个偶数。&#xff08…

Javaweb之SpringBootWeb案例之配置优先级的详细解析

1. 配置优先级 在我们前面的课程当中&#xff0c;我们已经讲解了SpringBoot项目当中支持的三类配置文件&#xff1a; application.properties application.yml application.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;可以通过这三种方式当中…

强化学习入门到不想放弃-3

第三节我们主要讲一下SARSA模型 上节课的链接:强化学习入门到不想放弃-2 (qq.com) 有模型的概念:简单理解,上节课我讲的就是有模型,就是可以开上帝视角,知道全局地图 无模型的概念: 打CS,但是看不到地图的情况,全凭自己探索 今天的讲解环境还是和上节课一样,如下…

vue 项目打包图片没有打包进去问题解决

问题 vue 项目打包&#xff0c;项目中引用了的图片没有被打进包里&#xff0c;导致打包后的项目图片缺失。 解决方法 1、在导入图片的文件中通过 import 引入图片 这种方法只适合图片少的情况 <template><img :srctestImg/> </template><script>i…

yml配置文件中常见的配置及含义

1.数据库连接的相关配置 项目名称:datasource:driver-class-name: com.mysql.cj.jdbc.Driverhost: localhostport: 3306database: 数据库名username: 用户名password: 密码 springboot配置文件,用于配置数据库源连接信息 数据库驱动类型为com.mysql.cj.jdbc.Driver,这是数据…

redis的搭建 RabbitMq搭建 Elasticsearch 搭建

官网 Download | Redis wget https://github.com/redis/redis/archive/7.2.4.tar.gz 编译安装 yum install gcc g tar -zxvf redis-7.2.4.tar.gz -C /usr/localcd /usr/local/redis make && make install 常见报错 zmalloc.h:50:10: fatal error: jemalloc/jemal…

前端学习——JS学习

文章目录 1. 定义变量&#xff0c;关键字 var、let、const2. 定义变量&#xff0c;数据类型3. 数组变量的操作4. 对象的操作5. JSON 字符串 1. 定义变量&#xff0c;关键字 var、let、const 这里主要是对var、let做比较 /** 1. var存在变量提升、let不存在变量提升 **/ cons…