導航:首頁 > 源碼編譯 > 神經網路超參數優化演算法

神經網路超參數優化演算法

發布時間:2022-09-19 20:31:53

⑴ 貝葉斯神經網路

通過優化的標准神經網路訓練(從概率的角度來看)等同於權重的最大似然估計(MLE)。由於許多原因,這往往是不能令人滿意的 —— 使用 MLE 會忽略在適當的權重值中可能存在的任何不確定性,即無法正確評估訓練數據中的不確定性,從實際的角度來看,這種類型的訓練容易出現過擬合現象。

對此的一個解決方案是引入正則化(從貝葉斯的角度來看,這相當於在權重上引入先驗)。如果我們可以通過規范模型來解決過度自信決策和防止模型過度擬合的問題,那為什麼我們需要貝葉斯神經網路?答案是: 當前神經網路架構中缺少預測中的不確定性度量,但貝葉斯神經網路將其納入其中 。BNN 在特定環境中很重要,特別是當我們非常關心不確定性時,貝葉斯方法自然地解釋了參數估計中的不確定性,並且可以將這種不確定性傳播到預測中。

深度神經網路已成功應用於許多領域,包括非常敏感的領域,如醫療保健,安全性,欺詐性交易等等。這些領域在很大程度上依賴於模型的預測准確性,甚至一個過度自信的決策也可能導致一個大問題。此外,這些領域具有非常不平衡的數據集(百萬個交易中的一個是欺詐性交易,百分之五的癌症檢測結果是陽性,不到百分之一的電子郵件是垃圾郵件),容易導致該模型過度擬合。

從概率論的角度來看,使用單點估計權重以進行分類是不合理的。而貝葉斯神經網路對於過擬合更加魯棒,並且可以從小數據集中輕松學習。 貝葉斯方法將其參數以概率分布的形式表示以提供不確定性估計;同時,通過使用先驗概率分布的形式來表示參數,訓練期間在許多模型上計算平均值,這給網路提供了正則化效果,從而防止過度擬合

在標准神經網路中,權重由單個點表示。 而貝葉斯神經網路以分布形式表示權重,如下圖所示:

即使使用少量參數,在貝葉斯神經網路中推斷後驗模型也是一項艱巨的任務,因此通常使用後驗模型的近似值,變分推理是一種流行的方法。人們將使用簡單的變分分布(例如高斯分布)對後驗進行模擬,並嘗試調整分布的參數使其盡可能接近真實的後驗 —— 通過最小化這種簡單變分分布和真實後驗之間的 KL 散度來完成。

但是用於逼近 BNN 後驗的變分方法在計算上可能相當昂貴,因為使用近似分布會大大增加模型參數的數量,但不會大幅增加模型容量。例如,使用 BNN 後驗近似的高斯分布,模型參數的數量增加了一倍,但報告了與使用丟失的傳統方法相同的預測性能。 這使得該方法在實踐中不適合與 CNN 一起使用,因為參數數量的增加太昂貴。

關於神經網路權重的精確貝葉斯推斷是難以處理的,因為參數的數量非常大,並且神經網路的函數形式不適合精確積分。 因此,我們用變分概率分布 q θ (w | D) 逼近難以處理的真實後驗概率分布 p(w | D),它包括高斯分布的性質 μ∈ℝ d 和 σ∈ℝ d ,表示為 N(θ | μ,σ²),其中 d 是定義概率分布的參數總數。 這些高斯變分後驗概率分布的形狀由它們的方差 σ² 確定,表示每個模型參數的不確定性估計。

在觀察數據之前定義先驗概率分布,一旦觀察到數據(訓練數據),學習就發生並且分布變換為後驗分布。 利用概率論從數據中學習構成了貝葉斯學習的基礎。貝葉斯定理如下:

P(θ | x) 為後驗概率,也是我們想要計算的;P(θ) 為先驗概率,在訓練數據之前就是已知的;P(x | θ) 為可能性,顯示了數據分布;P(x) 為證據,我們只能通過對所有可能的模型值積分來計算其值:

這使得問題變得棘手,因此我們採用變分近似來找到近似貝葉斯後驗分布。

首先,我們的原始目標是,需要根據已有數據推斷需要的分布 p;當 p(下圖中黃色區域)不容易表達,不能直接求解時,可以嘗試用變分推斷的方法, 即,尋找容易表達和求解的分布 q(下圖中紅線和綠線構成的區域),當 q 和 p 的差距很小的時候,q 就可以作為 p 的近似分布,成為輸出結果了。例如,我們用 q θ (w | D) 來近似 p(w | D)。首先注意 q θ (w | D) 的表達,其中 w 是變數,θ 是後驗概率分布 q 的參數。所以在構造 q 的時候也分兩步:第一,概率分布的選擇;第二,參數的選擇。第一步,我們在選擇 q 的概率分布時,通常會直觀選擇 p 可能的概率分布,這樣能夠更好地保證 q 和 p 的相似程度。例如高斯混合模型中,原始假設 p 服從高斯分布,則構造的 q 依然服從高斯分布。之後,我們通過改變 θ,使得 q 不斷逼近 p。

