如果說線性分類器使用直線作為分類的邊界,那麼神經網路則是在使用線性分類的基礎上加了非線性的分類,也就是曲線。直接說就是,比如在svm上是權重w與輸入x相乘之後就是計算損失函式(直接使用w權重矩陣對輸入x進行分類,而神經網路是在使用w權重對輸入x進行分類之前,先用啟用函式計算輸入x的值,),而神經網路裡則不是,它是在權重矩陣w與輸入x相乘之後,再將這個結果輸入到乙個名為啟用函式裡面,這個啟用函式就好比生物神經元裡面的激勵函式,當輸入訊號達到一定閾值後觸發訊號輸出。經過啟用函式計算後再計算損失函式。
w權重矩陣,對一幅影象而言,可以說是這幅影象的特徵表達,w權重的每行資料代表了乙個影象特徵,w權重的列數則表示該影象有多少個特徵需要去分類。普通的線性分類器比如支援向量機svm就是使用w特徵矩陣與輸入x矩陣相乘,然後根據損失函式對輸入進行分類,這是直接使用特徵矩陣對輸入去分類。而神經網路則不同。首先需要明白一件事,就是w特徵矩陣與輸入x相乘的結果是表達了什麼?w是這幅影象的特徵矩陣,每一行表示了乙個特徵,有多少列就有多少個特徵,那w與x矩陣乘法的結果是乙個矩陣,這個矩陣的每一行數則表示這幅影象的某特徵其突出的程度,也就是說某一行的結果越大則這一行所代表的影象特徵在影象中佔的比重就越大。而對於一些相似特徵那麼他們的結果也就越相近,這時再使用線性分類器則不好分別,那麼就需要使用一些函式對這些特徵進行抑制或者放大,突出我們想要的特徵。這些函式就是神經網路裡的啟用函式。這些啟用函式往往是在輸入層後面,輸出層前面,對於乙個兩層的神經網路來說就是,x->f(w1*x)->w2->loss,其輸入層是x,輸出層是w2->loss。中間隱含層是w1特徵矩陣。
對乙個兩層神經網路的**如下
import numpy as np
from numpy.random import randn
import matplotlib.pyplot as plt
# 定義輸入和神經元大小,並初始化
n, d_in, h, d_out =64,
1000
,100,10
x, y = randn(n,d_in)
, randn(n,d_out)
# x(64,1000),y(64,10)
w1, w2 = randn(d_in, h)
, randn(h, d_out)
# w1(1000,100),w2(100,10)
# 進行訓練
lossk =
for t in
range
(2000):
# 前向傳播
h =1/
(1+ np.exp(np.dot(
-x,w1)))
# 啟用函式,h(64,100)
y_pred = np.dot(h, w2)
# y_pred(64,10)
loss = np.square(y_pred - y)
.sum()
if(t%
100==0)
:print
(t, loss)
# 反向傳播
grad_y_pred =2*
(y_pred - y)
# (64,10)
grad_w2 = np.dot(h.t, grad_y_pred)
# (100,10)
grad_h = np.dot(grad_y_pred,w2.t)
# (64,100)
grad_w1 = np.dot(x.t,grad_h * h *
(np.ones(h.shape)
- h)
)# (1000,100)
# 更新w
w1 -=1e-
4* grad_w1
w2 -=1e-
4* grad_w2
x = np.arange(
2000
)y = lossk
plt.plot(x, y)
plt.show(
)
結果:
可以看見損失函式是在逐漸減少的
縱軸表示損失函式,橫軸表示訓練次數。
當然相比於規範的神經網路訓練步驟,這段**有幾處不足。
(1)對於輸入x沒有做標準化處理,雖然這裡的x和w均是隨機生成的呈正態分佈的資料。所謂標準化處理就是將輸入資料處理呈均值為0,方差為1呈標準正態分佈的資料。
(2)沒有增加偏置項b,如果沒有設定偏置項b,對於y=wx分類器一定會經過原點,影響分類效果,如果加了偏置項,b可以大於0可以等於0可以小於0,這樣這個分類器就會更加好用。
常用的啟用函式有sigmoid, tanh, relu,leaky-relu,elu.
缺點:(1)飽和性會使得梯度消失,就是x過大或者過小時,梯度接近於0;
(2)函式輸出永遠在0-1之間,每個神經元的偏導同號,其梯度值更新的方向都是一樣的,也就是梯度值會出現同時增加或者同時減小的現象,即容易出現鋸齒現象;
(3)涉及指數運算,會占用較大的計算資源。
雙曲正切函式作為啟用函式,會使得函式輸出有正有負,範圍在[-1,1],其梯度值的變化是可以有正有負的,不會出現鋸齒現象,但是其飽和性的問題依然存在。
relu函式可以理解為整流函式,只對輸入大於0的項做出反應,小於0的項則全部置零。這樣會使得一些神經元出現死亡的現象,也就是梯度不會發生更新,對外界輸入沒有反映,往往加一些偏置項(常取0.01)可以緩解這種情況。總體而言,relu啟用函式其梯度收斂速度遠遠大於sigmoid和雙曲正切函式,而且計算簡單不會出現飽和現象,因此relu啟用函式用的更多。
4.leaky relu:f(x)=max(0.01x,x)
leaky relu函式是為了解決死亡神經元問題而設計的,繼承了relu函式的優點。
5.maxout elu:f(x)=max(w1x+b1,w2x+b2)
對輸出使用神經元再進行選擇一次,繼承了relu和leaky relu的優點,但是引數卻增加了一倍。
(1)不要輕易使用sigmoid函式;
(2)可以使用relu函式,但是要注意學習率不能太大;
(3)可以使用tanh,但是效果不如leaky relu或者maxout
(4)可以使用leaky relu或者maxout elu。
神經網路的認識(一)神經網路的認識
特徵提取 我的理解就是將物體資料化,將乙個實體盡可能的描述成計算機可以懂得話,就比如定義乙個人,姓名 性別 愛好 出生地 出生日期 這樣可以給他打足夠多的標籤,就可以定義他是誰了,這個標籤就是特徵。使用神經網路有4個步驟 提取問題中實體的特徵向量作為神經網路的輸入,不同實體可以提取不同的特徵向量 定...
關於卷積神經網路的一些定義
卷積神經網路 convolutional neural networks,cnn 是一類包含 卷積計算且具有深度結構的 前饋神經網路 feedforward neural networks 是 深度學習 deep learning 的代表演算法之一 1 2 由於卷積神經網路能夠進行平移不變分類 sh...
關於神經網路訓練的一些建議筆記
1.train loss不斷下降,test loss不斷下降,網路正在學習 2.train loss不斷下降,test loss趨於不變,網路過擬合,需要增大資料 減小網路規模dropout 權重衰減或正則化l2等 3.train loss趨於不變,test loss趨於不變,遇到瓶頸,需要減少學習...