AI-02a5a5.神经网络-与学习相关的技巧-权重初始值

权重的初始值

在神经网络的学习中,权重的初始值特别重要。实际上,设定什么样的权重初始值,经常关系到神经网络的学习能否成功。

不要将权重初始值设为 0

权值衰减(weight decay):抑制过拟合、提高泛化能力的技巧。

如果想减小权重的值,一开始就将初始值设为较小的值才是正途。

将权重初始值设为0的话,将无法正确进行学习。为什么呢?
在误差反向传播法中,所有的权重值都会进行相同的更新。比如,在2层神经网络中,假设第1层和第2层的权重为0。这样一来,正向传播时,因为输入层的权重为0,所以第2层的神经元全部会被传递相同的值。第2层的神经元中全部输入相同的值,这意味着反向传播时第2层的权重全部都会进行相同的更新。因此,权重被更新为相同的值,并拥有了对称的值(重复的值)。这使得神经网络拥有许多不同的权重的意义丧失了。为了防止“权重均一化”(瓦解权重的对称结构),必须随机生成初始值。

隐藏层的激活值的分布

向一个5层神经网络(激活函数使用sigmoid函数)传入随机生成的输入数据,用直方图绘制各层激活值的数据分布。

# coding: utf-8
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams# 设置中文字体
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题def sigmoid(x):return 1 / (1 + np.exp(-x))def ReLU(x):return np.maximum(0, x)def tanh(x):return np.tanh(x)input_data = np.random.randn(1000, 100)  # 1000个数据
node_num = 100  # 各隐藏层节点(神经元)数
hidden_layer_size = 5  # 隐藏的层有5层
activations = {}  # 激活值的结果保存在这里x = input_datafor i in range(hidden_layer_size):if i != 0:x = activations[i-1]# 改变初始值进行实验!w = np.random.randn(node_num, node_num) * 1# w = np.random.randn(node_num, node_num) * 0.01# w = np.random.randn(node_num, node_num) * np.sqrt(1.0 / node_num) # Xavier初始值,适用 sigmoid、tanh等S型曲线# w = np.random.randn(node_num, node_num) * np.sqrt(2.0 / node_num) # He初始值,适用 ReLUa = np.dot(x, w)# 将激活函数的种类也改变,来进行实验!z = sigmoid(a)# z = ReLU(a)# z = tanh(a)activations[i] = z# 绘制直方图
for i, a in activations.items():plt.subplot(1, len(activations), i+1)plt.title(str(i+1) + "-layer")if i != 0: plt.yticks([], [])# plt.xlim(0.1, 1)# plt.ylim(0, 7000)plt.hist(a.flatten(), 30, range=(0,1))# plt.hist(a.flatten(), 30)if i == 0:plt.xlabel("标准差为1的高斯分布作为权重初始值时的sigmoid的各层激活值的分布", loc='left')
plt.show()

在这里插入图片描述

各层的激活值呈偏向0和1的分布。这里使用的sigmoid函数是S型函数,随着输出不断地靠近0(或者靠近1),它的导数的值逐渐接近0。因此,偏向0和1的数据分布会造成反向传播中梯度的值不断变小,最后消失。这个问题称为梯度消失(gradient vanishing)。层次加深的深度学习中,梯度消失的问题可能会更加严重。

在这里插入图片描述

集中在0.5附近的分布。没有偏向0和1,所以不会发生梯度消失的问题。但是,激活值的分布有所偏向,不同数量的神经元的输出几乎相同,说明在表现力上会有很大问题。因此,激活值在分布上有所偏向会出现“表现力受限”的问题。

各层的激活值的分布都要求有适当的广度。为什么呢?因为通过在各层间传递多样性的数据,神经网络可以进行高效的学习。反过来,如果传递的是有所偏向的数据,就会出现梯度消失或者“表现力受限”的问题,导致学习可能无法顺利进行。

Xavier初始值

Xavier的论文中,为了使各层的激活值呈现出具有相同广度的分布,推导了合适的权重尺度。推导出的结论是,如果前一层的节点数为 n n n,则初始值使用标准差为的分布 1 n \frac{1}{\sqrt{n}} n 1

在这里插入图片描述

越是后面的层,图像变得越歪斜,但是呈现了比之前更有广度的分布。因为各层间传递的数据有适当的广度,所以sigmoid函数的表现力不受限制,有望进行高效的学习。

在这里插入图片描述

使用tanh函数后,会呈漂亮的吊钟型分布。tanh函数和sigmoid函数同是 S型曲线函数,但tanh函数是关于原点(0, 0)对称的 S型曲线,而sigmoid函数是关于(x, y)=(0, 0.5)对称的S型曲线。

用作激活函数的函数最好具有关于原点对称的性质。

He初始值

Xavier初始值是以激活函数是线性函数为前提而推导出来的。因为sigmoid函数和tanh函数左右对称,且中央附近可以视作线性函数,所以适合使用Xavier初始值。

但当激活函数使用ReLU时,一般推荐使用ReLU专用的初始值,He初始值。

