機器學習,看完就明白了

CoorChice發表於2018-10-05


機器學習,看完就明白了


1 機器學習分類

  • 傳統機器學習
    機器學習可以理解成是生產演算法的演算法。需要人來先做特徵提取,然後在把特徵向量化後交給機器去訓練。
    傳統機器學習分為 監督學習無監督學習

  • 深度學習
    深度學習是基於深度神經網路的學習(DNN)。深度學習可以自動提取特徵。深度學習可以採用 End-to-End 的學習方式,只需要進行很少的歸一化和白化,就可以將資料交給模型去訓練。

2 機器學習中的一些概念

首先我們需要了解幾個機器學習中的起碼要知道是怎麼回事的概念,瞭解了後面看程式碼才不會一臉懵逼。

  • 訓練樣本
    就是用於訓練的資料。包括了現實中的一些資訊資料,以及對應的結果,也就是標籤。

  • 訓練
    對訓練樣本的特徵進行統計和歸納的過程。

  • 分類模型
    總結出的特徵,判斷標準。

  • 驗證
    用測試資料集驗證模型是否正確的過程。這個過程是在模型訓練完後進行的,就是再用另外一些樣本資料,代入到模型中去,看它的準確率如何。

2.1 聚類

聚類 是一種典型的 無監督學習 ,是把資料進行分類的過程。

進行聚類的基本思想是,利用 向量 之間的距離 —— 空間中的 歐式距離曼哈頓距離 , 根據距離的大小判斷物件是否應該歸為同一類別。

image

上圖是對3個一維向量分類的例子。明顯的能看到,離得近的兩個們可以近似的認為它們屬於同一類別。

2.2 迴歸

迴歸簡單的說就是一個 由果索因 的過程。這是機器學習中很常用的一個手段。

迴歸分為:

  1. 線性迴歸
  2. 非線性迴歸

實際使用那種迴歸模型,需要根據情況而定。

2.2.1 線性迴歸

線性迴歸模型:

image

其中 w 是一個特徵張量,儲存著與每個變數x中元素對應的特徵元素,x 就是輸入的訓練資料張量,b 是一個偏置量。

這其實就是高中概率與統計章節中常見的一個公式。就像解那時候的應用題一樣,我們需要根據一堆 (x,y)求解一個合適的 w 和 b。

image

看看上面這個應用題,是否想起了高中時代的數學課?哈哈...

2.2.2 損失Loss函式

損失函式是用來評估模型預測結果和真實情況差距的,差距越小,說明我們的模型越好,越準確。

這,就是損失函式的公式!

image

當我們假設一個 w 和 b 後,迴圈計算每一個 x 所得的值和真實 x 所對應的值相減,然後將每一個差相加求和,得到一個差值之和,就是當前的損失。

損失越小,說明所尋找到的 w 和 b 就越合適,當 Loss 為 0 時,說明此時模型的準確率為 100% 。

事實上,這和高中概率與統計應用題,給你一堆 x,y ,然後求一個 係數w 和 常量b 出來是一樣的一樣的。只不過在計算機中,由於算力比手算強大太多了,所以我們可以一遍一遍的調整 w 和 b 這兩個引數,使 Loss 一直向趨於 0 的方向移動 ,從而使模型的準確率趨於 100% 。

通常,為了使 Loss 始終保持為正 ,也會有如下損失函式:

$$ Loss = {\sum_{i = 1}^{n}{(y_i - (wx_i + b))^2}} $$

求平方使得結果橫為正數。

比如這個函式的影像可能是一個三維的碗,那麼我們的任務就是找到碗底的位置,也就是極值,因為在該點有解,即損失最小。

2.2.3 梯度下降法尋找最優解

對於複雜函式,我們要直接求解是巨困難的,甚至有時可以說是處於不可解的狀態。我們需要尋找損失函式的極值,可以使用牛頓迭代法的思想進行迭代尋找。

那對於複雜函式是不是就只能束手無策了呢?在你瞭解 牛頓迭代法 之後就可以回到不是了,而此前對於這個問題也許只能回答不能了。

$$ x_{n+1} = x_n -  η\frac{df(x_n)}{dx_n} $$

