天天看點

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

人工智能的浪潮正在席卷全球,諸多詞彙時刻萦繞在我們耳邊:人工智能(Artificial Intelligence)、機器學習(Machine Learning)、深度學習(Deep Learning)。本文主要是對李宏毅課程内容進行筆記梳理,參考連結在文末已經給出。

6-深度學習簡介

深度學習的三個步驟

  • Step1:神經網絡(Neural network)
  • Step2:模型評估(Goodness of function)
  • Step3:選擇最優函數(Pick best function)

神經網絡

神經網絡(Neural network)裡面的節點,類似我們的神經元。

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

神經網絡也可以有很多不同的連接配接方式,這樣就會産生不同的結構(structure)在這個神經網絡裡面,我們有很多邏輯回歸函數,其中每個邏輯回歸都有自己的權重和自己的偏差,這些權重和偏差就是參數,這些神經元連接配接方式都是手動去設計的。

完全連接配接前饋神經網絡

概念: 前饋(feedforward)也可以稱為前向,從信号流向來了解就是輸入信号進入網絡後,信号流動是單向的,即信号從前一層流向後一層,一直到輸出層,其中任意兩層之間的連接配接并沒有回報(feedback),亦即信号沒有從後一層又傳回到前一層。

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

輸入相應的數值之後,神經網絡在每一層直接乘相應的權重,然後在輸入到設定好的激活函數中,得到下一層的輸入,然後再次重複之前的操作,将信号一層一層的向下傳遞,最後得到網絡的輸出。

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

對于一個深度學習的網絡結構應該分為以下幾層:

  • 輸入層(Input Layer):1層
  • 隐藏層(Hidden Layer):N層
  • 輸出層(Output Layer):1層

    全連接配接的了解: layer1與layer2之間兩兩都有連接配接,是以叫做Fully Connect

前饋的了解: 現在傳遞的方向是由前往後傳,是以叫做Feedforward

深度的了解: Deep = Many hidden layer指的是擁有很多隐藏層

為什麼引入矩陣計算:

随着層數變多,錯誤率降低,随之運算量增大,通常都是超過億萬級的計算。對于這樣複雜的結構,我們一定不會一個一個的計算,對于億萬級的計算,使用循環效率很低。這裡我們就引入矩陣計算(Matrix Operation) 能使得我們的運算的速度以及效率高很多。這樣寫成矩陣運算的好處是,你可以使用GPU加速。

本質

通過隐藏層進行特征轉換。把隐藏層通過特征提取來替代原來的特征工程,這樣在最後一個隐藏層輸出的就是一組新的特征(相當于黑箱操作)而對于輸出層,其實是把前面的隐藏層的輸出當做輸入(經過特征提取得到的一組最好的特征)然後通過一個多分類器(可以是softmax函數)得到最後的輸出y。

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

模型評估

對于損失,我們不單單要計算一筆資料的,而是要計算整體所有訓練資料的損失,然後把所有的訓練資料的損失都加起來,得到一個總體損失L。接下來就是在function set裡面找到一組函數能最小化這個總體損失L,或者是找一組神經網絡的參數 θ \theta θ,來最小化總體損失L。

在神經網絡中計算損失最好的方法就是反向傳播,我們可以用很多架構來進行計算損失,比如說TensorFlow,theano,Pytorch等等

選擇最優函數

如何找到最優的函數和最好的一組參數呢,我們用的就是梯度下降。

具體流程: θ \theta θ是一組包含權重和偏差的參數集合,随機找一個初試值,接下來計算一下每個參數對應偏微分,得到的一個偏微分的集合 ∇ L \nabla{L} ∇L就是梯度,有了這些偏微分,我們就可以不斷更新梯度得到新的參數,這樣不斷反複進行,就能得到一組最好的參數使得損失函數的值最小。

項目搭建步驟

