在神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)中,權(quán)重的初始值特別重要。實(shí)際上,設(shè)定什么樣的權(quán)重初始值,經(jīng)常關(guān)系到神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)能否成功。本節(jié)將介紹權(quán)重初始值的推薦值,并通過(guò)實(shí)驗(yàn)確認(rèn)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)是否會(huì)快速進(jìn)行。
可以將權(quán)重初始值設(shè)為0嗎
后面我們會(huì)介紹抑制過(guò)擬合、提高泛化能力的技巧 —— 權(quán)值衰減。
權(quán)值衰減就是一種以減小權(quán)重參數(shù)的值為目的進(jìn)行學(xué)習(xí)的方法。
如果想減小權(quán)重的值,一開始就將初始值設(shè)為較小的值才是正途。實(shí)際上在這之前的權(quán)重初始值都是像0.01 * np.random.randn(10,100)
這樣,使用由高斯分布生成的值乘以0.01后得到的值(標(biāo)準(zhǔn)差為0.01的高斯分布)。
如果我們把權(quán)重初始值全部設(shè)為0以減小權(quán)重的值,會(huì)怎么樣呢? 事實(shí)上,將權(quán)重初始值設(shè)為0的話,將無(wú)法正確進(jìn)行學(xué)習(xí)。
為什么不能將權(quán)重初始值設(shè)為0呢? 嚴(yán)格地說(shuō),為什么不能將權(quán)重初值設(shè)成一樣的值?
這是因?yàn)樵谡`差反向傳播法中,所有的權(quán)重值都會(huì)進(jìn)行相同的更新。
比如,在2層神經(jīng)網(wǎng)絡(luò)中,假設(shè)第1層和第2層的權(quán)重為0。這樣一來(lái),正向傳播時(shí),因?yàn)檩斎藢拥臋?quán)重為0,所以第2層的神經(jīng)元全部被傳遞相同的值。第2層的神經(jīng)元中全部輸入相同的值,這意味著反向傳播時(shí)第2層的權(quán)重全部都會(huì)進(jìn)行相同的更新。因此,權(quán)重被更新為相同的值,并擁有了對(duì)稱的值(重復(fù)的值)。這使得神經(jīng)網(wǎng)絡(luò)擁有許多不同的權(quán)重的意義喪失了,所以必須隨機(jī)生成初始值。
隱藏層的激活值的分布
各層的激活值的分布都要求有適當(dāng)?shù)膹V度。因?yàn)橥ㄟ^(guò)在各層間傳遞多樣性的數(shù)據(jù),神經(jīng)網(wǎng)絡(luò)可以進(jìn)行高效的學(xué)習(xí)。反過(guò)來(lái),如果傳遞的是有所偏向的數(shù)據(jù),就會(huì)出現(xiàn)梯度消失或者“表現(xiàn)力受限”的問(wèn)題,導(dǎo)致學(xué)習(xí)可能無(wú)法順利進(jìn)行。
現(xiàn)在,在一般的深度學(xué)習(xí)框架中,Xavier初始值已被作為標(biāo)準(zhǔn)使用,比如,Cafe框架中,通過(guò)在設(shè)定權(quán)重初始值時(shí)賦予xavier參數(shù),就可以使用Xavier初始值。Xavier的論文中,為了使各層的激活值呈現(xiàn)出具有相同廣度的分布,推導(dǎo)了合適的權(quán)重尺度。推導(dǎo)出的結(jié)論是,如果前一層的節(jié)點(diǎn)數(shù)為n,則初值使用標(biāo)準(zhǔn)差為
的分布
使用Xavier初始值后,前一層的節(jié)點(diǎn)數(shù)越多,要設(shè)定為目標(biāo)節(jié)點(diǎn)的初始值的權(quán)重尺度就越小。
ReLU的權(quán)重初始值
Xavier初始值是以激活函數(shù)是線性函數(shù)為前提而推導(dǎo)出來(lái)的。因?yàn)閟igmoid函數(shù)和tanh函數(shù)左右對(duì)稱,且中央附近可以視作線性函數(shù),所以適合使用Xavier初始值。但當(dāng)激活函數(shù)使用ReLU時(shí),一般推薦使用ReLU專用的初始值也就是“He初始值”,即:當(dāng)前一層的節(jié)點(diǎn)數(shù)為n時(shí),He初始值使用標(biāo)準(zhǔn)差為的高斯分布。
總結(jié)一下,當(dāng)激活函數(shù)使用ReLU時(shí),權(quán)重初始值使用He初始值,當(dāng)激活函數(shù)為sigmoid或tanh等S型曲線函數(shù)時(shí),初始值使用Xavier初始值。這是目前的最佳實(shí)踐。
基于MNIST數(shù)據(jù)集的權(quán)重初始值的比較
下面通過(guò)實(shí)際的數(shù)據(jù),觀察不同的權(quán)重初始值的賦值方法會(huì)在多大程度上影響神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)。這里,我們基于std=0.01、Xavier初始值、He初始值進(jìn)行實(shí)驗(yàn),測(cè)試代碼如下:
# coding: utf-8
import os
import sys
sys.path.append(os.pardir) # 為了導(dǎo)入父目錄的文件而進(jìn)行的設(shè)定
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數(shù)據(jù)==========
(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:進(jìn)行實(shí)驗(yàn)的設(shè)置==========
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:開始訓(xùn)練==========
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()
結(jié)果如下:
std =0.01時(shí)完全無(wú)法進(jìn)行學(xué)習(xí)。這和才觀察到的激活值的分布一樣,是因?yàn)檎騻鞑ブ袀鬟f的值很小(集中在附近的數(shù)據(jù))。因此,逆向傳播時(shí)求到的梯度也很小,權(quán)重幾乎不進(jìn)行更新。
相反,當(dāng)權(quán)重初始值為Xavier初始值和He初始值時(shí),學(xué)習(xí)進(jìn)行得很順利并且,我們發(fā)現(xiàn)He初始值時(shí)的學(xué)習(xí)進(jìn)度更快一些。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-495068.html
綜上,在神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)中,權(quán)重初始值非常重要。很多時(shí)候權(quán)重初值的設(shè)定關(guān)系到神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)能否成功。權(quán)重初始值的重要性容易被忽視而任何事情的開始(初始值)總是關(guān)鍵的,因此在結(jié)束本節(jié)之際,再次強(qiáng)調(diào)權(quán)重初始值的重要性。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-495068.html
到了這里,關(guān)于【深度學(xué)習(xí)】5-2 與學(xué)習(xí)相關(guān)的技巧 - 權(quán)重的初始值的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!