【微軟出品】AI-神經網路基本原理簡明教程

視學演算法發表於2020-04-06

來自 | 專知

【導讀】我們現在有了很多非常厲害的深度學習框架,比如Tensorflow,CNTK,PaddlePaddle,Caffe2等等。然而,這些為了解決實際的應用問題而生的,而不是用來學習“深度學習”知識和思想的。所以微軟Xiaowuhu根據自己親身經歷的學習軌跡,歸納出了以下教程,可以幫助小白做到真正的從入門到精通。通過以下循序漸進地學習與動手實踐,一方面可以幫助讀者深刻理解“深度學習”的基礎知識,更好地理解並使用現有框架,另一方面可以助力讀者快速學習最新出現的各種神經網路的擴充套件或者變型,跟上快速發展的AI浪潮。

640?wx_fmt=png

地址:

https://github.com/microsoft/ai-edu/tree/master/

寫在前面,為什麼要出這個系列的教程呢?

總的說來,我們現在有了很多非常厲害的深度學習框架,比如Tensorflow,CNTK,PaddlePaddle,Caffe2等等。然而,我們用這些框架在搭建我們自己的深度學習模型的時候,到底做了一些什麼樣的操作呢?我們試圖去閱讀框架的原始碼來理解框架到底幫助我們做了些什麼,但是……很難!很難!很難!因為深度學習是需要加速啦,分散式計算啦,框架做了很多很多的優化,也讓像我們這樣的小白難以理解這些框架的原始碼。

這取決於你是想真正地掌握“深度學習”的思想,還是隻想成為一個調參師?在我們看來,如TensorFlow,CNTK這些偉大的深度學習工具,是為了解決實際的應用問題而生的,而不是用來學習“深度學習”知識和思想的。所以我們根據自己親身經歷的學習軌跡,歸納出了以下教程,可以幫助小白做到真正的從入門到精通。

通過以下循序漸進地學習與動手實踐,一方面可以幫助讀者深刻理解“深度學習”的基礎知識,更好地理解並使用現有框架,另一方面可以助力讀者快速學習最新出現的各種神經網路的擴充套件或者變型,跟上快速發展的AI浪潮。

對於這份教程的內容,如果沒有額外的說明,我們通常使用如下表格的命名約定:

符號含義
X輸入樣本
Y輸入樣本的標籤
Z線性運算的結果
A啟用函式/結果
W權重矩陣
B偏移矩陣
J損失函式
大寫字母矩陣或向量,如A,W,B
小寫字母變數,標量,如a,w,b
x1,2第1個樣本的第2個特徵值
wL2,3第L層第2個神經元對第L-1層第3個神經元的權重值
矩陣的行一批樣本的某一個特徵值的集合
矩陣的列一批樣本的某一個樣本的所有特徵值

適用範圍

沒有各種基礎想學習卻無從下手哀聲嘆氣的玩家,請按時跟蹤最新部落格,推導數學公式,跑通程式碼,並及時提出問題,以求最高療效;

深度學習小白,有直觀的人工智慧的認識,強烈的學習慾望和需求,請在部落格的基礎上配合程式碼食用,效果更佳;

調參師,訓練過模型,調過引數,想了解框架內各層運算過程,給玄學的調參之路新增一點心理保障;

超級高手,提出您寶貴的意見,給廣大初學者指出一條明路!

前期準備

環境:

  • Windows 10 version 1809

  • Visual Studio 2017 Community or above

  • Python 3.6.6

  • Jupyter Notebook (可選)

自己:

清醒的頭腦(困了的同學請自覺泡茶),紙和筆(如果想跟著推公式的話),鬧鐘(防止久坐按時起來轉轉),厚厚的衣服(有暖氣的同學請忽略)

網路結構概覽

網路結構名稱網路結構圖應用領域
單入
單出
一層

640?wx_fmt=png

一元線性迴歸
多入
單出
一層

640?wx_fmt=png