對于從0搭建一個深度學習項目來說,應該是分為以下步驟:

  • 第一部分:啟動一個深度學習項目
  • 第二部分:建立一個深度學習資料集
  • 第三部分:設計深度模型
  • 第四部分:可視化深度網絡模型及度量名額
  • 第五部分:深度學習網絡中的調試
  • 第六部分:改善深度學習模型性能及網絡調參

    下面将會對這六部分進行講解。

第一部分:啟動一個深度學習項目

項目研究:我們會先對現有産品進行研究,以探索它們的弱點。

理論項目研究:接下來,我們需要了解相關的研究和開源項目,許多人在開始實踐之前至少要看幾十篇論文和項目。深度學習 ( DL ) 代碼簡練,但很難排查缺陷,且很多研究論文常常遺漏了實作細節。許多項目始于開源實作,解決的問題也很相似,是以我們可以多多搜尋開源項目。

第二部分:建立一個深度學習資料集

我們可以使用公開資料集或者自定義資料集。公開資料集可以提供更整齊的樣本和基線模型性能,如果你有多個可用的公開資料集,請選擇與你的問題最相關且品質最好的樣本;如果沒有相應領域的公開資料集,我們可以根據項目的實際需要自己去搜集資料,建立資料集。

高品質資料集應該包括以下特征:

  • 類别均衡
  • 資料充足
  • 資料和标記中有高品質資訊
  • 資料和标記錯誤非常小
  • 與你的問題相關

注意事項:

  • 盡可能使用公共資料集;
  • 尋找可以擷取高品質、多樣化樣本的最佳網站;
  • 分析錯誤并過濾掉與實際問題無關的樣本;
  • 疊代地建立你的樣本;
  • 平衡每個類别的樣本數;
  • 訓練之前先整理樣本;
  • 收集足夠的樣本。如果樣本不夠,應用遷移學習。

第三部分:設計深度模型

首先靈活簡單的模型: 從較少網絡層和自定義開始設計,後面再做一些必要的超參數精調方案。這些都需要查證損失函數一直在降低,不要一開始就在較大的模型上浪費時間。

優先性以及增量設計: 把複雜問題分解成小問題,一步一步解決。在設計模型的過程中,我們會遇到許多驚喜。相比于做個要不斷改變的長期計劃,還不如以優先性驅動的計劃。使用更短、更小的設計疊代,進而保證項目可管理性。

避免随機改進: 首先分析自己模型的弱點,而不是随意地改進。随意做改進反而适得其反,會成比例的增加訓練成本,而回報極小。

限制: 我們把限制應用到網絡設計,進而保證訓練更高效。建立深度學習并不是簡單的把網絡層堆在一起。增加好的限制(constraints)能使得學習更為有效,或者更智能。

設計細節:

選擇深度學習軟體架構

遷移學習,許多預訓練模型可用于解決深度學習難題,我們可以先将自己的思路在原有的模型上進行模拟,看效果如何。

成本函數:

并非所有的成本函數都是等價的,它會影響模型的訓練難度。有些成本函數是相當标準的,但有些問題域需要仔細考慮。

  1. 分類問題:交叉熵,折頁損失函數(SVM)
  2. 回歸: 均方誤差(MSE)
  3. 對象檢測或分割:交并比(IoU)
  4. 政策優化:KL 散度
  5. 詞嵌入:噪音對比估計(NCE)
  6. 詞向量:餘弦相似度

度量标準: 良好的度量标準有助于更好地比較和調整模型。

正則化: L1 正則化和 L2 正則化都很常見,但 L2 正則化在深度學習中更受歡迎。L1 正則化有何優點?L1 正則化可以産生更加稀疏的參數,這有助于解開底層表示。由于每個非零參數會往成本上添加懲罰,與 L2 正則化相比,L1 更加青睐零參數,即與 L2 正則化中的許多微小參數相比,它更喜歡零參數。L1 正則化使過濾器更幹淨、更易于解釋,是以是特征選擇的良好選擇。L1 對異常值的脆弱性也較低,如果資料不太幹淨,運作效果會更好。然而,L2 正則化仍然更受歡迎,因為解可能更穩定。

