神經網路入門 神經元演算法

2022-04-03 09:14:40 字數 4096 閱讀 5028

目前機器學習、深度學習在業界使用的越來越廣泛,做為乙個有著技術追求的it人,我覺得有必要學習和了解一下這塊的知識,今天就從最簡單的單層神經網路開始介紹。

在介紹人工神經網路之前,首先認知下神經元。

神經元不知道大家還有印象這個圖嗎?這個是出現在我們生物課本中的一幅圖。

乙個神經元的組成基本就是上圖這些東西組成。

通常乙個神經元具有多個樹突,主要用來接受傳入資訊資訊,資訊通過軸突傳遞進來後經過一系列的計算(細胞核)最終產生乙個訊號傳遞到軸突,軸突只有一條,軸突尾端有許多軸突末梢可以給其他多個神經元傳遞資訊。軸突末梢跟其他神經元的樹突產生連線,從而傳遞訊號。這個連線的位置在生物學上叫做「突觸」。

也就是說乙個神經元接入了多個輸入,最終只變成乙個輸出,給到了後面的神經元,那麼基於此,我們嘗試去構造乙個類似的結構。

結構神經元的樹突我們模擬為多條輸入,而軸突可以模擬為最終的輸出。

這裡我們構造乙個典型的神經元模型,該模型包含有3個輸入,1個輸出,以及中間的計算功能。

注意在每乙個輸入的「連線」上,都有乙個對應的「權值」。

說個通俗的例子來理解下權值。比如今天你要決定今是否要去看電影,可能要考慮這3個因素: 1、女朋友有沒有時間,2、有沒有好看的電影,3、今天工作忙不忙; 而這三個因素對於每個人來說權重都是不同的,因為有的人看重工作、有的人看重家人,不同的權重最終的結果也會不一樣。

因此權重的大小是比較關鍵的。而乙個神經網路的訓練演算法就是讓權重的值調整到最佳,以便使得整個網路的**效果最好。

接下裡,我們用數學的方式來表示一下神經元,我們定義 w為權重,x為輸入

$$ w = \begin w_  \\  ... \\ w_ \end ,  x = \begin x_  \\  ... \\ x_ \end$$

$$ z = w_ * x_  + ... + w_ * x_ $$

z輸入的總和,也就是這兩個矩陣的點乘,也叫內積。這裡補充點數學知識。

​$$ z = w_ * x_  + ... + w_ * x_ = \sum\limits_^ w_ * w_ = w^*x $$

$w^$代表矩陣的轉置,即將列轉未行,舉個例子:

$$  \begin  1 & 2 & 3 \end * \begin 4 \\  5 \\ 6 \end = 1*4 + 2*5 + 3*6 $$

啟用函式

當資訊到達計算完成之後,這個值不會直接傳遞給下一層,而是需要經過乙個啟用函式,將啟用函式的值傳遞給下一層。

$\phi$(z) =  * x_ + w_ * x_  + ... + w_ * x_ $$