我們希望盡可能接近真正的分布,這可以通過最小化兩者之間的 Kullback-Liebler(KL)散度來做到這一點。然而 KL 的表達式中依然有一部分不可求的後驗概率,這個問題仍然是棘手的,所以用到了 ELBO:

但是由於積分的存在,這個公式仍然難以解決。此時,我們可以從近似函數 q θ (w | D) 中進行采樣,因為從近似函數中采樣權值要比真正的後驗函數 p(w | D) 更容易。這樣得到容易計算的函數:

這些采樣權值 w 被用於神經網路的反向傳播,學習後驗分布。

貝葉斯建模中,存在兩種類型的不確定:偶然不確定性和認知不確定性。

可以通過在模型參數或模型輸出上放置概率分布來估計不確定性 。通過在模型的權重上放置先驗分布,然後嘗試捕獲這些權重在給定數據的情況下變化多少來模擬認知不確定性。另一方面,通過在模型的輸出上放置分布來模擬偶然不確定性。

傳統神經網路常使用反向傳播來訓練。對於 BNN,其自然地解釋了參數估計中的不確定性,並且可以將這種不確定性傳播到預測結果中;此外,對參數值進行取平均而不是僅選擇單點估計值使得模型不易出現過擬合。因此,對 BNN 參數的訓練也需要特殊的訓練方法,Bayes by Backprop 就是其中一種(它也是一種變分推斷)。

Bayes by Backprop 用來學習神經網路權重的概率分布。它是一種變分推理方法,用於學習神經網路權重 w ~ q θ (w | D) 的後驗分布,可以在反向傳播中對權重 w 進行采樣。整個方法可歸納如下:

由於參數數目較大,所以需要對模型權重進行適當的修剪。模型修剪減少了深度神經網路的各種連接矩陣中的稀疏性,從而減少了模型中有價值的參數的數量。模型修剪的整個想法是減少參數的數量而不會損失模型的准確性。最常用的修剪模型的方法是將低貢獻權重映射到零並減少整體非零值權重的數量,可以通過訓練大型稀疏模型並進一步修剪來實現。

(這部分內容摘自 一個例子搞清楚 先驗分布/後驗分布/似然估計 )

給定一些數據樣本 x,假定我們知道樣本是從某一種分布中隨機取出的,但我們不知道這個分布具體的參數 θ。

因為給定樣本 x 後, p(x) 會在 θ 空間上為一個定值,和 θ 的大小沒有關系,所以可以省略分母 p(x)。 可化簡為:

p(x) 相當於是一個歸一化項,整個公式就表示為: Posterior∝(Likelihood∗Prior)(後驗概率 正比於 先驗概率 ∗ 似然函數)

需要一提的是,對貝葉斯 CNN 而言,不僅在卷積層中將概率分布置於權重上,還要求在全連接層中將概率分布置於權重上。

假設權重的變分後驗概率分布 q θ (w ijhw | D) = N(μ ijhw ,α ijhw μ 2 ijhw )(其中,i 和 j 分別對應輸入和輸出層數,h 和 w 分別對應過濾器的高度和寬度),那麼卷積公式被重定義為:

其中,ε j ~ N(0,1),A i 為過濾器在第 i 層要卷積的部分,b j 為相應的第 j 層的激活值,∗ 為卷積操作,⊙ 為元素乘法(component-wise multiplication)。

對 CNN 的權重應用概率分布而非單點值,並且要在反向傳播時更新變分後驗概率分布 q θ (w | D),關鍵在於過濾器會執行兩次卷積操作(在單點預測的 CNN 中只執行一次卷積)。

從前面的公式我們看到,卷積操作的輸出 b 是期望 μ ijhw 和方差 α ijhw μ 2 ijhw 的函數,因此我們可以分別計算出 μ ijhw 和 α ijhw μ 2 ijhw 的值,從而可以得到一個高斯概率分布。方法就是執行兩次卷積操作:第一次,我們將 b 視為通過頻率推理更新的 CNN 的輸出,將單點估計值解釋為變分後驗概率分布的期望;第二次,我們將得到方差。通過這種方式,我們確保每個卷積操作只更新一個參數(第一次為 μ ijhw ,第二次為 α ijhw ),這與通過頻率推斷更新的 CNN 完全相同。

實際上,當我們執行第一次卷積操作,我們得到的是 q θ (w | D) 的最大後驗概率,而第二次卷積操作則是得出權重 w 偏離了最大後驗概率多少。另外,為了加速計算,確保方差 α ijhw μ 2 ijhw 為非零正數,並提到准確度,我們學習 logα ijhw 並使用 Softplus 激活函數。

在分類任務中,我們關注的是 P D (y* | x*);對於貝葉斯神經網路,其被表示為:

在 Bayes by Backprop 中,q θ (w | D) ~ N(w | μ, σ 2 ),而 θ = {μ, σ} 在數據集 D = {x i , y i } n i=1 的訓練中學習得到。由於分類問題多是離散的,因此:

其中,Σ c f(x c ∗ | w) = 1,C 為總類數。通過從 q θ (w | D) 取樣,可以獲得期望值的無偏估計:

