深度學習AI面試問答必備50題

文:城主

(注:這不是面向初學者的文章。您需要一點基礎知識來理解本文內容。)

感謝粉絲的熱心推薦。本文對於任何想要準備深度學習面試的人來說都是非常有幫助的。

本文對應視頻的中英完整版B站傳送門:

【深度學習AI面試問答50題-嗶哩嗶哩】 https://b23.tv/m1osqBp

=以下是基於視頻信息重寫的中文書面版=

本文回答50個最常見的深度學習問題,這些問題是你在參加數據科學、機器學習工程、人工智能工程和研究科學家訪談時可能遇到的。

深度學習是當今最熱門的話題之一,它構成了大型語言模型和生成式人工智能等主題的基礎。深度學習包含許多複雜的概念,結合了線性代數、數學、微分理論以及先進的算法,它們共同構成了人工智能的這個領域。因此,如果你想在大型語言模型或人工智能方面找到一份工作,那麼一定要爲此類面試做好準備,因爲深度學習將成爲面試者測試你的一個重要概念。

首先,本文將討論的前50個問題中的前10個是基本概念。從深度學習的基本概念開始,探討深度學習和機器學習的區別,討論神經網絡的概念,研究其架構,以及神經元背後的概念。討論反向傳播的概念,它是如何工作的,與梯度下降(GD)有何不同,以及什麼是GD。此外,介紹不同的優化器和激活函數,詳細解釋飽和度的概念,以及這是如何導致梯度消失問題的。涵蓋神經網絡訓練和測試過程的各個方面。

然後,這將是接下來的10個問題。更詳細地介紹反向傳播的概念、與梯度下降的關係,介紹梯度消失和爆炸問題。涵蓋您在面試過程中會被問到的各種具體問題和與深度學習模型相關的問題。介紹損失函數和各種類型的流行損失函數,您在深度學習面試中可能會遇到這些問題。

在接下來的10個問題中,介紹SGD算法,這是GD的更高級版本。介紹GD的不同版本和變體,這些內容在深度學習面試中會一次又一次地出現,例如批量GD、小批量GD和SGD。將探討它們之間的區別,以及批量大小的作用。介紹Hessian的概念,將Hessian用作不同優化算法的一部分。以及介紹什麼是RMS屬性以及什麼是臭名昭著的Adam算法。

接下來10個問題,討論一些更復雜的主題,介紹Adam W的概念,介紹批量歸一化。探討批量歸一化和層歸一化的區別,如何將層歸一化用作Transformer的一部分。討論什麼是剩餘連接,以及剩餘連接的作用。討論梯度裁剪、cavier初始化,以及解決梯度消失問題和梯度爆炸問題的方法。介紹過度擬合的概念,這是您在深度學習面試中可能會遇到的問題。

最後10個問題介紹神經網絡中的dropout和去正則化的概念。探討過度擬合問題以及如何在神經網絡中解決它。此外,討論dropout和隨機森林的區別。討論訓練與測試的概念,以及退出時的調整。介紹L1正則化、L2正則化,它們之間的區別,以及它們對權重的影響、懲罰的影響以及它們對道德表現影響的嚴重程度。介紹維度準確性的概念以及深度學習如何解決這個問題。然後將介紹生成模型的概念。

1 什麼是深度學習?

在這個問題中,面試官想了解您是否瞭解深度學習與機器學習、人工智能相比的優勢。您可以簡要提及神經網絡的概念以及它與人腦的關係。深度學習是機器學習的一個子集,而機器學習又是人工智能的一個子集。這是人工智能的一個分支,涉及訓練人工神經網絡在大量數據上,以識別和學習數據中的隱藏模式、非線性關係,這是傳統機器學習模型(如線性迴歸或邏輯迴歸或隨機森林和XGBoost)無法做到的。深度學習的核心是層的概念,因爲人工神經網絡和一般而言,深度學習試圖複製人類大腦的工作方式以及當我們看到、聽到或聞到某些東西時攔截和獲取來自外界的輸入信號的方式。他們利用這些信息進行學習,並據此決定是否得出結論或採取行動。這正是深度學習試圖實現的目標。深度學習嘗試採用神經網絡的思想,神經網絡是深度學習模型的一種,以便在輸入層中獲取輸入數據,然後通過激活函數對其進行轉換以激活這些神經元,接着將其轉換爲激活狀態。這一過程將在我們的隱藏層中進行。深度學習模型的神奇之處在於,它能夠識別輸入數據中的非線性關係,然後產生輸出。這是一個非常高級的過程。

面試官並不希望你解釋權重和參數的概念,這些我們稍後會講。但是,面試官希望瞭解你是否對深度學習有較高的理解,也許還希望你能提供深度學習模型的例子。在講述這些時,你肯定要提到人類大腦和神經網絡之間的關係,以及輸入數據、輸入信號、激活和隱藏層的概念。不要過多討論神經網絡架構的細節,而是簡要提及這些深度學習模型。深度學習模型的示例包括人工神經網絡、循環神經網絡、長短期記憶網絡(LSTM)、以及更高級的架構,例如變分自動編碼器。這些模型都基於神經網絡。

因此,如果我要非常簡短地回答這個問題,我會說深度學習模型是人工智能分支上的機器學習模型的子集,它試圖學習複雜的數據和大量數據,並發現隱藏的模式和複雜的數據結構。這種模式的結構適用於各種類型的任務,包括計算機視覺,機器翻譯任務,以及許多自然語言處理模型,如臭名昭著的ChatGPT,GPT模型或T5等大型語言模型,它們都是基於神經網絡的深度學習模型。

2 深度學習與傳統的機器學習模型有何不同?

在這裡,面試官希望瞭解你是否知道深度學習模型相對於機器學習模型的主要優勢。因此,請先提及一些傳統機器學習模型的示例,然後再提及一些深度學習模型的示例,並嘗試將重點放在深度學習模型的一兩個優點上。機器學習模型的一些例子包括線性迴歸、邏輯迴歸、支持向量機、樸素貝葉斯算法、k均值或聚類以及無監督學習模型DBSCAN。還可以提到一些boosting算法,例如GBM、XGBoost,以及隨機森林,這在任務的進展和分類類型中非常流行。

然後,我們要提到深度學習模型,它與機器學習模型有根本的不同。並提及人工神經網絡(ANN)、循環神經網絡(RNN)、長短期記憶網絡(LSTM)、門控循環單元(GRU)和自動編碼器等示例,所有這些都基於神經網絡。還要提到卷積神經網絡(CNN),它在計算機視覺領域非常流行。然後指出,第一個最大的區別是傳統的機器學習模型依賴於手動特徵提取,而在深度學習模型中,它們會自動執行此操作,並自動按原樣獲取輸入數據。我們不需要執行特徵選擇,我們不需要擔心這一點,因爲我們的模型由神經網絡表示,特別是具有這些深層的模型,能夠識別所有這些數據中的這些模式,然後爲自己提取描述我們的數據的最重要的特徵,然後使用它對於不同類型的任務,無論是迴歸還是分類。它實際上表現非常好。

因此,深度學習模型在大數據上表現得非常好,而我們已經看到機器學習模型受到了影響。衆所周知,當數據量增加時,機器學習模型的性能會變得更差。當特徵數量增加時,它們開始過度擬合,並且也開始變得不穩定並且無法準確預測輸出。當我們增加數據中的觀察數量時,我們也會在數據中包含複雜的特徵。這無疑有助於深度學習模型超越傳統的機器學習模型,特別是在計算機視覺或語音識別、機器翻譯和深度學習模型的思想等任務中。您可以通過觀察不同技術領域中最新的各種應用程序,來理解爲什麼它們優於機器學習模型。在這些應用程序中,大多數都是基於神經網絡的算法,而非機器學習模型。這主要歸因於深度學習模型的多種能力,包括處理大數據、處理複雜特徵以及自我進行特徵提取,而不是在模型之外進行,或者受到各種影響,如傳統機器學習模型所面臨的問題。

3 什麼是神經網絡?

在這裡,面試官希望瞭解您對神經網絡與人類學習方式之間的關係的理解,以及您是否瞭解這些組件以及組件如何運作。在訓練過程中,您是否知道什麼是權重和參數?您是否知道隱藏層是什麼,以及它們是一個還是多個?您是否瞭解深度神經網絡的概念,以及這種信息流如何發生,以及您是否提到了神經網絡的所有這些元素?

作爲這個問題的回答,我想說,神經網絡是深度學習領域和人工智能領域的基本概念。它是一個受生物人腦啓發的計算模型,試圖複製人類學習、解釋信息、獲取輸入數據並處理信息的方式。因此,神經網絡對輸入數據進行訓練,並不斷更新這些信息,學習新的東西,添加新的信息,然後更新可能的結果。最終的目標是最大限度地減少我們在學習過程中所犯的錯誤。

神經網絡的核心是由神經元組成,就像我們人腦中的神經元一樣。這些神經元一起形成層,包括輸入層(代表我們的輸入數據)和權重(展示了我們需要對不同輸入信號賦予多少重要性)。這些權重就是我們在模型中所說的參數,我們在執行訓練和學習過程時需要不斷更新它們。這些層還包括一個或多個隱藏層,這是我們神經網絡的中間部分。隱藏層可以幫助我們學習這些不同的模式,理解、激活某些神經元並停用或激活較少的其他輸入神經元,然後轉換這些信息。

在隱藏層之後,我們可以有另一個隱藏層,它將接收來自前一個隱藏層的信息,然後繼續學習過程。反過來,它將能夠學習和理解先前的隱藏層信息。例如,在輸入中,我們有圖像的這些不同像素,我們想要學習這些圖像。爲了讓神經網絡學習,它應該能夠首先學習輸入數據中的某種對象。因此,在第一個隱藏層中,它可能會發現某些信號、某些邊緣和某些信息。然後在下一個隱藏層,它將能夠識別特定的物體,比如說貓的耳朵,如果我們想要識別圖像是貓還是狗,然後把這個信息傳遞到下一層,傳遞到下一層,然後我們繼續到最後一層,當我們產生輸出。

