神經(jīng)網(wǎng)絡(luò)

什么是神經(jīng)網(wǎng)絡(luò)

M-P神經(jīng)元模型

M-P神經(jīng)元模型是一直沿用至今的神經(jīng)元模型,神經(jīng)元接收到來自n個其他神經(jīng)元傳遞過來的輸入信號,這些輸入信號通過帶權(quán)重的連接進行傳遞,神經(jīng)元接收到的總輸入將與神經(jīng)元的閾值進行比較,然后通過“激活函數(shù)”處理以產(chǎn)生神經(jīng)元的輸出贺嫂。
理想中的激活函數(shù)是階躍函數(shù),它將輸入值映射為輸出值“0”或“1”雁乡,顯然“1”對應(yīng)于神經(jīng)元興奮第喳,“0”對應(yīng)于神經(jīng)元抑制。然而踱稍,階躍函數(shù)具有不連續(xù)性曲饱、不光滑等不太好的性質(zhì),因此實際常用Sigmoid函數(shù)作為激活函數(shù)珠月。Sigmoid把可能在較大范圍內(nèi)變化的輸入值擠壓到(0扩淀,1)輸出值的范圍內(nèi),因此有時也稱為“擠壓函數(shù)”桥温。


典型的神經(jīng)元激活函數(shù)

把許多個這樣的神經(jīng)元按一定的層次結(jié)構(gòu)連接起來引矩,就得到了神經(jīng)網(wǎng)絡(luò)梁丘。

誤差逆?zhèn)鞑ニ惴?/h2>

誤差逆?zhèn)鞑ィ╡rror BackPropagation侵浸,簡稱BP)算法是迄今最成功的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)算法⊥拢現(xiàn)實任務(wù)中使用神經(jīng)網(wǎng)絡(luò)時,大多是在使用BP算法進行訓(xùn)練掏觉。通常說“BP網(wǎng)絡(luò)”時区端,一般是指用BP算法訓(xùn)練的多層前饋神經(jīng)網(wǎng)絡(luò)。


BP網(wǎng)絡(luò)

這是一個擁有d個屬性描述澳腹,l個輸出神經(jīng)元织盼、q個隱層神經(jīng)元的多層前饋網(wǎng)絡(luò)結(jié)構(gòu)。


image.png

參數(shù)說明:



隱層神經(jīng)元的梯度項

下圖給出了BP算法的工作流程酱塔。對每個訓(xùn)練樣例沥邻,BP算法執(zhí)行以下操作:先將輸入示例提供給輸入層神經(jīng)元,然后逐層將信號前傳羊娃,知道產(chǎn)生輸出層的結(jié)果唐全;然后計算輸出層的誤差(第4-5行),再將誤差逆?zhèn)鞑ブ岭[層神經(jīng)元(第6行)蕊玷,最后根據(jù)隱層神經(jīng)元的誤差來對連接權(quán)和閾值進行調(diào)整(第7行)邮利。該迭代過程循環(huán)進行,直到達到某些停止條件為止垃帅,例如訓(xùn)練誤差已達到一個很小的值延届。


誤差逆?zhèn)鞑ニ惴?/div>

需注意的是,BP算法的目標(biāo)是要最小化訓(xùn)練集D上的累積誤差

但上圖的更新規(guī)則是基于單個的Ek推導(dǎo)而得贸诚。如果類似地推導(dǎo)出基于累積誤差最小化的更新規(guī)則方庭,就得到了累積誤差逆?zhèn)鞑ニ惴ā@鄯eBP算法和標(biāo)準(zhǔn)BP算法都很常用酱固。一般來說二鳄,標(biāo)準(zhǔn)BP算法每次更新只針對單個樣例,參數(shù)更新的非常頻繁媒怯,而且對不同樣例更新的效果可能出現(xiàn)“抵消”現(xiàn)象订讼。因此,為了達到同樣的累積誤差極小點扇苞,標(biāo)準(zhǔn)BP算法往往需進行更多次迭代欺殿。累積BP算法直接針對累積誤差最小化,它在讀取整個訓(xùn)練集D一遍后才對參數(shù)進行更新鳖敷,其參數(shù)更新的頻率低得多脖苏。但在很多任務(wù)中,累積誤差下降到一定程度之后定踱,進一步下降會非常緩慢棍潘,這時標(biāo)準(zhǔn)BP往往會更快獲得較好的解,尤其是在訓(xùn)練集D非常大時更明顯。

