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

  • 一、权重初始值
  • 二、权重初始值会影响隐藏层的激活值分布
  • 三、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()

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

  1. DL之DNN优化技术:采用三种激活函数(sigmoid、relu、tanh)构建5层神经网络,权重初始值(He参数初始化和Xavier参数初始化)影响隐藏层的激活值分布的直方图可视化

    DL之DNN优化技术:采用三种激活函数(sigmoid.relu.tanh)构建5层神经网络,权重初始值(He参数初始化和Xavier参数初始化)影响隐藏层的激活值分布的直方图可视化 目录

  2. CNN应用Relu激活函数时设计权重初始值设置方法

    CNN应用Relu激活函数时,根据√(2/n)设计权重初始值 学习<深度学习入门(基于Python的理论与实现)>时,设计DeepConvNet,需要应用Relu激活函数,使用了ReLU的 ...

  3. DL之DNN优化技术:自定义MultiLayerNetExtend算法(BN层使用/不使用+权重初始值不同)对Mnist数据集训练评估学习过程

    DL之DNN优化技术:自定义MultiLayerNetExtend算法(BN层使用/不使用+权重初始值不同)对Mnist数据集训练评估学习过程 目录 输出结果 设计思路 核心代码 更多输出 相关文章: ...

  4. DL之DNN优化技术:自定义MultiLayerNet【5*100+ReLU】对MNIST数据集训练进而比较三种权重初始值(Xavier参数初始化、He参数初始化)性能差异

    DL之DNN优化技术:自定义MultiLayerNet[5*100+ReLU]对MNIST数据集训练进而比较三种权重初始值(Xavier参数初始化.He参数初始化)性能差异 导读 #思路:观察不同的权 ...

  5. 基于MNIST数据集的不同权重初始值的比较

    上一篇文章(绘制隐藏层的激活值的分布[直方图])我们知道权重的初始值对激活层的值影响很大,也直接关系到神经网络学习是否顺利的至关重要的一环. 现在通过MNIST数据集的实例来比较下,直观感受不同的初始 ...

  6. python权重初始值设置_pytorch自定义初始化权重的方法

    在常见的pytorch代码中,我们见到的初始化方式都是调用init类对每层所有参数进行初始化.但是,有时我们有些特殊需求,比如用某一层的权重取优化其它层,或者手动指定某些权重的初始值. 核心思想就是构 ...

  7. 神经网络的阈值是什么,神经网络权重取值范围

    BP神经网络中神经元阈值是什么意思 谷歌人工智能写作项目:神经网络伪原创 神经网络中的权值和阈值什么意思 神经网络算法中权值W和阈值的定义是什么? 神经网络权值是啥意思? 神经网络的权值是通过对网络的 ...

  8. 求解神经网络的权重系数,神经网络权重取值范围

    神经网络权值怎么确定? 神经网络的权值是通过对网络的训练得到的.如果使用MATLAB的话不要自己设定,newff之后会自动赋值.也可以手动:{}=;{}=.一般来说输入归一化,那么w和b取0-1的随机 ...

  9. 神经网络权值是什么意思,神经网络权重取值范围

    人工神经网络里的权值和权向量是什么意思啊?? 神经网络权值的具体含义是什么 神经网络权值怎么确定? 神经网络的权值是通过对网络的训练得到的.如果使用MATLAB的话不要自己设定,newff之后会自动赋 ...

最新文章

  1. 上市 10 天就遭破解!AirTag 还能买吗?
  2. 原来windows下也可以用awk
  3. “斐波那契数列”的两种算法
  4. ReentrantLock 源码分析
  5. php udp 非阻塞,使用非阻塞udp读取时丢失消息
  6. VT-x/AMD-V 硬件加速器已被启动,但当前处于无效状态
  7. 面向对象 (接口 Interface)
  8. 微软开始取消 Windows 10 对 32 位系统的支持
  9. morphogenesis —— 形态发生
  10. javaweb增删改查实例_JavaWeb图像可视化管理系统之后台搭建(二)用户管理与增删改查(内含代码)...
  11. tshark/wireshark/tcpdump实战笔记(更新中...)
  12. driver nvidia web_黑苹果 macOS 10.13.6 17G66 安装 nVidia WebDriver
  13. 2022程序员都需要知道的 6 个挺火的开源项目
  14. atk-hc05 蓝牙
  15. 蒸汽流量计算软件_补偿型涡街流量计
  16. 最大公约数与最小公倍数求法(欧几里得算法)
  17. 【C语言】数字直角三角形,数字矩阵,蛇形数组
  18. C/C++ 简单排序之冒泡排序
  19. oracle dul 扫描磁盘,dul oracle 数据恢复
  20. SEO互帮团真诚奉献:一百多个站长论坛!

热门文章

  1. 清空文件下的SVN控制文件
  2. js使用location的方法实验
  3. 第十章触发器的创建与管理
  4. NodeJS知识汇总
  5. css折线效果,CSS3 box-shadow实现纸张的曲线投影效果 张鑫旭-鑫空间-鑫生活
  6. kaggle房价预测特征意思_机器学习-kaggle泰坦尼克生存预测(一)-数据清洗与特征构建...
  7. 苹果验证电子邮件地址服务器错误,苹果7P账户申请,验证电子邮件地址创建新Apple ID发生未知错误...
  8. Android代码设置角标,Android上的Badge,快速实现给应用添加角标
  9. python中类和对象_Python里的类和对象简介
  10. linux变量最大长度,51CTO博客-专业IT技术博客创作平台-技术成就梦想