梯度下降: 始終密切監視梯度是否消失或爆炸,梯度下降問題有許多可能的原因,這些原因難以證明。不要跳至學習速率調整或使模型設計改變太快,小梯度可能僅僅由程式設計 Bug 引起,如輸入資料未正确縮放或權重全部初始化為零。如果消除了其他可能的原因,則在梯度爆炸時應用梯度截斷(特别是對于 NLP)。跳過連接配接是緩解梯度下降問題的常用技術。在 ResNet 中,殘差子產品允許輸入繞過目前層到達下一層,這有效地增加了網絡的深度。

縮放: 縮放輸入特征。我們通常将特征縮放為以零為均值在特定範圍内,如 [-1, 1]。特征的不适當縮放是梯度爆炸或降低的一個最常見的原因。有時我們從訓練資料中計算均值和方差,以使資料更接近正态分布。如果縮放驗證或測試資料,要再次利用訓練資料的均值和方差。

Dropout: 可以将 Dropout 應用于層以歸一化模型。2015 年批量歸一化興起之後,dropout 熱度降低。批量歸一化使用均值和标準差重新縮放節點輸出。這就像噪聲一樣,迫使層對輸入中的變量進行更魯棒的學習。由于批量歸一化也有助于解決梯度下降問題,是以它逐漸取代了 Dropout。結合 Dropout 和 L2 正則化的好處是領域特定的。通常,我們可以在調優過程中測試 dropout,并收集經驗資料來證明其益處。

激活函數: 在 DL 中,ReLU 是最常用的非線性激活函數。如果學習速率太高,則許多節點的激活值可能會處于零值。如果改變學習速率沒有幫助,我們可以嘗試 leaky ReLU 或 PReLU。在 leaky ReLU 中,當 x < 0 時,它不輸出 0,而是具有小的預定義向下斜率(如 0.01 或由超參數設定)。參數 ReLU(PReLU)往前推動一步。每個節點将具有可訓練斜率。

拆分資料集: 為了測試實際性能,我們将資料分為三部分: 70 % 用于訓練,20 % 用于驗證,10 % 用于測試。確定樣本在每個資料集和每批訓練樣本中被充分打亂。在訓練過程中,我們使用訓練資料集來建構具有不同超參數的模型。我們使用驗證資料集來運作這些模型,并選擇精确度最高的模型。如果你的測試結果與驗證結果有很大差異,則應将資料打亂地更加充分或收集更多的資料。

自定義層: 深度學習軟體包中的内建層已經得到了更好的測試和優化。盡管如此,如果想自定義層,你需要:

  1. 用非随機資料對前向傳播和反向傳播代碼進行子產品測試;
  2. 将反向傳播結果和樸素梯度檢查進行對比;
  3. 在分母中添加小量的或用對數計算來避免 NaN 值。

歸一化: 深度學習的一大挑戰是可複現性。在調試過程中,如果初始模型參數在 session 間保持變化,就很難進行調試。是以,我們明确地對所有随機發生器初始化了種子。我們在項目中對 python、NumPy 和 TensorFlow 都初始化了種子。在精調過程中,我們我們關閉了種子初始化,進而為每次運作生成不同的模型。為了複現模型的結果,我們将對其進行 checkpoint,并在稍後重新加載它。

優化器: Adam 優化器是深度學習中最流行的優化器之一。它适用于很多種問題,包括帶稀疏或帶噪聲梯度的模型。其易于精調的特性使得它能快速獲得很好的結果。實際上,預設的參數配置通常就能工作得很好。Adam 優化器結合了 AdaGrad 和 RMSProp 的優點。Adam 對每個參數使用相同的學習率,并随着學習的進行而獨立地适應。Adam 是基于動量的算法,利用了梯度的曆史資訊。是以,梯度下降可以運作得更加平滑,并抑制了由于大梯度和大學習率導緻的參數振蕩問題。

