多層感知器(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 高度的並行性 人工神經網路是由許多相同的簡單處理單元併聯組合而成,雖然每個單元的功能簡單,但大量簡單單元的並...