T 為樣本數量。這個估計值允許我們評估預測值的不確定性,因此稱為預測方差,用 Var q 表示:

這個值可以進一步分為偶然不確定性和認知不確定性:

由於貝葉斯 CNN 中的權重都由期望和方差來表示其分布,因此,相較於單點估計 CNN,貝葉斯 CNN 的參數數量翻了一倍。為了使貝葉斯 CNN 參數數量等於傳統 CNN,可以使 BCNN 的過濾器數目減半。

另一種模型修剪的技術是對每層的權重使用 L1 歸一化。通過 L1 歸一化,我們使各模型層中的權重向量變得非常稀疏,即大部分矩陣元素變得接近零;同時,剩餘的非零元素則捕獲數據的最重要特徵。我們設置一個閾值,如果該值低於閾值,則使權重為零。通過只保留非零權重,可以減少模型的參數數量,而不會影響模型的整體性能。

看了一些國內的論文,將貝葉斯應用於 BP 神經網路優化,往往是利用貝葉斯定理尋找最優神經網路參數,以解決神經網路權值易陷入局部最優的問題,同時也能解決神經網路過擬合。其中心思想在於: 根據給定的先驗分布,利用貝葉斯定理考察神經網路參數的不確定性,從樣本數據中,獲得網路結構的後驗概率,那麼,使得該後驗概率最大化的網路參數即為所需的最優參數 (我認為這其實是 MAP 而非貝葉斯估計)。最優參數定義為:

為方便計算,對後驗概率取對數得到:

假設先驗概率分布 p(w) 滿足高斯分布:

則有:

上式中,似然函數部分對應於目標函數中的適應度函數,而先驗概率部分對應於正則項,因此我們可以通過確定先驗概率得到正則項,從而對神經網路的目標函數進行優化,進而有效控制網路規模,提高網路泛化能力。

後驗分布是人們在獲得樣本數據 D 之後對參數 w 的一種調整。 貝葉斯把上一步得到的後驗分布信息儲存起來,在將來做推測時,上一步的後驗信息就成為了先驗信息 ,這樣持續數次操作之後,樣本數據的預測結果會一直進行調整,最後對參數估計的結果精確度更高。

神經網路中最重要的兩個性能參數就是權值和閾值,而這兩個參數的分布情況受到了目標函數中超參數的控制,但一般的演算法不能確定超參數的取值。可以利用貝葉斯定理來求取目標函數的超參數,並且要求達到自主調節超參數取值的目標,並且通過持續的調整最後找到最優的取值,相應的確定 BP 神經網路的最優權值和閾值。

⑵ 百度知道

為了訓練的需要,要不然會出差錯

1. 背景介紹

近些年來,隨著Siri的走紅,類似Siri、搜狗語音助手這樣利用語音實現控制,語義理解的系統開始大量涌現。而語音識別系統作為這類系統的入口,很大程度上決定了這類應用的質量。沒有一個好的語音識別系統做支撐,再好的助手也只能乾瞪眼。

與此同時,隨著微信的發展,越來越多的用戶反饋,在多種場合下不方便收聽語音,需要將語音轉換成文字。許多微信公眾號也表示需要將語音識別成文字,以便進一步的處理。在此形勢下,提高我司現有語音識別系統的准確率成為了迫切的任務。

之前主流的語音識別系統都是採用HMM-GMM技術。近些年來,隨著深度神經網路(Deep neural network)技術的的發展,越來越多的系統採用HMM-DNN技術。這項技術把描述特徵發射概率的模型從混合高斯模型(GMM)替換為深度神經網路(DNN),從而使系統的錯誤率下降了20%~30%。

2. 相關產品

當前市場上的採用DNN技術的主要競品有訊飛的相關產品,包括訊飛語音輸入法和訊飛口訊等產品、以及某互聯網公司的輸入法等。

科大訊飛是當前語音行業的領航者,在語音行業有十幾年的歷史,在Siri推出前就已經推出了訊飛語音輸入法等產品,在數據積累方面具有其他公司無法比擬的優勢。而行業內另一家互聯網公司則是聲稱國內最早將DNN技術應用到語音識別產品中的公司。

3. 技術介紹

3.1 深度神經網路

為了描述神經網路,我們先介紹最簡單的神經網路,該神經網路只由一個神經元構成,如圖1所示。

圖1 神經元
圖1所示的神經元接受3個輸入,x1,x2,x3,和一個偏置+1, 其輸出為

其中Wi 為xi在輸入中的權重。函數f(x)被稱作激活函數。

圖2. 神經網路

神經網路將許多個單一的神經元連接在一起,如圖2所示。神經網路最左邊的一層叫做輸入層,最右的一層叫做輸出層。中間節點組成的一層叫做隱藏層.

3.2 深度神經網路在聲學模型中的應用

深度神經網路則是層數較多的神經網路。雖然神經網路很早之前就已經提出,但因為計算量的問題,神經網路的層數一直無法提升。近年來隨著神經網路理論的進一步發展和計算能力的不斷提高,特別是GPU的出現,才使得深度神經網路得以發揮其威力。

圖3. 使用DNN作為聲學模型[1]