假設您熟悉機器學習,並且正在閱讀本教程,那麼您應該熟悉分類、迴歸、監督學習的概念。對於傳統的神經網絡,我們會產生輸出,例如,它可以識別概率,即 0 到 1 之間的值,比如說我們的分類任務。然後這個值應該與實際的類進行比較。例如,如果我們有概率,並將其轉換爲類別,那麼我們可以更新相應的類別。因此,我們有每個時期神經網絡的輸出,然後我們使用這些信息與監督學習過程中的真實標籤進行比較,然後計算誤差。我們試圖瞭解我們的預測效果如何,然後使用這些信息來了解模型預測結果的準確度。這就是我們所說的損失。然後,我們使用這個損失函數來了解我們需要改變權重多少,我們對神經元的重視程度,我們需要更新這些權重以及模型中的其他參數多少,以便減少我們的模型所犯的錯誤量。神經網絡的基本思想在於獲取輸入,將其放入隱藏層以從輸入數據中學習。這個過程涉及到激活神經元,並可能包含一個或多個隱藏層。通過不斷激活這些神經元,我們可以獲得輸出。我們需要了解模型造成的損失,以及總體成本函數,然後計算我們所說的梯度。雖然我在這裡簡單地提到了梯度的概念,但並沒有過多討論它的細節。然後,我們使用這些梯度來了解需要更新多少權重才能改進模型參數。因爲最終,我們關心的是這個模型,它具有參數、權重參數、偏差參數,最終將爲我們生成最準確的預測。爲了達到這個目標,我們需要不斷學習,經歷這個循環,以便正確學習,並生成一個誤差最小的模型,以便能夠正確地從輸入數據中學習。

4 解釋深度學習中神經元的概念

在這個問題中,面試官想了解權重的概念,偏差因子的概念,如何使用它們來獲得所謂的 Z 分數,以及如何激活,激活函數用於獲取激活,以及這些權重和偏差因素以及與學習過程的關係的意義是什麼。深度學習中的神經元有時被稱爲人工神經元,它模仿人腦神經元的功能,但以一種自動且簡單的方式實現。在神經網絡中,模型獲得不同的輸入。這些輸入信號我們稱之爲神經元,它接受輸入數據,我們將其表示爲 x。我們用這個x來乘以權重,因爲這些權重可以告訴我們這個神經元應該有多少重要性,我們需要對這個神經元給予多少關注。然後這些權重乘以這個輸入數據,你稱之爲x,這些就是我們添加一個偏差因子,因爲當我們執行學習過程時總是會引入偏差。權重乘以輸入數據 x,然後在其上添加偏差因子,這將是我們的 Z 分數。但在下一階段,在接近隱藏層之前,我們使用所謂的激活函數。激活函數,比如 sigmoid 函數、整流線性單元或 Leaky ReLU,所有這些激活函數,它們所做的就是在數學上將非線性引入到我們的神經網絡中。這些激活函數基於權重、輸入數據和偏差因子應用於所有這些不同的 Z 分數,以便了解每個神經元應該被激活多少。在某些情況下,我們可能希望在查看對象並嘗試根據像素瞭解該圖像中的對象是什麼時,我們可能需要激活與該特定區域或該特定對象相關的某些神經元,並且我們不應該激活其他神經元。這正是我們對這些神經元的激活所做的事情。因此,在這裡,我們使用這些激活爲神經網絡引入非線性,以學習輸入數據中的這些複雜結構。

5 用簡單的方式解釋神經網絡的架構

鑑於我們已經回答了前面的問題,都提到了神經網絡的架構和訓練過程的某些部分,這個問題很容易回答,我將在這裡使用一個簡單的可視化來表示簡單的神經網絡,該神經網絡僅包含一個隱藏層只是總結我們在之前的面試問題中提到的所有內容。神經網絡就是這種多層結構的模型,每一層都在一步一步地對輸入數據進行變換。把它想象成一條裝配線。裝配線的每個階段都會比前一個階段增加更多的複雜性,而細節和複雜性會爲模型執行預測的能力增加更多的價值。一開始,模型有這些輸入層。正如您在這裡所看到的,輸入層由 Z1、Z2、Z3 直到 Zn 表示。在這裡,您可以將這個元素、這個輸入視爲輸入層的一部分,作爲描述數據的特徵。例如,我們可能想使用神經網絡來估計房屋的價格。我們需要具有某些特徵來估算該價格。我們需要學習才能瞭解如何區分不同的房屋以及這些特徵如何影響房價。例如,Z1 可以是這所房子的臥室數量。Z2可以是這所房子的層數。Z3可以是房子是否有游泳池。另一個可能的特徵是房子是否已經建成。這棟房子是在哪一年建造的?房子的年齡是多少?所有這些特徵描述了房子的某個元素或某個特徵。這將幫助我們,也將幫助模型從這個特徵中學習並理解。這棟房子的準確價格是多少?

接着,我們就有了這些不同的權重。如你所見,我們有權重1,1,權重1,2,權重1,3。然後我們就有了第二個輸入對應的權重,第三個特徵對應的權重,所以對應於Z3,比如W3,1,W3,2,W3,3等。如你所見,這些權重顯示了一堆正在移動的箭頭,箭頭指向下一層,即我們的隱藏層。

在這個簡單的架構中,我們只有一個隱藏層,但也可以有更多隱藏層,這通常是傳統深度神經網絡的情況,因此也被稱爲“深度”。這些權重的作用是幫助我們理解這個輸入特徵應該對第一隱藏單元、第二隱藏單元和第三隱藏單元貢獻多少。

如你所見,在我們的隱藏層中,我們有三個圓圈。這三個圓圈描述了隱藏層中的隱藏單元。我們有這個簡單的結構,所以我們只有三個隱藏單元。但這是你在訓練模型時可以自己決定的事情。這也是我們所說的可以調整的超參數。

在這裡你可以看到 W1,1 從 Z1 到 H1。這是重要的權重,它告訴我們並告訴神經網絡輸入層應該得到多少關注,什麼時候它應該變得重要,什麼時候它可以幫助你學習第一個隱藏單元。那麼對於H1,我們需要在Z1上施加的權重是多少,所以我們的第一個特徵。然後我們有 W1, 2,它描述了我們需要施加在第一個輸入特徵上的權重,當識別這一點時,當學習並將信息放入我們的第二個隱藏單元 H2 時。

這些權重和相應的偏差因子以及輸入數據可以幫助我們計算我們所說的 Z 分數。Z 分數可以表示爲權重(W)乘以前面的輸入數據(X),加上偏差因子(B)。

一旦我們有了 Z 分數,我們就準備添加非線性,即激活,這將幫助我們理解如何執行聚合。當涉及到第一個隱藏單元 H1 時,有四個不同的路徑,即箭頭指向 H1。分別是 W11、W21、W31 和 WN1。這基本上意味着我們有這些不同的輸入特徵,並且每個輸入特徵都有相應的權重。這有助於我們瞭解當我們獲得 H1 時,我們需要對這些不同的輸入特徵給予多少關注,即我們的隱藏層,我們的第一個隱藏單元。

我們可以根據不同的權重、不同的輸入信號聚合這些不同的 Z 分數,並且該激活函數可以顯着改變我們在 H1 中計算激活的方式。這正是激活的作用,所以激活函數起作用。

一旦我們獲得了這些信息,我們就計算了激活,準備好計算輸出,並且在計算 H1、H2 和 H3 後完成輸出。這些隱藏單元已經根據權重、偏差因子和激活函數學習了上一層輸入數據中的信息。然後我們使用最終的權重,即 WH1、WH2、WH3,以便了解每個隱藏單元需要對輸出層做出多少貢獻。

在這個輸出層中,我們所做的就是以所需的格式獲得輸出。所以可能我們在進行分類時想要得到一個概率,因此我們需要得到一個0到1之間的值。然後在這個輸出層中,我們將得到這個值,我們將它轉換爲一個類。我們將其與實際的標籤(例如 0 和 1)進行比較,以瞭解我們的簡單神經網絡的執行情況。

6 什麼是神經網絡中的激活函數?

激活函數在神經網絡中起着至關重要的作用,其選擇將決定神經網絡的性能。到目前爲止,我們已經討論了很多關於權重的內容,以及如何使用權重、輸入數據或前一層的輸入、前一層的輸出來計算Z分數。我們添加偏差向量以獲得Z分數,然後我們需要應用激活函數以獲得激活。這就是激活函數的作用,它決定了在計算下一層時,每個神經元應該被激活多少。

在神經網絡中,激活函數引入了非線性的概念。如果我們不使用特定類型的激活函數,我們的模型將類似於線性迴歸模型。我們將擁有一個簡單的線性類型的模型,它將能夠揭示線性模式,但無法發現數據中這些複雜的隱藏模式。我們已經看到,在現實世界中,數據大多數時候都包含非線性關係。

因此,我們引入激活函數,這有助於我們將非線性引入神經網絡。它們就像聚合函數一樣,幫助我們理解如何組合這些不同的輸入、這些不同神經元相應的Z分數,以獲得最終的單個激活量。如果你看這個圖,你可以看到我們正在使用x1、x2直到xn,它們是我們的輸入點。然後我們就有了相應的權重,它告訴我們每個輸入需要激活多少。然後我們需要聚合這些值。我們需要獲得一個單一的激活,然後該激活將基於激活函數。它基本上定義了在計算我們之前看到的隱藏單元的體積時,我們需要添加多少與特定輸入相對應的值。

有不同種類的激活函數。我簡單提一下,四種流行的激活函數是sigmoid激活函數、雙曲Tang函數,簡稱爲Tang函數。另外,我肯定會提到整流器線性單元激活函數,即ReLU。我還提到了Leaky ReLU,即整流器線性單元激活函數的Leaky版本。你也可以,如果你有時間,你也可以指定激活函數,它們就像看門人一樣。因此,他們決定需要從該狀態使用多少信息才能傳遞到下一個狀態。這基本上就是激活函數背後的想法,它使神經網絡能夠正確學習數據中的非線性關係。

7 列出幾個流行的激活函數並描述它們

我們在第六個問題中簡單討論了激活函數。因此,在這裡我將更詳細地介紹這些不同的激活函數,並且我們還將對它們進行分類。當你被問到這個問題時,你不需要給出所有這些不同類型的例子。僅舉這四個示例中的一個,然後提供此特定激活函數的詳細說明。但在這種情況下,我會做的是,我將爲您提供業界廣泛使用的所有四種流行的激活函數,然後由您決定以哪一種作爲示例。

所以我傾向於在這四個激活函數後面進行這樣的分類。所以sigmoid激活函數,Tang激活函數,整流線性單元或短ReLU激活函數,以及Leaky整流線性單元,ReLU激活函數。所以我傾向於說sigmoid函數和Tang函數,它們可以形成一個單一的類別。然後修正的線性單元及其調整版本Leaky ReLU,它們可以形成第二類激活函數。我們很快就會明白原因。

