1. 如何訓練神經網路
1、先別著急寫代碼
訓練神經網路前,別管代碼,先從預處理數據集開始。我們先花幾個小時的時間,了解數據的分布並找出其中的規律。
Andrej有一次在整理數據時發現了重復的樣本,還有一次發現了圖像和標簽中的錯誤。所以先看一眼數據能避免我們走很多彎路。
由於神經網路實際上是數據集的壓縮版本,因此您將能夠查看網路(錯誤)預測並了解它們的來源。如果你的網路給你的預測看起來與你在數據中看到的內容不一致,那麼就會有所收獲。
一旦從數據中發現規律,可以編寫一些代碼對他們進行搜索、過濾、排序。把數據可視化能幫助我們發現異常值,而異常值總能揭示數據的質量或預處理中的一些錯誤。
2、設置端到端的訓練評估框架
處理完數據集,接下來就能開始訓練模型了嗎?並不能!下一步是建立一個完整的訓練+評估框架。
在這個階段,我們選擇一個簡單又不至於搞砸的模型,比如線性分類器、CNN,可視化損失。獲得准確度等衡量模型的標准,用模型進行預測。
這個階段的技巧有:
· 固定隨機種子
使用固定的隨機種子,來保證運行代碼兩次都獲得相同的結果,消除差異因素。
· 簡單化
在此階段不要有任何幻想,不要擴增數據。擴增數據後面會用到,但是在這里不要使用,現在引入只會導致錯誤。
· 在評估中添加有效數字
在繪制測試集損失時,對整個測試集進行評估,不要只繪制批次測試損失圖像,然後用Tensorboard對它們進行平滑處理。
· 在初始階段驗證損失函數
驗證函數是否從正確的損失值開始。例如,如果正確初始化最後一層,則應在softmax初始化時測量-log(1/n_classes)。
· 初始化
正確初始化最後一層的權重。如果回歸一些平均值為50的值,則將最終偏差初始化為50。如果有一個比例為1:10的不平衡數據集,請設置對數的偏差,使網路預測概率在初始化時為0.1。正確設置這些可以加速模型的收斂。
· 人類基線
監控除人為可解釋和可檢查的損失之外的指標。盡可能評估人的准確性並與之進行比較。或者對測試數據進行兩次注釋,並且對於每個示例,將一個注釋視為預測,將第二個注釋視為事實。
· 設置一個獨立於輸入的基線
最簡單的方法是將所有輸入設置為零,看看模型是否學會從輸入中提取任何信息。
· 過擬合一個batch
增加了模型的容量並驗證我們可以達到的最低損失。
· 驗證減少訓練損失
嘗試稍微增加數據容量。
2. 如何建立神經網路模型
人工神經網路有很多種,我只會最常用的BP神經網路。不同的網路有不同的結構和不同的學習演算法。
簡單點說,人工神經網路就是一個函數。只是這個函數有別於一般的函數。它比普通的函數多了一個學習的過程。
在學習的過程中,它根據正確結果不停地校正自己的網路結構,最後達到一個滿意的精度。這時,它才開始真正的工作階段。
學習人工神經網路最好先安裝MathWords公司出的MatLab軟體。利用該軟體,你可以在一周之內就學會建立你自己的人工神經網路解題模型。
如果你想自己編程實現人工神經網路,那就需要找一本有關的書籍,專門看神經網路學習演算法的那部分內容。因為「學習演算法」是人工神經網路的核心。最常用的BP人工神經網路,使用的就是BP學習演算法。
3. 如何用python和scikit learn實現神經網路
1:神經網路演算法簡介
2:Backpropagation演算法詳細介紹
3:非線性轉化方程舉例
4:自己實現神經網路演算法NeuralNetwork
5:基於NeuralNetwork的XOR實例
6:基於NeuralNetwork的手寫數字識別實例
7:scikit-learn中BernoulliRBM使用實例
8:scikit-learn中的手寫數字識別實例
一:神經網路演算法簡介
1:背景
以人腦神經網路為啟發,歷史上出現過很多版本,但最著名的是backpropagation
2:多層向前神經網路(Multilayer Feed-Forward Neural Network)
4. 神經網路如何用單片機實現
主要考慮三個方向:
1)網路本身,神網本質上是一組矩陣,矩陣在單片機中的表現可以通過數組來實現。
2)輸入輸出,神網的應用就是把輸入陣列與網路本身的矩陣點乘叉乘後算術求和,產生輸出矩陣,把輸入輸出的演算法做到單片機里也不是難事。
3)訓練,神網的權值矩陣都是訓練出來的,採用諸如前向或反向的演算法,可以做離線也可以做在線,如果做離線就沒有必要把演算法實現在單片機內,PC上就可以做,然後導入矩陣即可;如果做在線則是相對較難的技術,需要在單片機上實現,對於單片機本身的資源要求也較高。
簡單說,1)是基礎,也最容易;1)+2)就已經是神經網路的應用了,也容易實現。1)+2)+Matlab神經網路離線訓練是易於實現,且富有彈性的應用方式;1)+2)+在線訓練基本上就是具備自己學習能力的機器人,這是學術界一直探索的方向。
5. 深層神經網路的超參數調試、正則化及優化
訓練集 ( Training set )
作用是用來擬合模型,通過設置分類器的參數,訓練分類模型。後續結合驗證集作用時,會選出同一參數的不同取值,擬合出多個分類器。
驗證集 ( Dev set )
作用是當通過訓練集訓練出多個模型後,為了能找出效果最佳的模型,使用各個模型對驗證集數據進行預測,並記錄模型准確率。選出效果最佳的模型所對應的參數,即用來調整模型參數。如svm中的參數c和核函數等。
測試集 ( Test set )
通過訓練集和驗證集得出最優模型後,使用測試集進行模型預測。用來衡量該最優模型的性能和分類能力。即可以把測試集當做從來不存在的數據集,當已經確定模型參數後,使用測試集進行模型性能評價。
一個有助於理解的形象比喻:
訓練集 —— 課本,學生根據課本里的內容來掌握知識。
驗證集 —— 作業,通過作業可以知道 不同學生學習情況、進步的速度快慢。
測試集 —— 考試,考的題是平常都沒有見過,考察學生舉一反三的能力。
訓練集 直接參與了模型調參的過程,顯然不能用來反映模型真實的能力(防止課本死記硬背的學生擁有最好的成績,即防止 過擬合 ) 。
驗證集 參與了人工調參(超參數)的過程,也不能用來最終評判一個模型(刷題庫的學生不代表其學習能力強)。
所以要通過最終的考試 (測試集) 來考察一個學生(模型)真正的能力。
如何將只有一個包含m個樣例的數據集D,產生出訓練集S和測試集T(驗證集可以省略)?主要有以下三種方法:
自助法 ( bootstrapping )
給定m個樣本的數據集D,我們對它進行采樣產生數據集D',每次隨機從D中挑選一個樣本,將其拷貝入D',然後再將樣本放回原始數據集D。顯然,該樣本在下次采樣時任然有可能被採到。這個過程重復m次後,我們就得到了含有m個樣本的數據集D',這就是自助采樣的結果。 樣本有重復采樣,也有一次也沒有被採到的。從未採到的結果是 ,取極限得到
因此,使用自助法約有1/3的數據集沒有被選中過,它們用於測試,這種方式叫「外包估計」。
自助法在數據集小,難以劃分訓練集、測試集的時候有很大的效果,如果數據集足夠大的時候,留出法和交叉驗證是更好的選擇。
留出法 ( hold-out )
將整個數據集D劃分為兩個互斥的集合,其中一個作為訓練集S,另一個作為測試集T。即,D=S∪T,S∩T=∅。在S上訓練出模型,T作為測試集,來評估模型效果。
當樣本數據量較小(10000條左右及以下)時,通常取其中70%作為訓練集,30%作為測試集;或60%作為訓練集,驗證集和測試集各20%。
交叉驗證法 ( cross validation )
如圖所示,交叉驗證法的實現流程大致如下:
(1) 將整個數據集分成k個大小相似的子集,即D=D1∪D2∪...∪Dk,Di∩Dj=∅(故又稱k折交叉驗證法,通常取k=10 )。
(2) 對於每一個模型Mi,演算法執行k次,每次選擇一個Sj(1≤j≤k)作為測試集,其它作為訓練集來訓練模型Mi,把訓練得到的模型在Sj上進行測試,這樣一來,每次都會得到一個誤差E,最後對k次得到的誤差求平均,就可以得到模型Mi的泛化誤差。
(3) 演算法選擇具有最小泛化誤差的模型作為最終模型,並且在整個訓練集上再次訓練該模型,從而得到最終的模型。
交叉驗證的主要的目的是 為了選擇不同的模型類型(比如一次線性模型、非線性模型) ,而 不是為了選擇具體模型的具體參數 。比如在BP神經網路中,其目的主要為了選擇模型的層數、神經元的激活函數、每層模型的神經元個數(即所謂的超參數),每一層網路神經元連接的最終權重是在模型選擇(即K折交叉驗證)之後,由全部的訓練數據重新訓練。
假設這就是數據集,顯然用簡單分類器(如邏輯回歸)並不能很好地擬合上述數據。這種情況稱為 欠擬合 。
相反地,如果採用一個非常復雜的分類器(如深度神經網路或含有隱藏單元的神經網路),擬合效果會非常好。但與此同時,模型的復雜度也會過高,這種稱為 過擬合 。
在兩者之間,可能會存在一些復雜程度適中、數據擬合適度的分類器,擬合結果較為合理,稱為 適度擬合 。
如上圖所示,訓練集誤差和驗證集誤差均較高時為 高偏差(欠擬合) 情況;訓練集誤差較高,驗證集誤差較高低時為 高方差(過擬合) 情況。
(1) 如何減小偏差(防止欠擬合)
① 增大神經網路規模。
(2) 如何減小方差(防止過擬合)
① 增加數據集樣本數量;
② 正則化。
參數 是指神經網路中由數據驅動並進行調整的變數,如𝑊和𝑏。
超參數 是指無需數據驅動,而是在訓練前或者訓練中人為進行調整的變數。例如演算法中的learning rate 𝑎(學習率)、iterations(梯度下降法循環的數量)、𝐿(隱藏層數目)、𝑛[𝑙](隱藏層單元數目)、choice of activation function(激活函數的選擇)等都需要人為設置,這些數字實際上控制了最後的參數𝑊和𝑏的值,所以它們被稱作超參數。
神經網路中的超參數主要分為三類:網路參數、優化參數、正則化參數。
網路參數
可指網路層與層之間的交互方式(相加、相乘或者串接等)、卷積核數量和卷積核尺寸、網路層數(也稱深度)和激活函數等。
優化參數
一般指學習率(learning rate)、批樣本數量(batch size)、不同優化器的參數以及部分損失函數的可調參數等。
正則化參數
權重衰減系數,隨機失活比率(dropout)等。
正則化有利於減小訓練集和驗證集准確率的方差,防止過擬合。在無法增加樣本數量或增加樣本數量的成本過高時,正則化是一種行之有效的方法。
一般將任意 維向量 的 - 范數定義為
根據定義:
當 時, 的 范數為 ,表示向量 中非0元素的個數。
當 時, 的 范數為 ,等於向量 中所有元素的絕對值之和。
當 時, 的 范數為 ,等於向量 中所有元素的平方和開根號。
正則化(Regularization) 的主要目的是控制模型復雜度,減小過擬合。最基本的正則化方法是在原目標(代價)函數 中添加懲罰項,對復雜度高的模型進行「懲罰」。
對於神經網路模型, 正則化即在其代價函數中添加 正則項:
其中, 。之後再求解優化問題 即可。
假設某三層神經網路存在過擬合問題,採用dropout正則化會遍歷網路的每一層,並設置消除該層中每一個節點的概率(比如0.5),最後得到一個節點更少、規模更小的網路,然後再用反向傳播方法進行訓練,就能有效防止過擬合。
最常用的方法是 inverted dropout(反向隨機失活) 。對於一個三層神經網路( ),以第三層為例,實施dropout的步驟如下:
① 定義一個三層dropout矩陣d3:
d3=numpy.random.rand(a3.shape[0],a3.shape[1])
其中,a3表示神經網路第三層的激活函數矩陣。
② 設置 ( )的大小。 表示保留某個隱藏單元的概率。將第①步產生的隨機矩陣d3的每個元素與 進行比較,小於置1,大於置0,得到新的d3矩陣(1表示保留該節點,0表示刪除該節點)。
③ 將a3與新的d3矩陣相乘(矩陣對應元素相乘),得到新的激活函數矩陣:
a3 =np.multiply(a3,d3)
④ 將新的a3矩陣除以keep-prob:
a3 /= keep_prob
目的是保證a3的期望值(均值)不變,從而保證第三層的輸出不變。
① 使用dropout可以使得部分節點失活,可以起到簡化神經網路結構的作用,從而起到正則化的作用。
② 因為dropout是使得神經網路的節點隨機失活,這樣會讓神經網路在訓練的時候不會使得某一個節點權重過大。因為該節點輸入的特徵可能會被清除,所以神經網路的節點不能依賴任何輸入的特徵。dropout最終會產生收縮權重的平方范數的效果,來壓縮權重,達到類似於 正則化的效果。
① dropout在測試階段不需要使用,因為如果在測試階段使用dropout可能會導致預測值產生隨機變化(因為dropout使節點隨機失活)。而且,在訓練階段已經將權重參數除以keep-prob來保證輸出的期望值不變,所以在測試階段沒必要再使用dropout。
② 神經網路的不同層在使用dropout的時候,keep-prob可以不同。因為可能有的層參數比較多,比較復雜,keep-prob可以小一些,而對於結構比較簡單的層,keep-prob的值可以大一些甚至為1,keep-prob等於1表示不使用dropout,即該層的所有節點都保留。
加快訓練速度。
對於一個神經網路模型,考慮其代價函數:
如果未歸一化輸入,其代價函數的形狀會較為細長狹窄。在這樣的代價函數的限制下,為避免陷入局部最優解,梯度下降法的學習率必須設置得非常小。
如果歸一化輸入,代價函數便呈現球形輪廓。這種情況下,不論從哪個位置開始梯度下降法,都能使用較大的學習率,從而更快速、直接地找到全局最優解。
對於包含n個特徵的m個樣本的數據集,其輸入歸一化的過程主要分為兩步:
① 零均值化
② 歸一化方差
其中, 代表第 個樣本的特徵矩陣。
訓練集、驗證集、測試集特徵矩陣的平均值 和標准差 要保持一致,確保它們歸一化後符合同一分布。
6. 如何將動態神經網路和bp網路結合起來
主要是三個方面
首先是網路設備維護使用(如華為這樣的網路設備)
其次是網路分析利用(如科來網路分析系統軟體等)
最後是網路安全部署(如諾頓、卡巴斯基等)