圖3說明了DNN是如何替代GMM應用到聲學模型中的。圖3中上半部分是HMM的結構,HMM的結構和轉移概率是HMM-GMM模型訓練的結果。圖3中間部分是描述了一個DNN,這個DNN模型來決定HMM的發射概率。通常情況下這個DNN模型的層數不會小於5層,每層大概數千個神經元組成。圖3中的下半部分是DNN模型的輸入,需要注意的是DNN模型的輸入是多幀特徵,而不是GMM模型中一幀。在識別語音的過程中,一小段語音都會被提取成上圖中所對應的Observation,並根據HMM中的狀態計算發射概率(也就是跟不同的發音比較相似度),選擇發射概率最大路徑作為最終的結果。

圖4. DNN聲學模型的訓練流程

圖4說明了DNN聲學模型的訓練流程。在訓練DNN模型之前,我們首先訓練出一個HMM-GMM模型來做強制對齊(forced alignment)。強制對齊的結果作為DNN訓練的樣本提交GPU上訓練DNN模型,這個過程包含了兩部分,首先是基於GPU的Pretrain,使神經網路有一個好的起點。然後使用BP演算法對神經網路進行Fine Tuning,得到最終的模型。

3.3 DNN訓練與識別系統的工程優化

DNN網路具有數據巨大的參數需要學習,每一層網路都有數百萬的參數,而下一層網路的輸入又是上一層網路的輸出,通常情況下訓練一個3.2節中所述的聲學模型需要近兩千個CPU內核運行近一個月。此外,由於聲學模型所用到的DNN較為特殊:每一層的一個神經元都依賴上一層的所有神經元,因此,如果把模型不同層次切分到不同的伺服器上分別進行訓練的話,會帶來巨大的網路開銷,使系統實際上不可用,因此我們在訓練DNN的過程中使用了GPU,並通過不斷的優化,使得訓練速度相比單台伺服器有近兩千倍的速度提高,從而使DNN模型的訓練成為現實。

此外,為了使DNN模型可以應用到線上的服務中,我們對DNN在CPU上的計算也做了優化,在幾乎不影響准確率的情況下,將計算速度提升了將近10倍。

4. 實驗結果

通過DNN模型的應用,我們語音識別系統的字錯誤率下降了40%左右,根據第三方的測試已經超過網路,並有望追上訊飛。

⑶ 機器學習的超參數是什麼

機器學習的超參數是什麼
自從接觸了機器學習後,在很多地方如書籍和文獻中經常會看到有一類參數叫超參數(hyperparameter),其中提超參數最多的地方是在支持向量機(SVM)和深度學習(Deep Learning)中,比如支持向量機中的鬆弛因子:

上式中的C就是鬆弛因子,這個參數在支持向量機中不像參數W那樣,可以通過優化學習得到。還有深度學習中的超參數,如學習率(Learning Rate),在訓練深度網路時,這個學習率參數需要提前指定,比如最近設為0.09等。
那麼問題來了,到底什麼是超參數(hyperparameter)?在很多教材和文獻中都是默認你理解超參數的定義的。如果不知道超參數的定義的話,有些文獻中的話可能不好理解,比如在機器學習中,尤其是在支持向量機中,為什麼有些文獻要把數據集分割成訓練集,驗證集和測試集,而不是直接分割為訓練集和測試集?只有理解了何謂超參數,才會明白某些文獻中這樣分割的道理。
什麼是超參數呢?先來看一下超參數的學院風定義:在機器學習的上下文中,超參數是在開始學習過程之前設置值的參數,而不是通過訓練得到的參數數據。通常情況下,需要對超參數進行優化,給學習機選擇一組最優超參數,以提高學習的性能和效果。
超參數的通俗定義:超參數也是一種參數,它具有參數的特性,比如未知,也就是它不是一個已知常量。一種手工可配置的設置,需要為它根據已有或現有的經驗指定「正確」的值,也就是人為為它設定一個值,它不是通過系統學習得到的。
下面主要看看超參數在機器學習中的定義及示例:
在機器學習的上下文中,超參數是在開始學習過程之前設置值的參數。 相反,其他參數的值通過訓練得出。
超參數:
1. 定義關於模型的更高層次的概念,如復雜性或學習能力。
2. 不能直接從標准模型培訓過程中的數據中學習,需要預先定義。
3. 可以通過設置不同的值,訓練不同的模型和選擇更好的測試值來決定
超參數的一些示例:
1. 樹的數量或樹的深度
2. 矩陣分解中潛在因素的數量
3. 學習率(多種模式)
4. 深層神經網路隱藏層數
5. k均值聚類中的簇數