現在讓我們從sigmoid激活函數開始。如果您熟悉邏輯迴歸,那麼您很可能會認識這個激活函數,因爲當我們嘗試生成類似概率的值(即0到1之間的值)時,邏輯迴歸中也會使用sigmoid函數。正如您所看到的,在sigmoid激活函數的情況下,當涉及到描述激活函數的圖表時,我們會得到這條S形曲線。那麼,激活函數包含哪些內容呢?

在計算過程中,我們首先計算出z分數,然後根據前一層的數據進行輸出。例如,我們可以用x來表示這個過程。我們將x乘以權重(假設爲w),然後添加偏差因子(假設爲b),這樣就可以得到z分數。接下來,我們需要將z分數作爲激活函數的輸入。這就是爲什麼我們需要將z分數轉換爲激活函數的原因。

在這個例子中,我們使用的是sigmoid激活函數。sigmoid激活函數接受輸入(假設爲z),然後將其轉換爲一個值,這個值等於1除以1加上e的負z次方。這與我們在邏輯迴歸中所做的非常相似。

如你所見,這張圖代表的是一個sigmoid函數,x軸代表所有的z分數,y軸代表相應的激活。你可以看到,對於x的所有值(從負無窮大到正無窮大),相應的z分數(即y軸上的激活)的值都在0和1之間。所以最小值爲0,最大值爲1。你可以看到,曲線的拐點,也就是我們翻轉曲線時到達的點,是0.5。

從這個激活函數中,你可以看到,每當我們有負值時,相應的激活就會在0到0.5之間。每當我們有正的z分數時,相應的激活將在0.5到1之間。

在回答面試問題時,需要記住和提及的一個重要問題是sigmoid函數可能會遭受我們所說的飽和問題。那麼,什麼是飽和度呢?當我們採用非常大的負值或非常大的正值時,就會發生飽和,然後激活或值(在這種情況下是函數)收斂到相應函數的極值。這就是這裡發生的情況。如果我們假設x等於負1,000,那麼相應的y值很可能非常接近0,即最小值,因此它是該激活函數的極值。如果我們將x視爲一個非常大的正數,例如加1,000,那麼相應的激活值將非常接近1,這就是該函數的全局最大值。這就是我們所說的飽和度。

這意味着,如果我們爲z分數取非常大的負數或非常大的正數,那麼該激活函數將爲我們提供一個輸出,一個非常接近極值的值,即0和1的相應激活函數。稍後,我們將討論如果我們使用此函數作爲隱藏層激活的一部分,爲什麼會出現問題。但是,當涉及到獲取一個值(0到1之間的輸出)時,sigmoid函數是首選的激活函數。

接下來我們要講的激活函數是雙曲正切激活函數,簡稱tanh函數。如你所見,雙曲正切函數的形狀與sigmoid激活函數非常相似。唯一的區別是,它將所有值轉換爲-1和1之間的值,而不是像sigmoid函數那樣轉換爲0和1。因此,正如其名稱所示,tang函數是基於幾何主題的概念。如果您對正弦、餘弦、正切和餘切的概念有所瞭解,那麼您對tang函數也會有所瞭解,因爲這個函數正是基於這些概念。tang函數的作用是將所有的z分數轉換爲-1到1之間的值。

代表此激活函數的fz是一個等於的函數,其分母是e的z次方減去e的負z次方,除以e的z次方加上e的負z次方。它的基本作用是進行轉換,獲取z分數,如果z分數爲負,則將其轉換爲-1到0之間的值。然後,如果z分數是從0到正無窮大的正數,則相應的激活將在0和1之間。與sigmoid函數一樣,tang函數也是S形的,只有膨脹點,所以它改變其模式的點,即圖形的行爲方式,不是在0.5點,而是在0點。與sigmoid函數一樣,tang函數也存在飽和問題。因此,對於大負數和大正數,相應的激活將非常接近極值點,因此該函數的-1和+1可能會出現問題,就像sigmoid函數的情況一樣。因此,不建議將這兩個函數用於隱藏層,而是將它們用於輸出層。

我們將這兩個函數用於輸出層,是因爲我們可以非常方便地將從這兩個函數獲得的值轉換爲相應的值,無論是分類情況,因爲如果我們獲得0和1之間的值,例如,在sigmoid激活函數的情況下,我們可以將其解釋爲概率,然後可以使用該概率來獲取類別,例如類別0或1。然後,可以通過將模型與實際類別進行比較來評估我們的模型,並計算交叉熵,或者可以基於此計算任何其他評估指標。

稍後,我們將討論爲什麼這兩個激活函數不應該在層中實際使用,特別是對於具有許多隱藏層的深度神經網絡。但現在,由於這超出了這個問題的範圍,我不想透露細節,因爲我們已經涵蓋了很多內容。所以在回答這個問題時你可以提到接下來的兩個激活函數:整流器線性單元和漏整流器線性單元激活函數。兩者非常相似,尤其是在正z分數方面,但在負z分數方面卻有些不同。

當我們查看整流器線性單元時,實際上是激活函數,您可以看到它看起來像這樣。所以它適用於z時的所有情況,所以激活,如果z分數小於0,那麼它是負數,那麼相應的激活將爲0。所以基本上,這個激活函數不會激活任何負神經元。而對於z分數爲正的情況,則相應的激活將完全等於z分數。因此,名稱爲線性。因此,如果您查看y等於x的線,並且可視化該線,您可以看到正數部分,因此對於x從0到無窮大爲正數的部分,您可以看到y等於x線與我們這裡的完全一樣。這就是“線性”這個詞的由來。它類似於線性函數的表示,但只適用於正數。對於正數,我們將得到z分數,並根據其確切數量進行激活。然而,如果z分數爲負或神經元爲負,則相應的激活不會發生,我們也不會激活這些負值。在所有這些情況下,激活函數會將激活值設置爲0。因此,當我們確實想要輸出、我們確實想要考慮這些負值、並且我們想要考慮這些負值並基於它們進行預測時,這可能會出現問題。在這些情況下,我們需要調整這個ReLU,這樣我們就可以更好地使用我們所說的Leaky ReLU。

Leaky ReLU激活函數的作用是,它不僅激活正分數,還激活負分數。當然,與z爲正數的情況相比,它是在不太極端的情況下實現的。正如您從消極的一面看到的那樣,從我們圖表的第三季度來看,但它仍然如此。而且從函數本身也可以看出,因爲Leaky ReLU對應的激活函數可以用它的f-set來表示,f-set等於0.01。如果z小於0,則如果z大於或等於0,則等於z。因此,對於所有正數,Leaky ReLU的行爲與ReLU完全相同,如您在此處看到的,但對於負值,相應的激活值只是等於0.01。所以你可以看到就是圖中的這一部分。因此,這兩個激活函數都不會受到飽和的影響,這與sigmoid和Tank函數相比絕對不同。這就是爲什麼推薦它,並且已經證明,當我們將這兩個激活函數用作隱藏層激活的一部分時,它們的性能要好得多,並且當涉及到輸出層時,它們的使用並不多。因此,可以考慮將Leaky ReLU和ReLU用於隱藏層,但不要將它們用於輸出層,反之亦然,用於sigmoid函數和Tank函數。將它們用於輸出層,但不能用於隱藏層。

8 如果在神經網絡中不使用任何激活函數會發生什麼?

這個問題的答案可能很短,因爲它非常明顯。缺乏激活函數會將神經網絡簡化爲常見的機器學習模型,例如線性迴歸,這從一開始就消除了使用神經網絡的整個想法。因此,爲了能夠利用神經網絡的架構並能夠發現數據中的隱藏模式、非線性模式,我們可以使用激活函數和非線性激活函數。

9 描述基本神經網絡的訓練如何工作

在這種情況下,面試官想知道您是否瞭解前向傳播、後向傳播的概念,什麼是反向傳播,這些過程如何相互連接,以及神經網絡如何利用這些層來學習這些複雜的模式在你的數據中。

你可以從描述神經網絡的訓練過程開始,一個非常基本的過程,通過我們所說的前向傳遞的過程。前向傳遞獲取輸入數據並通過我們之前看到的神經元進行處理,並使用此加權和和激活函數來產生輸出。我們獲取輸入數據,將其乘以相應的權重,然後添加偏差因子。這些就是我們的z分數。然後,我們應用激活函數來引入非線性,當我們將信息傳遞到下一層時,就會使用這些激活值(即激活分數),因爲我們將使用它作爲輸入。我們將其乘以相應的權重。我們添加偏差因子,然後使用該隱藏層的激活函數,以便從這些複雜性中學習。這個過程一直持續到我們到達計算輸出的輸出層。然後使用該輸出將其與我們的數據的真實值進行比較。例如,我們在處理分類問題時,會觀察到的實際標籤。接着,我們會計算所謂的損失函數或成本函數。例如,對於迴歸類型的問題,我們可能會使用均方根誤差(RMSE)或均方誤差(MSE)。對於分類類型的問題,我們可能會使用交叉熵。然後,我們利用這個損失函數進行所謂的反向傳播。

反向傳播是計算梯度的過程,也就是損失函數相對於權重和偏差因子的一階導數,以及我們希望改進的模型參數的影響。一旦我們計算出這個梯度,它就會告訴我們,如果我們對權重和參數做出一定的改變,損失函數將會改變多少。然後,我們可以利用這個梯度來更新模型中的參數。我們通過反向傳播的過程來實現這一點,這與我們在前向傳播中所做的正好相反。

在前向傳播中,我們從左到右直到模型末尾以獲得輸出。而在反向傳播中,我們做的是相反的事情,也就是說,我們正在倒退。我們通過反向傳播來識別梯度,然後利用這些梯度。我們將其作爲優化技術的輸入,這可以是隨機梯度下降(SGD)、梯度下降(GD)、帶動量的 SGD、均方根(RMS)、探針、Adam等。然後,我們使用這種方法逐層更新我們的權重和偏差因子。

我們基本上要做的就是獲取梯度,然後採用我們將使用的優化算法,例如 Adam,然後我們更新最後一層對應的權重。我們已經計算過了。然後我們繼續之前的下一層。這樣,我們從右邊,從很深層到左邊。因此,使用權重之間的乘法。通過這種方式,我們可以使用梯度,並更新權重和偏差因子,這樣我們就可以調整權重,然後減少損失函數。

