北京 | 深度学习与人工智能研修

12月23-24日

再设经典课程 重温深度学习阅读全文>

正文共2268个字,8张图,预计阅读时间:6分钟。

前言

神经网络中的权重(weight)初始化是个常常被忽略的问题。

最近在手写一个Python的神经网络库(GitHub:hamaa——https://github.com/monitor1379/hamaa),刚开始为了测试代码是否写对,搭建了一个2->4->2的单隐层神经网络来拟合异或运算,拟合结果十分完美。但是在做MNIST手写数字识别,将网络扩展到了784->100->10时,发现损失函数一直不下降,训练准确率一直停留在10%左右(和随机猜的命中概率一样嘛)。

一直以为是back propagation的代码写错了,debug了整整两天都没发现错误,结果输出中间weights的梯度dw看看,发现两个权重矩阵的梯度都是在1e-10左右的数量级。后来查询了一些资料,原来是代码缺少了权重初始化(weight initialization)这及其重要的一步。增加了权重初始化后拟合结果终于正常。

在以前看一些关于神经网络的资料时,我也经常看到“权重初始化”这一步,但一直错误地以为“权重初始化”等价于“权重随机初始化”,以为仅仅将权重初始化为很小的随机数即可,但其实它的原因除了打破梯度更新对称性之外,还有更深层次的原因。所以接下来文章分为两部分,分别介绍为什么需要进行权重初始化,以及如何进行权重初始化。

权重初始化:why

在创建了神经网络后,通常需要对权重和偏置进行初始化,大部分的实现都是采取Gaussian distribution来生成随机初始值。假设现在输入层有1000个神经元,隐藏层有1个神经元,输入数据x为一个全为1的1000维向量,采取高斯分布来初始化权重矩阵w,偏置b取0。下面的代码计算隐藏层的输入z:

# -*- coding:utf-8 -*-

import numpy as np

import matplotlib.pyplot as plt
 def run():    
x = np.ones(1000)    
w = np.random.randn(1000)    
b = 0    
# z为加权和    
z = np.sum(x * w) + b

print z

然而通过上述初始化后,因为w服从均值为0、方差为1的正太分布,x全为1,b全为0,输入层一共1000个神经元,所以z服从的是一个均值为0、方差为1000的正太分布。修改代码如下,生成20000万个z并查看其均值、方差以及分布图像:

def  run():    
# z的个数    
t = 20000    
z_lst = np.empty(t)    
x = np.ones(1000)    
b = 0  
for i in xrange(t):        
w = np.random.randn(1000)        
z = np.sum(x * w) + b        
z_lst[i] = z    
print 'z 均值:', np.mean(z_lst)    
print 'z 方差:', np.var(z_lst)    
plt.hist(z_lst, bins=100)

plt.show()

输出结果如下:

z 均值: -0.0402106463845

z 方差: 997.082082524

输出图像如下:

z分布(1)

在此情况下,z有可能是一个远小于-1或者远大于1的数,通过激活函数(比如sigmoid)后所得到的输出会非常接近0或者1,也就是隐藏层神经元处于饱和的状态。所以当出现这样的情况时,在权重中进行微小的调整仅仅会给隐藏层神经元的激活值带来极其微弱的改变。而这种微弱的改变也会影响网络中剩下的神经元,然后会带来相应的代价函数的改变。结果就是,这些权重在我们进行梯度下降算法时会学习得非常缓慢[1]。

因此,我们可以通过改变权重w的分布,使|z|尽量接近于0。这就是我们为什么需要进行权重初始化的原因了。

权重初始化:How

一种简单的做法是修改w的分布,使得z服从均值为0、方差为1的标准正态分布。根据正太分布期望与方差的特性,将w除以sqrt(1000)即可。修改后代码如下:

def run():    
# z的个数    
t = 20000    
z_lst = np.empty(t)    
# 输入神经元个数    
m = 1000    
x = np.ones(m)    
b = 0    
for i in xrange(t):      
 w = np.random.randn(m) / np.sqrt(m)        
z = np.sum(x * w) + b        
z_lst[i] = z    print 'z 均值:', np.mean(z_lst)    
print 'z 方差:', np.var(z_lst)

# 保持与z分布(1)图像横坐标刻度不变,使得结果更加直观

plt.xlim([-150, 150])    
plt.hist(z_lst, bins=10)

plt.show()

输出结果如下:

z 均值: 0.013468729222

z 方差: 1.00195898464

输出图像如下:

z分布(2)

这样的话z的分布就是一个比较接近于0的数,使得神经元处于不太饱和的状态,让BP过程能够正常进行下去。

除了这种方式之外(除以前一层神经元的个数n_in的开方),还有许多针对不同激活函数的不同权重初始化方法,比如兼顾了BP过程的除以( (n_in + n_out)/2 )。具体可以参考Stanford CS231n课程中提到的各种方法。

后记

最后强烈安利Stanford CS231n的官方授权中文翻译专栏知乎专栏:智能单元,感谢各位Zhihuer的辛勤翻译,为后辈的学习与快速上手提供了极大的便利。

参考

[1] www.neuralnetworksanddeeplearning.com,第三章
[2] Stanford CS231n
[3] Stanford CS231n官方授权中文翻译,知乎专栏:智能单元

http://www.jianshu.com/p/03009cfdf733

查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org

请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础

点击“阅读原文”直接打开报名链接

深度学习 | Why and How:神经网络中的权重初始化相关推荐

  1. 深度学习入门笔记(十一):权重初始化

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  2. 神经网络中的权重初始化问题weight initialization problem in FNN

    个人论文完成笔记 ^ _ ^欢迎批评指正 本篇文章研究的是全连接的多层神经网络中的权重初始化问题,以8-20-30-1的MLP为实验对象.神经网络是一种要素间关联性极强的结构,从输入数据,输入数据的s ...

  3. 深度学习(一)神经网络中的池化与反池化原理

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9579108.html 参考博客:https://blog.csdn.net/chengqium ...

  4. 深度学习(二)神经网络中的卷积和反卷积原理

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9579392.html 一.卷积 在深度学习的过程中,很多神经网络都会用到各种卷积核来进行操作, ...

  5. 神经网络中的权重初始化一览:从基础到Kaiming

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在进行各种小实验和思维训练时,你会逐步发现为什么在训练深度神经网络 ...

  6. 神经网络中的权重初始化常用方法

    1.权重初始化的重要性 神经网络的训练过程中的参数学习时基于梯度下降算法进行优化的.梯度下降法需要在开始训练时给每个参数赋予一个初始值.这个初始值的选取十分重要.在神经网络的训练中如果将权重全部初始化 ...

  7. 普通视频转高清:10个基于深度学习的超分辨率神经网络

    原文:http://www.tinymind.cn/articles/1176 在 AlphaGo 对弈李世石.柯洁之后,更多行业开始尝试通过机器学习优化现有技术方案.其实对于实时音视频来讲,对机器学 ...

  8. 深度学习将会变革NLP中的中文分词

    深度学习将会变革NLP中的中文分词 2016-08-08 19:03 转载 陈圳 0条评论 雷锋网按:本文转自ResysChina高翔,文章主要介绍了1)区分中文分词的方法:2)用深度学习的方法来解决 ...

  9. 1.1 欢迎-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 无 回到目录 1.2 什么是神经网络 欢迎 第一个视频主要讲了什么是深度学习,深度学习能做些什么事情.以下是吴恩达老师的原话: 深度学习改变了传统互联网业务,例如如网络搜索和 ...