由于其強大的表示能力亦歉,BP神經(jīng)網(wǎng)絡(luò)經(jīng)常遭遇過擬合恤浪,其訓(xùn)練誤差持續(xù)降低,但測試誤差卻可能上升肴楷。有兩種策略常用來緩解BP網(wǎng)絡(luò)的過擬合水由。第一種策略是“早停”:將數(shù)據(jù)集分成訓(xùn)練集和測試集赛蔫,訓(xùn)練集用來計算梯度砂客、更新連接權(quán)和閾值,驗證集用來估計誤差呵恢,若訓(xùn)練集誤差降低但驗證集誤差升高鞠值,則停止訓(xùn)練,同時返回具有最小驗證集誤差的連接權(quán)和閾值渗钉。第二種策略是“正則化”齿诉,其基本思想是在誤差目標(biāo)函數(shù)中增加一個用于描述網(wǎng)絡(luò)復(fù)雜度的部分。

代碼部分

數(shù)據(jù)來自西瓜書P84
西瓜數(shù)據(jù)集3.0

讀取數(shù)據(jù)

import pandas as pd
import numpy as np
dataset = pd.read_csv('watermelon_3.csv', delimiter=",")

數(shù)據(jù)預(yù)處理

# 處理數(shù)據(jù)集
attributeMap = {}
attributeMap['淺白'] = 0
attributeMap['青綠'] = 0.5
attributeMap['烏黑'] = 1
attributeMap['蜷縮'] = 0
attributeMap['稍蜷'] = 0.5
attributeMap['硬挺'] = 1
attributeMap['沉悶'] = 0
attributeMap['濁響'] = 0.5
attributeMap['清脆'] = 1
attributeMap['模糊'] = 0
attributeMap['稍糊'] = 0.5
attributeMap['清晰'] = 1
attributeMap['凹陷'] = 0
attributeMap['稍凹'] = 0.5
attributeMap['平坦'] = 1
attributeMap['硬滑'] = 0
attributeMap['軟粘'] = 1
attributeMap['否'] = 0
attributeMap['是'] = 1
del dataset['編號']
dataset = np.array(dataset)
m, n = np.shape(dataset)
for i in range(m):
    for j in range(n):
        if dataset[i, j] in attributeMap:
            dataset[i, j] = attributeMap[dataset[i, j]]
        dataset[i, j] = round(dataset[i, j], 3)

trueY = dataset[:, n-1]
X = dataset[:, :n-1]
m, n = np.shape(X)

初始化參數(shù)

# P101,初始化參數(shù)
import random
d = n   # 輸入向量的維數(shù)
l = 1   # 輸出向量的維數(shù)
q = d+1   # 隱層節(jié)點的數(shù)量
theta = [random.random() for i in range(l)]   # 輸出神經(jīng)元的閾值
gamma = [random.random() for i in range(q)]   # 隱層神經(jīng)元的閾值
# v size= d*q .輸入和隱層神經(jīng)元之間的連接權(quán)重
v = [[random.random() for i in range(q)] for j in range(d)]
# w size= q*l .隱藏和輸出神經(jīng)元之間的連接權(quán)重
w = [[random.random() for i in range(l)] for j in range(q)]
eta = 0.2    # 學(xué)習(xí)率晌姚,控制每一輪迭代的步長
maxIter = 5000  # 最大訓(xùn)練次數(shù)

sigmoid函數(shù)

import math
def sigmoid(iX,dimension):  # iX is a matrix with a dimension
    if dimension == 1:
        for i in range(len(iX)):
            iX[i] = 1 / (1 + math.exp(-iX[i]))
    else:
        for i in range(len(iX)):
            iX[i] = sigmoid(iX[i], dimension-1)
    return iX

標(biāo)準(zhǔn)的誤差逆?zhèn)鞑?/p>