$\phi$(z) = { 1  if  z>=0;   -1  otherwise

權重更新

好,前面所有的準備都已經完成,接下來我們看下剛才提到的第三步,權重向量的更新,其實也就是神經網路訓練的過程:

權重的更新每一輪迭代  wj = wj+ ​ ▽wj

而 ▽wj = η * ( y - y' ) * xj 

上式中 η 叫做學習率

是[0, 1]之間的乙個小數,由我們自己定義;y是真實 的樣本分類,而 y』 是感知器計算出來的分類。

我們可以簡單推導一下,當 y 和 y' 相等,​

▽wj 的值為0,wj則不會更新。對應的意義就是真實和**的結果是相同的,因此權重也不需要再更新了。

這裡舉個例子 : 

假設初始化 w = [ 0, 0, 0] , x = [1, 2, 3],  假設定義 η = 0.3,y = 1,y' = -1 

▽w(1) = 0.3 * (1 - (-1)) * x(1) = 0.3*2*1 = 0.6;      w(1) = w(1) + ▽w(1) = 0.6;

▽w(2) = 0.3 * (1 - (-1)) * x(2) = 0.3*2*2 = 1.2;      w(1) = w(1) + ▽w(1) = 1.2;

▽w(3) = 0.3 * (1 - (-1)) * x(3) = 0.3*2*3 = 1.8;      w(1) = w(1) + ▽w(1) = 1.8;

更新之後的向量 w = [0.6, 1.2, 1.8]  然後接著繼續計算,更新。

閾值更新

前面提到,我們將閾值經過變換後變成了 w0,再每一輪的迭代訓練過程中,w0也需要跟著一起更新。

最初w0 也需要初始化為0,因為x0等於1,因此 ▽w(0) = η * ( y - y' ) ;

這裡很多人可能會和我開始有一樣的疑惑,閾值不是提前定義好的嗎?其實不是的,這裡不斷的迭代,其實就是閥值計算的過程,和權重向量一樣,最終都是通過一輪一輪更新計算出來的,由於一開始我們設定的w0 = - θ,所以當最終我們的閥值更新出來後,-w0 就是我們學習出來的閥值。

看到上面的過程是否有些暈,從整體上看,其實就是這樣乙個過程:

初始化權重向量和閾值,然後計算**結果和真實結果是否存在誤差,有誤差就根據結果不斷的更新權重,直到權重計算的結果最終達到最佳,權重的值就是我們學習出的規律。

感知器目前的適用場景為線性可分的場景,就是用一條直線可以分割的二分類問題。

用python實現了上述過程,可以看下:

#

-*- coding:utf-8 -*-

#簡單神經網路 感知器

import

numpy as np

reload(sys)

sys.setdefaultencoding(

"utf-8")

class

perception(object):

'''eta: 學習率 η

time: 訓練次數

w_: 權重向量

'''def

__init__(self, eta = 0.01, time=10):

self.eta =eta

self.time =time

pass

'''輸入訓練資料,x為輸入樣本向量,y對應樣本分類

x:shape[n_samples, n_features]

x:[[1,2,3], [4,5,6]]

n_samples : 2

n_features: 3

y:[1, -1]

'''def

fit(self, x, y):

#初始化權重向量為0,加一為w0,也就是損失函式的閾值

self.w_ = np.zero[1 + x.shape[1]]

self.errors_ =

for _ in

range(self.time):

errors =0

#x:[[1,2,3], [4,5,6]]

#y:[1, -1]

#zip(x,y) = [[1,2,3,1], [4,5,6.-1]]

for xi, target in

zip(x, y):

#update = η * ( y - y' )

update = self.eta * (target -self.predict(xi))

#xi 為向量, 這裡每個向量都會乘

self.w_[1:] += update *xi

self.w_[0] +=update;

errors += int(update != 0.0)

pass

#損失函式

defpredict(self, x):

#z = w1*x1+...+wj*xj + w0*1

z = np.dot(x, self.w_[1:]) +self.w_[0]

#損失函式

if z >= 0.0:

return 1

else

:

return -1

神經網路 神經元

從生物上來說,神經元就是神經細胞的別稱。神經元最主要的兩個特性 興奮性和傳導性。興奮性 神經元的興奮性具有一種很特殊的現象,當刺激強度未達到某一閾限值時 限值的概念為人工神經元模仿提供了理論依據,傳輸函式中大多數函式都是依據此原則來輸出的 神經衝動不會發生,而當刺激強度達到該值時,神經衝動發生並能瞬...

神經網路之softmax神經元

在之前的內容裡,我們採用的是sigmoid函式作為輸出層神經元。這裡我們介紹一種softmax函式作為新的輸出層。softmax本質上是一種歸一化的過程,假設神經元的帶權輸入為 zl j k wljk al 1 k bl j zjl kw jkla kl 1 bjl 定義輸出神經元的啟用值為 al ...

前饋神經網路 神經元

引言 人工神經網路 artificial neutral network 是受生物神經網路啟發而開發,由神經元連線組成的網路狀機器學習模型。其中,前饋神經網路 feedforward neural network 多層感知機 multilayer perceptron,mlp 是最具代表的神經網路,...