【DL碎片1】神经网络参数初始化的学问

我们已经知道,神经网络的参数主要是权重(weights):W, 和偏置项(bias):b。
训练神经网络的时候需先给定一个初试值,才能够训练,然后一点点地更新,但是不同的初始化方法,训练的效果可能会截然不同。本文主要记录一下不同的初始化的方法,以及相应的效果。

笔者正在学习的Andrew Ng的DeepLearning.ai提供了相应的模型框架和数据,我们这里要自己设置的就是不同的初值。

数据可视化之后是这样的:


数据集

我们需要做的就是把上面的红点和蓝点分类。

一、直接把参数都初始化为0

这是大家可以想到的最简单的方法,也确实很多其他的地方都采用0初值,那神经网络中这样做是否可行呢?
在python中,可以用np.zeros((维度)) 来给一个向量/矩阵赋值0,
于是,对于L层神经网络,可这样进行0-initialization:

for l in range(1,L): #总共L层,l为当前层
    W = np.zeros((num_of_dim[l],num_of_dim[l-1])) # W的维度是(当前层单元数,上一层单元数)
    b = np.zeros((num_of_dim[l],1)) # b的维度是(当前层单元数,1)

通过这样的初值,我们run一下模型,得到的cost-iteration曲线以及在训练集、测试集上面的准确率如下:


可以发现,压根就没训练!得到的模型跟瞎猜没有区别。

为什么呢?

我们看看神经网络的结构图:

3层神经网络

这是一个3层神经网络,可以看出,神经网络结构是十分对称的,不管有几层。
当我们把所有的参数都设成0的话,那么上面的每一条边上的权重就都是0,那么神经网络就还是对称的,对于同一层的每个神经元,它们就一模一样了。
这样的后果是什么呢?我们知道,不管是哪个神经元,它的前向传播和反向传播的算法都是一样的,如果初始值也一样的话,不管训练多久,它们最终都一样,都无法打破对称(fail to break the symmetry),那每一层就相当于只有一个神经元,最终L层神经网络就相当于一个线性的网络,如Logistic regression,线性分类器对我们上面的非线性数据集是“无力”的,所以最终训练的结果就瞎猜一样。

因此,我们决不能把所有参数初始化为0,同样也不能初始化为任何相同的值,因为我们必须“打破对称性”!

二、随机初始化

好,不用0,咱们随机给一批值总可以吧。确实可以!咱们看看:
【下面的演示会试试多种参数或超参数,为了方便大家看,我分4步:①②③④】

①随机初始化

python中,随机初始化可以用 np.random.randn(维度) 来随机赋值:
于是前面的代码改成:

for l in range(1,L): #总共L层,l为当前层
    W = np.random.randn(num_of_dim[l],num_of_dim[l-1]) # W的维度是(当前层单元数,上一层单元数)
    b = np.zeros((num_of_dim[l],1)) # b的维度是(当前层单元数,1)

这里有三点需要说明一下:

  1. b不用随机初始化,因为w随机之后,已经打破对称,b就一个常数,无所谓了
  2. random.rand()是在0~1之间随机,random.randn()是标准正态分布中随机,有正有负
  3. np.zeros(())这里是两个括号,random.randn()是一个括号,奇怪的很,就记着吧

那看看run出来的效果如何呢:


效果明显比0初始化要好多了,cost最后降的也比较低,准确率也不错,92%。给分类效果可视化:


我们接着试试,如果把随机初始化的值放大一点会出现什么:

②放大版随机初始化

for l in range(1,L): #总共L层,l为当前层
    W = np.random.randn(num_of_dim[l],num_of_dim[l-1])*10 # W的维度是(当前层单元数,上一层单元数)
    b = np.zeros((num_of_dim[l],1)) # b的维度是(当前层单元数,1)

上面的代码中,我们给W最后多乘以10,run的效果:
【注意啊,乘以10不一定就是变大,因为我们的w的随机取值可正可负,所以乘以10之后,正数更大,负数更小】


咦~~ 真o心 ~~

准确率明显降低了许多,到86%。

为什么把随机初始化的值放大就不好了呢?

