上一周我們學習了 邏輯回歸,并使用它解決了簡單的 0/1 分類問題。這周我們首先嘗試使用 邏輯回歸 來解決 多分類問題( 手寫字符識別 )。通過這個問題了解到,當我們需要解決特征量很大的非線性分類問題時( 比如計算機視覺問題 ),我們原本假設高次特征的方法會使得特征數異常龐大,從而引出新的方法 神經網絡。
為了更好的閱讀體驗你可以在 網站 中查看,點擊 課程視頻 你就能不間斷地學習 Ng 的課程,關于課程作業的 Python 代碼已經放到了 Github 上,點擊 課程代碼 就能去 Github 查看,代碼中的錯誤和改進歡迎大家指出。
以下是 Ng 機器學習課程第三周的筆記。
多分類問題
之前我們已經使用 邏輯回歸 解決了 0/1 分類問題,這次的新問題是手寫字符識別。有一個手寫字符的圖片集合,每張圖片都是一個 0 ~ 9 之間的手寫數字,對于每張手寫字符圖片,我們要輸出它是什么數字。( 下圖是隨機選取的 100 張圖片 )
對于這個問題,我們的解決方法是訓練 10 個 0/1 分類器,分別判斷圖片屬于這個分類的概率( 邏輯回歸 的輸出 ),然后從這 10 個結果中選取最大的作為結果。對于作業中的數據( 數據集 與 訓練集相同 ),這個分類器可以達到 95% 的正確率。要想再提升準確率我們就需要將特征映射到更高次,比如之前作業中的 6 次。這樣的話,就會有多達 342505341313200 個特征。所以要更好地解決這類問題,我們需要引入新的方法。
神經網絡
神經網絡是一種很古老的算法,這個算法誕生的目的是為了模擬大腦的算法從而建造智能機器。這個想法產生的原因是神經科學的研究表明大腦并非對不同的信號采取不同的處理方式( 不同的算法 ),而是使用同一種來應對不同的信號( 視覺、聽覺等 )。這極大地激發了研究人員對尋找這種算法的熱情,雖然期間由于各種技術問題( 沒有有效的訓練算法和硬件速度限制 )消聲覓跡了一段時間,但最終憑借 反向傳播、共享權值、GPU加速 等技術重現光輝。并成為現代機器學習技術中最有效的方法之一。
數學表示
我們把單個 神經元 抽象為一個 邏輯單元 ,x0、x1、x2、x3 為 樹突 傳入的信號( x0 為偏置,圖中沒有畫出 ),激活 神經元 后從 軸突 輸出 hθ(x)。
邏輯單元 可以使用數學符號表示為如下形式:
單個 神經元 的能力非常有限,而 神經網絡 強大的地方在于將這些 神經元 連接在一起共同工作( 類似于大腦中神經元的工作方式 ),所以我們來看一下 神經網絡 是如何表示的。
上圖是含有一層 隱含層 的神經網絡,輸入單元 x0、x1、x2、x3 將值傳給 隱含層( 每個輸入單元傳入的 權值 是不同的 )。然后 隱含層 將輸出值再傳給輸出層的 神經元。用數學語言表達就是:
式中 g(z) 為 激活函數,也就是 邏輯回歸 中提到的 Sigmoid 函數。a02=1 為偏置。hΘ(x) 由于輸出層只有一個元素,為了美觀沒有寫為矩陣形式。圖中輸出層只有一個 邏輯單元,但實際可以有多個。
表達能力
監督學習 的目的就是為了使用算法獲得問題的 預測函數,所以一個 預測函數 能夠表達的函數越多,應用就能夠更廣泛。那么 神經網絡 的表達能力如何呢?Andrew Ng 在課程中展示了如何使用 邏輯單元 來組成數字電路中的 邏輯門。而我們又知道 邏輯門 是計算機計算的基礎,它們的組合可以表達一切可以計算的函數,所以從某種直覺上來說 神經網絡 能夠表達的東西是非常多的。
這里我強烈推薦看 神經網絡可以擬合任意函數的視覺證明( sorry~,第四章有互動,沒能找到好的翻譯 ),在文章中你可以調整各種參數,互動地感受 神經網絡 的表達能力。
手寫字符識別
本周課程最后回到我們的 多分類問題 問題,我們構造一個 神經網絡 來完成手寫字符識別的任務。網絡的輸入為 20x20 的圖片,所以輸入層有 401 個單元。我們需要歸類 0 ~ 9 的 10 個數字,所以輸出層有 10 個單元,第 i 個單元表示圖片為 i mod 10 的概率( 偏置不在圖中繪出 )。
作業中給出的隱含層為 26 個單元,并且已經給出了層與層之前的權值矩陣,我們通過 神經網絡 的數學表達來計算它的輸出。最后我們得到的識別準確率為 97%??吹?神經網絡 正確地給圖片做出分類還真是覺得神奇。
在下次的課程中我們會學習如何訓練我們的 神經網絡,給出它的 代價函數,并使用 反向傳播 算法來計算梯度。
So~,第三周的內容就是這些了,謝謝大家耐心閱讀。