這一點非常重要,要向面試官展示你的理解,爲什麼我們要更新權重以及爲什麼我們要更新偏差因子。因爲從數學上講,梯度顯示了當我們將某個權重或某個偏置因子改變一定量時,損失函數會發生多大的變化。這就是我們正在使用的東西,梯度,爲了更新之前的權重參數和偏差參數,這樣我們就可以減少模型造成的損失。因爲這意味着我們離擁有更準確的模型又近了一步。我們犯的錯誤越小,損失就越小,神經網絡的性能就越好。這就是神經網絡訓練背後的想法。

這個過程一直持續下去。我們有前向傳播、反向傳播、後向傳播,等等,直到我們達到某種結束標準,即停止標準。這可能是迭代次數、紀元數或其他一些停止標準。

10 什麼是梯度下降?

梯度下降是我們在機器學習和深度學習中使用的一種優化算法,目的是最小化模型的損失函數。這意味着我們正在迭代改進模型參數,以最小化成本函數並最終得到一組模型參數,這將優化我們的模型。該模型將產生高度準確的預測。

爲了理解梯度下降,我們需要理解什麼是損失函數,什麼是成本函數,這是損失函數的另一種說法。我們還需要了解神經網絡的流程、訓練過程如何工作,我們已經將其視爲之前問題的一部分。然後我們需要理解迭代改進模型的想法以及我們這樣做的原因。

讓我們從頭開始。在神經網絡的訓練過程中,我們首先進行前向傳遞,這意味着我們正在迭代計算我們的激活。因此,我們獲取輸入數據,然後將其與相應的權重參數和偏差向量一起通過隱藏層傳遞,然後使用激活函數激活這些神經元。然後我們將遍歷這些多個隱藏層,直到我們最終計算出該特定前向傳遞的輸出。

一旦我們在訓練神經網絡的最初迭代中執行此操作,我們需要有一組模型參數,我們可以首先開始訓練過程。因此,我們需要在模型中初始化這些參數。我們在神經網絡中特別有兩種類型的模型參數。正如我們在前面的討論中所提到的,我們需要考慮權重和偏差因素。那麼,如果我們使用這組特定的權重和偏差向量,我們會犯多少錯誤?這些權重和偏差是我們可以調整的參數,以提高模型的準確性。

再次提出問題,如果我們使用這個模型參數的初始版本,也就是權重和偏差向量,我們計算出的輸出(即 y 帽子),那麼我們需要了解根據這組模型參數做出的模型有多少誤差。這就是我們所說的損失函數,也被稱爲成本函數,它表示我們使用這些權重和偏差因子進行預測時產生的平均誤差。

在機器學習中,我們知道有迴歸類型的任務和分類類型的任務。根據您要解決的問題,您可以選擇使用哪種損失函數來衡量模型的表現。神經網絡訓練的基本思想是,您希望通過迭代改進模型參數,即權重和偏差向量,最終得到一組最佳和最優的權重和偏差因子。這將使模型產生的誤差最小,這意味着您已經找到了一種能夠產生高度準確預測的算法和神經網絡,這是我們使用神經網絡的整個目標。

因此,如果您正在處理分類類型的問題,損失函數可以是交叉熵,這通常是處理分類任務時的首選。但您也可以使用 F1 分數,即 F beta 分數。您可以使用精確率、召回率。此外,如果您有迴歸類型的任務,您可以使用均方誤差(MSE)、RMSE 或 MAA。這些都是您在每次更改模型參數時可以用來衡量模型性能的方法。

在神經網絡訓練的過程中,我們需要使用一種基本算法,我們稱之爲反向傳播。我們使用它來了解當我們對參數進行微小更改時,損失函數會發生多少變化。這就是我們所說的梯度,它來自數學。在反向傳播的過程中,我們計算損失函數關於每個模型參數的一階偏導數,以瞭解我們可以改變每個參數多少以減少損失函數。

那麼,梯度下降是如何執行優化的呢?在訓練過程中,梯度下降在每次傳遞和迭代時都會使用全部的訓練數據。因此,對於每次參數的更新,也就是每次更新權重因子和偏差因子時,它都會使用全部的訓練數據。這意味着,在一次前向傳遞中,我們使用所有的訓練觀察結果來計算預測,然後計算損失函數,然後執行反向傳播,計算損失函數相對於每個模型參數的一階導數,然後使用這些導數來更新參數。

梯度下降執行優化的方式是,更新模型參數,獲取反向傳播的輸出,這是損失函數相對於模型參數的一階偏導數,然後乘以學習率或步長,然後從原始模型參數和當前模型參數中減去該量以獲得模型參數的更新版本。

在這個過程中,我們從反向傳播中獲取梯度,然後我們使用這個 dv,它是損失函數相對於權重參數的一階梯度,然後將其乘以步長 eta,然後我們從 v 中減去這個,即當前的權重參數,從而得到新的更新後的權重參數。我們也對第二個參數(即偏差因子)執行同樣的操作。

值得注意的是,我們在這裡使用的步長,即學習率,也可以被視爲一個單獨的主題。我們可以深入探討這背後的細節。但現在,將學習率視爲一個步長,它決定了我們執行更新時步長的大小,因爲我們確切地知道當我們對參數進行一定的更改時,損失函數將會發生多大的變化。所以我們知道梯度的大小。首先,我們需要了解我們需要應用的更改的內容有多少。我們是否希望實現一個大的跳躍,還是我們希望在迭代改進模型參數時做出較小的跳躍?如果我們把學習率設定得很大,那就意味着我們將應用更大的變化,這意味着算法在走向全局最優時將邁出更大的一步。然而,我們也需要注意,當我們進行太大的跳躍時,尤其是如果這些跳躍不準確時,可能會出現問題。

因此,我們需要確保優化這個學習參數,這是一個超參數。我們可以對其進行調整,以找到最佳學習率,從而最小化損失函數並優化我們的神經網絡。當涉及到梯度下降時,這個算法的質量非常高。它被認爲是一個很好的優化器,因爲它在執行梯度時使用整個訓練數據,因此執行反向傳播,然後利用它來更新模型參數。我們根據整個訓練數據得到的梯度代表真實的梯度。所以我們不對其進行估計,我們沒有犯錯誤。相反,我們在計算這些梯度時使用整個訓練數據,這意味着我們擁有一個優秀的優化器,能夠採取準確的步驟來尋找全局最優值。因此,梯度下降也被稱爲良好的優化器,它能夠以更高的可能性找到損失函數的全局最優值。

然而,梯度下降的問題是,當它每次更新模型參數時都使用整個訓練數據,這在計算上可能不可行或者非常昂貴,因爲訓練了大量的觀察,使用整個訓練數據對模型參數執行一次更新,每次將大量數據存儲到內存中,對這些大數據執行這些迭代,這意味着當你有非常大的數據時,使用此算法可能需要幾個小時才能優化。在某些情況下,甚至可能需要幾天或幾年,特別是當涉及使用非常大的數據或使用非常複雜的數據時。因此,雖然梯度下降被認爲是一個很好的優化器,但在某些情況下,使用它是不可行的,因爲它效率不高。

11 優化器在深度學習中的作用是什麼?

當我們談到訓練神經網絡時,我們想要找到什麼是超參數集以及什麼是參數集,我們可以將其用作模型的一部分,這最終會產生最少的錯誤。因爲當我們的算法產生最小的錯誤時,這意味着我們的預測很可能是準確的。當將其用於新的未見過的數據時,它也會以更好的方式表現。因此,這意味着我們可以依賴該算法,並且可以將其應用於不同的應用程序,而不必擔心它會產生太大的錯誤。

爲了執行此優化,我們正在利用不同的優化算法。我們剛剛討論的梯度下降就是用於更新模型參數的算法之一,以儘量減少模型產生的誤差。在這種情況下,費用金額或模型通過最小化損失函數而產生的損失。因此,這基本上不僅是深度學習中優化器的主要目標,而且也是機器學習和深度學習模型中的優化器的主要目標。

我們的想法是,我們將迭代調整模型參數,在這種情況下,我們模型中的權重參數和偏差參數,爲了最終得到場景和模型,其中算法產生的錯誤量最小。或者在某些情況下,它可以是目標函數具有應該最大化的性質,意味着我們需要提出一組模型參數,這將使目標函數最大化。所以取決於目標的類型,作爲算法的一部分,然後您需要決定如何應用優化算法。您需要最小化或最大化您的目標函數。

當談到優化算法時,我們有非常原始的優化算法,但多年來也開發了許多其他梯度下降的變體,以克服梯度下降的一些缺點,但同時,也要嘗試複製梯度下降的好處。例如,除了梯度下降之外,我們還有隨機梯度下降(SGD)和小批量梯度下降。當引入動量來改進SGD等優化算法時,我們還有帶動量的SGD。我們擁有基於自適應學習的優化技術,例如 RMSProp、Adam、AdamW 和 AdaGrad。這些都是在深度學習中使用的不同類型的優化算法,它們的目標是優化算法。因此,我們需要記住的另一個重要方面是,優化算法的目標是迭代地改進模型參數,以便我們最終找到全局最優值。

在解釋梯度下降和其他優化器的方差時,我將繼續使用“全局最優”這個術語。全局最優是指我們用來衡量模型誤差的目標函數的實際最小值或實際最大值。我們需要注意的是,我們可能會遇到局部最小值或局部最大值,而不是全局最小值或全局最大值。這意味着,在一個由許多值組成的區域中,可能會出現錯誤。在某些情況下,優化算法可能會誤導我們,使我們找到局部最小值或局部最大值,而不是全局最小值或全局最大值。

當優化算法正在移動以瞭解如何改進其方向以識別最小值時,它可能會發現,這就是我們正在尋找的最小值。因此,算法會收斂,並決定這是我們需要使用的一組超參數和參數以優化我們的模型。但實際上,它可能混淆了全局最小值和局部最小值,並錯誤地宣稱算法已經收斂並找到了實際的最小值。然而,這實際上是局部最小值,而不是全局最小值。局部最小值可能看起來像是損失函數的最小值,但實際上它只是一個值,它比周圍的值小得多,但並不是整組值中最小的一個。

因此,我們的目標是找到全局最小值而不是局部最小值。理想情況下,我們希望最終實現收斂,並找到所有權重和偏差因素的模型狀態,它們導致損失函數的實際最小值,而不僅僅是對於特定一組值來說似乎是最小值的值。

12 什麼是反向傳播以及爲什麼它在深度學習中很重要?