我们看看神经网络中常用的sigmoid函数:

sigmoid function

这家伙,中间的斜率大,两边的斜率小还趋于零。所以当我们把随机的值乘以10了之后,我们的初值会往两边跑,那么我们的梯度下降就会显著变慢,可能迭代半天,才下降一点点。

这就是问题的症结。

我们上面的实验,可以从图的横坐标看出,都是设定的一样的迭代次数(iteration number):15000次,因此,在相同的迭代次数下,放大版的随机初始化的模型的学习就像一个“笨学生”,没别人学的多,因此效果就更差

为了验证我说的,我们可以试试吧迭代次数加大,看看我说的是不是对的:

③增大迭代次数

测试了好久。。。
然后打脸了。。。

不过还是值得玩味~~

我把迭代次数显示设为60000,也就是增大了4,5倍,结果cost function后来下降十分十分缓慢,最后效果还不如之前的。然后我再把迭代次数增加到了160000,相当于比一开始增大了10倍多,结果....


可以看到,cost基本从20000次迭代之后就稳定了,怎么都降不下去了,实际上是在降低,但是十分十分十分X10地缓慢。难道这就是传说中的梯度消失???
所以结果并没有我想象地把迭代次数加大,就可以解决这个问题,实际上,可以看到,在训练集上准确度确实上升了,所以说明确实模型有所改进,只不过改进的太缓慢,相当于没有改进。

仔细分析了一下,由于W太大或者太小,导致激活函数对w的倒数趋于零,那么计算cost对w的导数也会趋于零,所以下降如此缓慢也是可以理解。

好,放大的效果如此差,我们缩小试试?

④缩小版随机初始化

还是回到迭代14000次,这次把w除以10看看:

嘿~缩小结果甚至更差!连圈圈都没有了。

上面这个图,说明学习到的模型太简单了,因为我们把w都除以10,实际上就接近0了,深度学习中我们认为参数越大,模型越复杂;参数越小,模型越简单。所以除以10之后,参数太小了,模型就too simple了,效果当然不好。

最后再试一次吧,再多的话大家都烦了我也烦了。

上面乘以10和除以10,效果都很差,那我们试一个中间的,比如:除以3(真的是随便试试)


好了好了,终于提高了!这个准确率是目前的最高水平了!

可见,只要找到一个恰当的值来缩小,是可以提高准确率的。但是,这里除以三是我拍脑门出来的,不能每次都这么一个个地试吧,有没有一个稳健的,通用的方法呢?

有!接着看:

三、何氏初试法(He Initialization)(不知道是不是何,我音译的)

上面试了各种方法,放大缩小都不好,无法把握那个度。还好,总有大神为我们铺路,论文He et al., 2015.中提出了一种方法,我们称之为He Initialization,它就是在我们随机初始化了之后,乘以

这样就避免了参数的初始值过大或者过小,因此可以取得比较好的效果,代码也很简单,用np.sqrt()来求平方根:

for l in range(1,L): #总共L层,l为当前层
    W = np.random.randn(num_of_dim[l],num_of_dim[l-1])**np.sqrt(2/num_of_dim[l-1]) # W的维度是(当前层单元数,上一层单元数)
    b = np.zeros((num_of_dim[l],1)) # b的维度是(当前层单元数,1)

取得的效果如下:


啧啧啧,看这效果,看这优美的损失曲线,看着卓越的准确率... ...

以后就用你了,He Initialization !

其实吧,He Initialization是推荐针对使用ReLU激活函数的神经网络使用的,不过对其他的激活函数,效果也不错。

还有其他的类似的一些好的初始化方法,例如:

推荐给sigmoid的Xavier Initialization:随机化之后乘以

总结一下:

  • 神经网络不可用0来初始化参数!
  • 随机赋值是为了打破对称性,使得不同的神经元可以有不同的功能
  • 推荐在初始化的时候使用He Initialization

我的其他[深度学习笔记]文章:
【DL笔记1】Logistic回归:最基础的神经网络
【DL笔记2】神经网络编程原则&Logistic Regression的算法解析
如果觉得写的不错,随手点个赞吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容