⑷ 優化演算法

  SGD演算法中的一個關鍵參數是學習率。之前,我們介紹的SGD使用固定的學習率。在實踐中,有必要隨著時間的推移逐漸降低學習率,因此我們將第 k 步迭代的學習率記作 ϵ k 。
  這是因為SGD中梯度估計引入的雜訊源(m 個訓練樣本的隨機采樣)並不會在極小點處消失。相比之下,當我們使用批量梯度下降到達極小點時,整個代價函數的真實梯度會變得很小,之後為 0,因此批量梯度下降可以使用固定的學習率。保證SGD收斂的一個充分條件是

  若 ϵ 0 太大,學習曲線將會劇烈振盪,代價函數值通常會明顯增加。溫和的振盪是良好的,容易在訓練隨機代價函數(例如使用Dropout的代價函數)時出現。如果學習率太小,那麼學習過程會很緩慢。如果初始學習率太低,那麼學習可能會卡在一個相當高的代價值。通常,就總訓練時間和最終代價值而言,最優初始學習率會高於大約迭代 100 次左右後達到最佳效果的學習率。因此,通常最好是檢測最早的幾輪迭代,選擇一個比在效果上表現最佳的學習率更大的學習率,但又不能太大導致嚴重的震盪。

  雖然隨機梯度下降仍然是非常受歡迎的優化方法,但其學習過程有時會很慢。動量方法 (Polyak, 1964) 旨在加速學習,特別是處理高曲率、小但一致的梯度,或是帶雜訊的梯度。動量演算法積累了之前梯度指數級衰減的移動平均,並且繼續沿該方向移動。動量的效果如圖8.5所示

  受 Nesterov 加速梯度演算法 (Nesterov, 1983, 2004) 啟發,提出了動量演算法的一個變種。這種情況的更新規則如下:

  其中參數 α 和 ϵ 發揮了和標准動量方法中類似的作用。Nesterov 動量和標准動量之間的區別體現在梯度計算上。Nesterov 動量中,梯度計算在施加當前速度之後。因此,Nesterov 動量可以解釋為往標准動量方法中添加了一個校正因子。完整的Nesterov動量演算法如演算法3.2所示

  初始點能夠決定演算法是否收斂,有些初始點十分不穩定,使得該演算法會遭遇數值困難,並完全失敗。當學習收斂時,初始點可以決定學習收斂得多快,以及是否收斂到一個代價高或低的點。此外,差不多代價的點可以具有區別極大的泛化誤差,初始點也可以影響泛化。
  也許完全確知的唯一特性是初始參數需要在不同單元間 『『破壞對稱性』』。如果具有相同激活函數的兩個隱藏單元連接到相同的輸入,那麼這些單元必須具有不同的初始參數。如果它們具有相同的初始參數,然後應用到確定性損失和模型的確定性學習演算法將一直以相同的方式更新這兩個單元。即使模型或訓練演算法能夠使用隨機性為不同的單元計算不同的更新(例如使用Dropout的訓練),通常來說,最好還是初始化每個單元使其和其他單元計算不同的函數。這或許有助於確保沒有輸入模式
丟失在前向傳播的零空間中,沒有梯度模式丟失在反向傳播的零空間中。每個單元計算不同函數的目標促使了參數的隨機初始化。我們可以明確地搜索一大組彼此互不相同的基函數,但這經常會導致明顯的計算代價。例如,如果我們有和輸出一樣多的輸入,我們可以使用 Gram-Schmidt 正交化於初始的權重矩陣,保證每個單元計算彼此非常不同的函數。在高維空間上使用高熵分布來隨機初始化,計算代價小並且不太可能分配單元計算彼此相同的函數。
  通常情況下,我們可以為每個單元的偏置設置啟發式挑選的常數,僅隨機初始化權重。額外的參數(例如用於編碼預測條件方差的參數)通常和偏置一樣設置為啟發式選擇的常數。
  我們幾乎總是初始化模型的權重為高斯或均勻分布中隨機抽取的值。高斯或均勻分布的選擇似乎不會有很大的差別,但也沒有被詳盡地研究。然而,初始分布的大小確實對優化過程的結果和網路泛化能力都有很大的影響。
  更大的初始權重具有更強的破壞對稱性的作用,有助於避免冗餘的單元。它們也有助於避免在每層線性成分的前向或反向傳播中丟失信號——矩陣中更大的值在矩陣乘法中有更大的輸出。如果初始權重太大,那麼會在前向傳播或反向傳播中產生爆炸的值。在循環網路中,很大的權重也可能導致混沌(chaos)(對於輸入中很小的擾動非常敏感,導致確定性前向傳播過程表現隨機)。在一定程度上,梯度爆炸問題可以通過梯度截斷來緩解(執行梯度下降步驟之前設置梯度的閾值)。較大的權