# 標(biāo)準(zhǔn)BP
while(maxIter > 0):
    maxIter -= 1
    sumE = 0
    for i in range(m):
        alpha = np.dot(X[i], v)  # p101 line 2 from bottom, shape=1*q
        b = sigmoid(alpha-gamma, 1)  # b=f(alpha-gamma), shape=1*q
        beta = np.dot(b, w)  # shape=(1*q)*(q*l)=1*l
        predictY = sigmoid(beta-theta, 1)   # shape=1*l ,p102--5.3
        E = sum((predictY-trueY[i])*(predictY-trueY[i]))/2    # 5.4
        sumE += E  # 5.16
        # p104
        g = predictY*(1-predictY)*(trueY[i]-predictY)  # shape=1*l p103--5.10
        e = b*(1-b)*((np.dot(w, g.T)).T)  # shape=1*q , p104--5.15
        w += eta*np.dot(b.reshape((q, 1)), g.reshape((1, l)))  # 5.11
        theta -= eta*g  # 5.12
        v += eta*np.dot(X[i].reshape((d, 1)), e.reshape((1, q)))  # 5.13
        gamma -= eta*e  # 5.14
    # print(sumE)

累積的誤差逆?zhèn)鞑?/p>

# #累積 BP
# trueY=trueY.reshape((m,l))
# while(maxIter>0):
#     maxIter-=1
#     sumE=0
#     alpha = np.dot(X, v)#p101 line 2 from bottom, shape=m*q
#     b = sigmoid(alpha - gamma,2)  # b=f(alpha-gamma), shape=m*q
#     beta = np.dot(b, w)  # shape=(m*q)*(q*l)=m*l
#     predictY = sigmoid(beta - theta,2)  # shape=m*l ,p102--5.3
#
#     E = sum(sum((predictY - trueY) * (predictY - trueY))) / 2  # 5.4
#     # print(round(E,5))
#     g = predictY * (1 - predictY) * (trueY - predictY)  # shape=m*l p103--5.10
#     e = b * (1 - b) * ((np.dot(w, g.T)).T)  # shape=m*q , p104--5.15
#     w += eta * np.dot(b.T, g)  # 5.11 shape (q*l)=(q*m) * (m*l)
#     theta -= eta * g  # 5.12
#     v += eta * np.dot(X.T, e)  # 5.13 (d,q)=(d,m)*(m,q)
#     gamma -= eta * e  # 5.14

預(yù)測

def predict(iX):
    alpha = np.dot(iX, v)  # p101 line 2 from bottom, shape=m*q
    b = sigmoid(alpha-gamma, 2)  # b=f(alpha-gamma), shape=m*q
    beta = np.dot(b, w)  # shape=(m*q)*(q*l)=m*l
    predictY = sigmoid(beta - theta, 2)  # shape=m*l ,p102--5.3
    return predictY

print(predict(X))

輸出結(jié)果
image.png

代碼以及數(shù)據(jù)集可以到我碼云下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粤剧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挥唠,更是在濱河造成了極大的恐慌抵恋,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宝磨,死亡現(xiàn)場離奇詭異弧关,居然都是意外死亡,警方通過查閱死者的電腦和手機唤锉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門世囊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窿祥,你說我怎么就攤上這事株憾。” “怎么了晒衩?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵嗤瞎,是天一觀的道長。 經(jīng)常有香客問我听系,道長贝奇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任靠胜,我火速辦了婚禮掉瞳,結(jié)果婚禮上毕源,老公的妹妹穿的比我還像新娘。我一直安慰自己陕习,他們只是感情好霎褐,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衡查,像睡著了一般。 火紅的嫁衣襯著肌膚如雪必盖。 梳的紋絲不亂的頭發(fā)上拌牲,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音歌粥,去河邊找鬼塌忽。 笑死,一個胖子當(dāng)著我的面吹牛失驶,可吹牛的內(nèi)容都是我干的土居。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼嬉探,長吁一口氣:“原來是場噩夢啊……” “哼擦耀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涩堤,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤眷蜓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后胎围,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吁系,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年白魂,在試婚紗的時候發(fā)現(xiàn)自己被綠了汽纤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡福荸,死狀恐怖蕴坪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敬锐,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布滞造,位于F島的核電站续室,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谒养。R本人自食惡果不足惜挺狰,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一明郭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丰泊,春花似錦薯定、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至学赛,卻和暖如春年堆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盏浇。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工变丧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绢掰。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓痒蓬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親滴劲。 傳聞我的和親對象是個殘疾皇子攻晒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容