反向傳播是神經網絡訓練的基本組成部分。它可以幫助我們從模型在每次迭代中所犯的錯誤中學習,以便理解模型的某些參數(例如權重因子和偏差因子)如何變化,從而導致損失函數發生變化。

反向傳播算法是整個訓練過程的中間部分。我們首先執行前向傳播,將輸入數據輸入我們的網絡。然後基於這些轉換,我們最終得到最終的輸出層,然後我們就可以執行我們的預測。我們計算預測值,一旦計算出預測值,我們就可以計算該特定迭代的損失函數。一旦我們有了損失函數,我們就可以理解我們需要如何改變我們的權重和偏差因子,以便我們可以減少模型在當前迭代中犯的錯誤。

模型所產生的誤差,即平均誤差,我們通過損失函數來測量。下一步是該算法的一部分,就是爲了獲得當我們對權重參數和偏差參數進行微小改變時,損失函數的具體變化量。這就是我們所說的梯度。計算這些梯度的整個過程稱爲反向傳播。

反向傳播基本上是指計算損失函數相對於我們每個模型參數(包括各種權重參數和偏差參數)的一階偏導數的過程。這種反向傳播是基礎,因爲它有助於算法理解改變每個不同的權重參數會導致損失函數中的多少變化。這是我們需要將這些信息提供給優化算法(例如 GADM)的方式。爲了使優化算法能夠更新模型參數,我們需要利用反向傳播的輸出,這是梯度下降(GD)、隨機梯度下降(SGD)、Adam等優化算法的輸入。以我們之前研究過的一個具體示例來看,這是一個非常簡單的神經網絡,它有少量的隱藏層和隱藏單元,只有幾個輸入信號。

在前向傳播的過程中,我們執行所有轉換,激活神經元,然後得到預測的響應變量,即y帽。一旦我們得到了y帽,我們也會緩存我們的最終結果,即z分數值。z分數等於輸入x乘以權重參數,再加上偏置參數。有了這個之後,我們可以應用各種微分規則,特別是鏈式法則,同時我們也可以利用求和的微分規則和應用於常數的微分規則,以更新損失函數相對於激活的梯度,即dA。

然後我們可以利用dA來獲得損失函數相對於z的梯度。進一步,我們可以利用dA和dZ來獲得損失函數相對於權重的梯度,即dV。最後,以類似的方式,我們可以利用dA和dZ來獲得損失函數相對於偏置的梯度,即我們的偏差因子。

重要的是要記住,爲了更新模型參數,我們需要知道損失函數相對於權重參數dV的梯度,以及偏置因子的梯度,這是損失函數的一階偏導數。但爲了計算dV和dB,我們還需要首先計算激活的梯度和z分數的梯度,因爲權重因素和偏差因素是z分數的一部分。所以我們應用了一系列變換,這意味着當我們執行微分時,我們還需要執行這一微分鏈,以便能夠首先獲得權重的梯度和偏置因子的梯度。

具體來說,z等於權重矩陣的轉置乘以激活矩陣,然後我們添加偏差因素,形成了我們的z。爲了計算損失函數相對於權重的梯度,即dV,我們首先需要對損失函數J求偏導數,關於z分數,然後我們需要乘以z分數相對於權重矩陣的偏導數,以便能夠計算這個偏導數dV。這簡單地等於dz乘以激活矩陣的轉置。我們也在執行類似的操作來獲取偏差因子的梯度。

我不會過多討論這些梯度的數學推導的細節,因爲您需要深入研究這些不同的偏導數。當涉及到使用鏈式規則時,我們還需要刷新我們的記憶,當涉及到值的總和時,當涉及到常數與目標值相乘時,微分規則。當您學習深度學習主題時,我肯定會建議您刷新這些內容。但爲了留在面試問題的範圍內,我只是想分享這個只是爲了刷新你的記憶,在每次我們嘗試優化算法時,我們都在執行反向傳播。爲了計算所有這些不同的梯度,我們首先需要計算相對於權重的梯度和相對於偏差因子的梯度。此外,我們還需要計算關於激活的梯度和關於z分數的梯度。然後,我們使用這些計算結果來計算權重的梯度和偏置因子的梯度。最後,反向傳播就是計算損失函數相對於權重和偏置因子的偏導數的過程,以便將這些結果作爲輸入提供給我們的優化算法。這實際上引出了我們的下一個問題。

13 反向傳播與梯度下降有何不同?

在深度學習面試中,您可能會遇到有關反向傳播和梯度下降之間差異的問題。這通常是一個棘手的問題,因爲描述訓練過程並不總是直觀的。我們首先執行前向傳播,然後計算損失函數,以瞭解模型的訓練效果以及平均誤差量。接着,我們計算梯度以瞭解當我們改變各種參數時,損失函數會發生多大的變化。然後我們使用這些信息來不斷更新模型參數,直到前面的層,以便最終得到一個表現更好的模型。這個過程是通過從較深層到較早的層進行的。

那麼梯度下降與反向傳播有何不同?當涉及到反向傳播和梯度下降時,具體有什麼區別?這個問題的答案其實很簡單。在我看來,這只是一個欺騙受訪者的問題。反向傳播是計算梯度的實際過程,瞭解當我們改變模型參數時損失函數有多大變化。然後反向傳播的輸出簡單地用作梯度下降或任何其他優化算法的輸入,以便更新模型參數。所以梯度下降只是使用反向傳播的輸出作爲輸入,因爲它採用計算出的梯度來自反向傳播作爲輸入,以便更新模型參數。所以反向傳播發生在中間,一旦我們完成前傳。然後反向傳播就完成了。然後我們執行向後傳遞。因此,我們使用反向傳播,然後不斷迭代地將模型參數從較深層更新到較早層。這就是優化算法所做的事情。

14 描述什麼是梯度消失問題及其對神經網絡的影響

當網絡的梯度(即損失函數)相對於模型參數(例如權重和偏差參數)時,就會發生梯度消失,它們變得很小。在某些情況下,它們變得完全接近於零,這意味着它們開始消失,因爲它們通過非常深的層傳播回較早的層。這種梯度消失的結果是網絡不再能夠有效地學習數據中的依賴關係。並且模型不再能夠有效地更新模型,這意味着算法最終不會被優化。我們最終將得到一個無法也無法學習數據中實際依賴關係的模型。

當然,這是我們想要避免的事情。我們希望擁有適量的梯度,將其用作梯度下降等優化算法的一部分,以獲得模型參數,然後不斷迭代地執行此操作,這樣我們最終將最小化我們的損失函數。我們的模型將處於提供高度準確預測的狀態。那麼我們如何解決梯度消失問題呢?其原因何在?

作爲神經網絡訓練的一部分,我們看到在每次訓練迭代中,例如,作爲梯度下降算法的一部分,我們將使用整個訓練數據訓練我們的網絡,然後從最早期的層到最後的輸出層執行這些不同的轉換,獲取激活值,然後將其與權重指標相乘,然後添加偏差參數,以這種方式計算z分數,然後應用激活函數來激活這些神經元。然後這一切完成之後,在該特定的隱藏層中,網絡能夠學習數據中的不同依賴關係,然後學習結構,然後進入下一層,然後進入下一層,直到到達輸出層。然後當我們有了輸出層時,我們就可以計算我們的預測。因此,我們首先計算預測值 y hat,然後將其與真實標籤或真實值進行比較。接着,我們需要了解損失函數的性質,以及模型在使用這組參數時產生的平均誤差是多少。然後,我們執行反向傳播來計算梯度,並將其提供給優化算法,以便更新模型參數。優化算法的工作方式與前向路徑相反。它計算並獲取梯度,計算相應的更新,然後更新權重以及從深層到較早層的偏差因素。

問題在於,我們正在執行所有這些轉換,並且每次都將這些值相乘。這意味着什麼呢?在某些情況下,特別是當我們有深層網絡,有很多隱藏層時,當網絡從深層、中間層、然後更早的層接近時,許多這些權重相乘之後,這些梯度開始變得非常接近於零。當梯度變得非常接近零時,這意味着我們除了更新權重之外別無他法,並更新我們的偏差參數。當我們無法再更新模型中的權重時,這意味着網絡不再能夠正確學習,尤其是當梯度消失時從較早的層學習。

這就是一個問題,因爲我們希望我們的模型能夠不斷學習並不斷更新這些權重,這樣我們最終會得到權重和偏差因子的最佳參數集,以最小化損失函數,然後提供高度準確的預測。因此,理想情況下,我們希望確保這些梯度不會消失。所以我們要解決梯度消失問題,我們的網絡能夠正確學習並理解數據中的這些依賴關係,無論是在深層還是在較早的層中都是獨立的。

因此,在描述這個問題時,請嘗試關注權重,因爲當權重的梯度開始消失時,這是最大的挑戰,特別是對於深度神經網絡中的早期層。這是我們想要避免的,因爲模型會出現梯度消失問題,無法有效學習。作爲答案的一部分,您可以提到的另一件重要的事情是,某些架構本質上都受到這個問題的影響。尤其是 RNN、遞歸神經網絡,以及 LSTM、GRU,它們本質上都是深刻的,因爲不像人工神經網絡這樣原始的神經網絡具有單個輸入層,它們提供輸入,然後神經元被激活並提供單一輸出。和隱藏層,它們並不相互關聯。所以它們不像 RNN 那樣接受輸入,然後爲每個輸入提供相應的輸出。然後這個隱藏層,然後隱藏單元將被用作下一步和下一步的一部分。所以它們不像 RNN 那樣基於順序,那麼它們比 RNN 更不容易出現梯度消失問題。

由於 RNN 是另一種序列類型的神經網絡,因此它們本質上很深,這意味着它們具有多層,基於他們擁有的時間步長,這使得這些算法更容易出現梯度消失問題。

15 各種激活函數和梯度消失問題之間有什麼聯繫?

因此,梯度消失問題與激活函數的選擇高度相關,因爲某些激活函數由於其固有的特性,會自動導致梯度消失問題。還有一些已知不會導致梯度消失問題的激活函數。當然,我們希望瞭解這樣的激活函數,然後當我們意識到可能存在梯度消失問題時就不要使用它們。所以在這裡我傾向於區分 sigmoid 激活函數和坦克激活函數與 ReLU,所以整流器線性單元,和 Leaky-ReLU 激活函數。其原因在於它們的固有屬性,即我們所說的飽和度。這意味着,例如,在 sigmoid 激活函數的情況下,當激活 fz 等於 1 加 e 次方減 z 時,這意味着只要 z 或 z 分數是一個非常大的負數,比如說負 1000,然後進行相應的激活。然後,fz將非常接近零,正如您所看到的,這被認爲是sigmoid函數的最小值。當z爲本例中的z分數時,x將是非常大的正數,因此它將在1000左右。接下來是相應的函數,即激活函數,其值約爲1,非常接近1。正如您所看到的,在達到x的某個水平時,對於正值,無論x的大小如何,相應的激活值將非常接近1。而到了某個時候,這個領域甚至不會發生任何變化。

