機器學習
人工智能,是使計算機具有智能的根本途徑,其應用遍及人工智能的各個領域,它主要使用歸納、綜合而不是演繹,而機器學習是人工智能的核心。
“機器學習是一門人工智能的科學,該領域的主要研究對象是人工智能,特別是如何在經驗學習中改善具體算法的性能
01 機器學習分類
- 傳統機器學習
- 機器學習可以理解成是生產算法的算法。需要人來先做特征提取,然后在把特征向量化后交給機器去訓練。
- 傳統機器學習分為 監督學習 和 無監督學習。
- 深度學習
- 深度學習是基于深度神經網絡的學習(DNN)。深度學習可以自動提取特征。深度學習可以采用 End-to-End 的學習方式,只需要進行很少的歸一化和白化,就可以將數據交給模型去訓練。
02 機器學習中的一些概念
首先我們需要了解幾個機器學習中的起碼要知道是怎么回事的概念,了解了后面看代碼才不會一臉懵逼。
- 訓練樣本
- 就是用于訓練的數據。包括了現實中的一些信息數據,以及對應的結果,也就是標簽。
- 訓練
- 對訓練樣本的特征進行統計和歸納的過程。
- 分類模型
- 總結出的特征,判斷標準。
- 驗證
- 用測試數據集驗證模型是否正確的過程。這個過程是在模型訓練完后進行的,就是再用另外一些樣本數據,代入到模型中去,看它的準確率如何。
2.1 聚類
聚類 是一種典型的 無監督學習 ,是把數據進行分類的過程。進行聚類的基本思想是,利用向量之間的距離 —— 空間中的歐式距離或曼哈頓距離 , 根據距離的大小判斷對象是否應該歸為同一類別。

上圖是對3個一維向量分類的例子。明顯的能看到,離得近的兩個們可以近似的認為它們屬于同一類別。
2.2 回歸
回歸簡單的說就是一個 由果索因 的過程。這是機器學習中很常用的一個手段。
回歸分為:
1. 線性回歸
2. 非線性回歸
實際使用那種回歸模型,需要根據情況而定。
2.2.1 線性回歸
線性回歸模型:

其中 w 是一個特征張量,儲存著與每個變量x中元素對應的特征元素,x 就是輸入的訓練數據張量,b 是一個偏置量。
這其實就是高中概率與統計章節中常見的一個公式。就像解那時候的應用題一樣,我們需要根據一堆 (x,y)求解一個合適的 w 和 b。

看看上面這個應用題,是否想起了高中時代的數學課?
2.2.2 損失Loss函數
損失函數是用來評估模型預測結果和真實情況差距的,差距越小,說明我們的模型越好,越準確。這就是損失函數的公式!

當我們假設一個w和b后,循環計算每一個 x 所得的值和真實 x 所對應的值相減,然后將每一個差相加求和,得到一個差值之和,就是當前的損失。
損失越小,說明所尋找到的 w 和 b 就越合適,當 Loss 為 0 時,說明此時模型的準確率為 100% 。
事實上,這和高中概率與統計應用題,給你一堆 x,y ,然后求一個 系數w 和 常量b 出來是一樣的一樣的。只不過在計算機中,由于算力比手算強大太多了,所以我們可以一遍一遍的調整 w 和 b 這兩個參數,使 Loss 一直向趨于 0 的方向移動 ,從而使模型的準確率趨于 100% 。
通常,為了使 Loss 始終保持為正 ,也會有如下損失函數:

求平方使得結果橫為正數。
比如這個函數的圖像可能是一個三維的碗,那么我們的任務就是找到碗底的位置,也就是極值,因為在該點有解,即損失最小。

2.2.3 梯度下降法尋找最優解
對于復雜函數,我們要直接求解是巨困難的,甚至有時可以說是處于不可解的狀態。我們需要尋找損失函數的極值,可以使用牛頓迭代法的思想進行迭代尋找。
那對于復雜函數是不是就只能束手無策了呢?在你了解 牛頓迭代法 之后就可以回到不是了,而此前對于這個問題也許只能回答不能了。