Adam 優化器調整

Adam 有 4 個可配置參數:

  1. 學習率(預設 0.001);
  2. β1:第一個矩估計的指數衰減率(預設 0.9);
  3. β2:第二個矩估計的指數衰減率(預設 0.999),這個值在稀疏梯度問題中應該被設定成接近 1;
  4. (預設值 1e^-8)是一個用于避免除以零運算的小值。

β(動量)通過累積梯度的曆史資訊來平滑化梯度下降。通常對于早期階段,預設設定已經能工作得很好。否則,最可能需要改變的參數應該是學習率。

第四部分:可視化深度網絡模型及度量名額

在為深度神經網絡排除故障方面,人們總是太快、太早地下結論了。在了解如何排除故障前,我們要先考慮要尋找什麼,再花費數小時時間追蹤故障。這部分我們将讨論如何可視化深度學習模型和性能名額。

TensorBoard:

在每一步追蹤每個動作、檢查結果非常重要。在預置包如 TensorBoard 的幫助下,可視化模型和性能名額變得簡單,且獎勵幾乎是同時的。

資料可視化(輸入、輸出):

驗證模型的輸入和輸出。在向模型饋送資料之前,先儲存一些訓練和驗證樣本用于視覺驗證。

名額(損失 & 準确率):

除了定期記錄損失和準确率之外,我們還可以記錄和繪制它們,以分析其長期趨勢。下圖是 TensorBoard 上展示的準确率和交叉熵損失。

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

繪制損失圖能夠幫助我們調整學習率。損失的任意長期上升表明學習率太高了。如果學習率較低,則學習的速度變慢。

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

這裡是另一個學習率太高的真實樣本。我們能看到損失函數突然上升(可能由梯度突然上升引起)。

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

我們使用準确率圖調整正則化因子。如果驗證和訓練準确率之間存在很大差距,則該模型出現過拟合。為了緩解過拟合,我們需要提高正則化因子。

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

第五部分:深度學習網絡中的調試

深度學習的問題解決步驟

在前期開發中,我們會同時遇到多個問題。就像前面提到的,深度學習訓練由數百萬次疊代組成。找到 bug 非常難,且容易崩潰。從簡單開始,漸漸做一些改變。正則化這樣的模型優化可以在代碼 degug 後做。以功能優先的方式檢查模型:

  1. 把正則化因子設定為 0;
  2. 不要其他正則化(包括 dropouts);
  3. 使用預設設定的 Adam 優化器;
  4. 使用 ReLU;
  5. 不要資料增強;
  6. 更少的深度網絡層;
  7. 擴大輸入資料,但不要非必要預處理;
  8. 不要在長時間訓練疊代或者大 batch size 上浪費時間。

用小量的訓練資料使模型過拟合是 debug 深度學習的最好方式。 如果在數千次疊代内,損失值不下降,進一步 debgug 代碼。準确率超越瞎猜的概念,你就獲得了第一個裡程碑。然後對模型做後續的修改:增加網絡層和自定義;開始用完整訓練資料做訓練;通過監控訓練和驗證資料集之間的準确率差别,來增加正則化控制過拟合。

初始化超參數

許多超參數與模型優化更為相關。關掉超參數或者使用預設值。使用 Adam 優化器,它速度快、高效且預設學習率也很好。前期的問題主要來自于 bug,而不是模型設計和精調問題。在做微調之前,先過一遍下面的檢查清單。這些問題更常見,也容易檢查。如果損失值還沒下降,就調整學習率。如果損失值降的太慢,學習率增加 10。如果損失值上升或者梯度爆炸,學習率降低 10。重複這個過程,直到損失值逐漸下降。典型的學習率在 1 到 1e-7 之間。