最新文章

  1. qgis修复拓扑错误_深度 | QGIS开发与发布规则解析
  2. 2021中国国际消费电子博览会和青岛国际软件融合创新博览会盛大开幕
  3. VS2010数据库项目不能正常工作解决方案
  4. 【干货】从小米发布会看:雷军的七个产品思维
  5. 帝国cms调用相关文章若没有则调取最新文章
  6. IOS NSArray 倒序
  7. cas实现单点登录原理
  8. 镜头的分类及选购指南
  9. [javaSE] 集合框架(迭代器)
  10. POJ1753-Flip Game
  11. 如何删减QQ无用功能 为系统彻底减负
  12. vscode启动项目报jdk11没有_JDK 11 安装过程(同时已安装了JDK 8)以及Intellij IDEA 配置...
  13. 从无线安全到内网渗透(转)
  14. 博图v15编程手册_好消息!全套西门子plc编程软件,案例和说明书下载
  15. oracle导出数据只能9999,批量快速的导入导出Oracle的数据
  16. 基于JSP+Servlet校园二手交易平台
  17. 变色龙引导安装mac
  18. 转录组学分析之基因芯片的预处理
  19. mysql8+maven+mybatis
  20. WWW2023即将截稿

热门文章

  1. python开发公司网站_用python开发网站
  2. php类实例化js,php中如何实例化一个类_后端开发
  3. linux进程创建过程,Linux 进程创建过程的分析
  4. 全连接神经网络_【模型解读】从“局部连接”回到“全连接”的Non-Local神经网络...
  5. java安装找不到uri,【找不到与请求 URI匹配的 HTTP 资源】(转)
  6. 中南大学c语言试题期末考试,2011年中南大学C语言期末试题卷A
  7. 初中物理凸透镜成像动态图_初中物理:凸透镜成像、望远镜与显微镜的区别
  8. STM32 HAL库 UART 串口读写功能笔记
  9. js Iframe与父级页面通信及IE9-兼容性
  10. SpringBoot 2.x (3):文件上传