通過迭代,我們可以逐步的逼近索要尋找的極值。
這里,我們還人為的引入了一個 η 參數,這個參數用于調整步長。步子邁大了可能會越過極值,邁小了有會產生很大的計算量,具體取多大合適,還是要多看看老司機們燙過的坑。
普通的梯度下降法(批梯度下降法,BGD),需要遍歷所有的數據樣本,在樣本量不大的時候還是可以的,畢竟這么干精度起碼是很高的。但是如果樣本容量巨大,那每次遍歷所有樣本,必然都會消耗很多時間成本。并且如果我們的損失函數不是一個凸函數誤差曲面就會存在多個局部極小值(即局部碗底),那采用這種方法可能會陷入局部最優解中。

如上圖就是一個非凸損失函數,有可能在梯度下降的過程中走到了一個局部最低點去,而這其實不是真正的最低點。
為了加快收斂速度,隨機梯度下降法(SGD) 就誕生了。它的思想是每次僅隨機的抽取樣本總體中的一個樣本,來決定下一步的走向。它的好處是不用遍歷所有的樣本,所以對于樣本容量巨大的情況,能夠極大的加快收斂。但可想而知,每次隨便取一個樣本來更新權值,最終的權值很可能并不是最優解,不過有時在考慮現實情況的時候,這點精度誤差也是可接受的。
那我們可不可以既要速度,又要精度呢?當 CoorChice 這么問的時候,你可就是知道套路問題的套路答案了(也許下次 CoorChice 就不會按套路走了,啊哈哈!)。答案就是 小批梯度下降法(Mini-batch GD)。它的思想是每次選取一定量的樣本進行訓練,然后再更新權值。即不用全部遍歷,也不會因為每次更新僅由一個樣本來決定而損失過多的精度。兩頭兼顧,當然也比較中庸。
2.2.4 交叉熵
在了解交叉熵之前,先了解一下什么是信息熵?首先看兩個相關公式。
信息量公式:

沒錯,通過對一種情況發生的先驗概率進行對數計算的結果,被用來表征這種事件發生的信息量。
信息熵公式:

就是將所有事件的信息熵進行加和。這個值越大,表明對于預測一個事件而言的不確定性就越大。
上面的公式是 信息熵 公式,它表示對于一系列事件,根據其歷史發生數據可以計算出一個先驗概率,根據這個先驗概率,可以計算出該事件發生的信息量,再將信息量乘以先驗概率,就可以得到單個事件的熵。將這些事件的熵求和,就可以得到信息熵了。它有什么作用呢?就是用來量化信息量的,如果越不確定,則其信息熵就越大。對于一個有序的系統(按部就班)來說,它的信息熵就比較小了。
如果理解了信息熵,接下來就可以更進一步的了解交叉熵了。首先,交叉熵損失函數如下:

y 表示期望輸出值,a 表示實際模型的輸出。交叉熵是用來干什么的呢?它表示的訓練結果和實際標簽結果的差距。交叉熵函數也有這種常用的形式:

通常交叉熵會和 Softmax 激勵函數一起在輸出層計算輸出。
03 深度學習的基本概念
深度學習是基于深度神經網絡的學習。它的概念類似與人的神經結構,由神經元可鏈接成一個神經網絡,每個神經元被作為一個網絡節點。
好像一下又回到了生物課!深度學習相對于傳統的機器學習來說,很明顯的優勢在于能夠自動提取特征,可將線性不可分的問題轉變為線性可分的問題。
使用傳統機器學習,不管用樸素貝葉斯、決策樹、支持向量機SVM等分類模型之前,必須對大量的模型進行處理,人工的從中提取特征用于量化。而在深度學習中,通過大量的線性分類器的堆疊,加上一些非線性因素,可以使一些特征能夠自動的顯現出來,而干擾因素經過過濾也能很大程度的被忽略。
總之,這種方式的機器學習肯定是更加先進的,但是需要消耗的資源也會更大。深度學習由于是自動提取特征的,所以會導致我們有時候無法判斷處究竟為什么會是這個模型,不便于我們分析問題,它就像一個黑盒一樣,給它數據,它給你結果,而你很難了解里面發生了什么。
3.1 神經元的組成
通常,一個神經元由一個 “線性模型” 和 一個 “激勵函數” 組成。線性模型其實就是上面提到過的線性回歸模型。

