⑴ 卷積神經網路參數解析
(1)現象:
(1-1)一次性將batch數量個樣本feed神經網路,進行前向傳播;然後再進行權重的調整,這樣的一整個過程叫做一個回合(epoch),也即一個batch大小樣本的全過程就是一次迭代。
(1-2)將訓練數據分塊,做成批(batch training)訓練可以將多個訓練數據元的loss function求和,使用梯度下降法,最小化 求和後的loss function ,進而對神經網路的參數進行優化更新
(2)一次迭代:包括前向傳播計算輸出向量、輸出向量與label的loss計算和後向傳播求loss對權重向量 w 導數(梯度下降法計算),並實現權重向量 w 的更新。
(3)優點:
(a)對梯度向量(代價函數對權值向量 w 的導數)的精確估計,保證以最快的速度下降到局部極小值的收斂性;一個batch一次梯度下降;
(b)學習過程的並行運行;
(c)更加接近隨機梯度下降的演算法效果;
(d)Batch Normalization 使用同批次的統計平均和偏差對數據進行正則化,加速訓練,有時可提高正確率 [7]
(4)現實工程問題:存在計算機存儲問題,一次載入的batch大小受到內存的影響;
(5)batch參數選擇:
(5-1)從收斂速度的角度來說,小批量的樣本集合是最優的,也就是我們所說的mini-batch,這時的batch size往往從幾十到幾百不等,但一般不會超過幾千
(5-2)GPU對2的冪次的batch可以發揮更佳的性能,因此設置成16、32、64、128...時往往要比設置為整10、整100的倍數時表現更優
(6)4種加速批梯度下降的方法 [8] :
(6-1)使用動量-使用權重的 速度 而非 位置 來改變權重。
(6-2)針對不同權重參數使用不同學習率。
(6-3)RMSProp-這是Prop 的均方根 ( Mean Square ) 改進形式,Rprop 僅僅使用梯度的符號,RMSProp 是其針對 Mini-batches 的平均化版本
(6-4)利用曲率信息的最優化方法。
(1)定義:運用梯度下降演算法優化loss成本函數時,權重向量的更新規則中,在梯度項前會乘以一個系數,這個系數就叫學習速率η
(2)效果:
(2-1)學習率η越小,每次迭代權值向量變化小,學習速度慢,軌跡在權值空間中較光滑,收斂慢;
(2-2)學習率η越大,每次迭代權值向量變化大,學習速度快,但是有可能使變化處於震盪中,無法收斂;
(3)處理方法:
(3-1)既要加快學習速度又要保持穩定的方法修改delta法則,即添加動量項。
(4)選擇經驗:
(4-1)基於經驗的手動調整。 通過嘗試不同的固定學習率,如0.1, 0.01, 0.001等,觀察迭代次數和loss的變化關系,找到loss下降最快關系對應的學習率。
(4-2)基於策略的調整。
(4-2-1)fixed 、exponential、polynomial
(4-2-2)自適應動態調整。adadelta、adagrad、ftrl、momentum、rmsprop、sgd
(5)學習率η的調整:學習速率在學習過程中實現自適應調整(一般是衰減)
(5-1)非自適應學習速率可能不是最佳的。
(5-2)動量是一種自適應學習速率方法的參數,允許沿淺方向使用較高的速度,同時沿陡峭方向降低速度前進
(5-3)降低學習速率是必要的,因為在訓練過程中,較高學習速率很可能陷入局部最小值。
參考文獻:
[1] Simon Haykin. 神經網路與機器學習[M]. 機械工業出版社, 2011.
[2] 訓練神經網路時如何確定batch的大小?
[3] 學習筆記:Batch Size 對深度神經網路預言能力的影響
[4] 機器學習演算法中如何選取超參數:學習速率、正則項系數、minibatch size. http://blog.csdn.net/u012162613/article/details/44265967
[5] 深度學習如何設置學習率 . http://blog.csdn.net/mao_feng/article/details/52902666
[6] 調整學習速率以優化神經網路訓練. https://zhuanlan.hu.com/p/28893986
[7] 機器學習中用來防止過擬合的方法有哪些?
[8] Neural Networks for Machine Learning by Geoffrey Hinton .
[9] 如何確定卷積神經網路的卷積核大小、卷積層數、每層map個數
[10] 卷積神經網路的卷積核大小、卷積層數、每層map個數都是如何確定下來的呢?
⑵ 神經網路momentum 是什麼意思
網路契機/勢頭
momentum
n. [物]動量;勢頭;動力;要素,契機
[例句]Maintaining the cruze 's sales momentum won 't be easy , though.
不過,要保持克魯茲的熱銷勢頭並非易事。
⑶ sklearn 神經網路 MLPClassifier簡單應用與參數說明
MLPClassifier是一個監督學習演算法,下圖是只有1個隱藏層的MLP模型 ,左側是輸入層,右側是輸出層。
上圖的整體結構可以簡單的理解為下圖所示:
MLP又名多層感知機,也叫人工神經網路(ANN,Artificial Neural Network),除了輸入輸出層,它中間可以有多個隱藏層,如果沒有隱藏層即可解決線性可劃分的數據問題。最簡單的MLP模型只包含一個隱藏層,即三層的結構,如上圖。
從上圖可以看到,多層感知機的層與層之間是全連接的(全連接的意思就是:上一層的任何一個神經元與下一層的所有神經元都有連接)。多層感知機最底層是輸入層,中間是隱藏層,最後是輸出層。
輸入層沒什麼好說,你輸入什麼就是什麼,比如輸入是一個n維向量,就有n個神經元。
隱藏層的神經元怎麼得來?首先它與輸入層是全連接的,假設輸入層用向量X表示,則隱藏層的輸出就是
f(W1X+b1),W1是權重(也叫連接系數),b1是偏置,函數f 可以是常用的sigmoid函數或者tanh函數:
最後就是輸出層,輸出層與隱藏層是什麼關系?其實隱藏層到輸出層可以看成是一個多類別的邏輯回歸,也即softmax回歸,所以輸出層的輸出就是softmax(W2X1+b2),X1表示隱藏層的輸出f(W1X+b1)。
MLP整個模型就是這樣子的,上面說的這個三層的MLP用公式總結起來就是,函數G是softmax
因此,MLP所有的參數就是各個層之間的連接權重以及偏置,包括W1、b1、W2、b2。對於一個具體的問題,怎麼確定這些參數?求解最佳的參數是一個最優化問題,解決最優化問題,最簡單的就是梯度下降法了(sgd):首先隨機初始化所有參數,然後迭代地訓練,不斷地計算梯度和更新參數,直到滿足某個條件為止(比如誤差足夠小、迭代次數足夠多時)。這個過程涉及到代價函數、規則化(Regularization)、學習速率(learning rate)、梯度計算等。
下面寫了一個超級簡單的實例,訓練和測試數據是mnist手寫識別數據集:
from sklearn.neural_network import MLPClassifier
import gzip
import pickle
with gzip.open('./mnist.pkl.gz') as f_gz:
train_data,valid_data,test_data = pickle.load(f_gz)
clf = MLPClassifier(solver='sgd',activation = 'identity',max_iter = 10,alpha = 1e-5,hidden_layer_sizes = (100,50),random_state = 1,verbose = True)
clf.fit(train_data[0][:10000],train_data[1][:10000])
print clf.predict(test_data[0][:10])
print(clf.score(test_data[0][:100],test_data[1][:100]))
print(clf.predict_proba(test_data[0][:10]))
參數說明:
參數說明:
1. hidden_layer_sizes :例如hidden_layer_sizes=(50, 50),表示有兩層隱藏層,第一層隱藏層有50個神經元,第二層也有50個神經元。
2. activation :激活函數,{『identity』, 『logistic』, 『tanh』, 『relu』}, 默認relu
- identity:f(x) = x
- logistic:其實就是sigmod,f(x) = 1 / (1 + exp(-x)).
- tanh:f(x) = tanh(x).
- relu:f(x) = max(0, x)
3. solver: {『lbfgs』, 『sgd』, 『adam』}, 默認adam,用來優化權重
- lbfgs:quasi-Newton方法的優化器
- sgd:隨機梯度下降
- adam: Kingma, Diederik, and Jimmy Ba提出的機遇隨機梯度的優化器
注意:默認solver 『adam』在相對較大的數據集上效果比較好(幾千個樣本或者更多),對小數據集來說,lbfgs收斂更快效果也更好。
4. alpha :float,可選的,默認0.0001,正則化項參數
5. batch_size : int , 可選的,默認』auto』,隨機優化的minibatches的大小batch_size=min(200,n_samples),如果solver是』lbfgs』,分類器將不使用minibatch
6. learning_rate :學習率,用於權重更新,只有當solver為』sgd』時使用,{『constant』,』invscaling』, 『adaptive』},默認constant
- 『constant』: 有』learning_rate_init』給定的恆定學習率
- 『incscaling』:隨著時間t使用』power_t』的逆標度指數不斷降低學習率learning_rate_ ,effective_learning_rate = learning_rate_init / pow(t, power_t)
- 『adaptive』:只要訓練損耗在下降,就保持學習率為』learning_rate_init』不變,當連續兩次不能降低訓練損耗或驗證分數停止升高至少tol時,將當前學習率除以5.
7. power_t: double, 可選, default 0.5,只有solver=』sgd』時使用,是逆擴展學習率的指數.當learning_rate=』invscaling』,用來更新有效學習率。
8. max_iter: int,可選,默認200,最大迭代次數。
9. random_state:int 或RandomState,可選,默認None,隨機數生成器的狀態或種子。
10. shuffle: bool,可選,默認True,只有當solver=』sgd』或者『adam』時使用,判斷是否在每次迭代時對樣本進行清洗。
11. tol:float, 可選,默認1e-4,優化的容忍度
12. learning_rate_int:double,可選,默認0.001,初始學習率,控制更新權重的補償,只有當solver=』sgd』 或』adam』時使用。
14. verbose : bool, 可選, 默認False,是否將過程列印到stdout
15. warm_start : bool, 可選, 默認False,當設置成True,使用之前的解決方法作為初始擬合,否則釋放之前的解決方法。
16. momentum : float, 默認 0.9,動量梯度下降更新,設置的范圍應該0.0-1.0. 只有solver=』sgd』時使用.
17. nesterovs_momentum : boolean, 默認True, Whether to use Nesterov』s momentum. 只有solver=』sgd』並且momentum > 0使用.
18. early_stopping : bool, 默認False,只有solver=』sgd』或者』adam』時有效,判斷當驗證效果不再改善的時候是否終止訓練,當為True時,自動選出10%的訓練數據用於驗證並在兩步連續迭代改善,低於tol時終止訓練。
19. validation_fraction : float, 可選, 默認 0.1,用作早期停止驗證的預留訓練數據集的比例,早0-1之間,只當early_stopping=True有用
20. beta_1 : float, 可選, 默認0.9,只有solver=』adam』時使用,估計一階矩向量的指數衰減速率,[0,1)之間
21. beta_2 : float, 可選, 默認0.999,只有solver=』adam』時使用估計二階矩向量的指數衰減速率[0,1)之間
22. epsilon : float, 可選, 默認1e-8,只有solver=』adam』時使用數值穩定值。
屬性說明:
- classes_:每個輸出的類標簽
- loss_:損失函數計算出來的當前損失值
- coefs_:列表中的第i個元素表示i層的權重矩陣
- intercepts_:列表中第i個元素代表i+1層的偏差向量
- n_iter_ :迭代次數
- n_layers_:層數
- n_outputs_:輸出的個數
- out_activation_:輸出激活函數的名稱。
方法說明:
- fit(X,y):擬合
- get_params([deep]):獲取參數
- predict(X):使用MLP進行預測
- predic_log_proba(X):返回對數概率估計
- predic_proba(X):概率估計
- score(X,y[,sample_weight]):返回給定測試數據和標簽上的平均准確度
-set_params(**params):設置參數。
⑷ 在神經網路中weight decay起到的做用是什麼momentum
說下自己對momentum的看法。momentum是沖量單元,但是更好地理解方式是「粘性因子」,也就是所說的viscosity。momentum的作用是把直接用SGD方法改變位置(position)的方式變成了用SGD來對速度(velocity)進行改變。momentum讓「小球」的速度保持一個衡量,增加了某一方向上的連續性,同時減小了因為learning帶來的波動,因此使得我們採用更大的learning rate來進行訓練,從而達到更快。
另一位答主的回答也是有道理的,個人認為沒有提到learning rate對網路能快速收斂解釋不足,摘錄如下:
「momentum是沖量單元,也就是下式中的m,作用是有助於訓練過程中逃離局部最小值,使網路能夠更快速地收斂,也是需要經過反復地trial and error獲得的經驗值。」
作者:Hzhe Xu
鏈接:http://www.hu.com/question/24529483/answer/88729904
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
⑸ 在神經網路中weight decay起到的做用是什麼momentum
在機器學習或者模式識別中,會出現overfitting,而當網路逐漸overfitting時網路權值逐漸變大,因此,為了避免出現overfitting,會給誤差函數添加一個懲罰項,常用的懲罰項是所有權重的平方乘以一個衰減常量之和。其用來懲罰大的權值。
權值衰減懲罰項使得權值收斂到較小的絕對值,而懲罰大的權值。因為大的權值會使得系統出現過擬合,降低其泛化性能。
momentum是一種 參數更新方式。為了避免當某一方向梯度過大的時候,W基本就是改方向更新,從而引入了v,類似慣性的想法。當出現某方向過大的梯度時,保持一部分原來的v,再加上一個較小的梯度更新。這樣的梯度下降軌跡就能抑制震盪。
⑹ AI數學基礎14——神經網路的參數和超參數
神經網路的參數( Parameters ),是指神經網路模型內部的配置變數,比如W、b,可以用訓練的方式獲得
神經網路的超參數( Hyper Parameters) ,是神經網路模型外部的配置參數,比如學習率a、隱藏層數L、隱藏層單元數、激活函數的選擇、momentum、mini batch size、regularization parameters等等,這些參數不能從訓練中得到, 必須手動設置, 並且影響最後的參數W和b的值 。
訓練神經網路的過程,也是系統性調整神經網路超參數的過程;Andrew Ng說:「經常試試不同的超參數,勤於檢查結果,看看有沒有更好的超參數取值,你將會得到設定超參數的直覺」
⑺ 怎樣用python構建一個卷積神經網路
用keras框架較為方便
首先安裝anaconda,然後通過pip安裝keras
以下轉自的博客。
#coding:utf-8
'''
GPUruncommand:
THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32pythoncnn.py
CPUruncommand:
pythoncnn.py
2016.06.06更新:
這份代碼是keras開發初期寫的,當時keras還沒有現在這么流行,文檔也還沒那麼豐富,所以我當時寫了一些簡單的教程。
現在keras的API也發生了一些的變化,建議及推薦直接上keras.io看更加詳細的教程。
'''
#導入各種用到的模塊組件
from__future__importabsolute_import
from__future__importprint_function
fromkeras.preprocessing.imageimportImageDataGenerator
fromkeras.modelsimportSequential
fromkeras.layers.coreimportDense,Dropout,Activation,Flatten
fromkeras.layers.advanced_activationsimportPReLU
fromkeras.layers.,MaxPooling2D
fromkeras.optimizersimportSGD,Adadelta,Adagrad
fromkeras.utilsimportnp_utils,generic_utils
fromsix.movesimportrange
fromdataimportload_data
importrandom
importnumpyasnp
np.random.seed(1024)#forreprocibility
#載入數據
data,label=load_data()
#打亂數據
index=[iforiinrange(len(data))]
random.shuffle(index)
data=data[index]
label=label[index]
print(data.shape[0],'samples')
#label為0~9共10個類別,keras要求格式為binaryclassmatrices,轉化一下,直接調用keras提供的這個函數
label=np_utils.to_categorical(label,10)
###############
#開始建立CNN模型
###############
#生成一個model
model=Sequential()
#第一個卷積層,4個卷積核,每個卷積核大小5*5。1表示輸入的圖片的通道,灰度圖為1通道。
#border_mode可以是valid或者full,具體看這里說明:http://deeplearning.net/software/theano/library/tensor/nnet/conv.html#theano.tensor.nnet.conv.conv2d
#激活函數用tanh
#你還可以在model.add(Activation('tanh'))後加上dropout的技巧:model.add(Dropout(0.5))
model.add(Convolution2D(4,5,5,border_mode='valid',input_shape=(1,28,28)))
model.add(Activation('tanh'))
#第二個卷積層,8個卷積核,每個卷積核大小3*3。4表示輸入的特徵圖個數,等於上一層的卷積核個數
#激活函數用tanh
#採用maxpooling,poolsize為(2,2)
model.add(Convolution2D(8,3,3,border_mode='valid'))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2,2)))
#第三個卷積層,16個卷積核,每個卷積核大小3*3
#激活函數用tanh
#採用maxpooling,poolsize為(2,2)
model.add(Convolution2D(16,3,3,border_mode='valid'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
#全連接層,先將前一層輸出的二維特徵圖flatten為一維的。
#Dense就是隱藏層。16就是上一層輸出的特徵圖個數。4是根據每個卷積層計算出來的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4
#全連接有128個神經元節點,初始化方式為normal
model.add(Flatten())
model.add(Dense(128,init='normal'))
model.add(Activation('tanh'))
#Softmax分類,輸出是10類別
model.add(Dense(10,init='normal'))
model.add(Activation('softmax'))
#############
#開始訓練模型
##############
#使用SGD+momentum
#model.compile里的參數loss就是損失函數(目標函數)
sgd=SGD(lr=0.05,decay=1e-6,momentum=0.9,nesterov=True)
model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=["accuracy"])
#調用fit方法,就是一個訓練過程.訓練的epoch數設為10,batch_size為100.
#數據經過隨機打亂shuffle=True。verbose=1,訓練過程中輸出的信息,0、1、2三種方式都可以,無關緊要。show_accuracy=True,訓練時每一個epoch都輸出accuracy。
#validation_split=0.2,將20%的數據作為驗證集。
model.fit(data,label,batch_size=100,nb_epoch=10,shuffle=True,verbose=1,validation_split=0.2)
"""
#使用dataaugmentation的方法
#一些參數和調用的方法,請看文檔
datagen=ImageDataGenerator(
featurewise_center=True,#setinputmeanto0overthedataset
samplewise_center=False,#seteachsamplemeanto0
featurewise_std_normalization=True,#divideinputsbystdofthedataset
samplewise_std_normalization=False,#divideeachinputbyitsstd
zca_whitening=False,#applyZCAwhitening
rotation_range=20,#(degrees,0to180)
width_shift_range=0.2,#(fractionoftotalwidth)
height_shift_range=0.2,#randomlyshiftimagesvertically(fractionoftotalheight)
horizontal_flip=True,#randomlyflipimages
vertical_flip=False)#randomlyflipimages
#
#(std,mean,)
datagen.fit(data)
foreinrange(nb_epoch):
print('-'*40)
print('Epoch',e)
print('-'*40)
print("Training...")
#
progbar=generic_utils.Progbar(data.shape[0])
forX_batch,Y_batchindatagen.flow(data,label):
loss,accuracy=model.train(X_batch,Y_batch,accuracy=True)
progbar.add(X_batch.shape[0],values=[("trainloss",loss),("accuracy:",accuracy)])
"""
⑻ 神經網路中自適應的梯度下降優化演算法(二)
Adagrad演算法可以針對不同的參數自適應的採用不同的更新頻率,對低頻出現的特徵採用低的更新率,對高頻出現的特徵採用高的更新率,因此,對於稀疏的數據它表現的很好,很好的提升了SGD的魯棒性,在Google的通過Youtube視頻識別貓的神經網路訓練中有很好的表現。
梯度更新規則:
g(t,i)表示在t時刻目標函數對θ(i)的偏導數。SGD的每個參數的更新過程如下:
Adagrad的每個參數更新過程如下:
G(t)是一個對角矩陣,對角線上的每個元素是t時刻前所有θ(i)的梯度的平方和。ε通常取值在1e-8量級,它的存在是為了避免除數為0。一個有趣的現象是,如果沒有平方根操作,演算法的表現就非常糟糕。
Adagrad的主要缺點是,它的分母是平方梯度的累積,它的值會一直增加,最終導致學習率衰減到非常小,從而使得學習演算法無法進行下去。
TensorFlow實現:
tf.train.AdagradOptimizer(learning_rate, initial_accumulator_value=0.1, use_locking=False, name='Adagrad')
Adadelta演算法主要解決Adagrad的缺陷,它不再累加過去所有的梯度,而是僅累積過去固定個數的梯度。
Adadelta不是採用平方梯度的簡單累加,而是採用 歷史 平方梯度的衰減的平均。
γ通常等於0.9
分母相當於梯度的均方根(root mean squared, RMS),即將所有值平方求和,求其均值,再開平方,就得到均方根值。
梯度更新規則:
將學習率η設置為
,我們就不需要提前設定學習率。
RMSprop是Geoff Hinton提出的一種自適應學習率的方法,它與Adadelta方法都是為了解決Adagrad學習率急劇下降問題的。它與Adadelta方法是一致的。
梯度更新規則
超參數設定值:
Hinton建議設定γ=0.9, 學習率η=0.001。
TensorFlow實現:
tf.train.RMSPropOptimizer.__init__(learning_rate, decay, momentum=0.0, epsilon=1e-10, use_locking=False, name='RMSProp')
Adam也是對不同的參數自適應設置不同的學習率。它對 歷史 梯度和 歷史 平方梯度同時採用指數梯度衰減(exponentially decaying average)。
梯度更新規則
Adam作者觀察到,如果m(t)和v(t)初始化為零向量,並且衰減率很小時(比如β1和β2都非常接近於1時),在開始的迭代中,m(t)和v(t)總是向零偏移,所以需要做偏移校正。
然後用校正後的值進行梯度更新:
Adam作者建議β1=0.9,β2=0.999,ε=10^{-8}
,在實踐中,Adam比其它演算法的效果要好。
TensorFlow實現:
tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')
Adam更新規則中的梯度縮放與 歷史 梯度的L2范數成反比。
我們可以把這個規則泛化到Lp范數。
當p值增大的時候,Lp的值往往會變得不穩定,所以在實踐中L1和L2使用的比較普遍。但是Adamax作者發現L∞可以收斂到一個穩定值。
然後我們可以採用u(t)代替
來更新Adam中的梯度。
同時u(t)不需要做零偏校正。默認取值建議:
⑼ 人工神經網路概念梳理與實例演示
人工神經網路概念梳理與實例演示
神經網路是一種模仿生物神經元的機器學習模型,數據從輸入層進入並流經激活閾值的多個節點。
遞歸性神經網路一種能夠對之前輸入數據進行內部存儲記憶的神經網路,所以他們能夠學習到數據流中的時間依賴結構。
如今機器學習已經被應用到很多的產品中去了,例如,siri、Google Now等智能助手,推薦引擎——亞馬遜網站用於推薦商品的推薦引擎,Google和Facebook使用的廣告排名系統。最近,深度學習的一些進步將機器學習帶入公眾視野:AlphaGo 打敗圍棋大師李世石事件以及一些圖片識別和機器翻譯等新產品的出現。
在這部分中,我們將介紹一些強大並被普遍使用的機器學習技術。這當然包括一些深度學習以及一些滿足現代業務需求傳統方法。讀完這一系列的文章之後,你就掌握了必要的知識,便可以將具體的機器學習實驗應用到你所在的領域當中。
隨著深層神經網路的精度的提高,語音和圖像識別技術的應用吸引了大眾的注意力,關於AI和深度學習的研究也變得更加普遍了。但是怎麼能夠讓它進一步擴大影響力,更受歡迎仍然是一個問題。這篇文章的主要內容是:簡述前饋神經網路和遞歸神經網路、怎樣搭建一個遞歸神經網路對時間系列數據進行異常檢測。為了讓我們的討論更加具體化,我們將演示一下怎麼用Deeplearning4j搭建神經網路。
一、什麼是神經網路?
人工神經網路演算法的最初構思是模仿生物神經元。但是這個類比很不可靠。人工神經網路的每一個特徵都是對生物神經元的一種折射:每一個節點與激活閾值、觸發的連接。
連接人工神經元系統建立起來之後,我們就能夠對這些系統進行訓練,從而讓他們學習到數據中的一些模式,學到之後就能執行回歸、分類、聚類、預測等功能。
人工神經網路可以看作是計算節點的集合。數據通過這些節點進入神經網路的輸入層,再通過神經網路的隱藏層直到關於數據的一個結論或者結果出現,這個過程才會停止。神經網路產出的結果會跟預期的結果進行比較,神經網路得出的結果與正確結果的不同點會被用來更正神經網路節點的激活閾值。隨著這個過程的不斷重復,神經網路的輸出結果就會無限靠近預期結果。
二、訓練過程
在搭建一個神經網路系統之前,你必須先了解訓練的過程以及網路輸出結果是怎麼產生的。然而我們並不想過度深入的了解這些方程式,下面是一個簡短的介紹。
網路的輸入節點收到一個數值數組(或許是叫做張量多維度數組)就代表輸入數據。例如, 圖像中的每個像素可以表示為一個標量,然後將像素傳遞給一個節點。輸入數據將會與神經網路的參數相乘,這個輸入數據被擴大還是減小取決於它的重要性,換句話說,取決於這個像素就不會影響神經網路關於整個輸入數據的結論。
起初這些參數都是隨機的,也就是說神經網路在建立初期根本就不了解數據的結構。每個節點的激活函數決定了每個輸入節點的輸出結果。所以每個節點是否能夠被激活取決於它是否接受到足夠的刺激強度,即是否輸入數據和參數的結果超出了激活閾值的界限。
在所謂的密集或完全連接層中,每個節點的輸出值都會傳遞給後續層的節點,在通過所有隱藏層後最終到達輸出層,也就是產生輸入結果的地方。在輸出層, 神經網路得到的最終結論將會跟預期結論進行比較(例如,圖片中的這些像素代表一隻貓還是狗?)。神經網路猜測的結果與正確結果的計算誤差都會被納入到一個測試集中,神經網路又會利用這些計算誤差來不斷更新參數,以此來改變圖片中不同像素的重要程度。整個過程的目的就是降低輸出結果與預期結果的誤差,正確地標注出這個圖像到底是不是一條狗。
深度學習是一個復雜的過程,由於大量的矩陣系數需要被修改所以它就涉及到矩陣代數、衍生品、概率和密集的硬體使用問題,但是用戶不需要全部了解這些復雜性。
但是,你也應該知道一些基本參數,這將幫助你理解神經網路函數。這其中包括激活函數、優化演算法和目標函數(也稱為損失、成本或誤差函數)。
激活函數決定了信號是否以及在多大程度上應該被發送到連接節點。階梯函數是最常用的激活函數, 如果其輸入小於某個閾值就是0,如果其輸入大於閾值就是1。節點都會通過階梯激活函數向連接節點發送一個0或1。優化演算法決定了神經網路怎麼樣學習,以及測試完誤差後,權重怎麼樣被更准確地調整。最常見的優化演算法是隨機梯度下降法。最後, 成本函數常用來衡量誤差,通過對比一個給定訓練樣本中得出的結果與預期結果的不同來評定神經網路的執行效果。
Keras、Deeplearning4j 等開源框架讓創建神經網路變得簡單。創建神經網路結構時,需要考慮的是怎樣將你的數據類型匹配到一個已知的被解決的問題,並且根據你的實際需求來修改現有結構。
三、神經網路的類型以及應用
神經網路已經被了解和應用了數十年了,但是最近的一些技術趨勢才使得深度神經網路變得更加高效。
GPUs使得矩陣操作速度更快;分布式計算結構讓計算能力大大增強;多個超參數的組合也讓迭代的速度提升。所有這些都讓訓練的速度大大加快,迅速找到適合的結構。
隨著更大數據集的產生,類似於ImageNet 的大型高質量的標簽數據集應運而生。機器學習演算法訓練的數據越大,那麼它的准確性就會越高。
最後,隨著我們理解能力以及神經網路演算法的不斷提升,神經網路的准確性在語音識別、機器翻譯以及一些機器感知和面向目標的一些任務等方面不斷刷新記錄。
盡管神經網路架構非常的大,但是主要用到的神經網路種類也就是下面的幾種。
3.1前饋神經網路
前饋神經網路包括一個輸入層、一個輸出層以及一個或多個的隱藏層。前饋神經網路可以做出很好的通用逼近器,並且能夠被用來創建通用模型。
這種類型的神經網路可用於分類和回歸。例如,當使用前饋網路進行分類時,輸出層神經元的個數等於類的數量。從概念上講, 激活了的輸出神經元決定了神經網路所預測的類。更准確地說, 每個輸出神經元返回一個記錄與分類相匹配的概率數,其中概率最高的分類將被選為模型的輸出分類。
前饋神經網路的優勢是簡單易用,與其他類型的神經網路相比更簡單,並且有一大堆的應用實例。
3.2卷積神經網路
卷積神經網路和前饋神經網路是非常相似的,至少是數據的傳輸方式類似。他們結構大致上是模仿了視覺皮層。卷積神經網路通過許多的過濾器。這些過濾器主要集中在一個圖像子集、補丁、圖塊的特徵識別上。每一個過濾器都在尋找不同模式的視覺數據,例如,有的可能是找水平線,有的是找對角線,有的是找垂直的。這些線條都被看作是特徵,當過濾器經過圖像時,他們就會構造出特徵圖譜來定位各類線是出現在圖像的哪些地方。圖像中的不同物體,像貓、747s、榨汁機等都會有不同的圖像特徵,這些圖像特徵就能使圖像完成分類。卷積神經網路在圖像識別和語音識別方面是非常的有效的。
卷積神經網路與前饋神經網路在圖像識別方面的異同比較。雖然這兩種網路類型都能夠進行圖像識別,但是方式卻不同。卷積神經網路是通過識別圖像的重疊部分,然後學習識別不同部分的特徵進行訓練;然而,前饋神經網路是在整張圖片上進行訓練。前饋神經網路總是在圖片的某一特殊部分或者方向進行訓練,所以當圖片的特徵出現在其他地方時就不會被識別到,然而卷積神經網路卻能夠很好的避免這一點。
卷積神經網路主要是用於圖像、視頻、語音、聲音識別以及無人駕駛的任務。盡管這篇文章主要是討論遞歸神經網路的,但是卷積神經網路在圖像識別方面也是非常有效的,所以很有必要了解。
3.3遞歸神經網路
與前饋神經網路不同的是,遞歸神經網路的隱藏層的節點里有內部記憶存儲功能,隨著輸入數據的改變而內部記憶內容不斷被更新。遞歸神經網路的結論都是基於當前的輸入和之前存儲的數據而得出的。遞歸神經網路能夠充分利用這種內部記憶存儲狀態處理任意序列的數據,例如時間序列。
遞歸神經網路經常用於手寫識別、語音識別、日誌分析、欺詐檢測和網路安全。
遞歸神經網路是處理時間維度數據集的最好方法,它可以處理以下數據:網路日誌和伺服器活動、硬體或者是醫療設備的感測器數據、金融交易、電話記錄。想要追蹤數據在不同階段的依賴和關聯關系需要你了解當前和之前的一些數據狀態。盡管我們通過前饋神經網路也可以獲取事件,隨著時間的推移移動到另外一個事件,這將使我們限制在對事件的依賴中,所以這種方式很不靈活。
追蹤在時間維度上有長期依賴的數據的更好方法是用內存來儲存重要事件,以使近期事件能夠被理解和分類。遞歸神經網路最好的一點就是在它的隱藏層裡面有「內存」可以學習到時間依賴特徵的重要性。
接下來我們將討論遞歸神經網路在字元生成器和網路異常檢測中的應用。遞歸神經網路可以檢測出不同時間段的依賴特徵的能力使得它可以進行時間序列數據的異常檢測。
遞歸神經網路的應用
網路上有很多使用RNNs生成文本的例子,遞歸神經網路經過語料庫的訓練之後,只要輸入一個字元,就可以預測下一個字元。下面讓我們通過一些實用例子發現更多RNNs的特徵。
應用一、RNNs用於字元生成
遞歸神經網路經過訓練之後可以把英文字元當做成一系列的時間依賴事件。經過訓練後它會學習到一個字元經常跟著另外一個字元(「e」經常跟在「h」後面,像在「the、he、she」中)。由於它能預測下一個字元是什麼,所以它能有效地減少文本的輸入錯誤。
Java是個很有趣的例子,因為它的結構包括很多嵌套結構,有一個開的圓括弧必然後面就會有一個閉的,花括弧也是同理。他們之間的依賴關系並不會在位置上表現的很明顯,因為多個事件之間的關系不是靠所在位置的距離確定的。但是就算是不明確告訴遞歸神經網路Java中各個事件的依賴關系,它也能自己學習了解到。
在異常檢測當中,我們要求神經網路能夠檢測出數據中相似、隱藏的或許是並不明顯的模式。就像是一個字元生成器在充分地了解數據的結構後就會生成一個數據的擬像,遞歸神經網路的異常檢測就是在其充分了解數據結構後來判斷輸入的數據是不是正常。
字元生成的例子表明遞歸神經網路有在不同時間范圍內學習到時間依賴關系的能力,它的這種能力還可以用來檢測網路活動日誌的異常。
異常檢測能夠使文本中的語法錯誤浮出水面,這是因為我們所寫的東西是由語法結構所決定的。同理,網路行為也是有結構的,它也有一個能夠被學習的可預測模式。經過在正常網路活動中訓練的遞歸神經網路可以監測到入侵行為,因為這些入侵行為的出現就像是一個句子沒有標點符號一樣異常。
應用二、一個網路異常檢測項目的示例
假設我們想要了解的網路異常檢測就是能夠得到硬體故障、應用程序失敗、以及入侵的一些信息。
模型將會向我們展示什麼呢?
隨著大量的網路活動日誌被輸入到遞歸神經網路中去,神經網路就能學習到正常的網路活動應該是什麼樣子的。當這個被訓練的網路被輸入新的數據時,它就能偶判斷出哪些是正常的活動,哪些是被期待的,哪些是異常的。
訓練一個神經網路來識別預期行為是有好處的,因為異常數據不多,或者是不能夠准確的將異常行為進行分類。我們在正常的數據里進行訓練,它就能夠在未來的某個時間點提醒我們非正常活動的出現。
說句題外話,訓練的神經網路並不一定非得識別到特定事情發生的特定時間點(例如,它不知道那個特殊的日子就是周日),但是它一定會發現一些值得我們注意的一些更明顯的時間模式和一些可能並不明顯的事件之間的聯系。
我們將概述一下怎麼用 Deeplearning4j(一個在JVM上被廣泛應用的深度學習開源資料庫)來解決這個問題。Deeplearning4j在模型開發過程中提供了很多有用的工具:DataVec是一款為ETL(提取-轉化-載入)任務准備模型訓練數據的集成工具。正如Sqoop為Hadoop載入數據,DataVec將數據進行清洗、預處理、規范化與標准化之後將數據載入到神經網路。這跟Trifacta』s Wrangler也相似,只不過它更關注二進制數據。
開始階段
第一階段包括典型的大數據任務和ETL:我們需要收集、移動、儲存、准備、規范化、矢量話日誌。時間跨度的長短是必須被規定好的。數據的轉化需要花費一些功夫,這是由於JSON日誌、文本日誌、還有一些非連續標注模式都必須被識別並且轉化為數值數組。DataVec能夠幫助進行轉化和規范化數據。在開發機器學習訓練模型時,數據需要分為訓練集和測試集。
訓練神經網路
神經網路的初始訓練需要在訓練數據集中進行。
在第一次訓練的時候,你需要調整一些超參數以使模型能夠實現在數據中學習。這個過程需要控制在合理的時間內。關於超參數我們將在之後進行討論。在模型訓練的過程中,你應該以降低錯誤為目標。
但是這可能會出現神經網路模型過度擬合的風險。有過度擬合現象出現的模型往往會在訓練集中的很高的分數,但是在遇到新的數據時就會得出錯誤結論。用機器學習的語言來說就是它不夠通用化。Deeplearning4J提供正則化的工具和「過早停止」來避免訓練過程中的過度擬合。
神經網路的訓練是最花費時間和耗費硬體的一步。在GPUs上訓練能夠有效的減少訓練時間,尤其是做圖像識別的時候。但是額外的硬體設施就帶來多餘的花銷,所以你的深度學習的框架必須能夠有效的利用硬體設施。Azure和亞馬遜等雲服務提供了基於GPU的實例,神經網路還可以在異構集群上進行訓練。
創建模型
Deeplearning4J提供ModelSerializer來保存訓練模型。訓練模型可以被保存或者是在之後的訓練中被使用或更新。
在執行異常檢測的過程中,日誌文件的格式需要與訓練模型一致,基於神經網路的輸出結果,你將會得到是否當前的活動符合正常網路行為預期的結論。
代碼示例
遞歸神經網路的結構應該是這樣子的:
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder(
.seed(123)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1)
.weightInit(WeightInit.XAVIER)
.updater(Updater.NESTEROVS).momentum(0.9)
.learningRate(0.005)
.gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue)
.(0.5)
.list()
.layer(0, new GravesLSTM.Builder().activation("tanh").nIn(1).nOut(10).build())
.layer(1, new RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT)
.activation("softmax").nIn(10).nOut(numLabelClasses).build())
.pretrain(false).backprop(true).build();
MultiLayerNetwork net = new MultiLayerNetwork(conf);
net.init();
下面解釋一下幾行重要的代碼:
.seed(123)
隨機設置一個種子值對神經網路的權值進行初始化,以此獲得一個有復驗性的結果。系數通常都是被隨機的初始化的,以使我們在調整其他超參數時仍獲得一致的結果。我們需要設定一個種子值,讓我們在調整和測試的時候能夠用這個隨機的權值。
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1)
決定使用哪個最優演算法(在這個例子中是隨機梯度下降法)來調整權值以提高誤差分數。你可能不需要對這個進行修改。
.learningRate(0.005)
當我們使用隨機梯度下降法的時候,誤差梯度就被計算出來了。在我們試圖將誤差值減到最小的過程中,權值也隨之變化。SGD給我們一個讓誤差更小的方向,這個學習效率就決定了我們該在這個方向上邁多大的梯度。如果學習效率太高,你可能是超過了誤差最小值;如果太低,你的訓練可能將會永遠進行。這是一個你需要調整的超參數。
⑽ 在神經網路中weight decay起到的做用是什麼momentum
一、weight decay(權值衰減)的使用既不是為了提高你所說的收斂精確度也不是為了提高收斂速內度,其最終容目的是防止過擬合。在損失函數中,weight decay是放在正則項(regularization)前面的一個系數,正則項一般指示模型的復雜度,所以weight decay的作用是調節模型復雜度對損失函數的影響,若weight decay很大,則復雜的模型損失函數的值也就大。
二、momentum是梯度下降法中一種常用的加速技術。對於一般的SGD,其表達式為,沿負梯度方向下降。而帶momentum項的SGD則寫生如下形式: