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

感知機(jī)到神經(jīng)網(wǎng)絡(luò)

感知機(jī)(理論上)可以處理很復(fù)雜的問(wèn)題,但是感知機(jī)權(quán)重設(shè)置的工作依然是由人工進(jìn)行的,這個(gè)特性限制了感知機(jī)處理問(wèn)題的復(fù)雜度.
而神經(jīng)網(wǎng)絡(luò)一個(gè)重要性質(zhì)就是他可以自動(dòng)從數(shù)據(jù)中學(xué)習(xí)到合適的權(quán)重參數(shù).
習(xí)慣上"多層感知機(jī)"指的就是神經(jīng)網(wǎng)絡(luò).
一個(gè)2層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)可以用下圖表示:


神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)

"2層"表示擁有權(quán)重的層數(shù)為2
中間層由被稱為隱藏層,神經(jīng)網(wǎng)絡(luò)的連接方式和感知機(jī)一致,可以將神經(jīng)網(wǎng)絡(luò)理解成由多層感知機(jī)堆疊而成.

激活函數(shù)

感知機(jī)判別函數(shù)
y= \begin{cases} 0 &(w_1x_1+w_2x_2\le\theta) \\ 1 &(w_1x_1+w_2x_2\le\theta) \end{cases} = \begin{cases} 0 &(b+w_1x_1+w_2x_2)\le 0\\ 1 &(b+w_1x_1+w_2x_2)\gt0 \end{cases} \\其中 w_1,w_2稱為權(quán)重,b=-\theta稱為偏置
可以寫(xiě)成如下形式
a = b + w_1x_1+w_2x_2 \\ y = h(a) = \begin{cases} 0 &(a\le0) \\ 1 &(a\gt0) \end{cases} \\
類似h這種將輸入信號(hào)的總和轉(zhuǎn)化為輸出信號(hào)的函數(shù)被稱為激活函數(shù)
我們可以用下圖表示這一過(guò)程

image.png

神經(jīng)網(wǎng)絡(luò)中每一個(gè)節(jié)點(diǎn)都可以認(rèn)為是一個(gè)激活函數(shù)的計(jì)算過(guò)程.
常見(jiàn)的激活函數(shù)包括:

階躍函數(shù)

類似感知機(jī)的激活函數(shù),以閾值為界,一旦輸入超過(guò)閾值就切換輸出
h(x) = \begin{cases} 0 &(x\le x_0) \\ 1 &(x\gt x_0) \end{cases}

sigmoid函數(shù)(較傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)激活函數(shù)):

h(x)=\frac{1}{1+exp(-x)}

ReLU函數(shù)(最近流行的神經(jīng)網(wǎng)絡(luò)激活函數(shù))

h(x) = \begin{cases} 0 &(x \le0) \\ x &(x \gt0) \end{cases}

線性激活函數(shù)

神經(jīng)網(wǎng)絡(luò)必須使用非線性的激活函數(shù),否則便失去了加深神經(jīng)網(wǎng)絡(luò)層數(shù)的意義
eg.對(duì)于一個(gè)n層網(wǎng)絡(luò),若使用h_i(x)=c_ix作為激活函數(shù),則
y=h_1(h_x(...(h_n(x)..))=c_1(c_2(...(c_n(x)..))=(c_1c_2...c_n)x等價(jià)于單層神經(jīng)網(wǎng)絡(luò)

神經(jīng)網(wǎng)絡(luò)的內(nèi)積

image.png

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

三層神經(jīng)網(wǎng)絡(luò).png

其中,為函數(shù)
實(shí)現(xiàn)代碼如下:

import numpy as np
def init_network():
    network = {}
    network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
    network['b1'] = np.array([0.1, 0.2, 0.3])
    network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
    network['b2'] = np.array([0.1, 0.2])
    network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
    network['b3'] = np.array([0.1, 0.2])
    return network
def sigmoid(x):
    return 1/(1+np.exp(-x))
def forward(network,x):
    W1,W2,W3 = network['W1'],network['W2'],network['W3']
    b1,b2,b3 = network['b1'],network['b2'],network['b3']
    
    a1 = x.dot(W1) + b1
    z1 = sigmoid(a1)
    
    a2 = z1.dot(W2) + b2
    z2 = sigmoid(a2)
    
    a3 = z2.dot(W3) + b3
    y = a3
    return y
network = init_network()
x = np.array([1.,.5])
y = forward(network,x)
# y = [0.31682708, 0.69627909]

恒等函數(shù)和softmax函數(shù)

恒等函數(shù):將輸入信號(hào)原樣輸出的函數(shù),輸出層的神經(jīng)元只受單個(gè)輸入神經(jīng)元的影響

恒等函數(shù)

softmax函數(shù):,輸出層的神經(jīng)元收到輸入層的所有神經(jīng)元影響
為了防止數(shù)值溢出,我們可以對(duì)上式變形
softmax函數(shù)總是輸出0.到1.之間的實(shí)數(shù),并且softmax輸出總和總是1,我們可以吧softmax函數(shù)的輸出解釋成"概率"
softmax函數(shù)

小結(jié)

  • 神經(jīng)網(wǎng)絡(luò)中的激活函數(shù)使用平滑變化的sigmoid函數(shù)或者ReLU函數(shù)
  • 通過(guò)巧妙使用Numpy的多維數(shù)組,可以高效地實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)
  • 機(jī)器學(xué)習(xí)的問(wèn)題大體上可以分為分類和回歸問(wèn)題
  • 關(guān)于輸出層的激活函數(shù),回歸問(wèn)題中一般用恒等函數(shù),分類問(wèn)題一般用softmax函數(shù)
  • 分類問(wèn)題中,輸出層的神經(jīng)元的數(shù)量設(shè)置為要分類的類別數(shù)
  • 輸入數(shù)據(jù)的集合稱為批(batch),通過(guò)以批為單位的推理處理(Numpy)能夠提高運(yùn)算效率
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容