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

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

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

看看上面這個(gè)應(yīng)用題,是否想起了高中時(shí)代的數(shù)學(xué)課?
2.2.2 損失Loss函數(shù)
損失函數(shù)是用來評估模型預(yù)測結(jié)果和真實(shí)情況差距的,差距越小,說明我們的模型越好,越準(zhǔn)確。這就是損失函數(shù)的公式!

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

求平方使得結(jié)果橫為正數(shù)。
比如這個(gè)函數(shù)的圖像可能是一個(gè)三維的碗,那么我們的任務(wù)就是找到碗底的位置,也就是極值,因?yàn)樵谠擖c(diǎn)有解,即損失最小。

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

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

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

沒錯(cuò),通過對一種情況發(fā)生的先驗(yàn)概率進(jìn)行對數(shù)計(jì)算的結(jié)果,被用來表征這種事件發(fā)生的信息量。
信息熵公式:

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

y 表示期望輸出值,a 表示實(shí)際模型的輸出。交叉熵是用來干什么的呢?它表示的訓(xùn)練結(jié)果和實(shí)際標(biāo)簽結(jié)果的差距。交叉熵函數(shù)也有這種常用的形式:

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

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


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

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

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

從圖中可以很直觀的看出這個(gè)函數(shù)的功能,就是各種分類的概率啊。
3.3 獨(dú)熱編碼
對于多分類問題,標(biāo)注分類可以使用使用 獨(dú)熱編碼 來進(jìn)行,比如這樣一個(gè)例子:

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