檢查清單

資料:

  1. 可視化并檢查輸入資料(在資料預處理之後,饋送到模型之前);
  2. 檢查輸入标簽的準确率(在資料擾動之後);
  3. 不要一遍又一遍的饋送同一 batch 的資料;
  4. 适當的縮放輸入資料(一般可縮放到區間 (-1, 1) 之間,且具有零均值);
  5. 檢查輸出的範圍(如,在區間 (-1, 1) 之間);
  6. 總是使用訓練集的平均值/方差來重新調節驗證/測試集;
  7. 模型所有的輸入資料有同樣的次元;
  8. 擷取資料集的整體品質(是否有太多異常值或者壞樣本)。

模型:

  1. 模型參數準确的初始化,權重不要全部設定為 0;
  2. 對激活或者梯度消失/爆炸的網絡層做 debug(從最右邊到最左邊);
  3. 對權重大部分是 0 或者權重太大的網絡層做 debug;
  4. 檢查并測試損失函數;
  5. 對預訓練模型,輸入資料範圍要比對模型中使用的範圍;
  6. 推理和測試中的 Dropout 應該總是關掉。

權重初始化

把權重全部初始化到 0 是最常見的錯誤,深度網絡也學不到任何東西。權重要按照高斯分布做初始化:

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

縮放與歸一化

人們對縮放與歸一化都有很好地了解,但這仍舊是最被輕視的問題之一。如果輸入特征和節點輸出都被歸一化,就能更容易地訓練模型。如果做的不準确,損失值就不會随着學習率降低。我們應該監控輸入特征和每層節點輸出的的直方圖。要适當的縮放輸入。而對節點的輸出,完美的形狀是零均值,且值不太大(正或負)。如果不是且遇到該層有梯度問題,則在卷積層做批歸一化,在 RNN 單元上做層歸一化。

損失函數

檢查和測試損失函數的準确性。模型的損失值一定要比随機猜測的值低。

分析誤差

檢查表現不好(誤差)的地方并加以改進,且對誤差進行可視化。

正則化精調

關掉正則化(使得模型過拟合)直到做出合理的預測。

一旦模型代碼可以工作了,接下來調整的參數是正則化因子。我們需要增加訓練資料的體量,然後增加正則化來縮小訓練和驗證準确率之間的差别。不要做的太過分,因為我們想要稍微讓模型過拟合。密切監測資料和正則化成本。長時間尺度下,正則化損失不應該控制資料損失。如果用大型正則化還不能縮小兩個準确率間的差距,那先 degug 正則化代碼或者方法。

類似于學習率,我們以對數比例改變測試值,例如開始時改變 1/10。注意,每個正則化因子都可能是完全不同的數量級,我們可以反複調整這些參數。

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

多個損失函數

在第一次實作中,避免使用多個資料損失函數。每個損失函數的權重可能有不同的數量級,也需要一些精力去調整。如果我們隻有一個損失函數,就可以隻在意學習率了。

固定變量

當我們使用預訓練模型,我們可以固定特定層的模型參數,進而加速計算。一定要再次檢查是否有變量固定的錯誤。

第六部分:改善深度學習模型性能及網絡調參

提升模型容量

要想提升模型容量,我們可以向深度網絡(DN)逐漸添加層和節點。更深的層會輸出更複雜的模型。調參過程更重實踐而非理論。我們逐漸添加層和節點,可以與模型過拟合,因為我們可以用正則化方式再将其調低。重複該疊代過程直到準确率不再提升,不再值得訓練、計算性能的降低。

對于非常深層的網絡,梯度消失問題很嚴重。我們可以添加跳躍連接配接(類似 ResNet 中的殘差連接配接)來緩解該問題。

模型 & 資料集設計變化

