準(zhǔn)備工作讀懂這篇文章,需要你有以下方面的知識(shí)
如果有下列知識(shí)就更好了
有任何沒(méi)看懂的部分,歡迎留言,信不信我半小時(shí)內(nèi)秒回。 一個(gè)巨簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)(A Deadly Simple NN) 如果你對(duì)神經(jīng)網(wǎng)絡(luò)(neural network)感興趣或者關(guān)注過(guò)相關(guān)的文章,那下圖中的這個(gè)模型想必你不會(huì)感覺(jué)很陌生。 一個(gè)人工神經(jīng)網(wǎng)絡(luò)模型不過(guò)這個(gè)可能對(duì)于初學(xué)者有點(diǎn)不太友好?那看看下面這個(gè)簡(jiǎn)化版的 一個(gè)無(wú)隱層的神經(jīng)網(wǎng)絡(luò)圖里的這些東西,咱們一個(gè)一個(gè)的捋一遍。每個(gè)藍(lán)色的圓代表一個(gè)神經(jīng)元(neuron)。每個(gè)方塊代表一個(gè)運(yùn)算,比如 + 代表求和。上圖中最左邊的三個(gè)神經(jīng)元組成了輸入層(input layer),包含一個(gè) h 的神經(jīng)元組成了輸出層(output layer),并且這一層只有這一個(gè)神經(jīng)元。 輸出層神經(jīng)元的輸入值對(duì)于生物學(xué)意義上的神經(jīng)元來(lái)說(shuō),通常存在一個(gè)閾值(threshold)來(lái)使其達(dá)到興奮的狀態(tài),也就是被激活。在我們所討論的神經(jīng)網(wǎng)絡(luò)中,我們的神經(jīng)元將會(huì)通過(guò)輸入值和激活函數(shù)(activation function)計(jì)算一個(gè)輸出值。激活函數(shù)最值得稱(chēng)贊的一點(diǎn)就是它可以是任何類(lèi)型的函數(shù),包括但不限于躍階函數(shù),多項(xiàng)式函數(shù)或者 sigmoid 函數(shù)。h 是輸出神經(jīng)元的輸入值,結(jié)合激活函數(shù),輸出神經(jīng)元會(huì)輸出 f(h) 計(jì)算的結(jié)果 y,也就是整個(gè)神經(jīng)網(wǎng)絡(luò)的輸出值。 如果你選擇 f(h) = h 作為你的激活函數(shù),那么你的神經(jīng)網(wǎng)絡(luò)輸出結(jié)果將會(huì)是下圖中的這個(gè)公式,這里 y = f(h)。 神經(jīng)網(wǎng)絡(luò)的輸出如果你覺(jué)得這看起來(lái)是一個(gè)線性回歸的模型,那就對(duì)了。如果你的激活函數(shù)是連續(xù)且可導(dǎo)的,那么(通常情況下)你就可以使用一個(gè)叫做 梯度下降(gradient descent) 的方法來(lái)訓(xùn)練你的網(wǎng)絡(luò)。不過(guò)這理解起來(lái)要稍微麻煩一點(diǎn),在我們深入到訓(xùn)練的步驟之前,我們先來(lái)編寫(xiě)一個(gè)很簡(jiǎn)單的程序來(lái)了解神經(jīng)網(wǎng)絡(luò)作出預(yù)測(cè)的過(guò)程。我們將使用 sigmoid 函數(shù)作為激活函數(shù), Python 作為編程語(yǔ)言。預(yù)測(cè)的這個(gè)過(guò)程是一種前饋(feedforward)的計(jì)算,僅僅有這一部分的神經(jīng)網(wǎng)絡(luò)是不能學(xué)習(xí)的(例如,通過(guò)反向傳播(backpropagation)),但我們稍后再關(guān)注訓(xùn)練學(xué)習(xí)的部分。 Sigmoid 函數(shù) import numpy as npdef sigmoid(x): # sigmoid function return 1/(1 + np.exp(-x))inputs = np.array([0.7, -0.3])weights = np.array([0.1, 0.8])bias = -0.1# calculate the outputoutput = sigmoid(np.dot(weights, inputs) + bias)print('Output:')print(output) 第一個(gè)單隱層神經(jīng)網(wǎng)絡(luò)(Your First 2-Layer NN) 注:?jiǎn)坞[層,即為包括一個(gè)隱層,一個(gè)輸出層的神經(jīng)網(wǎng)絡(luò),輸入層和輸出層因?yàn)槭潜仨毜?,所以不?jì)數(shù)。 現(xiàn)在你已經(jīng)基本知道了一個(gè)神經(jīng)網(wǎng)絡(luò)是怎么計(jì)算預(yù)測(cè)結(jié)果的。在現(xiàn)實(shí)生活中,我們面臨的預(yù)測(cè)問(wèn)題往往十分復(fù)雜,這樣簡(jiǎn)單的網(wǎng)絡(luò)結(jié)構(gòu)可能遠(yuǎn)遠(yuǎn)不夠。這里我們要引入一個(gè)新的概念,隱層(hidden layer)。 一個(gè)擁有三個(gè)輸入層神經(jīng)元,兩個(gè)隱層神經(jīng)元和一個(gè)輸出層神經(jīng)元的神經(jīng)網(wǎng)絡(luò) 在第一部分那個(gè)簡(jiǎn)單的網(wǎng)絡(luò)模型中,我們的權(quán)重(weight)是一個(gè)向量。但是對(duì)于多數(shù)神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),其實(shí)權(quán)重將會(huì)是一個(gè)如下圖一樣的矩陣。 三個(gè)輸入層神經(jīng)元和兩個(gè)隱層神經(jīng)元的權(quán)重矩陣 結(jié)合第一部分的理解和上面單隱層神經(jīng)網(wǎng)的模型,你也許已經(jīng)知道怎么通過(guò)這個(gè)模型計(jì)算 h1 的具體數(shù)值了。我們給出一個(gè)簡(jiǎn)單的公式定義 計(jì)算隱層神經(jīng)元輸入值的公式 對(duì)于我們所關(guān)注的這個(gè)單隱層模型來(lái)說(shuō),它是下面這樣的 計(jì)算隱層輸入值的矩陣乘法 注意?。?/strong>:上圖中的權(quán)重下角標(biāo)已經(jīng)更改為矩陣的表達(dá)方式,并不是和單隱層神經(jīng)網(wǎng)絡(luò)圖中的下角標(biāo)所對(duì)應(yīng)的。因?yàn)樵诰仃嚨谋磉_(dá)方法中,是用行/列的順序來(lái)標(biāo)注的。所以如果用示意圖中的方法標(biāo)注的話,會(huì)造成一些誤會(huì)。 用先前神經(jīng)網(wǎng)絡(luò)模型圖中的下角標(biāo)所標(biāo)注的矩陣 記住,上圖中的這個(gè)計(jì)算過(guò)程使用的并非是矩陣使用的角標(biāo),但這個(gè)和我們上面單隱層神經(jīng)網(wǎng)絡(luò)的示意圖中的標(biāo)注是一致的。 結(jié)合上面所學(xué)的知識(shí),我們可以快速構(gòu)建一個(gè)單隱層神經(jīng)網(wǎng)絡(luò)的前饋(即預(yù)測(cè))過(guò)程了。我們?nèi)匀皇褂?sigmoid 函數(shù)作為我們的激活函數(shù)(并且在之后很長(zhǎng)時(shí)間都會(huì)用這個(gè)函數(shù))。 待辦事項(xiàng):
import numpy as npdef sigmoid(x): # sigmoid function return 1/(1+np.exp(-x))# 神經(jīng)網(wǎng)絡(luò)各層神經(jīng)元數(shù)量N_input = 3N_hidden = 2N_output = 1np.random.seed(42)# Make some fake dataX = np.random.randn(4)# 生成輸入層到隱層/隱層到輸出層權(quán)重weights_in_hidden = np.random.normal(0, scale=0.1, size=(N_input, N_hidden))weights_hidden_out = np.random.normal(0, scale=0.1, size=(N_hidden, N_output))# 計(jì)算隱層的輸入值/輸出值hidden_layer_in = np.dot(X, weights_in_hidden)hidden_layer_out = sigmoid(hidden_layer_in)print('Hidden-layer Output:')print(hidden_layer_out)# 計(jì)算輸出層的輸入值/輸出值output_layer_in = np.dot(hidden_layer_out, weights_hidden_out)output_layer_out = sigmoid(output_layer_in)print('Output-layer Output:')print(output_layer_out) 參考資料
|
|
來(lái)自: 天朗氣清uizw04 > 《數(shù)學(xué)》