关于神经网络权重初始值的设置的研究

关于神经网络权重初始值的设置的研究

    • 一、权重初始值
    • 二、权重初始值会影响隐藏层的激活值分布
    • 三、Xavier初始值
    • 四、He初始值
    • 五、基于MNIST数据集的权重初始值的比较

一、权重初始值

权值衰减—抑制过拟合、提高泛化能力。

所谓权值衰减,即,以减小权重参数的值为目的进行学习。

所以说人们一开始,就想把权重初始值设置的比较小。

在这里插入图片描述

那如果权重初始值全设为0或者一样的值呢?那可不行,如果输入层权重为0,那么第二层神经元都到的全是0,如果第二层是乘法节点,拿上图举例子,x=y=0,所以返回来的两个梯度是一个样的。就没意义了。所有权重共同进退有何意义?权重共同进退,术语叫做权重均一化。

二、权重初始值会影响隐藏层的激活值分布

先看斯坦福大学做的一个实验:

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

实验目的是通过改变标准差,观察激活值的分布如何变化。

实验代码:

这个实验各层激活值的结果保存在activations变量中。

import numpy as np
import matplotlib.pyplot as pltdef 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)# w = np.random.randn(node_num, node_num) * np.sqrt(2.0 / node_num)a = 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.show()

首先来看,使用的权重初始值是标准差为1的高斯分布时,激活值的分布,w = np.random.randn(node_num, node_num) * 1。

在这里插入图片描述

再看使用的权重初始值是标准差为0.01的高斯分布时,激活值的分布:

在这里插入图片描述

看到,使用的权重初始值是标准差为1的高斯分布时,激活值偏向0和1的分布。这会导致,随着输出不断靠近0或1,导数的值逐渐接近0,反向传播中梯度的值不断变小,最后会消失。这就是所谓的梯度消失。

使用的权重初始值是标准差为0.01的高斯分布时,不会发生梯度消失,但是激活值分布偏向0.5,说明表现力有大问题。如果100个神经元输出都几乎相同,那我可以用1个神经元表达100个神经元干的事。术语,所谓的表现力受限问题。

三、Xavier初始值

Xavier提出:如果前一层的节点数为n,则初始值使用标准差为根号n分之一的分布。

代码里就这句话,w = np.random.randn(node_num, node_num) * np.sqrt(1.0 / node_num)

效果如下:呈现了比之前更有广度的分布。

在这里插入图片描述

Xavier的初始值是以激活函数是线性函数为前提而推导得出。

四、He初始值

Kaiming He提出,当前一层的节点数为n时,He的初始值使用标准差为根号(n分之2)的高斯分布。

我们研究一下激活函数用ReLU时,不同权重初始值下,每一层激活值分布的区别。

权重初始值为He初始值时:

在这里插入图片描述

权重初始值为Xavier时:

在这里插入图片描述

权重初始值为标准差为0.01的高斯分布时

在这里插入图片描述

明显ReLU更适合用He初始值。因为分布广度好,表现力好。

初始值为Xavier时,随层次加深,往0那边偏,我猜,如果加深网络,会出现梯度消失现象。

五、基于MNIST数据集的权重初始值的比较

在这里插入图片描述

这个对比,揭示了,很多时候,权重初始值的设定关系到神经网络的学习能否成功。

代码:

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# 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("iterations")
plt.ylabel("loss")
plt.ylim(0, 2.5)
plt.legend()
plt.show()

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

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

相关文章

使用权值衰减算法解决神经网络过拟合问题、python实现

使用权值衰减算法解决神经网络过拟合问题、python实现一、what is 过拟合二、过拟合原因三、权值衰减四、实验验证4.1制造过拟合现象4.2使用权值衰减抑制过拟合一、what is 过拟合 过拟合指只能拟合训练数据,但不能很好拟合不包含在训练数据中的其他数据的状态。 …

解决神经网络过拟合问题—Dropout方法、python实现

解决神经网络过拟合问题—Dropout方法一、what is Dropout?如何实现?二、使用和不使用Dropout的训练结果对比一、what is Dropout?如何实现? 如果网络模型复杂,L2范数权值衰减方法就难以对付过拟合。这种情况下&#…

神经网络如何调参、超参数的最优化方法、python实现

神经网络如何调参、超参数的最优化方法、python实现一、what is 超参数二、超参数优化实验一、what is 超参数 超参数是什么,其实就是,各层神经元数量、batch大小、学习率等人为设定的一些数。 数据集分为训练数据、测试数据、验证数据。 用测试数据评…

卷积神经网络的整体结构、卷积层、池化、python实现

卷积神经网络的整体结构、卷积层、池化、python实现一、整体结构二、卷积层三、池化层四、python实现卷积层、池化层一、整体结构 神经网络相邻层所有神经元之间都有连接,称为全连接。前面用Affine层实现了全连接。 举个例子 全连接神经网络结构: 卷积…

基于随机梯度下降法的手写数字识别、epoch是什么、python实现

基于随机梯度下降法的手写数字识别、epoch是什么、python实现一、普通的随机梯度下降法的手写数字识别1.1 学习流程1.2 二层神经网络类1.3 使用MNIST数据集进行学习注:关于什么是epoch二、基于误差反向传播算法求梯度的手写数字识别2.1 学习流程2.2 实现与结果分析一…

基于卷积神经网络的手写数字识别、python实现