当前一层的节点数为 n n n时,He初始值使用标准差为 2 n \sqrt{\frac{2}{n}} n2 的高斯分布。当Xavier初始值是 1 n \sqrt{\frac{1}{n}} n1 时,(直观上)可以解释为,因为ReLU的负值区域的值为0,为了使它更有广度,所以需要2倍的系数。

在这里插入图片描述

当“std = 0.01”时,各层的激活值非常小 。神经网络上传递的是非常小的值,说明逆向传播时权重的梯度也同样很小。这是很严重的问题,实际上学习基本上没有进展。

在这里插入图片描述

随着层的加深,偏向一点点变大。实际上,层加深后,激活值的偏向变大,学习时会出现梯度消失的问题。

在这里插入图片描述

各层中分布的广度相同。由于即便层加深,数据的广度也能保持不变,因此逆向传播时,也会传递合适的值。

当激活函数使用ReLU时,权重初始值使用He初始值,当激活函数为sigmoid或tanh等S型曲线函数时,初始值使用Xavier初始值。这是目前的最佳实践。

在这里插入图片描述

神经网络有5层,每层有100个神经元,激活函数使用的是ReLU。
从上图分析可知,std = 0.01时完全无法进行学习。这和刚才观察到的激活值的分布一样,是因为正向传播中传递的值很小(集中在0附近的数据)。因此,逆向传播时求到的梯度也很小,权重几乎不进行更新。相反,当权重初始值为Xavier初始值和He初始值时,学习进行得很顺利。并且,我们发现He初始值时的学习进度更快一些。

# coding: utf-8
import os
import syssys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.util import smooth_curve
from common.multi_layer_net import MultiLayerNet
from common.optimizer import SGD
from matplotlib import rcParams# 设置中文字体
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 0:读入MNIST数据==========
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)
train_size = x_train.shape[0]
batch_size = 128
max_iterations = 2000# 1:进行实验的设置==========
weight_init_types = {'std=0.01': 0.01, 'Xavier': 'sigmoid', 'He': 'relu'}
optimizer = SGD(lr=0.01)networks = {}
train_loss = {}
for key, weight_type in weight_init_types.items():networks[key] = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100],output_size=10, weight_init_std=weight_type)train_loss[key] = []# 2:开始训练==========
for i in range(max_iterations):batch_mask = np.random.choice(train_size, batch_size)x_batch = x_train[batch_mask]t_batch = t_train[batch_mask]for key in weight_init_types.keys():grads = networks[key].gradient(x_batch, t_batch)optimizer.update(networks[key].params, grads)loss = networks[key].loss(x_batch, t_batch)train_loss[key].append(loss)if i % 100 == 0:print("===========" + "iteration:" + str(i) + "===========")for key in weight_init_types.keys():loss = networks[key].loss(x_batch, t_batch)print(key + ":" + str(loss))# 3.绘制图形==========
markers = {'std=0.01': 'o', 'Xavier': 's', 'He': 'D'}
x = np.arange(max_iterations)
for key in weight_init_types.keys():plt.plot(x, smooth_curve(train_loss[key]), marker=markers[key], markevery=100, label=key)plt.xlabel("学习迭代次数")
plt.ylabel("损失函数值")
plt.title("基于MNIST数据集的权重初始值的比较")
plt.ylim(0, 2.5)
plt.legend()
plt.show()

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

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

相关文章

TCP首部格式及三次握手四次挥手

TCP协议详解:首部格式与连接管理 一、TCP首部格式 TCP首部最小20字节,最大60字节,包含以下字段: | 源端口号(16bit) | 目的端口号(16bit) | | 序列号(32bit) | | 确认号(32bit) | | 数据偏移(4bit)| 保留(6bit) |U|A|P|R|S|…

Pytorch的Dataloader使用详解

PyTorch 的 DataLoader 是数据加载的核心组件,它能高效地批量加载数据并进行预处理。 Pytorch DataLoader基础概念 DataLoader基础概念 DataLoader是PyTorch基础概念 DataLoader是PyTorch中用于加载数据的工具,它可以:批量加载数据&#xf…

HTML、CSS 和 JavaScript 基础知识点

HTML、CSS 和 JavaScript 基础知识点 一、HTML 基础 1. HTML 文档结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

亚远景-对ASPICE评估体系的深入研究与分析

一、ASPICE评估体系的定义与背景 ASPICE&#xff08;Automotive Software Process Improvement and Capability Determination&#xff09;即汽车软件过程改进及能力测定模型&#xff0c;是由欧洲20多家主要汽车制造商共同制定的&#xff0c;专门针对汽车行业的软件开发过程评…

灰度图像和RGB图像在数据大小和编码处理方式差别

技术背景 好多开发者对灰度图像和RGB图像有些认知差异&#xff0c;今天我们大概介绍下二者差别。灰度图像&#xff08;Grayscale Image&#xff09;和RGB图像在编码处理时&#xff0c;数据大小和处理方式的差别主要体现在以下几个方面&#xff1a; 1. 通道数差异 图像类型通道…

从爬虫到网络---<基石9> 在VPS上没搞好Docker项目,把他卸载干净