多元線性迴歸
多入
單出
一層

640?wx_fmt=png

線性二分類
多入
多出
一層

640?wx_fmt=png

線性多分類
單入
單出
兩層

640?wx_fmt=png

一元非線性迴歸/擬合
可以擬合任意複雜函式
多入
單出
兩層

640?wx_fmt=png

非線性二分類
多入
多出
兩層

640?wx_fmt=png

非線性多分類
多入
多出
三層

640?wx_fmt=png

非線性多分類

目錄

1. 基本概念

首先會講解一下神經網路基本的訓練和工作原理,因為基本上各種教程裡都沒有提到這一點,以至於筆者在剛開始學習神經網路時一頭霧水,不得要領,不知從何處開始下手。

後面接的是導數公式和反向傳播公式,包括矩陣求導,這一部分可以大概瀏覽一下,主要的目的是備查,在自己推導反向公式時可以參考。

然後是反向傳播和梯度下降,我們先從簡單的線性方式說起(只有加法和乘法),而且用代入數值的方式來消除對公式的恐懼心理。然後會說到分層的複雜(非線性)函式的反向傳播,同樣用數值代入方式手推反向過程。

梯度下降是神經網路的基本學習方法,我們會用單變數和雙變數兩種方式說明,配以視覺化的圖解。再多的變數就無法用視覺化方式來解釋了,所以我們力求用簡單的方式理解複雜的事物。

本部分最後是損失函式的講解,著重說明了神經網路中目前最常用的均方差損失函式(用於迴歸)和交叉熵損失函式(用於分類)。

640?wx_fmt=png

2. 線性迴歸

用線性迴歸作為學習神經網路的起點,是一個非常好的選擇,因為線性迴歸問題本身比較容易理解,在它的基礎上,逐步的增加一些新的知識點,會形成一條比較平緩的學習曲線,或者說是邁向神經網路的第一個小臺階。

單層的神經網路,其實就是一個神經元,可以完成一些線性的工作,比如擬合一條直線,這用一個神經元就可以實現。當這個神經元只接收一個輸入時,就是單變數線性迴歸,可以在二維平面上用視覺化方法理解。當接收多個變數輸入時,叫做多變數線性迴歸,此時視覺化方法理解就比較困難了,通常我們會用變數兩兩組對的方式來表現。

當變數多於一個時,兩個變數的量綱和數值有可能差別很大,這種情況下,我們通常需要對樣本特徵資料做歸一化,然後把資料餵給神經網路進行訓練,否則會出現“消化不良”的情況。

3. 線性分類

分類問題在很多資料中都稱之為邏輯迴歸,Logistic Regression,其原因是使用了線性迴歸中的線性模型,加上一個Logistic二分類函式,共同構造了一個分類器。我們在本書中統稱之為分類。

神經網路的一個重要功能就是分類,現實世界中的分類任務複雜多樣,但萬變不離其宗,我們都可以用同一種模式的神經網路來處理。

本部分中,我們從最簡單的線性二分類開始學習,包括其原理,實現,訓練過程,推理過程等等,並且以視覺化的方式來幫助大家更好地理解這些過程。

在第二步中,我們學習了實現邏輯非門,在本部分中,我們將利用學到的二分類知識,實現邏輯與門、與非門,或門,或非門。

做二分類時,我們一般用Sigmoid函式做分類函式,那麼和Sigmoid函式長得特別像的雙曲正切函式能不能做分類函式呢?我們將會探索這件事情,從而對分類函式、損失函式、樣本標籤有更深的理解。

然後我們將進入線性多分類的學習。多分類時,可以一對一、一對多、多對多,那麼神經網路使用的是哪種方式呢?

Softmax函式是多分類問題的分類函式,通過對它的分析,我們學習多分類的原理、實現、以及視覺化結果,從而理解神經網路的工作方式。

640?wx_fmt=png

4. 非線性迴歸

從這一步開始,我們進入了兩層神經網路的學習,從而解決非線性問題。

