從MLP到神經網路

2021-07-28 14:20:07 字數 3467 閱讀 5847

多層感知器(mlp)是一種非常簡單的神經網路,其實現起來也是非常容易滴。那我們就來看一看吧

首先,先看一下來自維基百科的介紹:

多層感知器

(multilayer perceptron,縮寫mlp)是一種前向結構的

人工神經網路

,對映一組輸入向量到一組輸出向量。mlp可以被看作是乙個有向圖,由多個的節點層所組成,每一層都全連線到下一層。除了輸入節點,每個節點都是乙個帶有非線性啟用函式的神經元(或稱處理單元)。一種被稱為

反向傳播演算法

的監督學習

方法(bp演算法)常被用來訓練mlp。

mlp是

感知器的推廣,克服了感知器不能對

線性不可分

資料進行識別的弱點。

接下來我們看乙個最簡單的mlp結構:

最簡單的mlp是三層結構(輸入層-隱藏層-輸出層),如下圖所示:

多層感知機的層與層之間是全連線的,即每一層的任意乙個神經元均與其前一層的所有神經元有連線,這種連線其實代表了一種權重加和。

例如:從輸入層到隱藏層:

我們用x代表輸入,h代表隱藏層,則h=f(w1x + b1),其中w1代表權重,b1代表偏置,函式f通常是非線性的,叫做啟用函式。

常見的啟用函式有:sigmoid(s型啟用函式,將輸入對映到乙個0到1之間的值,

tanh(雙曲正切函式,將輸入對映到乙個-1到1之間的值,

relu(近似生物神經啟用函式,它的函式形式是f(x)=max(0,x))

softmax(在多分類中常用的啟用函式,是基於邏輯回歸的。p(i

)=ex

p(θt

ix)∑

kk=1

exp(

θtkx

)   )

從隱藏層到輸出層:我們用y代表輸出,則y=g(w2h + b2),其中w2和b2均為訓練引數。函式g是啟用函式,常見的有softmax(用於多分類)

這樣,我們就得到了乙個從輸入到輸出的關係,我們最終就是通過監督學習方法求得w1、b1、w2、b2。通常利用反向傳播演算法(bp)和最優化演算法對權重更新,迭代更新引數,直至滿足某個條件為止。

由於deep learning框架我經常使用的keras,所以就以keras為例,讓我們具體來看一下在keras裡面如何實現mlp:

sequence_input = input(shape=(max_sequence_length,dim), dtype='int32')

dense_1 = dense(100,activation='tanh')(sequence_input)

dense_2 = dense(2, activation='softmax')(dense_1)

max_pooling = globalmaxpooling1d()(dense_2)

model = model(sequence_input, dense_2)

可以看到,輸入層是sequence_input,輸入到隱層就是乙個全連線層dense層,隱層到輸出也是乙個全連線層dense層。然後我們看看具體dense層是怎麼實現的:

class dense(layer):

def call(self, x, mask=none):

output = k.dot(x, self.w)

if self.bias:

output += self.b

return self.activation(output)

可以看到dense層就是對輸入x做了f(w1x + b1)變換,w1代表權重,b1代表偏置,函式f是啟用函式。

舉個例子來說,如果輸入張量x(tensorflow和keras中都是對張量進行執行)的shape為[n_samples,100],在keras中,w的shape為[100,50],b的shape為[50],則dense層的輸出為[n_samples,50]。

可以從keras中dense層的build函式看到w和b的初始化(其中,input_dim是x的shape最後一維,即100,output_dim是dense層設定的輸出維度,即50,所以w的shape為[100,50],b的shape為[50],通過f(w1x + b1)變換即可得到dense層的輸出[n_samples,50],這裡的n_samples是設定的batch_size,即一次取多少個樣本進行更新):

def build(self, input_shape):

assert len(input_shape) >= 2

input_dim = input_shape[-1]

self.input_dim = input_dim

self.input_spec = [inputspec(dtype=k.floatx(),

ndim='2+')]

self.w = self.add_weight((input_dim, self.output_dim),

initializer=self.init,

name='{}_w'.format(self.name),

regularizer=self.w_regularizer,

constraint=self.w_constraint)

if self.bias:

self.b = self.add_weight((self.output_dim,),

initializer='zero',

name='{}_b'.format(self.name),

regularizer=self.b_regularizer,

constraint=self.b_constraint)

else:

self.b = none

if self.initial_weights is not none:

self.set_weights(self.initial_weights)

del self.initial_weights

self.built = true

如果用mlp對文字進行分類,分類數為2,則輸入張量x的shape為[n_samples,sentence_length,100],,w的shape為[100,2],b的shape為[2],dense層的輸出為[n_samples,sentence_length,2],w和b是共享的。這個時候需要注意了,由於dense層的輸出為3維,不能直接進行分類,這時普遍的做法是在dense層的上方新增乙個pooling層,常用的有maxpooling、meanpooling,pooling層將dense層的輸出[n_samples,sentence_length,2]轉換為[n_samples,2]。

怎麼樣,是不是非常簡單。那就趕快用起來吧,雖然由於mlp過於簡單,大家一般不會單獨拿來用,但是對於deep learning新手來說,還是可是拿來先試一下手的。

參考:

mlp神經網路 MLP(全連線神經網路)的反向傳播

3 梯度消失與 mlp可以說是最簡單的一種ann結構了,輸入通過若干個隱藏層後,進入輸出層得到輸出。下圖展示了只有乙個單隱層的mlp。圖1 單隱層mlp 如果使用交叉熵損失函式 cross entropy error function 需要在輸出層的狀態值 如果使用mse損失函式 mean squa...

從生物神經網路到人工神經網路

如今提及人工智慧,大家期待的一定是某種可以 學習 的方法,這種方法使用數學模型從資料中獲取模式的某種表示。在眾多 學習 方法中,獲得最多關注,承載最多期望的非 神經網路 莫屬。既然我們將這種數學方法稱作神經網路,那麼他必然和廣泛存在於生物體內的神經網路存在某種聯絡。讓我們考察乙個典型的神經連線。每個...

MLP 多層神經網路 介紹

接觸神經網路 ann 的時間很長了,以前也只是學了學原理,做過乙個bpn的練習,沒有系統的總結過,最近看torch的原始碼,對mlp有了更多的了解,寫寫自己學到的東西吧,算是做了一次總結!1 高度的並行性 人工神經網路是由許多相同的簡單處理單元併聯組合而成,雖然每個單元的功能簡單,但大量簡單單元的並...