重也會產生使得激活函數飽和的值,導致飽和單元的梯度完全丟失。這些競爭因素決定了權重的理想初始大小。
  也有助於避免在每層線性成分的前向或反向傳播中丟失信號——矩陣中更大的值在矩陣乘法中有更大的輸出。如果初始權重太大,那麼會在前向傳播或反向傳播中產生爆炸的值。在循環網路中,很大的權重也可能導致混沌(chaos)(對於輸入中很小的擾動非常敏感,導致確定性前向傳播過程表現隨機)。在一定程度上,梯度爆炸問題可以通過梯度截斷來緩解(執行梯度下降步驟之前設置梯度的閾值)。較大的權重也會產生使得激活函數飽和的值,導致飽和單元的梯度完全丟失。這些競爭因素決定了權重的理想初始大小。
  有些啟發式方法可用於選擇權重的初始大小。一種初始化 m 個輸入和 n 輸出的全連接層的權重的啟發式方法是從分布 U(−1/√ m ,
1/√ m ) 中采樣權重,而 Glorot and Bengio 建議使用標准初始化

  後一種啟發式方法初始化所有的層,折衷於使其具有相同激活方差和使其具有相同梯度方差之間。這假設網路是不含非線性的鏈式矩陣乘法,據此推導得出。現實的神經網路顯然會違反這個假設,但很多設計於線性模型的策略在其非線性對應中的效果也不錯。
  數值范圍准則的一個缺點是,設置所有的初始權重具有相同的標准差,例如1/√ m ,會使得層很大時每個單一權重會變得極其小。Martens (2010) 提出了一種被稱為稀疏初始化(sparse initialization)的替代方案,每個單元初始化為恰好有 k 個非零權重。這個想法保持該單元輸入的總數量獨立於輸入數目 m,而不使單一權重元素的大小隨 m 縮小。稀疏初始化有助於實現單元之間在初始化時更具多樣性。但是,獲得較大取值的權重也同時被加了很強的先驗。因為梯度下降需要很長時間縮小 『『不正確』』 的大值,這個初始化方案可能會導致某些單元出問題,例如maxout單元有幾個過濾器,互相之間必須仔細調整。

  Delta-bar-delta 演算法 (Jacobs, 1988) 是一個早期的在訓練時適應模型參數各自學習率的啟發式方法。該方法基於一個很簡單的想法,如果損失對於某個給定模型參數的偏導保持相同的符號,那麼學習率應該增加。如果對於該參數的偏導變化了符號,那麼學習率應減小。當然,這種方法只能應用於全批量優化中。

  AdaGrad 演算法,如演算法8.4所示,獨立地適應所有模型參數的學習率,縮放每個參數反比於其所有梯度歷史平方值總和的平方根 (Duchi et al., 2011)。具有損失最大偏導的參數相應地有一個快速下降的學習率,而具有小偏導的參數在學習率上有相對較小的下降。凈效果是在參數空間中更為平緩的傾斜方向會取得更大的進步。

  在凸優化背景中,AdaGrad 演算法具有一些令人滿意的理論性質。然而,經驗上已經發現,對於訓練深度神經網路模型而言,從訓練開始時積累梯度平方會導致有效學習率過早和過量的減小。AdaGrad在某些深度學習模型上效果不錯,但不是全部。

  RMSProp 演算法 (Hinton, 2012) 修改 AdaGrad 以在非凸設定下效果更好,改變梯度積累為指數加權的移動平均。AdaGrad旨在應用於凸問題時快速收斂。當應用於非凸函數訓練神經網路時,學習軌跡可能穿過了很多不同的結構,最終到達一個局部是凸碗的區域。AdaGrad 根據平方梯度的整個歷史收縮學習率,可能使得學習率在達到這樣的凸結構前就變得太小了。RMSProp 使用指數衰減平均以丟棄遙遠過去的歷史,使其能夠在找到凸碗狀結構後快速收斂,它就像一個初始化於該碗狀結構的 AdaGrad 演算法實例。
  RMSProp 的標准形式如演算法8.5所示,結合 Nesterov 動量的形式如演算法8.6所示。相比於 AdaGrad,使用移動平均引入了一個新的超參數ρ,用來控制移動平均的長度范圍。經驗上,RMSProp 已被證明是一種有效且實用的深度神經網路優化演算法。目前它是深度學習從業者經常採用的優化方法之一。

  Adam (Kingma and Ba, 2014) 是另一種學習率自適應的優化演算法,最好被看作結合 RMSProp 和具有一些重要區別的動量的變種。首先,在 Adam 中,動量直接並入了梯度一階矩(指數加權)的估計。將動量加入 RMSProp 最直觀的方法是將動量應用於縮放後的梯度。結合縮放的動量使用沒有明確的理論動機。其次,Adam 包括偏置修正,修正從原點初始化的一階矩(動量項)和(非中心的)二階矩的估計(演算法8.7)。RMSProp 也採用了(非中心的)二階矩估計,然而缺失了修正因子。因此,不像 Adam,RMSProp 二階矩估計可能在訓練初期有很高的偏置。Adam 通常被認為對超參數的選擇相當魯棒,盡管學習率有時需要從建議的默認修改。

  目前,最流行並且使用很高的優化演算法包括 SGD、具動量的 SGD、RMSProp、具動量的 RMSProp、AdaDelta 和 Adam。

⑸ 神經網路的超參數

初始參數無所謂,激活函數就用logsitc或者sigmoid都可以,模擬乘法應該不難吧

⑹ 神經網路中自適應的梯度下降優化演算法(二)

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)不需要做零偏校正。默認取值建議:

⑺ 機器學習中的參數與超參數之間的區別