一、CNN网络结构与构建 参数: 输入数据的维数,通道,高,长 input_dim(1, 28, 28)卷积层的超参数,filter_num:滤波器数量,filter_size:滤波器大小,stride:步幅…

基于深度学习的手写数字识别、python实现

基于深度学习的手写数字识别、python实现一、what is 深度学习二、加深层可以减少网络的参数数量三、深度学习的手写数字识别一、what is 深度学习 深度学习是加深了层的深度神经网络。 二、加深层可以减少网络的参数数量 加深层的网络可以用更少参数获得与没有加深层同等水…

二极管的结构、特性、参数、稳压管的特性和参数

二极管的结构、特性、参数、稳压管的特性和参数本文介绍的定义一、半导体类型二、PN结的结构与单向导电性三、二极管的伏安特性四、二极管的参数五、稳压管本文介绍的定义 本文介绍的定义:半导体、本征半导体、空穴、载流子、杂质半导体、N型半导体、P型半导体、PN…

双极结型三极管的结构、特性曲线、参数、lceda仿真

双极结型三极管的结构、特性、参数本文介绍的定义一、三极管结构二、三极管特性曲线三、三极管参数本文介绍的定义 硅平面管、锗合金管、发射区、基区,集电区、发射极、基极、集电极、发射结、集电结、发射、发射极电流、复合和扩散、基极电流、收集、集电极电流、…

结型场效应管的结构、特性、参数

结型场效应管的结构、特性、参数本文介绍的定义一、N沟道结型场效应管结构二、N沟道结型场效应管特性曲线本文介绍的定义 场效应管、结型场效应管、N沟道结型场效应管的结构、耗尽层、栅极、源极、漏极、N沟道结型场效应管、夹断电压、预夹断、输出特性、可变电阻区、恒流区、…

绝缘栅型场效应管的结构、特性、参数

绝缘栅型场效应管的结构、特性、参数本文介绍的定义一、N沟道增强型MOS场效应管结构二、N沟道增强型MOS场效应管特性曲线三、N沟道耗尽型MOS场效应管结构和特性曲线本文介绍的定义 绝缘栅型场效应管、N沟道增强型MOS场效应管、耗尽型场效应管、增强型场效应管、反型层、开启电…

放大电路、单管共发射极放大电路结构、工作原理、lceda仿真

放大电路、单管共发射极放大电路结构、工作原理本文介绍的定义一、放大电路基本概念二、单管共发射极放大电路本文介绍的定义 放大、实现放大作用、放大电路技术指标测量、电压放大倍数、电流放大倍数、相量表示、最大输出幅度、峰峰值、非线性失真系数、输入电阻、输出电阻、…

放大电路分析方法、图解法分析放大电路、lceda仿真

放大电路分析方法、图解法分析放大电路一、本文介绍的定义二、放大电路分析方法三、图解法一、本文介绍的定义 放大电路分析、图解法、微变等效电路法、静态分析、动态分析、直流通路、交流通路、单管共射放大电路的直流和交流通路、静态工作点、图解法分析静态、直流负载线、…

通过共现矩阵和余弦相似度实现机器对单词的认知、python实现

通过共现矩阵和余弦相似度实现机器对单词的认知、python实现本文介绍的定义:一、语料库预处理二、单词的分布式表示三、单词的相似度四、相似单词排序本文介绍的定义: 语料库、计数方法的目的、语料库预处理、单词的分布式表示、分布式假设、上下文、窗…

使用PPMI改进共现矩阵

使用PPMI改进共现矩阵 共现矩阵的元素表示两个单词同时出现的次数,这里的次数并不具备好的性质,举个例子,有短语叫the car,因为the是个常用词,如果以两个单词同时出现的次数为衡量相关性的标准,与drive 相…

基于SVD的降维优化

基于SVD的降维优化 向量降维:尽量保留数据“重要信息”的基础上减少向量维度。可以发现重要的轴(数据分布广的轴),将二维数据 表示为一维数据,用新轴上的投影值来表示各个数据点的值,示意图如下。 稀疏矩阵…

微变等效电路法分析放大电路

微变等效电路法分析放大电路本文介绍的定义一、简化的h参数微变等效电路1.静态工作点计算2.微变等效电路法估算电压放大倍数二、微变等效电路法应用本文介绍的定义 微变等效电路法、h参数微变等效电路、单管共射放大电路的微变等效电路、Rbe近似估算、微变等效电路法应用。 一…

分压式静态工作点稳定电路

分压式静态工作点稳定电路本文介绍的定义:一、静态工作点稳定问题二、分压式静态工作点稳定电路本文介绍的定义: 静态工作点稳定问题、温度对三极管参数的影响、分压式静态工作点稳定电路、电流负反馈式工作点稳定电路、旁路电容、静态分析、动态分析。…

双极型三极管共集电极、共基极放大电路

双极型三极管共集电极、共基极放大电路本文介绍的定义共集电极放大电路共基极放大电路本文介绍的定义 双极型三极管放大电路的接法、共集电极放大电路、射极跟随器、带负载能力、共基极放大电路、改善频率响应。 共集电极放大电路 接法:根据输入信号与输出信号公…

stm32使用DAP下载程序

jym认为,会下载程序等于学会stm32,hahaha。 首先点这个魔术棒 接下来进行下面的设置: 配置Debug选项 配置Utilities选项 配置Degug-setting选项 选择目标板,flash大小由板子芯片型号决定,勾选reset and run&#xff…