咨询热线:13599308467 联系人:刘凯庆 地址:陕西省西安市莲湖区丰庆路中段68号
深度学习基础系列(六)| 权重初始化的选择
来源:亚美多一点手机版 发布时间:2019-11-20 点击量:158
深层网络需要一个优良的权重初始化方案,目的是降低发生梯度爆炸和梯度消失的风险。先解释下梯度爆炸和梯度消失的原因,假设我们有如下前向传播路径:
a1 = w1x + b1
z1 = σ(a1)
a2 = w2z1 + b2
z2 = σ(a2)
...
an = wnzn-1 + bn
zn = σ(an)
简化起见,令所有的b都为0,那么可得:
zn = σ(wnσ(Wn-1σ(...σ(w1x))),
若进一步简化,令z = σ(a) = a,那么可得:
zn = wn * Wn-1 * Wn-1 *...* X
而权重w的选择,假定都为1.5,那么可观察到 zn是呈现指数级递增,深层网络越深,意味着后面的值越大,呈现爆炸趋势;反之,w假定都为0.5,那么可观察到 zn是呈现指数级递减,深层网络越深,意味着后面的值越小,呈现消失趋势。
若令z = σ(a) = sigmoid(a),且a= ∑nwixi + b,其中n为输入参数的个数,当输入参数很多时,猜测|a|很大概率会大于1,对于sigmoid函数而言,|a|>1,则意味着曲线越来越平滑,z值会趋近于1或0,从而也会导致梯度消失。
那我们在每一层网络进行初始化权重时,若能给w一个合适的值,则能降低这种梯度爆炸或梯度消失的可能性吗?我们看看该如何选择。
一、随机分布权重
在keras中,其函数为:K.random_uniform_variable(),我们来直观地看看其数据分布图,先看代码:
import numpy as npimport matplotlib.pyplot as pltimport tensorflow.keras.backend as Kw = K.eval(K.random_uniform_variable(shape=(1, 10000), low=-1, high=1))w = w.reshape(-1)print("w:", w)x = K.eval(K.random_uniform_variable(shape=(1, 10000), low=-1, high=1))x = x.reshape(-1)print("x:", x)a = np.dot(w, x)print("a:", a)n, bins, patches = plt.hist(w, 50, density=1, facecolor="g", alpha=0.75)plt.xlabel("data range")plt.ylabel("probability")plt.axis([-2, 2, 0, 1])plt.grid(True)plt.show()
其图像为:
观察图像可知,随机函数取了10000个点,值范围被约束在-1~1之间,其概率分布都很均匀。
其输出结果为:
w: [-0.3033681 0.95340157 0.76744485 ... 0.24013376 0.5394962 -0.23630977]x: [-0.19380212 0.86640644 0.6185038 ... -0.66250014 -0.2095201 0.23459053]a: 16.111116
从结果可知,若我们的输入是10000个特征点,那么a= ∑10000wixi + b,从图像观察可知|a|>1的概率很大(结果为16.111116)。可想而知,不采用激活函数或relu函数,则有梯度爆炸的可能性;若采用sigmoid激活函数的话,则会导致梯度消失。
二、正太分布权重
在keras中,其函数为:K.random_normal_variable()和K.truncated_normal(),我们来直观地看看其数据分布图,先看K.random_normal_variable代码:
import numpy as npimport matplotlib.pyplot as pltimport tensorflow.keras.backend as Kw = K.eval(K.random_normal_variable(shape=(1, 10000), mean=0, scale=1))w = w.reshape(-1)print("w:", w)x = K.eval(K.random_uniform_variable(shape=(1, 10000), low=-1, high=1))x = x.reshape(-1)print("x:", x)a = np.dot(w, x)print("a:", a)n, bins, patches = plt.hist(w, 50, density=1, facecolor="g", alpha=0.75)plt.xlabel("data range")plt.ylabel("probability")plt.axis([-5, 5, 0, 0.6])plt.grid(True)plt.show()
其图像为:
其结果为:
w: [-1.8685548 1.501203 1.1083876 ... -0.93544585 0.08100258 0.4771947 ]x: [ 0.40333223 0.7284522 -0.40256715 ... 0.79942155 -0.915035 0.50783443]a: -46.02679
再看看K.truncated_normal()的代码:
import numpy as npimport matplotlib.pyplot as pltimport tensorflow.keras.backend as Kw = K.eval(K.truncated_normal(shape=(1, 10000), mean=0, stddev=1))w = w.reshape(-1)print("w:", w)x = K.eval(K.random_uniform_variable(shape=(1, 10000), low=-1, high=1))x = x.reshape(-1)print("x:", x)a = np.dot(w, x)print("a:", a)n, bins, patches = plt.hist(w, 50, density=1, facecolor="g", alpha=0.75)plt.xlabel("data range")plt.ylabel("probability")plt.axis([-5, 5, 0, 0.6])plt.grid(True)plt.show()
其图像为:
其结果为:
w: [ 1.0354282 -0.9385183 0.57337016 ... -0.3302136 -0.10443623 0.9371711 ]x: [-0.7896631 -0.01105547 0.778579 ... 0.7932384 -0.17074609 0.60096693]a: -18.191553
观察两个图像可知,两者都是正太分布图像,唯一区别在于K.truncated_normal()把大于2和小于2的数据给截断了,只保留了一部分数据。
从结果可知,若我们的输入是10000个特征点,那么a= ∑10000wixi + b ,从图像观察可知,虽然图像具有一定的对称性,总体均值为0,但|a1|>1依然有很大概率存在,依旧有有梯度消失和爆炸的可能性。
三、正太收窄权重
我们的目标是使得|a1| < 1,这样无论激活函数是sigmoid还是relu,都可以保证每一层的输出值不会增长太大,也不会增长过小。所以我们可以在正太分布的基础上,让其收窄变尖,可以让wi=wi / √n,其中n为该层的输入参数的数量,以10000个输出特征点为例,wi=wi / √10000,这样a1= ∑10000wixi + b1 就可以确保大致在-1~1范围内。可看代码:
import numpy as npimport matplotlib.pyplot as pltimport tensorflow.keras.backend as Kw = K.eval(K.random_normal_variable(shape=(1, 10000), mean=0, scale=1/np.sqrt(10000)))w = w.reshape(-1)print("w:", w)x = K.eval(K.random_uniform_variable(shape=(1, 10000), low=-1, high=1))x = x.reshape(-1)print("x:", x)a = np.dot(w, x)print("a:", a)n, bins, patches = plt.hist(w, 50, density=1, facecolor="g", alpha=0.75)plt.xlabel("data range")plt.ylabel("probability")plt.axis([-0.1, 0.1, 0, 50])plt.grid(True)plt.show()
其图像为:
其结果为:
w: [ 0.00635913 -0.01406644 -0.00843588 ... -0.00573074 0.00345371 -0.01102492]x: [ 0.3738377 -0.01633143 0.21199775 ... -0.78332734 -0.96384525 -0.3478613 ]a: -0.4904538
观察图像可知,数值范围已经被压缩在-0.025~0.025附近,概率值最高也到了40以上,变得又窄又尖了。
从结果也可知,我们成功地把|a|压缩在1范围以内,这个结果无论对sigmoid函数,还是relu函数,都是比较友好的,降低了梯度爆炸和梯度消失的风险,也利于加快训练学习过程。
相关产品
-
伊万诺维奇最近状态平平,罗马赛首轮不敌资格赛选手出局。很快欧洲媒体还捕捉到她在球场外“偷欢”的镜头:德国足球明星施魏因施泰格手捧伊万脸颊激吻。原来,“小猪”施魏因施泰格忙里偷闲到罗马“探班”,德国媒体认为,是“小猪”的不期而至扰乱了美女芳心,导致后者输球。
-
东平湖管理委员会副主任叶桂军说:“到目前为止,全县21家船上餐厅全部拆除。预计8月底,对餐船周边的附属物以及建筑垃圾全面清除。”
-
《愤怒的小鸟》曝光了小鸟与绿猪的“对战”版海报,“胖红”、“飞镖黄”、“炸弹黑”作为敢于和绿猪对抗的三只小鸟上阵对峙,看他们跃跃欲试的样子,这场大战恐怕会打得难解难分,我们的英雄“胖红”怒气冲冲瞪着想要夺取鸟蛋的绿猪,而对面三只忙着做鬼脸,露出“痴汉”式笑容的它们让人忍俊不禁。特辑中仔细展现了影片与游戏神契合的几处细节画面,逗趣又有爱的场景仿佛让人回到了游戏中的世界。
-
马布里在接受ESPN采访中表示,自己在CBA收官之战后将回到洛杉矶家中修养,并将保持运动员的体型和状态,“以防万一在NBA剩余赛季,有球队发出邀请”。
-
中新社桂林7月21日电 (赵琳露 唐星光)旅游胜地桂林漓江再添保护新规,旨在进一步规范漓江通航秩序和漓江旅游客船污染物排放,确保漓江水上交通安全及保护漓江生态环境。
-
宝马X5车尾的设计也变化明显,总的感觉是与宝马X1的设计更加接近,L型的尾灯点亮后有双翼的感觉。车身尺寸上,新宝马X5基本延续了老款的尺寸,长宽高为4886/1938/1762mm,长度和宽度略有增大,高度有所降低;轴距依然为2933mm,未有改变。新宝马X5在轮毂尺寸上有18寸、19寸以及20寸可供选择。
-
当广州恒大开始借功勋球员卖出高价的同时,其他球队却在高调地砸钱买人,其中便包括中甲土豪天津权健。在官宣赵旭日加盟后,天健权健在微博上傲娇地写道,“目前两外援、四内援已确定,留给天津权健官宣的机会不多了。 ”
-
范丽青说,中共中央政治局常委、国务院总理李克强4月10日下午在海南省博鳌会见了出席博鳌亚洲论坛2014年年会的台湾两岸共同市场基金会荣誉董事长萧万长一行,双方就发展两岸关系,特别是进一步推动两岸经济合作交换意见。
热点资讯
- Salesforce创始人:收购《时代》杂志是为了推动变革2019-11-15
- 肉鸽养殖的特点养殖过程中有什么特别注意的?2019-06-28
- 街电称来电以专利勒索8亿元,要求远超价值的收购2019-11-18
- “长不大”的微软小娜2019-11-09
- 官员们被指控接受3千多万14年的监禁,并以亲戚|马汉选择|拆迁|房地产开发有限公司的名义租了两套公寓。2019-06-28
- 多家企业被纳入电信业务经营不良名单百度等在列2019-06-28
- 开源软件平台如何加速数据科学?超级公开课特别预览2019-06-28
- 特斯拉开始生产欧洲版Model3,为进军欧洲市场做准备2019-06-28