以下是提升性能的檢查清單:

  1. 在驗證資料集中分析誤差(糟糕的預測結果);
  2. 監控激活函數。在激活函數不以零為中心或非正态分布時,考慮批歸一化或層歸一化;
  3. 監控無效節點的比例;
  4. 使用梯度截斷(尤其是 NLP 任務中)來控制梯度爆炸問題;
  5. Shuffle 資料集(手動或通過程式);
  6. 平衡資料集(每個類别具備相似數量的樣本)。

我們應該在激活函數之前密切監控激活直方圖。如果它們的規模差别很大,那麼梯度下降将會無效。使用歸一化。如果深度網絡有大量無效節點,那麼我們應該進一步追蹤該問題。它可能是由 bug、權重初始化或梯度消失導緻的。如果都不是,則試驗一些進階 ReLU 函數,如 leaky ReLU。

資料集收集 & 清洗

如果你想建構自己的資料集,那麼最好的建議就是仔細研究如何收集樣本。找最優質的資源,過濾掉與你問題無關的所有資料,分析誤差。

資料增強

收集有标簽的資料是一件昂貴的工作。對于圖檔來說,我們可以使用資料增強方法如旋轉、随機剪裁、移位等方式來對已有資料進行修改,生成更多的資料。顔色失真則包括色調、飽和度和曝光偏移。

監督學習

我們還可以使用無标注資料補充訓練資料。使用模型分類資料。把具備高置信預測的樣本添加到具備對應标簽預測的訓練資料集中。

調整

學習率調整

我們先簡單回顧一下如何調整學習率。在早期開發階段,我們關閉任意非關鍵超參數或設定為 0,包括正則化。在具備 Adam 優化器的情況下,預設學習率通常性能就很好了。如果我們對自己的代碼很有信心,但是損失并沒有下降,則需要調整學習率。典型的學習率在 1 和 1e-7 之間。每次把學習率降低 10%,并在簡短疊代中進行測試,密切監控損失。如果它持續上升,那麼學習率太高了。如果它沒有下降,則學習率太低。提高學習率,直到損失提前變得平緩。

超參數調整

在模型設計穩定後,我們也可以進一步調整模型。最經常調整的超參數是:

  1. mini-batch 尺寸;
  2. 學習率;
  3. 正則化因子;
  4. 特定層的超參數(如 dropout)。

Mini-batch 尺寸

通常的批尺寸是 8、16、32 或 64。如果批尺寸太小,則梯度下降不會很順暢,模型學習的速度慢,損失可能會振蕩。如果批尺寸太大,則完成一次訓練疊代(一輪更新)的時間太長,得到的傳回結果較小。我們密切監控整個學習速度和損失。如果損失振蕩劇烈,則我們會知道批尺寸降低的幅度太大了。批尺寸影響正則化因子等超參數。一旦我們确定好批尺寸,我們通常就鎖定了值。

學習率 & 正則化因子

我們可以使用上述方法進一步調整學習率和正則化因子。我們監控損失,來控制學習率和驗證與訓練準确率之間的差距,進而調整正則化因子。調參不是線性過程。超參數是有關聯的,我們将反複調整超參數。學習率和正則化因子高度相關,有時需要一起調。不要太早進行精細調整,有可能浪費時間。設計改變的話這些努力就白費了。

Dropout

Dropout 率通常在 20% 到 50% 之間。我們先從 20% 開始。如果模型出現過拟合,則提高值。

其他調整

稀疏度激活函數

模型參數的稀疏度能使計算優化變得簡單,并減少能耗(這對于移動裝置來說至關重要)。如果需要,我們可以用 L1 正則化替代 L2 正則化。ReLU 是最流行的激活函數。對于一些深度學習競賽,人們使用更進階的 ReLU 變體以提高準确率。在一些場景中它還可以減少無效節點。

進階調參

一些進階精細調參方法:

  1. 學習率衰減排程
  2. 動量(Momentum)
  3. 早停