這就是我們所說的飽和度,意味着當我們有非常大的負數或非常大的正數時,相應的激活就不再有任何變化。我們最終將接近該函數的最大值或最小值。在這種情況下,對於非常大的正x,y將約爲1,對於非常大的負數,相應的激活值將在0左右。因此,在sigmoid激活的情況下,我們說sigmoid激活函數遭遇飽和,並且容易造成梯度消失問題。所以它會導致梯度消失,特別是當我們有非常大的z平方值時。所以它可以是大正值,也可以是大負值。

實際上,同樣的情況也適用於tang激活函數,因爲就像你在這裡看到的那樣,tang激活函數和sigmoid激活函數一樣,都是這種s形的激活函數。與sigmoid函數一樣,tang也存在飽和問題。在這裡,你可以看到當我們有x,這是一個非常大的正數,比方說1,000,那麼相應的激活值將在1左右。如果我們改變這個x並將其設爲2,000或3,000,同樣的情況也會成立。

無論x這個大數增加多少,相應的激活將是相同的。它將接近1,這是該函數的最大值。對於該激活函數的非常大的負數也是如此。假設x約爲負1,000,那麼相應的激活值將在負1左右。但當x約爲負2,000或負10k時,同樣成立。

所以這意味着在tang激活函數的情況下,就像在sigmoid激活函數的情況下一樣,當我們有非常大的正值或非常大的負值時,我們想看看使用這個激活函數可以激活它們多少,那麼相應的激活值就在該函數的極值附近。所以在tang函數的情況下負1和1,以及sigmoid激活函數情況下的0和1。因此,就像sigmoid激活函數的情況一樣,我們說tang激活函數遇到了飽和。這意味着tang激活函數本質上會導致梯度消失問題,因爲它導致梯度消失。這是我們想要避免的事情。

所以我們要記住的一件事是,當涉及到輸出層時,sigmoid激活函數和tang激活函數非常有用,因爲它們在某些範圍之間轉換值時具有這些很好的屬性。就像sigmoid函數一樣,它會轉換值,0到1之間的任何值,當我們想要以概率形式輸出時,這非常有用。問題的分類非常適合。然而,當我們談論將激活函數用於隱藏層時,這是我們想要避免的。因此,我建議使用 Sigmoid 激活函數或雙曲 Tang 激活函數於輸出層,但不要將其用於隱藏層,因爲它們容易出現梯度消失問題。

我們今天要討論的下一組激活函數是修正線性單元(ReLU)和泄漏修正線性單元(Leaky ReLU)。與 Sigmoid 激活函數和 Tang 激活函數不同,ReLU 或 Leaky ReLU 不會飽和,這意味着它們不會導致梯度消失問題,非常適合作爲隱藏層的一部分。

您可以看到,當我們取非常大的正 x 值時,相應的激活會發生變化。當我們從 1000 到 2000,從 2000 到 10k,相應的激活量也會有很大的變化,這意味着激活函數不會導致梯度非常接近於零,這就是我們所說的梯度消失。因此,ReLU 不會導致梯度消失問題,這是很棒的事情,特別是當我們將它們用作隱藏層的一部分時。

這同樣適用於 Leaky ReLU,我們可以在這裡看到這一點,因爲兩者非常相似。唯一的區別是,Leaky ReLU 在某種程度上確實考慮了負神經元的激活,這意味着當 x 爲負值時,從負無窮大到零,您可以看到相應的激活不是零,而是等於 0.01。因此,與 Sigmoid 和 Tang 激活函數不同,這兩個函數沒有飽和,它們的激活值會改變,並且不會接近函數的同一個極值。當我們提供非常大的正值或非常大的負值作爲輸入時,這意味着它們非常適合用作隱藏層的一部分,使網絡能夠持續有效地學習數據中隱藏的依賴關係。因此,我們建議使用 ReLU 和 Leaky ReLU 作爲隱藏層的一部分來激活這些神經元,並且每當接近輸出層時,對於輸出層,請使用 Sigmoid 函數或 Tang 激活函數。

16 隱藏層中有一個神經元總是會導致反向傳播產生很大的誤差,可能的原因是什麼?

作爲神經網絡反向傳播的一部分,可能有很多原因導致該特定神經元或某些神經元始終產生較大誤差。第一個可能的原因是權重初始化不當。這意味着在開始訓練過程時,我們需要初始化權重參數和偏差參數,以便網絡可以採用這些初始值,然後執行前向傳遞計算,然後將其用作梯度下降(GD)、隨機梯度下降(SGD)等優化算法的輸入,以便迭代更新這些權重參數。但是,如果我們沒有以正確的方式初始化權重,這意味着我們沒有使用正確的分佈從中隨機採樣,或者我們只是爲此權重和偏差參數提供了錯誤或不正確的值,這將從一開始就改變那些特定神經元的學習過程。

如果我們從一開始就以不正確的方式進行學習過程,我們正在扭曲那些學習過程,在每次迭代中,這意味着下一次迭代將基於從第一次傳遞錯誤開始的第一次迭代,它也會以錯誤的方式完成。然後下一次、下一次,這個過程每次都會繼續下去,在不正確的學習中,並在誤差較大時作爲損失的一部分進行計算然後反向傳播。

另一個可能的原因是梯度消失或爆炸。如果梯度變得非常小,並且神經元的權重,特別是在深層網絡中,不再開始更新那些不同的參數,這意味着,我們可能會在特定神經元中持續犯大錯誤,因爲我們無法有效地學習模型中的依賴關係。這個特定神經元將無法被正確激活,相應的權重也無法得到更新,從而無法提高對這些特定神經元預測的準確性。同樣,這也適用於梯度爆炸問題。如果我們進行過多的更新,而神經元沒有被正確激活,那麼相應的權重也無法得到正確的更新,這將導致我們在這些神經元上持續犯大錯誤。

另一個可能導致這種情況的原因是學習率不適當。如果我們的學習率過高或過低,我們可能會在訓練過程中超出或低於最佳值,因此無法充分更新權重參數和偏差參數。因此,優化模型中的這些超參數非常重要,以使模型能夠持續更新並改進參數,從而改善學習過程。

另一個可能的原因是激活函數選擇不當,因爲激活函數可以顯著影響學習過程。我們激活神經元的方式將是一個決定性因素,它決定了神經網絡是否能正確學習數據中的依賴關係,以及權重參數和偏差參數需要如何更新,以便優化學習。

17 你對計算圖的理解是什麼

計算圖是一種可視化複雜操作的方法,我們在訓練模型的過程中使用它,作爲各種類型的優化過程的一部分。它是展示我們從非常簡單的變量或對象開始,應用各種變換,然後得到非常複雜函數的好方法。我們使用計算圖的一種方式是可視化神經網絡。

在計算圖中,我們通常有代表對象或變量的節點,然後邊通常代表我們正在應用的操作或轉換的類型。在這種情況下,你可以看到我們有輸入信號 x1、x2、x3,它們只是變量,這些是初始層的節點。然後我們展示我們正在應用的邊緣,這些箭頭進入我們的第一個隱藏層。

在這個隱藏層中,你可以看到我們有每個隱藏單元的z分數,然後我們就有相應的激活。所以z1, a1對應於第一個隱藏層的第一個隱藏單元。然後我們就有了z2、a2,然後是z3、a3,z4、a4,因爲我們有四個不同的隱藏單元作爲單個隱藏層的一部分。然後我們應用另一個變換,當我們從第一個隱藏層到輸出層時。

你可以看到,我們有這些箭頭展示了我們如何從x1、x2、x3輸入數據到z分數,然後我們對z分數應用激活來計算我們的激活分數。然後我們使用這個激活分數從最後一層開始,爲了繼續我們的預測,即y帽子。你可以看到我們正在使用最終輸出層來計算y帽。

我們正在做的事情是爲了可視化首先計算基於xi的z分數的過程,輸入數據乘以權重矩陣w加b的轉置。然後y-hat就等於ai等於sigma zi。我們在這裡所做的是計算z分數,然後在z分數之後我們應用這個西格瑪函數,這是我們得到的激活函數。首先,我們將激活函數應用於 z 分數,然後計算並獲取激活分數。接着,我們使用這個激活分數來計算我們的預測值 yi-hat。一旦我們得到了 yi-hat,我們將其與真實值 yi 進行比較,然後計算損失,即模型產生的誤差量。

你可以看到我們正在採取的步驟。當我們的神經網絡有更多的隱藏層時,不僅僅是一層,而是三層、四層或數十億層,我們最終將很難理解這些不同的步驟,更不用說將其可視化或展示我們有多少層了。每次我們都會使用不同的指數,執行相同的轉換,從輸入數據到 z 分數,然後到激活函數,從激活函數之後我們得到激活分數。

因此,使用計算圖來展示所有這些計算會更簡單。我們不再使用所有這些複雜的變換和矩陣,而是使用計算圖來簡化過程並將其可視化,展示我們如何從輸入變量出發,應用所有這些轉換,然後得到預測。

然而,通過展示故事的另一面,計算圖可能會變得更加複雜。我們首先獲得預測,然後應用反向傳播,然後從反向傳播到實際的梯度計算,然後更新參數。但爲了簡單起見,我想我會用一個簡單的神經網絡來展示這一點。計算圖背後的想法不僅僅是展示前向傳遞,還展示整個網絡,包括反向傳播,即梯度的計算。

18 談談梯度裁剪及其對神經網絡的影響

我們剛剛看到了殘差連接,特別是對於深度神經網絡,特別是像 RNN、LSTM 這樣的情況,當我們具有太多層的順序性質時,我們可能會遇到梯度消失的問題,而殘差連接可以幫助解決這個問題。

現在,梯度裁剪正在解決相反的問題,即梯度爆炸問題。每當我們有某些深度神經網絡,如 RNN、LSTM,我們每次都使用這些變換,並且我們使用累積性質並將所有這些權重相互相乘。通過這個過程,我們正在使用之前的隱藏狀態更新新的隱藏狀態,因此下一個隱藏狀態和下一個隱藏狀態。這也意味着當我們遍歷這些層時,在優化過程中,反向傳播完成後,我們需要執行所有這些轉換。當我們完成前面的幾層時,我們可能會遇到梯度爆炸的問題。