通過迭代,我們可以逐步的逼近索要尋找的極值。

這裡,我們還人為的引入了一個 η 引數,這個引數用於調整步長。步子邁大了可能會越過極值,邁小了有會產生很大的計算量,具體取多大合適,還是要多看看老司機們燙過的坑。

普通的梯度下降法(批梯度下降法,BGD),需要遍歷所有的資料樣本,在樣本量不大的時候還是可以的,畢竟這麼幹精度起碼是很高的。但是如果樣本容量巨大,那每次遍歷所有樣本,必然都會消耗很多時間成本。並且如果我們的損失函式不是一個凸函式誤差曲面就會存在多個區域性極小值(即區域性碗底),那採用這種方法可能會陷入區域性最優解中。

如上圖就是一個非凸損失函式,有可能在梯度下降的過程中走到了一個區域性最低點去,而這其實不是真正的最低點。

為了加快收斂速度,隨機梯度下降法(SGD) 就誕生了。它的思想是每次僅隨機的抽取樣本總體中的一個樣本,來決定下一步的走向。它的好處是不用遍歷所有的樣本,所以對於樣本容量巨大的情況,能夠極大的加快收斂。但可想而知,每次隨便取一個樣本來更新權值,最終的權值很可能並不是最優解,不過有時在考慮現實情況的時候,這點精度誤差也是可接受的。

那我們可不可以既要速度,又要精度呢?當 CoorChice 這麼問的時候,你可就是知道套路問題的套路答案了(也許下次 CoorChice 就不會按套路走了,啊哈哈!)。答案就是 小批梯度下降法(Mini-batch GD)。它的思想是每次選取一定量的樣本進行訓練,然後再更新權值。即不用全部遍歷,也不會因為每次更新僅由一個樣本來決定而損失過多的精度。兩頭兼顧,當然也比較中庸。

2.2.4 交叉熵

在瞭解交叉熵之前,先了解一下什麼是資訊熵?

首先看兩個相關公式。

資訊量公式:

$ H(x_i) = -log_2P(x_i)$

沒錯,通過對一種情況發生的先驗概率進行對數計算的結果,被用來表徵這種事件發生的資訊量。

資訊熵公式:

就是將所有事件的資訊熵進行加和。這個值越大,表明對於預測一個事件而言的不確定性就越大。

上面的公式是 資訊熵 公式,它表示對於一系列事件,根據其歷史發生資料可以計算出一個先驗概率,根據這個先驗概率,可以計算出該事件發生的資訊量,再將資訊量乘以先驗概率,就可以得到單個事件的熵。將這些事件的熵求和,就可以得到資訊熵了。它有什麼作用呢?就是用來量化資訊量的,如果越不確定,則其資訊熵就越大。對於一個有序的系統(按部就班)來說,它的資訊熵就比較小了。

如果理解了資訊熵,接下來就可以更進一步的瞭解交叉熵了。

首先,交叉熵損失函式如下:

$LOSS = -\frac{1}{n}{\sum_{i=1}[y_i}lna + (1 - y_i)ln(1-a)] $

y 表示期望輸出值,a 表示實際模型的輸出。

交叉熵是用來幹什麼的呢?它表示的訓練結果和實際標籤結果的差距。

交叉熵函式也有這種常用的形式:

$LOSS = -\frac{1}{n}{\sum_{i=1}y_iloga}$

通常交叉熵會和 Softmax 激勵函式一起在輸出層計算輸出。

3 深度學習的基本概念

深度學習是基於深度神經網路的學習。它的概念類似與人的神經結構,由神經元可連結成一個神經網路,每個神經元被作為一個網路節點。

好像一下又回到了生物課!

深度學習相對於傳統的機器學習來說,很明顯的優勢在於能夠自動提取特徵,可將線性不可分的問題轉變為線性可分的問題。

使用傳統機器學習,不管用樸素貝葉斯、決策樹、支援向量機SVM等分類模型之前,必須對大量的模型進行處理,人工的從中提取特徵用於量化。而在深度學習中,通過大量的線性分類器的堆疊,加上一些非線性因素,可以使一些特徵能夠自動的顯現出來,而干擾因素經過過濾也能很大程度的被忽略。