如圖就是一個神經網絡,它共有兩層,一個是神經元層(隱含層),一個是輸出層。通常我們在說一個網絡的深度時,是不會把輸入層不計入的。
在神經元中,有一個線性模型 wx + b 和 一個激活函數 f。我們的數據將會通過一個個的神經元,每個神經元都有一組權重,用于提取一類特征,相當于是我們把數據進行了一層一層的剖析。
3.2 激勵函數
激勵函數,通常也會被稱為激活函數,它是跟隨在 f(x) = wx + b 函數之后,用來加入一些非線性的因素的。通過激活函數,可以將線性函數作為輸入,經過激活函數后,變成非線性的,這樣一來就更接近真實世界的復雜情況了。列舉幾個常用的激活函數,有助理解。
3.2.1 Sigmoid函數


從函數可以看到,這個函數的值域為 (0,1),0.5值處為函數的對稱中心。有時在 <-4 和 >4 的區間中,函數曲線越來越趨于水平,也就是導數很趨于0,這會導致梯度下降時,我們的對權值的更新微乎其微,也就是出現梯度消失的問題。
當然,它作為比較常用的激勵函數,有其自己很適用的問題領域,比如二分類問題。
3.2.2 ReLu函數y = max(x, 0)

這是個很受歡迎的函數,光是看看它簡潔的函數式你就不能拒絕它!這個函數在 > 0 的時候,輸入就等于輸出,計算量會小很多,所以收斂速度會快很多。
3.2.3 Softmax

這個函數看起來比較復雜,它通常被用于處理多分類問題。可以看看它的定義式,就是個體在總體中的占比情況。

從圖中可以很直觀的看出這個函數的功能,就是各種分類的概率啊。
3.3 獨熱編碼
對于多分類問題,標注分類可以使用使用 獨熱編碼 來進行,比如這樣一個例子:

就是說,有幾個類型就定義一個幾維的向量,然后向量中只有一個元素為1,其余均為0,通過1在向量中的位置來表示類型。
3.3 過擬合和欠擬合
在訓練過程中,可能會因為過擬合或者欠擬合而導致最終訓練出來的模型準確率不足或者因泛化性差而導致準確率低。
- 欠擬合
- 樣本過少,無法歸納出足夠的共性
- 過擬合
- 參數過多,導致在訓練集上準確率很高,但換新樣本會嚴重誤判。
總結
在了解了機器學習是干什么的之后,又了解了一些基本概念在機器學習中會被經常用到的,相信你對機器學習也不會保持一種敬畏感了,知道它很厲害,但是不知道為什么厲害。
現在開始,可以試著到 TensorFlow 官網看一些入門的 code 例子,然后結合這些概念理解下每個步驟是在干什么,為什么要這么做?
在前面,大家也會看到,在機器學習中用到了很多統計學的知識,所以很多人會認為機器學習其實就是統計學而已。
實際上 CoorChice 認為,機器學習只是用了統計學作為工具,去研究解決問題,實際上它是有一套自己的理論和套路的,就像物理用數據作為工具去解決問題一樣。
機器學習在解決實際問題的過程中,會需要很多學科的交叉來分析問題,構建模型。當然,總體的思想看起來還是很簡單的,只不過面對真世界中的復雜情況下,其探尋求解過程會比較復雜。