梯度爆炸意味着我們的神經網絡不穩定,這也意味着權重的更新會太大,這將導致神經網絡表現不佳且訓練不當。爲了避免所有這些問題,我們解決梯度爆炸問題的方法是使用梯度裁剪。梯度裁剪的作用是基本上裁剪梯度在一定水平上。所以有一個閾值,這是我們用於梯度裁剪的參數,每當梯度變得太大,高於閾值時,我們就會裁剪該梯度,以確保該梯度不會太大,並且我們不會過度更新權重參數或偏差因素。

通過這種方式,我們正在穩定我們的神經網絡,這對於 LSTM、RNN、GRU 等架構尤其重要,其具有太多層的數據的順序性質。通過這種方式,我們將確保我們不會出現這些不穩定的跳躍,在我們的神經網絡優化過程中,我們最終將得到一個能夠正確學習相互依賴關係的穩定網絡。

19 什麼是交叉熵損失函數

交叉熵,也稱爲對數損失,它衡量分類模型的性能。具有概率輸出的值介於0和1之間。因此,每當你處理分類問題時,例如,你可能想要對圖像進行分類,判斷它是否是貓,或者是狗,或者是房子,而房子又可以進一步分類爲新房子和舊房子。在所有這些情況下,當你擁有這些標籤並且想要模型提供一個概率,即每個觀察到的類別的概率,你就會得到模型的輸出。例如,房子A有50%的概率被分類爲新的,50%的概率被分類爲舊的,或者一張圖片有70%的概率是貓,30%的概率是狗。在處理這類問題時,你可以應用交叉熵作爲損失函數。

交叉熵被測量爲這個負值:y log p 加上 (1 - y) log (1 - p) 的總和,其中y是實際標籤。例如,在二元分類中,這可以是1和0,而p是預測概率。所以在這種情況下,p將是0到1之間的值,而y就是對應的標籤。因此,當你處理貓圖像時,假設標籤爲0;當你處理狗圖像時,假設標籤爲1。這個公式背後的數學解釋超出了這個問題的範圍,所以我不會討論這個細節。但如果你對此感興趣,你可以查看邏輯迴歸模型,這是我在機器學習基礎手冊中的一部分內容。

我們如何從應用對數函數後將乘積求和,這樣我們就得到了對數似然函數,然後我們將它與負號相乘,因爲這是負數。假設我們希望理想地最小化損失函數,則計算似然函數。這與似然函數相反。在這種情況下,這表明我們最終會得到一個值,這表明模型在分類方面的表現如何。因此,交叉熵將告訴我們模型在將觀察結果分類到某個類別方面是否做得很好。

20 爲什麼交叉熵優先作爲多類分類問題的代價函數

當我們處理多類分類時,我們可以應用什麼樣的損失函數呢?在處理多類分類時,我們可以使用多類交叉熵,這通常被稱爲softmax函數。softmax損失函數是衡量模型性能的好方法,尤其是當你想要將觀察結果分類爲多個類別之一時。這意味着我們不再處理二元分類,而是處理多類分類。例如,當我們想要將圖像分類爲夏季主題,春季主題,或冬季主題時。鑑於我們有三個不同的可能類別,我們需要有一種適當的方法來衡量執行此分類的模型的性能,而softmax正是這樣做的。

因此,我們不會將配對觀測值設置爲不同的值,這會說明該觀測值屬於第一類或第二類的概率是多少,而是我們將擁有一個更大的向量,取決於你將要處理的類別數量。在這個具體示例中,我們最終將得到三個不同的值,因此一個向量具有三個不同的條目,說明這張圖片來自冬季主題的概率是多少,來自夏季主題的概率是多少,以及來自春季主題的概率是多少。然後我們將得到具有相應概率的所有類別。在交叉熵的情況下,當我們的softmax值很小時,這意味着該模型在將觀察結果分類爲不同類別方面表現出色,我們得到的類別分離度也很好。

需要記住的一點是,當我們比較交叉熵和多類交叉熵或softmax時,這些都是在我們有超過兩個類別的情況下使用的。您可能還記得在論文“Attention is All You Need”中介紹的Transformer模型,其中作爲Transformer架構的一部分,還應用了softmax層,作爲多類分類的一部分。因此,當我們計算激活分數時,最後,當我們想要將我們的輸出轉換爲一個有意義的值並測量Transformer的性能時,我們會使用這些方法。

21 什麼是隨機梯度下降(SGD)?爲什麼我們要用它來訓練神經網絡?

SGD,就像梯度下降(GD)一樣,是深度學習中使用的一種優化算法,其目的是優化深度學習模型的性能,並找到一組可以最小化損失函數的模型參數。通過迭代改進模型的參數,包括權重參數和偏差參數。SGD的執行方式是通過使用隨機選擇的單個或幾個訓練觀察值來更新模型參數。這與GD不同,GD在一次迭代中使用了整個訓練數據來更新模型參數,而SGD僅使用單個或幾個隨機選擇的訓練觀察來執行更新。

這基本上意味着,SGD在每次訓練觀察中進行模型參數的更新,而不是使用整個訓練數據進行每次更新。這個隨機成分在算法中也很重要,因此該算法中的隨機元素也被稱爲隨機梯度下降。因爲SGD是從訓練觀察中隨機採樣單個或幾個訓練數據點,然後使用它來執行前向傳遞。它計算z分數,然後在應用激活函數後計算激活分數,然後到達前向傳播和網絡的末端,計算輸出,即y帽,然後計算損失。然後我們僅對這幾個數據點執行反向傳播。

在SGD中,考慮到我們正在使用僅隨機選擇的幾個數據點或單個數據點,而不是實際的梯度,我們正在估計這些真實梯度,因爲真實梯度基於整個訓練數據。對於此優化,我們僅使用很少的數據點。這意味着作爲反向傳播的一部分,我們對這些梯度的估計不完美,這意味着梯度將包含這種噪聲。

這樣做的結果是我們使優化過程更加高效,因爲我們僅使用幾個數據點就可以基於傳遞非常快速地更新這些參數。僅在幾個數據點上訓練神經網絡要快得多,並且比使用整個訓練數據進行一次更新更容易。但這是以犧牲SGD的質量爲代價的,因爲當我們只使用幾個數據點來訓練模型,然後計算梯度,這是真實梯度的估計,那麼這些梯度將會非常嘈雜。他們將是不完美的,並且很可能遠離實際梯度,這也意味着我們將對模型參數進行不太準確的更新。

這意味着每次優化算法試圖找到全局最優值並在每次迭代中進行這些移動時,向最佳狀態更近一步,大多數時候,它最終會做出錯誤的決定,並且會選擇錯誤的方向,因爲梯度是它需要採取的方向選擇的來源。每次它都會產生這些振盪,這會非常不穩定,大多數時候它最終會發現局部最優而不是全局最優,因爲每次它只使用訓練數據的一小部分,它正在估計梯度,這些都是有噪音的,這意味着它所採取的方向很可能也是錯誤的。當你每次都做出錯誤的方向和錯誤的舉動時,你會開始搖擺不定。這正是SGD正在做的事情。在討論優化方向時,該算法可能會做出錯誤的決策選擇,最終找到的是局部最優而非全局最優。因此,隨機梯度下降(SGD)有時被認爲是一個不佳的優化器。然而,它在收斂時間上表現出色,且在內存使用上也相當有效,因爲存儲模型基於非常小的數據,並將這些小數據存儲在內存中,計算量並不大。然而,這是以優化器的質量爲代價的。在接下來的討論中,我們將學習如何調整 SGD 算法以提高優化技術的質量。

22 爲什麼隨機梯度下降(即 SGD)會向局部最小值振盪?

造成這種振盪的原因有幾個。首先,我們需要明確什麼是振盪。振盪是我們在尋找全局最優值時所發生的運動。當我們嘗試使用 GD、SGD、RMSProp、Adam 等優化方法來優化算法時,我們正在嘗試最小化損失函數。理想情況下,我們希望迭代地改變我們的模型參數,以便我們最終得到一組參數,從而得到損失函數的全局最小值,而不僅僅是局部最小值。局部最小值可能看起來像是損失函數的最小值,但它僅適用於特定區域。而全局最優值實際上是損失函數的平均值,即實際最小值。這正是我們正在努力追逐的。

當我們有太多的振盪(即過多的運動)時,這可能會成爲問題,因爲我們每次都會做太多的動作。如果我們做出相反的動作或者方向錯誤,那麼這最終將導致發現局部最優而不是全局最優。這正是我們試圖避免的。與 GD 相比,SGD 中的振盪發生得更頻繁。因爲在 GD 的情況下,我們使用整個訓練數據來計算梯度,需要計算損失函數相對於模型參數的偏導數。而在 SGD 的情況下,我們瞭解到我們僅使用隨機採樣的單個或幾個訓練數據點來更新梯度並使用這些梯度來更新模型參數。這會導致出現過多的振盪,因爲我們使用的隨機子集比訓練數據小得多,它們不包含訓練數據中的所有信息。這意味着我們正在計算的梯度在每個步驟中,當我們使用完全不同且非常小的數據時,可能會有很大差異。這種巨大的差異,這種方向上的變化可能會導致這些振盪過於頻繁。

在 SGD 中,導致過多振盪的第二個原因是步長。步長,或者說學習率,可以定義我們需要更新多少權重或偏置參數。而這個更新的幅度是由這個學習率決定的,然後它也發揮了作用,決定了這些運動會有多大的不同以及在我們觀察振盪時,會出現多大的跳躍。

第三個原因是 SGD 會遭受太多的振盪,這是一件壞事,因爲這會導致太多次找到局部最優而不是全局最優,這是由於不完美的估計。當我們計算損失函數相對於權重參數或偏差因子的梯度時,如果這是在訓練數據的小樣本上完成的,那麼梯度就會有噪音。然而,如果我們使用包含有關特徵之間關係的所有信息並且僅在數據中一般性的整個訓練數據,那麼梯度的噪聲就會少得多。他們的預測將會更加精確。我們正在使用基於小數據集的梯度作爲實際梯度的估計,這是基於整個訓練數據的。這種做法會引入噪聲,因此在估計真實梯度時會存在缺陷。這種缺陷可能會導致更新並不總是直接指向全局最優值,從而導致隨機梯度下降(SGD)出現振盪。在更高的層面上,我認爲SGD出現過多振盪的原因有三個:第一個是隨機子集,第二個是步長,第三個是梯度的不完美估計。