在兩層神經網路之間,必須有啟用函式連線,從而加入非線性因素,提高神經網路的能力。所以,我們先從啟用函式學起,一類是擠壓型的啟用函式,常用於簡單網路的學習;另一類是半線性的啟用函式,常用於深度網路的學習。

接下來我們將驗證著名的萬能近似定理,建立一個雙層的神經網路,來擬合一個比較複雜的函式。

在上面的雙層神經網路中,已經出現了很多的超參,都會影響到神經網路的訓練結果。所以在完成了基本的擬合任務之後,我們將會嘗試著除錯這些引數,得到更好的訓練效果(又快又好),從而得到超參除錯的第一手經驗。

640?wx_fmt=png

5. 非線性分類

我們在第三步中學習了線性分類,在本部分中,我們將學習更復雜的分類問題,比如,在很多年前,兩位著名的學者證明了感知機無法解決邏輯中的異或問題,從而使感知機這個研究領域陷入了長期的停滯。我們將會在使用雙層網路解決異或問題。

異或問題是個簡單的二分類問題,因為畢竟只有4個樣本資料,我們會用更復雜的資料樣本來學習非線性多分類問題,並理解其工作原理。

然後我們將會用一個稍微複雜些的二分類例子,來說明在二維平面上,神經網路是通過怎樣的神奇的線性變換加啟用函式預算,把線性不可分的問題轉化為線性可分問題的。

解決完二分類問題,我們將學習如何解決更復雜的三分類問題,由於樣本的複雜性,必須在隱層使用多個神經元才能完成分類任務。

最後我們將搭建一個三層神經網路,來解決MNIST手寫數字識別問題,並學習使用梯度檢查來幫助我們測試反向傳播程式碼的正確性。

資料集的使用,是深度學習的一個基本技能,開發集、驗證集、測試集,合理地使用才能得到理想的泛化能力強的模型。

6. 模型推理與部署

我們已經用神經網路訓練出來了一套權重矩陣,但是這個模型如何使用呢?我們總不能在實際生產環境中使用python程式碼來做推理吧?更何況在手機中也是不能執行Python程式碼的。

這就引出了模型的概念。一個模型會記錄神經網路的計算圖,並載入權重矩陣,而這些模型會用C++等程式碼來實現,以保證部署的便利。

我們將會學習到在Windows上使用ONNX模型的方法,然後是在Android上的模型部署方法。而在iOS裝置上的模型,與Android的原理相同,有需要的話可以自己找資料學習。我們也許會考慮以後增加這部分內容。

7. 深度神經網路

在前面的幾步中,我們用簡單的案例,逐步學習了眾多的知識,使得我們可以更輕鬆地接觸深度學習。

從這一部分開始,探討深度學習的一些細節,如權重矩陣初始化、梯度下降優化演算法、批量歸一化等高階知識。

由於深度網路的學習能力強的特點,會造成網路對樣本資料過分擬合,從而造成泛化能力不足,因為我們需要一些手段來改善網路的泛化能力。

8. 卷積神經網路

卷積神經網路是深度學習中的一個里程碑式的技術,有了這個技術,才會讓計算機有能力理解圖片和視訊資訊,才會有計算機視覺的眾多應用。

在本部分的學習中,我們將會逐步介紹卷積的前向計算、卷積的反向傳播、池化的前向計算與反向傳播,然後用程式碼實現一個卷積網路並訓練一些實際資料。

在後面我們還會介紹一些經典的卷積模型,向大師們學習一些解決問題的方法論問題。

- END -
如果看到這裡,說明你喜歡這篇文章,請轉發、點贊。微信搜尋「perfect_iscas」,關注後回覆「進群」或者掃描下方二維碼即可進入無廣告技術交流群。
掃描二維碼進群↓

640?wx_fmt=jpeg

640

640?wx_fmt=gif

在看 640?wx_fmt=jpeg

相關文章