神经网络权重不可为相同的值,比如都为0,因为如果这样网络正向传播输出和反向传播结果对于各权重都完全一样,导致设置多个权重和设一个权重毫无区别。我们需要使用随机数作为网络权重

实验程序

在以下实验中,我们使用5层神经网络,每层神经元个数100,使用sigmoid作为激活函数,向网络传入1000个正态分布随机数,测试使用不同的随机数对网络权重的影响。

# coding: utf-8
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 标准差为1随机正态

在这一情况下,权重值主要集中于0和1.由于sigmoid在接近0和1时导数趋于0,这一数据分别会导致反向传播中梯度逐渐减小,这一现象称为梯度消失

2 标准差为0.01随机正态

这时神经网络权重集中在0.5附近,此时不会出现梯度消失,但是由于值集中在同一区间,多个神经网络会输出几乎相同的值,使得神经网络表现能力受限(如开头所说)

3 使用Xavier初始值

Xavier初始值为保证各层权重值具有足够广度设计。其推导出的最优初始值为每一层初始权重值是1/√N,其中N为上一层权重个数

使用sigmoid激活函数和Xavier初始值结果:

可以看到此时权重初始值的值域明显大于了之前的取值。Xavier初始值是基于激活函数为线性函数的假设推导出的。sigmoid函数关于(0, 0.5)对称,其在原点附近还不是完美的线性。而tanh函数关于原点对称,在原点附近可以基本近似于直线,其使用Xavier应该会产生更理想的参数值

使用tanh激活函数和Xavier初始值:

ReLU函数的权重设置

ReLU函数有自己独特的默认权重设置,称为He初始值,其公式为2/√N标准差的随机数,N为上一次神经元个数。

在该分布中,各层广度分布基本相同,这使得即使层数加深,也不容易出现梯度消失问题

使用mnist数据集对不同初始化权重方法进行测试:

该程序使用0.01随机正态,Xavier + sigmoid,He + ReLU进行2000轮反向传播,并绘制总损失关于迭代次数图象

# coding: utf-8
import os
import syssys.path.append("D:\AI learning source code")  # 为了导入父目录的文件而进行的设定
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()


在该图象中可以看到,0.01随机正态由于梯度丢失问题,权重更新速率极慢,在2000次迭代中总损失基本没有变化。Xavier和He都正常进行了反向传播得到了更准确的网络参数,其中He似乎学习速率更快一些

深度学习笔记:神经网络权重确定初始值方法相关推荐

  1. 吴恩达深度学习笔记——神经网络与深度学习(Neural Networks and Deep Learning)

    文章目录 前言 传送门 神经网络与深度学习(Neural Networks and Deep Learning) 绪论 梯度下降法与二分逻辑回归(Gradient Descend and Logist ...

  2. Goodfellow深度学习笔记--神经网络架构

    目录 损失函数 指标选择 交叉熵 交叉熵代码 使用最大似然的优势 损失函数的具体形式 用于高斯输出分布的线性单元 用于Bernoulli输出分布的sigmoid单元 用于Multinoulli输出分布 ...

  3. 1.2)深度学习笔记------神经网络的编程基础

    目录 1)Binary Classification 2)Logistic Regression 3)Logistic Regression Cost Function 4)Gradient Desc ...

  4. 吴恩达深度学习L2W1——神经网络权重初始化方法、正则化

    文章目录 神经网络的初始化 初始化数据 模型搭建 简单函数 零初始化--initialize_parameters_zeros 随机初始化--initialize_parameters_random ...

  5. 深度学习笔记之关于常用模型或者方法

    九.Deep Learning的常用模型或者方法 9.1.AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结 ...

  6. 深度学习笔记之关于常用模型或者方法(四)

    不多说,直接上干货! 九.Deep Learning的常用模型或者方法 9.1.AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(AN ...

  7. 深度学习笔记——神经网络(ANN)搭建过程+python代码

    目录 1.多维数组的运算 (1)多维数组 (2)矩阵乘法 (3)神经网络的内积 2.3层神经网络的实现 (1)第一层加权和 (2)输入层到第1层的信号传递 (3)第1层到第2层的信号传递 (4)完整代 ...

  8. 深度学习——权重的初始值

    权重的初始值 ①权重的初始值十分重要,关系到神经网络的学习是否成功. 可以将权重初始值设置为0吗 为了抑制过拟合.提高泛化能力,采用权值衰减的方法,它是一种以减小权重参数的值为目的进行学习的方法. 在 ...

  9. 深度学习笔记(4) 浅层神经网络

    深度学习笔记(4) 浅层神经网络 1. 神经网络概述 2. 激活函数 3. 激活函数的导数 4. 神经网络的梯度下降 5. 随机初始化 1. 神经网络概述 神经网络看起来是如下: 有输入特征x1.x2 ...

最新文章

  1. Java中final关键字如何使用?
  2. 如何设计 QQ、微信、微博、Github 等等,第三方账号登陆 ?(附表设计)
  3. 聊聊Elasticsearch的ExponentiallyWeightedMovingAverage
  4. Leetcode 数据结构与算法题解大全——目录(推荐收藏,持续更新)
  5. JAVA知识基础(十):多态
  6. php面向对象教学笔记,php学习笔记之面向对象编程
  7. java判断socket是否连接_java判断socket是否连接
  8. uploadify 上传时丢失session
  9. SVO深度解析(三)之深度滤波(建图部分)
  10. mod java 求余_java中求余%与取模floorMod的区别
  11. 三星s8 android9.0官方rom,三星S8港版安卓9官方固件rom刷机包:TGY-G9500ZHU3DSD3
  12. 计算机电子线路制图是学啥的,电气制图与电子线路CAD课程教学大纲.doc
  13. OFFICE | WORD VBA 合集
  14. 现在完成进行时和现在完成时的区别
  15. 项目实战 - tpshop商城项目环境搭建
  16. Git之版本回退和分支合并
  17. STM32---c语言指针1
  18. studio3t连接mysql_Studio 3T 2019 强大的MongoDB数据库连接工具
  19. PTA 7-222 sdut-C语言实验-N^3问题
  20. golang 递归方式解析json串

热门文章

  1. 做强信息产业 拓宽智慧城市发展路径
  2. 前端程序员应该去哪个城市发展?
  3. vm无法连接虚拟设备sata01_无法连接虚拟设备sata0:1怎样解决?
  4. 研究生学历越来越成为入职门槛?学历焦虑该不该贩...
  5. 云服务器系统种类,云服务器系统种类
  6. sql查询--比较left join、join和子查询的性能
  7. 极链AI云丨图像转换代表作CycleGAN快速复现
  8. 通过httpclient发送请求的几种方式,发送文件、参数、json对象
  9. AE影视后期特效制作深入剖析AE表达…
  10. 各种范文都有,到时不用找了。(值得收藏)