我們沒有使用固定的學習率,而是定期降低學習率。超參數包括學習率下降的頻率和幅度。例如,你可以在每十萬次疊代時減少 0.95 的學習率。要調整這些參數,我們需要監控成本,以确定參數下降地更快但又不至于過早平緩。

進階優化器使用動量使梯度下降過程流暢進行。Adam 優化器中存在兩種動量設定,分别控制一階(預設 0.9)和二階(預設 0.999)動量。對于具備梯度陡降的問題領域如 NLP,我們可以稍稍提高動量值。

當驗證誤差持續上升時,過拟合可通過停止訓練來緩解。

但是,這隻是概念的可視化。實時誤差可能暫時上升,然後再次下降。我們可以定期檢查模型,記錄對應的驗證誤差。稍後我們來選擇模型。

網格搜尋

一些超參數是高度相關的。我們應該使用對數尺度上的可能性網格一起調整它們。網格搜尋的計算量很大。對于較小的項目,它們會被零星使用。我們開始用較少的疊代來調整粗粒度參數。在後期的細調階段,我們會使用更長的疊代,并将數值調至 3(或更低)。

模型集合

在機器學習中,我們可以從決策樹中投票進行預測。這種方法非常有效,因為判斷失誤通常是有局部性質的:兩個模型發生同一個錯誤的幾率很小。在深度學習中,我們可以從随機猜測開始訓練(送出一個沒有明确設定的随機種子),優化模型也不是唯一的。我們可以使用驗證資料集測試多次選出表現最佳的模型,也可以讓多個模型進行内部投票,最終輸出預測結果。這種方式需要進行多個會話,肯定非常耗費系統資源。我們也可以訓練一次,檢查多個模型,随後在這個過程中選出表現最佳的模型。通過集合模型,我們可以基于這些進行準确的預測:

  1. 每個模型預測的「投票」;
  2. 基于預測置信度進行權重投票。

模型集合在提高一些問題的預測準确率上非常有效,經常會被深度學習資料競賽的隊伍所采用。

模型提升

在微調模型以外,我們也可以嘗試使用模型的不同變體來提升性能。

7-反向傳播

  • 給到  θ   \theta  θ (weight and bias)
  • 先選擇一個初始的  θ 0 \theta^0 θ0,計算   θ 0  \theta^0  θ0 的損失函數(Loss Function)設一個參數的偏微分
  • 計算完這個向量(vector)偏微分,然後就可以去更新的你  θ \theta θ
  • 百萬級别的參數(millions of parameters)
  • 反向傳播(Backpropagation)是一個比較有效率的算法,讓你計算梯度(Gradient) 的向量(Vector)時,可以有效率的計算出來。

鍊式法則

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播
  • 連鎖影響(可以看出x會影響y,y會影響z)
  • BP主要用到了chain rule(鍊式法則)

反向傳播

  1. 損失函數(Loss function)是定義在單個訓練樣本上的,也就是就算一個樣本的誤差,比如我們想要分類,就是預測的類别和實際類别的差別,是一個樣本的,用L表示。
  2. 代價函數(Cost function)是定義在整個訓練集上面的,也就是所有樣本的誤差的總和的平均,也就是損失函數的總和的平均,有沒有這個平均其實不會影響最後的參數的求解結果
  3. 總體損失函數(Total loss function)是定義在整個訓練集上面的,也就是所有樣本的誤差的總和。也就是平時我們反向傳播需要最小化的值。
李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

我們的目标是要求計算 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z​(Forward pass的部分)和計算 ∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l​( Backward pass的部分 ),然後把 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z​和 ∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l​相乘,我們就可以得到 ∂ l ∂ w \frac{\partial l}{\partial w} ∂w∂l​,所有我們就可以得到神經網絡中所有的參數,然後用梯度下降就可以不斷更新,得到損失最小的函數

李宏毅《深度學習》(四)6-深度學習簡介7-反向傳播

繼續閱讀