總之,這種方式的機器學習肯定是更加先進的,但是需要消耗的資源也會更大。

深度學習由於是自動提取特徵的,所以會導致我們有時候無法判斷處究竟為什麼會是這個模型,不便於我們分析問題,它就像一個黑盒一樣,給它資料,它給你結果,而你很難了解裡面發生了什麼。

3.1 神經元的組成

通常,一個神經元由一個 “線性模型” 和 一個 “激勵函式” 組成。線性模型其實就是上面提到過的線性迴歸模型。

image

如圖就是一個神經網路,它共有兩層,一個是神經元層(隱含層),一個是輸出層。通常我們在說一個網路的深度時,是不會把輸入層不計入的。

在神經元中,有一個線性模型 wx + b 和 一個啟用函式 f

我們的資料將會通過一個個的神經元,每個神經元都有一組權重,用於提取一類特徵,相當於是我們把資料進行了一層一層的剖析。

3.2 激勵函式

激勵函式,通常也會被稱為啟用函式,它是跟隨在 f(x) = wx + b 函式之後,用來加入一些非線性的因素的。通過啟用函式,可以將線性函式作為輸入,經過啟用函式後,變成非線性的,這樣一來就更接近真實世界的複雜情況了。

列舉幾個常用的啟用函式,有助理解。

3.2.1 Sigmoid函式

image

影像

image

從函式可以看到,這個函式的值域為 (0,1),0.5值處為函式的對稱中心。有時在 <-4 和 >4 的區間中,函式曲線越來越趨於水平,也就是導數很趨於0,這會導致梯度下降時,我們的對權值的更新微乎其微,也就是出現梯度消失的問題。

當然,它作為比較常用的激勵函式,有其自己很適用的問題領域,比如二分類問題。

3.2.2 ReLu函式

y = max(x, 0)
複製程式碼

影像

image

這是個很受歡迎的函式,光是看看它簡潔的函式式你就不能拒絕它!

這個函式在 > 0 的時候,輸入就等於輸出,計算量會小很多,所以收斂速度會快很多。

3.2.3 Softmax

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

image

從圖中可以很直觀的看出這個函式的功能,就是各種分類的概率啊。

3.3 獨熱編碼

對於多分類問題,標註分類可以使用使用 獨熱編碼 來進行,比如這樣一個例子:

就是說,有幾個型別就定義一個幾維的向量,然後向量中只有一個元素為1,其餘均為0,通過1在向量中的位置來表示型別。

3.3 過擬合和欠擬合

在訓練過程中,可能會因為過擬合或者欠擬合而導致最終訓練出來的模型準確率不足或者因泛化性差而導致準確率低。

  • 欠擬合
    樣本過少,無法歸納出足夠的共性

  • 過擬合
    引數過多,導致在訓練集上準確率很高,但換新樣本會嚴重誤判。

總結

在瞭解了機器學習是幹什麼的之後,又瞭解了一些基本概念在機器學習中會被經常用到的,相信你對機器學習也不會保持一種敬畏感了,知道它很厲害,但是不知道為什麼厲害。

現在開始,可以試著到 TensorFlow 官網看一些入門的 code 例子,然後結合這些概念理解下每個步驟是在幹什麼,為什麼要這麼做?

在前面,大家也會看到,在機器學習中用到了很多統計學的知識,所以很多人會認為機器學習其實就是統計學而已。實際上 CoorChice 認為,機器學習只是用了統計學作為工具,去研究解決問題,實際上它是有一套自己的理論和套路的,就像物理用資料作為工具去解決問題一樣。機器學習在解決實際問題的過程中,會需要很多學科的交叉來分析問題,構建模型。當然,總體的思想看起來還是很簡單的,只不過面對真世界中的複雜情況下,其探尋求解過程會比較複雜。

  • 抽出空餘時間寫文章分享需要動力,還請各位看官動動小手點個贊,給CoorChice充值些信仰?
  • CoorChice一直在不定期的分享新的乾貨,想要上車只需進到CoorChice的【個人主頁】點個關注就好了哦。發車嘍~


相關文章