23 梯度下降(GD)與隨機梯度下降(SGD)有何不同?

到目前爲止,我們已經詳細討論了SGD,我將從更高的層次總結兩者的差異。對於這個問題,我將利用四個不同因素來解釋GD和SGD之間的差異:第一個是數據使用情況,第二個是更新頻率,第三個是計算效率,第四個是收斂模式。讓我們一一探討這些因素。

梯度下降在訓練模型和計算梯度時使用整個訓練數據,並將該梯度用作反向傳播過程的一部分來更新模型參數。然而,SGD與GD不同,它在執行訓練過程和更新模型參數時並不一次性使用整個訓練數據。相反,SGD僅使用隨機採樣的單個或兩個訓練數據點來執行訓練,以及使用基於這兩點的梯度來更新模型參數。這就是SGD與GD在數據使用量和數據使用方式上的區別。

第二個區別是更新頻率。考慮到GD每次都會根據整個訓練數據來更新模型參數,與SGD相比,它的更新要少得多。因爲SGD每次都會頻繁地對單個數據點或兩個訓練數據點進行模型參數的更新。與GD不同,GD必須使用整個訓練數據來進行一組更新。這會導致SGD在使用非常小的數據時更頻繁地進行更新,這就是更新頻率方面的差異。

另一個區別是計算效率。GD的計算效率低於SGD,因爲GD必須使用整個訓練數據進行計算或反向傳播,然後根據整個訓練數據更新模型參數。這可能會導致計算量很大,尤其是在處理非常大的數據以及非常複雜的數據時。與GD不同,SGD效率更高且速度非常快,因爲它使用非常少量的數據來執行更新。這意味着它需要較少的內存來對使用小數據的數據進行排序,然後花費的時間就會少得多找到全局最優值,或者至少它認爲它找到了全局最優值。因此,與GD相比,SGD的收斂速度要快得多,這使得它比GD更有效率。

最後一個我要在這個問題中提到的因素是收斂模式。衆所周知,GD的收斂過程比較平滑,作爲優化算法,其質量比SGD更高。SGD是一個效率高但質量較差的優化器,其原因是SGD的效率是以犧牲其質量爲代價的,尋找全局最優值。SGD會產生大量的振盪,因爲在估計真實梯度時它只使用了訓練數據的一小部分。與SGD不同,GD使用整個訓練數據,因此不需要估計梯度。它能夠確定精確的梯度,這會在SGD的情況下導致大量振盪。對於梯度下降(GD),我們並不需要進行所有的振盪。因此,算法所做的運動量要小得多。這就是爲什麼隨機梯度下降(SGD)找到全局最優值所需的時間要少得多。然而,不幸的是,大多數時候,SGD會將全局最優值與局部最優值混淆。因此,SGD經過多次迭代後,最終可能只找到局部最優,並將其誤認爲全局最優,這顯然是我們不希望看到的。

我們的目標是找到真正的全局最優值,因此,我們需要最小化並找到使損失函數最小的參數集。這與SGD的做法恰恰相反,因爲SGD使用的是真實梯度,大多數時候,它能夠識別出真正的全局最優值。

24 如何改進梯度下降等優化方法?動量項的作用是什麼?

每當你聽到“動量”和“GD”這兩個詞,你應該自動將注意力轉向帶有動量的SGD,因爲帶有動量的SGD基本上是SGD的改進版本。如果你理解了SGD和GD之間的區別,你就能更容易地解釋什麼是帶有動量的SGD。

我們剛剛討論了GD受到振盪影響的問題,這種過多的運動會導致我們使用少量的訓練數據來估計真實的梯度,從而導致具有完全不同的梯度的權重中有太多不同類型的更新。這是我們想要避免的,因爲我們已經看到並解釋了過多的這些運動最終會導致優化算法錯誤地混淆全局最優和局部最優。因此,它會選擇局部最優,誤認爲這是全局最優,但事實並非如此。

爲了解決這個問題,我們提出了帶有動量的SGD算法。帶有動量的SGD算法利用了SGD的優點,並嘗試解決SGD的最大缺點,即過多的振盪。帶有動量的SGD引入了動量的概念,利用這種動量來尋找優化算法並將其推向更好的方向,從而減少振盪。

動量的作用是嘗試添加我們之前對模型參數進行的更新的一小部分,然後我們假設這將很好地指示該特定時間步長中更準確的方向。假設我們處於時間步t,並且我們需要進行更新,那麼動量的作用就是查看之前的所有更新,並更頻繁地使用最近的更新。與非常舊的更新相比,最近的更新很可能會更好地代表我們需要採取的方向。這在優化過程中更新模型參數時,當我們考慮到這些是最近的情況時,我們就可以有更好、更準確的方法。

帶有動量的SGD試圖加速這個轉換過程,並且不是有太多朝向不同方向的運動,也不是有兩個不同的經常梯度和更新,而是試圖穩定這個過程,並且有更多的持續更新。在這裡你可以看到,作爲動量的一部分,我們獲得了這個動量項,它等於vt加一,用於時間步長t加一的更新。它的作用是需要這個伽瑪乘以vt,加上學習率eta,然後是梯度。你可以看到這個膨脹的三角形,然後在theta下方,然後j theta t只是表示損失函數相對於參數theta的梯度。它基本上所做的是它說我們正在計算這個動量項,t的時間步長加一,基於之前的更新。通過將 gamma 乘以 VT 並加上我們之前看到的隨機梯度下降(SGD)的常用術語,對於梯度下降(GD)來說,基本操作是使用 eta 學習率乘以損失函數相對於參數 theta 的一階偏導數。因此,我們使用這個動量項簡單地從我們的當前參數 theta t 獲取新版本,更新版本爲 theta t 加一,其中 theta 只是模型參數。

通過這種方式,我們正在做的是,以更一致的方式執行更多的更新,從而在方向中引入一致性。通過更重視近期的調整,我們增強了動量,因此稱爲動量。動量增加了朝這個方向的速度,使得在更一致的梯度中找到全局最優值,增強了向全局最優的運動,從而使損失函數達到全局最小值。這當然會提高優化算法的質量,我們最終會發現全局最優而不是局部最優。

總結一下,帶有動量的 SGD 的作用是,它基本上採用 SGD 算法,因此在執行模型參數更新時再次使用少量訓練數據。但與 SGD 不同,帶動量的 SGD 的作用是,在尋找實際的全局最優值時,它試圖複製 GD 的質量,而它的實現方式是引入動量項。這還有助於引入更新的一致性並減少算法產生的振盪,通過更平滑的路徑來發現損失函數的實際全局最優值。

25 比較批量梯度下降和小批量梯度下降,以及隨機梯度下降

這裡我們有梯度下降算法的三個不同版本:傳統的批量梯度下降(通常簡稱爲 GD)、小批量梯度下降和 SGD 或隨機梯度下降。這三種算法彼此非常接近,它們在執行每個模型訓練和模型參數更新時的效率和使用的數據量方面確實有所不同。

批量梯度下降是原始的 GD,該方法涉及使用整個訓練數據的傳統方法。對於計算梯度時的每次迭代,進行反向傳播,然後將這些梯度作爲優化算法的輸入,以對這些模型參數執行單次更新。然後再次使用整個訓練數據進行下一次迭代,計算梯度並更新模型參數。在批量梯度下降中,我們不是在估計兩個梯度,而是實際上在計算梯度,因爲我們擁有完整的訓練數據。由於使用整個訓練數據的這種質量,批量梯度下降具有非常高的質量,因此非常穩定,能夠識別實際的全局最優值。然而,這是以效率爲代價的,因爲批量梯度下降使用每次都需要將整個訓練數據放入內存中的整個訓練數據,並且在執行優化時非常慢,特別是在處理大型和複雜的數據集時。

接下來我們有批量梯度下降的另一個極端,即 SGD。SGD 與 GD 不同,我們之前在討論 SGD 隨機使用的先前面試問題時看到了這一點,因此隨機採樣單個或少數訓練觀察結果,爲了執行訓練,計算執行反向傳播的梯度,然後使用優化來更新每次迭代中的模型參數。這意味着我們實際上並不計算實際的梯度,但我們實際上正在估計真實的梯度,因爲我們只使用了訓練數據的一小部分。這當然是以算法質量爲代價的,儘管僅使用小樣本是有效的,從進行反向傳播時的訓練數據中我們不需要存儲訓練,將整個訓練數據放入內存中,但只是其中的一小部分,我們快速執行模型更新,然後我們更快地找到所謂的最佳值。但這是以算法質量爲代價的,因爲這樣它就會開始產生太多的振盪。由於噪聲梯度的存在,全局最優值和局部最優值往往會被混淆。這引出了我們的第三種優化算法,即小批量梯度下降。小批量梯度下降基本上是批量梯度下降和原始隨機梯度下降(SGD)之間的一種折衷方案。小批量梯度下降的工作方式是試圖在傳統的梯度下降(GD)和SGD之間取得平衡。

小批量梯度下降試圖利用SGD在效率方面的優勢,並將其與GD在更新的穩定性和一致性以及尋找實際全局最優方面的優勢結合起來。它的實現方式是將訓練觀察結果隨機抽樣到批次中,其中批次比SGD大得多,然後使用這些較小部分的訓練數據在每次迭代中進行反向傳播,然後更新模型參數。因此,當我們將訓練數據採樣到這k個不同的摺疊(在本例中是批次)時,可以將其視爲k折交叉驗證,然後我們使用它來訓練模型,然後在神經網絡的情況下使用小批量梯度下降更新模型參數,例如權重和偏差向量。

雖然這三種方法有很多相似之處,但也有不同之處。在這個面試問題中,面試官試圖測試你是否理解這三種方法的優點以及小批量梯度下降的目的。

26 如何在考慮小尺寸和大尺寸的情況下決定深度學習中的批量大小

這個問題是一個非常重要的問題,面試官試圖測試你是否理解批量大小的影響,以及它如何影響整個算法的質量。

在這裡,你的面試官想知道你對批量大小對梯度噪聲、模型的偏差、模型的方差、模型的泛化、模型的收斂性、效率,尤其是內存使用情況的理解。我們已經討論並比較了傳統批量梯度下降、小批量梯度下降和SGD。我們已經談到了...