機器學習中的參數與超參數之間的區別
機器學習中的模型參數和模型超參數在作用、來源等方面都有所不同,而模型超參數常被稱為模型參數,這樣,很容易對初學者造成混淆。本文給出了模型參數和模型超參數的定義,並進行了對比,指出了二者本質上的區別:模型參數是模型內部的配置變數,可以用數據估計模型參數的值;模型超參數是模型外部的配置,必須手動設置參數的值。
我們在做研究的時候,會碰到很多術語。有時,在不同的研究領域還會出現同樣名稱的術語。比如,統計學、經濟學中經常使用的「模型參數」和「模型超參數」,在機器學習中也同樣存在。
機器學習領域中的「模型參數」「模型超參數」在作用、來源等方面都有所不同,初學者如果對二者沒有明確的認識,學習起來往往會比較吃力,尤其是那些來自統計學和經濟學領域的初學者們。
為了讓大家在應用機器學習時,對「參數模型」和「超參數模型」有一個清晰的界定,在這篇文章中,我們將具體討論這兩個術語。
首先,我們來看一下「參數」是什麼?
參數作為模型從歷史訓練數據中學到的一部分,是機器學習演算法的關鍵 。
統計學中的「參數」:
在統計學中,你可以假設一個變數的分布,比如高斯分布。高斯分布的兩個參數分別是平均值(μ)和標准差(sigma)。這在機器學習中是有效的,其中這些參數可以用數據估計得到並用作預測模型的一部分。
編程中的「參數」:
編程中可以將參數傳遞給函數。在這種情況下,參數是一個函數參數,可以有一個值范圍。在機器學習中,您正在使用的具體模型就是函數,需要參數才能對新數據進行預測。
「參數」和「模型」有什麼關系?
根據經典的機器學習文獻,可以將模型看作假設,而參數是根據特定的數據集對假設進行的具體調整。
模型是否具有固定或可變數量的參數,決定了模型是「參數」模型或「非參」模型。
什麼是模型參數?
簡單來說,模型參數就是模型內部的配置變數,可以用數據估計它的值。
具體來講,模型參數有以下特徵:
進行模型預測時需要模型參數。
模型參數值可以定義模型功能。
模型參數用數據估計或數據學習得到
模型參數一般不由實踐者手動設置。
模型參數通常作為學習模型的一部分保存。
通常使用優化演算法估計模型參數,優化演算法是對參數的可能值進行的一種有效搜索。
模型參數的一些例子包括:
人造神經網路中的權重。
支持向量機中的支持向量。
線性回歸或邏輯回歸中的系數。
什麼是模型超參數?
模型超參數是模型外部的配置,其值不能從數據估計得到。
具體特徵有:
模型超參數常應用於估計模型參數的過程中。
模型超參數通常由實踐者直接指
模型超參數通常可以使用啟發式方法來設置。
模型超參數通常根據給定的預測建模問題而調整。
怎樣得到它的最優值: 對於給定的問題,我們無法知道模型超參數的最優值。但我們可以使用經驗法則來探尋其最優值,或復制用於其他問題的值,也可以通過反復試驗的方法。
模型超參數的一些例子包括:
訓練神經網路的學習速率。
支持向量機的C和sigma超參數。
k鄰域中的k。
「模型參數」和「模型超參數」
二者的聯系:
當針對特定問題調整機器學習演算法時,例如在使用網格搜索或隨機搜索時,你將調整模型或命令的超參數,以發現一個可以使模型預測最熟練的模型參數。許多模型中重要的參數無法直接從數據中估計得到。例如,在K近鄰分類模型中...這種類型的模型參數被稱為調整參數,因為沒有可用的分析公式來為其計算一個合適的值。
區分:
模型超參數通常被稱為模型參數,這種叫法很容易讓人產生誤解。解決這個問題的一個很好的經驗法則如下:如果你必須手動指定一個「模型參數」,那麼它可能就是一個模型超參數。
總結
讀完這篇文章可以了解模型參數和模型超參數的明確定義和區別。
總而言之,模型參數是從數據中自動估計的,而模型超參數是手動設置的,並用於估計模型參數的過程。

⑻ 卷積神經網路參數解析

(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個數都是如何確定下來的呢?

⑼ 神經網路超參數選擇

深度學習模型通常由隨機梯度下降演算法進行訓練。隨機梯度下降演算法有許多變形:例如 Adam、RMSProp、Adagrad 等等。這些演算法都需要你設置學習率。學習率決定了在一個小批量(mini-batch)中權重在梯度方向要移動多遠。

如果學習率很低,訓練會變得更加可靠,但是優化會耗費較長的時間,因為朝向損失函數最小值的每個步長很小。
如果學習率很高,訓練可能根本不會收斂,損失函數一直處於波動中,甚至會發散。權重的改變數可能非常大,使得優化越過最小值,使得損失函數變得更糟。

訓練應當從相對較大的學習率開始。這是因為在開始時,初始的隨機權重遠離最優值。在訓練過程中,學習率應當下降,以允許細粒度的權重更新。

參考: https://www.jiqixin.com/articles/2017-11-17-2

批次大小是每一次訓練神經網路送入模型的樣本數。在 合理的范圍之內 ,越大的 batch size 使下降方向越准確,震盪越小,通常取值為[16,32,64,128]。

Batch_Size=全部數據集 缺點:
1) 隨著數據集的海量增長和內存限制,一次性載入所有的數據進來變得越來越不可行。
2) 以 Rprop 的方式迭代,會由於各個 Batch 之間的采樣差異性,各次梯度修正值相互抵消,無法修正。
Batch_Size = 1 缺點:
使用在線學習,每次修正方向以各自樣本的梯度方向修正,橫沖直撞各自為政,難以達到收斂。

