本篇是神經(jīng)網(wǎng)絡(luò)體系搭建的第二篇困鸥,解決體系搭建的深度學(xué)習(xí)網(wǎng)絡(luò)相關(guān)問題,詳見神經(jīng)網(wǎng)絡(luò)體系搭建(序)
深度學(xué)習(xí)是一個(gè)已經(jīng)被說爛了的詞剑按,幾乎說起人工智能疾就,非專業(yè)人士也會(huì)說出深度學(xué)習(xí)這個(gè)詞,甚至有時(shí)候覺得神經(jīng)網(wǎng)絡(luò)艺蝴,low爆了猬腰,深度學(xué)習(xí)才流行。
我也一度以為深度學(xué)習(xí)是多么神奇的一個(gè)技術(shù)猜敢,其實(shí)說到底姑荷,還是神經(jīng)網(wǎng)絡(luò)盒延,沒啥高大上的,只不過深了很多層鼠冕,注意添寺,是“深”,而不是“寬”懈费。但是呢畦贸,就是深了很多層,確實(shí)讓它的表現(xiàn)好了很多楞捂,所以它才有了一個(gè)專有名字薄坏,叫做深度學(xué)習(xí)。
深入了解深度學(xué)習(xí)寨闹,先從多層感知器說起胶坠。
多層感知器(MLP,Multilayer Perceptron)
多層感知器的多層到底是指wide還是deep繁堡,看了一些例子沈善,發(fā)現(xiàn)只要wide了,就可以叫一個(gè)多層感知器椭蹄,那些中間層就被成為隱藏層闻牡。這里其實(shí)是有疑問的,因?yàn)槌诉@里绳矩,其他地方的“多層”指的都是Deep方向的層罩润,我也表示很迷糊……
反向傳播
神經(jīng)網(wǎng)絡(luò)體系搭建(一)中的權(quán)重求法,是單層神經(jīng)網(wǎng)絡(luò)或者單層網(wǎng)絡(luò)的堆疊權(quán)重矩陣的求法翼馆,如果有多層割以,就需要用反向傳播來求出每層的權(quán)重矩陣。
反向傳播的到底是什么应媚?是誤差項(xiàng)严沥,也就是神經(jīng)網(wǎng)絡(luò)體系搭建(一)中提到的error_term。
要使用梯度下降法更新隱藏層的權(quán)重中姜,你需要知道各隱藏層節(jié)點(diǎn)的誤差對(duì)最終輸出的影響消玄。每層的輸出是由兩層間的權(quán)重決定的,兩層之間產(chǎn)生的誤差丢胚,按權(quán)重縮放后在網(wǎng)絡(luò)中向前傳播翩瓜。既然我們知道輸出誤差,便可以用權(quán)重來反向傳播到隱藏層嗜桌。
——來自優(yōu)達(dá)學(xué)城
我們的目的是更新每一層的權(quán)重矩陣奥溺,更新的重點(diǎn)是求delta_w,求delta_w的重點(diǎn)是找到誤差項(xiàng)骨宠,我們可以正向傳播找到輸出節(jié)點(diǎn)的誤差項(xiàng)浮定,但是隱藏層的誤差項(xiàng)各是什么我們不知道相满,但是把網(wǎng)絡(luò)倒過來看,就可以把誤差項(xiàng)傳播回去桦卒,找到隱藏層的誤差項(xiàng)立美,這就是反向傳播。
數(shù)學(xué)原理
除去輸入層和輸出層方灾,剩下幾層就代表幾層的網(wǎng)絡(luò)建蹄。反向傳播詳細(xì)的計(jì)算過程見下圖(可查看原圖放大)。
代碼實(shí)現(xiàn)
下面實(shí)現(xiàn)有一個(gè)隱藏層的神經(jīng)網(wǎng)路裕偿。
import numpy as np
# 設(shè)置超參數(shù)
n_hidden = 2 # number of hidden units
epochs = 900
learnrate = 0.005
# 設(shè)置數(shù)據(jù)數(shù)量及每條數(shù)據(jù)的特征數(shù)量
n_records, n_features = features.shape
last_loss = None
# 初始化權(quán)重
weights_input_hidden = np.random.normal(scale=1 / n_features ** .5,
size=(n_features, n_hidden))
weights_hidden_output = np.random.normal(scale=1 / n_features ** .5,
size=n_hidden)
# 迭代e次
for e in range(epochs):
# 將各層的delta_w矩陣置零
del_w_input_hidden = np.zeros(weights_input_hidden.shape)
del_w_hidden_output = np.zeros(weights_hidden_output.shape)
# 對(duì)每一條數(shù)據(jù)
for x, y in zip(features.values, targets):
## 正向傳播 ##
# 計(jì)算隱藏層節(jié)點(diǎn)的輸入
hidden_input = np.dot(x, weights_input_hidden)
# 計(jì)算隱藏層節(jié)點(diǎn)的輸出
hidden_output = sigmoid(hidden_input)
# 計(jì)算輸出
output = sigmoid(np.dot(hidden_output, weights_hidden_output))
## 反向傳播 ##
# 計(jì)算誤差
error = y - output
# 計(jì)算輸出節(jié)點(diǎn)誤差項(xiàng)
output_error_term = error * output * (1 - output)
# 計(jì)算隱藏節(jié)點(diǎn)誤差項(xiàng)
hidden_error_term = np.dot(output_error_term, weights_hidden_output) * hidden_output * (1 - hidden_output)
# 更新所有delta_w
del_w_hidden_output += output_error_term * hidden_output
del_w_input_hidden += hidden_error_term * x[:, None]
# 更新所有權(quán)重矩陣
weights_input_hidden += learnrate * del_w_input_hidden / n_records
weights_hidden_output += learnrate * del_w_hidden_output / n_records
深度學(xué)習(xí)網(wǎng)絡(luò)
掌握了反向傳播洞慎,就掌握了深度學(xué)習(xí)網(wǎng)路的基礎(chǔ),對(duì)整個(gè)網(wǎng)絡(luò)的實(shí)現(xiàn)也就都明白了嘿棘。剩下的其實(shí)就是根據(jù)具體要解決的問題設(shè)置網(wǎng)絡(luò)劲腿,調(diào)整迭代次數(shù),調(diào)整隱藏層數(shù)鸟妙,調(diào)整分類器數(shù)等等焦人。
過擬合的防止
通常將數(shù)據(jù)分為訓(xùn)練集、驗(yàn)證集和測(cè)試集重父,為什么會(huì)多出來一個(gè)“驗(yàn)證集”花椭?就是為了防止過擬合。在訓(xùn)練時(shí)房午,我們通常用它的accuracy來確定學(xué)習(xí)率矿辽、迭代次數(shù)等超參數(shù)。如果在測(cè)試集上做這些歪沃,會(huì)是網(wǎng)絡(luò)“記住”測(cè)試集嗦锐,一點(diǎn)點(diǎn)過擬合測(cè)試集,因此有了驗(yàn)證集沪曙。
為了防止網(wǎng)絡(luò)過擬合,通常有以下三個(gè)辦法:
- 觀察“驗(yàn)證集(注意不是訓(xùn)練集也不是測(cè)試集而是驗(yàn)證集)”大的performance萎羔,在它停止提高時(shí)停止訓(xùn)練液走。
- L2正則化:對(duì)網(wǎng)絡(luò)應(yīng)用人為約束,隱式地減少自有參數(shù)的數(shù)量贾陷,同時(shí)不會(huì)使其更難優(yōu)化缘眶。
具體做法是將權(quán)重的L2范數(shù)添加到損失函數(shù),乘以一個(gè)較小的常數(shù)髓废,好處就是不用動(dòng)網(wǎng)絡(luò)結(jié)構(gòu)巷懈,但是多了一個(gè)要調(diào)節(jié)的超參數(shù)。L2范數(shù)代表想兩種各元素的平方和慌洪。 -
dropout:修改網(wǎng)絡(luò)本身結(jié)構(gòu)顶燕,在訓(xùn)練時(shí)凑保,隨機(jī)“刪除”一半的隱層單元。
Dropout涌攻,圖片來源于優(yōu)達(dá)學(xué)城課程截圖
問題回答
至此欧引,深度學(xué)習(xí)網(wǎng)絡(luò)的骨架搭建完畢。
-
多層感知器是什么恳谎?
包含眾多中間層的神經(jīng)網(wǎng)絡(luò)芝此。 -
深度學(xué)習(xí)是什么?
通過加深網(wǎng)絡(luò)層數(shù)使網(wǎng)絡(luò)表現(xiàn)更好因痛。 -
深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)有什么區(qū)別婚苹?
就是層數(shù)深了。 -
深度學(xué)習(xí)網(wǎng)絡(luò)模型有哪些參數(shù)可以調(diào)整(優(yōu)化)鸵膏?
選擇合適的迭代次數(shù)膊升、找合適的學(xué)習(xí)率、用L2正則化中較小的常數(shù)较性、合適的隱藏層數(shù)用僧、合適的分類器數(shù)、找合適的初始權(quán)重矩陣赞咙、找合適的激活函數(shù)责循、找合適的損失函數(shù)。
以上內(nèi)容來自822實(shí)驗(yàn)室神經(jīng)網(wǎng)絡(luò)知識(shí)分享
我們的822攀操,我們的青春
歡迎所有熱愛知識(shí)熱愛生活的朋友和822思享實(shí)驗(yàn)室一起成長(zhǎng)院仿,吃喝玩樂,享受知識(shí)速和。