1.停止并删除所有正在运行的容器 docker ps -a # 查看所有容器 docker stop $(docker ps -aq) # 停止所有容器 docker rm $(docker ps -aq) # 删除所有容器如果提示没有找到容器&#xff0c;可以忽略这些提示。 2.删除所有镜像 docker images # 查看所有镜像 dock…

Centos 上安装Klish(clish)的编译和测试总结

1&#xff0c;介绍 clish是一个类思科命令行补全与执行程序&#xff0c;它可以帮助程序员在nix操作系统上实现功能导引、命令补全、命令执行的程序。支持&#xff1f;&#xff0c;help, Tab按键。本文基于klish-2.2.0介绍编译和测试。 2&#xff0c;klish的编译 需要安装的库&…

理解计算机系统_并发编程(3)_基于I/O复用的并发(二):基于I/O多路复用的并发事件驱动服务器

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 接续上一帖理解计算机系统_并发编程(2)_基于I/O复用的并发…

系统可靠性分析:指标解析与模型应用全览

以下是关于系统可靠性分析中可靠性指标、串联系统与并联系统、混合系统、系统可靠性模型的相关内容&#xff1a; 一、可靠性指标 可靠度&#xff1a;是系统、设备或元件在规定条件和规定时间内完成规定功能的概率。假设一个系统由多个部件组成&#xff0c;每个部件都有其自身…

数字高程模型(DEM)公开数据集介绍与下载指南

数字高程模型&#xff08;DEM&#xff09;公开数据集介绍与下载指南 数字高程模型&#xff08;Digital Elevation Model, DEM&#xff09;广泛应用于地理信息系统&#xff08;GIS&#xff09;、水文模拟、城市规划、环境分析、灾害评估等领域。本文系统梳理了主流的DEM公开数据…

Python+大模型 day01

Python基础 计算机系统组成 基础语法 如:student_num 4.标识符要做到见名知意,增强代码的可读性 关键字 系统或者Python定义的,有特殊功能的字符组合 在学习过程中,文件名没有遵循标识符命名规则,是为了按序号编写文件方便查找复习 但是,在开发中,所有的Python文件名称必须…

C++引用编程练习

#include <iostream> using namespace std; double vals[] {10.1, 12.6, 33.1, 24.1, 50.0}; double& setValues(int i) { double& ref vals[i]; return ref; // 返回第 i 个元素的引用&#xff0c;ref 是一个引用变量&#xff0c;ref 引用 vals[i] } // 要调用…

机密虚拟机的威胁模型

本文将介绍近年兴起的机密虚拟机&#xff08;Confidential Virtual Machine&#xff09;技术所旨在抵御的威胁模型&#xff0c;主要关注内存机密性&#xff08;confidentiality&#xff09;和内存完整性&#xff08;integrity&#xff09;两个方面。在解释该威胁可能造成的问题…

【Rust trait特质】如何在Rust中使用trait特质,全面解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Simulink模型回调

Simulink 模型回调函数是一种特殊的 MATLAB 函数&#xff0c;可在模型生命周期的特定阶段自动执行。它们允许用户自定义模型行为、执行初始化任务、验证参数或记录数据。以下是各回调函数的详细说明&#xff1a; 1. PreLoadFcn 触发时机&#xff1a;Simulink 模型加载到内存之…

FPGA:Xilinx Kintex 7实现DDR3 SDRAM读写

在Xilinx Kintex 7系列FPGA上实现对DDR3 SDRAM的读写&#xff0c;主要依赖Xilinx提供的Memory Interface Generator (MIG) IP核&#xff0c;结合Vivado设计流程。以下是详细步骤和关键点&#xff1a; 1. 准备工作 硬件需求&#xff1a; Kintex-7 FPGA&#xff08;如XC7K325T&…

Python爬虫实战:研究进制流数据,实现逆向解密

1. 引言 1.1 研究背景与意义 在现代网络环境中,数据加密已成为保护信息安全的重要手段。许多网站和应用通过二进制流数据传输敏感信息,如视频、金融交易数据等。这些数据通常经过复杂的加密算法处理,直接分析难度较大。逆向工程进制流数据不仅有助于合法的数据获取与分析,…

Java Spring Boot项目目录规范示例

以下是一个典型的 Java Spring Boot 项目目录结构规范示例&#xff0c;结合了分层架构和模块化设计的最佳实践&#xff1a; text 复制 下载 src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ └── myapp/ │…

图像颜色理论与数据挖掘应用的全景解析

文章目录 一、图像颜色系统的理论基础1.1 图像数字化的本质逻辑1.2 颜色空间的数学框架1.3 量化过程的技术原理 二、主要颜色空间的深度解析2.1 RGB颜色空间的加法原理2.2 HSV颜色空间的感知模型2.3 CMYK颜色空间的减色原理 三、图像几何属性与高级特征3.1 分辨率与像素密度的关…

mysql两张关联表批量更新一张表存在数据,而另一张表不存在数据的sql

一、mysql两张关联表批量更新一张表存在、另一张表不存在的数据 创建user和user_order表 CREATE TABLE user (id varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,id_card varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NU…