在合理范圍內,增大 Batch_Size 有何好處?
1) 內存利用率提高了,大矩陣乘法的並行化效率提高。
2) 跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。
3) 在一定范圍內,一般來說 Batch_Size 越大,其確定的下降方向越准,引起訓練震盪越小。

盲目增大 Batch_Size 有何壞處?
1) 內存利用率提高了,但是內存容量可能撐不住了。
2) 跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數的修正也就顯得更加緩慢。
3) Batch_Size 增大到一定程度,其確定的下降方向已經基本不再變化。

參考: https://blog.csdn.net/juronghui/article/details/78612653

迭代次數是指整個訓練集輸入到神經網路進行訓練的次數,當測試錯誤率和訓練錯誤率相差較小,且測試准確率趨於穩定時(達到最優),可認為當前迭代次數合適;當測試錯誤率先變小後變大時則說明迭代次數過大了,需要減小迭代次數,否則容易出現過擬合。

用激活函數給神經網路加入一些非線性因素,使得網路可以更好地解決較為復雜的問題。參考: https://blog.csdn.net/tyhj_sf/article/details/79932893

它能夠把輸入的連續實值變換為0和1之間的輸出。
缺點:
1) 在深度神經網路中梯度反向傳遞時導致梯度爆炸和梯度消失,其中梯度爆炸發生的概率非常小,而梯度消失發生的概率比較大。
2) Sigmoid 的 output 不是0均值,使得收斂緩慢。batch的輸入能緩解這個問題。

它解決了Sigmoid函數的不是zero-centered輸出問題,然而梯度消失的問題和冪運算的問題仍然存在。
tanh函數具有中心對稱性,適合於有對稱性的二分類

雖然簡單,但卻是近幾年的重要成果,有以下幾大優點:
1) 解決了梯度消散問題 (在正區間)
2)計算速度非常快,只需要判斷輸入是否大於0
3)收斂速度遠快於sigmoid和tanh
ReLU也有幾個需要特別注意的問題:
1)ReLU的輸出不是zero-centered
2)Dead ReLU Problem,指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新。有兩個主要原因可能導致這種情況產生: (1) 非常不幸的參數初始化,這種情況比較少見 (2) learning rate太高導致在訓練過程中參數更新太大,不幸使網路進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的演算法。

為了解決Dead ReLU Problem,提出了將ReLU的前半段設為 αx 而非 0 ,如 PReLU 。

1)深度學習往往需要大量時間來處理大量數據,模型的收斂速度是尤為重要的。所以,總體上來講,訓練深度學習網路盡量使用zero-centered數據 (可以經過數據預處理實現) 和zero-centered輸出。所以要盡量選擇輸出具有zero-centered特點的激活函數以加快模型的收斂速度。
2)如果使用 ReLU,那麼一定要小心設置 learning rate,而且要注意不要讓網路出現很多 「dead」 神經元,如果這個問題不好解決,那麼可以試試 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以試試 tanh,不過可以預期它的效果會比不上 ReLU 和 Maxout.

公式: https://www.cnblogs.com/xiaobingqianrui/p/10756046.html
優化器比較: https://blog.csdn.net/weixin_40170902/article/details/80092628

⑽ 人工神經網路概念梳理與實例演示

人工神經網路概念梳理與實例演示
神經網路是一種模仿生物神經元的機器學習模型,數據從輸入層進入並流經激活閾值的多個節點。
遞歸性神經網路一種能夠對之前輸入數據進行內部存儲記憶的神經網路,所以他們能夠學習到數據流中的時間依賴結構。
如今機器學習已經被應用到很多的產品中去了,例如,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給我們一個讓誤差更小的方向,這個學習效率就決定了我們該在這個方向上邁多大的梯度。如果學習效率太高,你可能是超過了誤差最小值;如果太低,你的訓練可能將會永遠進行。這是一個你需要調整的超參數。

閱讀全文

與神經網路超參數優化演算法相關的資料

熱點內容
美團的伺服器是什麼 瀏覽:357
axure原型設計精髓pdf 瀏覽:376
svox文件夾有用嗎 瀏覽:506
怎樣才可以給軟體添加密鑰 瀏覽:587
光纖通信原理pdf 瀏覽:207
c需要用什麼編譯器 瀏覽:702
python設置斷點調試 瀏覽:313
pc手柄怎麼連接安卓 瀏覽:33
dll解壓不成功 瀏覽:343
連接地址伺服器失敗是什麼 瀏覽:399
台達dvp14ss2編程電纜 瀏覽:133
單片機開發板設置技巧 瀏覽:343
阿里雲伺服器怎麼配置git 瀏覽:414
androidcameraid 瀏覽:430
活塞式空氣壓縮機原理 瀏覽:791
vt編輯編制編譯 瀏覽:807
抖音優質創作者推薦程序員 瀏覽:75
攝像機多控神器讓拍攝輕松解壓 瀏覽:422
杭州的伺服器地址 瀏覽:277
全醫葯學大詞典pdf 瀏覽:809