官术网_书友最值得收藏!

1.4 機器學習的基本概念

1.4.1 書中用到的術語介紹

現在每過一段時間都會出現幾個新的網絡用語,懂的人見了會心一笑,不懂的只能摸摸腦袋,不知道“梗”在哪里,少了許多樂趣。機器學習也有許多獨特的用語,在本節,我們先把機器學習的“行話”都介紹清楚。

1.常用術語

模型:模型(Model)是機器學習的核心概念。如果認為編程有兩大組成部分,即算法和數據結構,那么機器學習的兩大組成部分就是模型和數據集。如果之前沒有接觸過相關概念,想必你現在很希望直觀地理解什么是模型,但對模型給出一個簡潔又嚴謹的定義并不容易,你可以認為它是某種機器學習算法在設定參數后的產物,它的作用和編程時用到的函數一樣,可以根據某些輸入得到某些輸出。既然叫機器學習算法,不妨將它想象成一臺機器,其上有很多旋鈕,這些旋鈕就是參數。機器本身是有輸入和輸出功能的,根據不同的旋鈕組合,同一種輸入可以產生不同的輸出,而機器學習的過程就是找到合適的那組旋鈕組合,通過輸入得到你所希望的輸出。

數據集:如果說機器學習的“機器”指的是模型,那么數據集就可以說是驅動著這臺機器去“學習”的“燃料”。有些文獻將數據集又分為訓練集和測試集,其實它們的內容和形式并無差異,只是用在不同的地方:在訓練模型階段使用,就叫作訓練集;在測試模型階段使用,就叫作測試集。

數據:我們剛才提到了數據集,數據集就是數據的集合。在機器學習中,我們稱一條數據為一個樣本(Sample),形式類似一維數組。樣本通常包含多個特征(Feature),如果是用于分類問題的數據集,還會包含類別(Class Label)信息,如果是回歸問題的數據集,則會包含一個連續型的數值。

特征:這個術語又容易讓你產生誤解了。我們一般把可以作為人或事物特點的征象、標志等稱作特征,譬如這個人鼻子很大,這就是特征,但在機器學習中,特征是某個對象的幾個記錄維度。我們都填寫過個人信息表,特征就是這張表里的空格,如名字、性別、出生日期、籍貫等,一份個人信息表格可以看成一個樣本,名字、籍貫這些信息就稱作特征。前面說數據形式類似一維數組,那么特征就是數組的值。

向量:向量為線性代數術語,機器學習模型算法的運算均基于線性代數法則,不妨認為向量就是該類算法所對應的“數據結構”。一條樣本數據就是以一個向量的形式輸入模型的。一條監督學習數據的向量形式如下:

[特征X1值,特征X2值,…, Y1值]

矩陣:矩陣為線性代數術語,可以將矩陣看成由向量組成的數組,形式上也非常接近二維數組。前面所說的數據集,通常就是以矩陣的形式輸入模型的,常見的矩陣形式如下:

[[特征X1值,特征X2值,…, Y1值],

[特征X1值,特征X2值,…, Y2值],

[特征X1值,特征X2值,…, Yn值]]

其實這個組織形式非常類似電子表格,不妨就以電子表格來對照理解。每一行就是一個樣本,每一列就是一個特征維度,譬如某個數據集一共包括了7個樣本,那就是有7行數據,每個樣本又都有4個維度的特征,那就是每行數據有4列,用電子表格表示如圖1-2所示,其中,A~D列為特征,E列為結果。

圖1-2 用電子表格來表示機器學習的數據集矩陣

對比一下應該就能馬上理解數據集是怎樣用矩陣保存數據的。有一個需要注意的細節——我們在制作電子表格時習慣添加列頭或行頭,譬如第一行往往是時間、名字、班級這樣的信息標簽,但機器學習使用的數據集一般并不包含這些列頭和行頭,第一格的內容就是第一個樣本的第一個特征的值,與我們日常習慣稍有區別。

2.常用函數

作為一門與數學關聯很密切的科目,機器學習自然會用到大量函數,但不用恐慌,機器學習中函數所起的實際作用更接近于編程概念上的函數。在編程中,我們會給函數“喂”點什么,名曰“傳參”,然后函數會反過來給我們“吐”點什么,名曰“返回值”。在機器學習中,函數扮演了類似的角色。下面我們先介紹兩個機器學習中的“網紅”函數:假設函數和損失函數。

假設函數(Hypothesis Function)將是我們機器學習大冒險中的主角。機器學習的模型訓練依靠數據,但數據本身無法直接作為驅動模型訓練的動力,而假設函數正好發揮了驅動引擎的作用,我們給假設函數灌入數據作為“燃料”,它就能產生動力輸出并讓學習過程運轉起來。這個過程將在后面詳述。

假設函數在本書中的寫法是H(x),這里的x可以簡單理解成矩陣形式的數據,我們把數據“喂”給假設函數,假設函數就會返回一個結果,而這個結果正是機器學習所得到的預測結果。為什么假設函數具有如此神奇的能力?很復雜,不過不要緊,后面我們將用整本書來解釋它。

我們的機器學習之旅將是一部雙主角的冒險歷程,而另一大主角毫無疑問就是損失函數(Loss Function)。損失函數很重要,它為機器學習提供了學習動力。與其他算法不一樣,機器學習不是一個一次就得到最終結果的計算過程,而是不斷逼近學習目標的迭代過程。既然是要“逼近”,首先肯定需要通過衡量工具來度量當前距離目標是逼近了還是遠離了,所以損失函數又叫目標函數。

損失函數用L(x)表示,L代表Loss,這里的x是假設函數的預測結果。函數返回值越大,表示結果偏差越大。機器學習中有一個與損失函數含義非常相近的術語,叫作成本函數(Cost Function),通常用J(x)表示,同樣,這里的x也是假設函數的預測結果。成本函數與損失函數意義非常相近,同樣是函數返回值越大,表示偏差越大。

損失函數和成本函數都表示預測結果與真實情況的偏差,概念非常相近,作用也類似,初學時很容易混淆。其實區別二者的關鍵在于對象,損失函數是針對單個樣本,而成本函數則是針對整個數據集,也就是說,損失函數求得的總和就是成本函數。下次遇到要區別涉及偏差的函數時,你只需要看一看對象是誰:如果是針對單個樣本的預測偏差,就是損失函數;如果要考察整個數據集的偏差之和,那么自然就是成本函數了。可以說,損失函數與成本函數既有聯系又有區別,是微觀與宏觀的關系。

舉個例子,假設有10個樣本,我們會對這10個樣本利用假設函數進行逐一預測,并逐一計算偏差,這時用到的是損失函數。當我們開始計算這10個樣本的總體偏差時,我們用到的是成本函數。成本函數是由損失函數計算得到的,不過在實際計算時,可以選擇令成本函數為損失函數值的總和,也可以令成本函數是損失函數值的平均,但無論是總和還是平均,其最終目標都是希望最小化成本,從而使假設函數的預測最可靠。

根據上述介紹,模型的每一輪預測結果偏差嚴格來說應該稱作“成本值”,但這個詞既不形象,念起來又拗口,后面我們將采用“損失值”來指代預測與實際的偏差。損失函數和成本函數都是衡量偏差的標尺工具,二者確實存在區別,但這種區別需要在引入樣本、進入實際的模型訓練階段才能體現,僅從算法本身來看,二者并沒有實質的不同。因此,許多教材在書寫某個機器學習算法偏差值的計算公式時,有的會選擇使用J(x)表示,有的會選擇使用L(x)表示,看似雜亂無章,缺乏規范,實際上都是代表了相同的意思,即計算模型產生了多大的偏差。本書選擇統一使用符號L(x),即用損失函數來表示損失值的計算方法。

前面我們提到模型需要利用成本函數進行多輪學習,這里又說對損失函數求和才能得到成本函數,也許這兩個涉及成本函數的多次運算會讓你感到困惑。這里其實涉及了三個步驟,第一步是將每個樣本用損失函數進行計算之后,各自得到一個損失值,損失值的和為成本函數的損失值;第二步是將成本函數的損失值作為優化方法的輸入,完成對假設函數的參數調整;第三步即重復第一步,計算出新的損失值,再重復第二步,繼續調整假設函數的參數。二者的關系應該就更清楚了。

1.4.2 機器學習的基本模式

假設函數和損失函數是機器學習的重要概念,機器學習算法看似千差萬別,但如果把算法結構都拆開來比較,肯定都是假設函數和損失函數這對固定組合,再搭配一些其他零部件。

同樣,機器學習的運行模式也都大同小異,整個過程有點像騎共享單車。騎車的時候,我們用腳蹬踏板,踏板盤通過鏈條帶動后輪轉動,單車就可以前進了。在機器學習中,假設函數和損失函數就發揮著踏板盤和后輪的作用(如圖1-3所示)。

圖1-3 假設函數產生的偏差驅動著機器學習模型不斷優化

要開始進行機器學習,至少要準備三樣東西。首先當然是數據,如果機器學習是一架機器,數據就是燃料,若沒有燃料,再強大的機器也得“趴窩”。然后是假設函數,再然后是損失函數。把數據“喂”給假設函數,假設函數會“吐”出一個結果,我們也說過了,這個是預測結果。剛開始,假設函數的預測與瞎猜基本是一個意思,很不可靠。有多不可靠呢?這就得問問損失函數了。損失函數好比一把尺子,我們把假設函數的預測結果“喂”給損失函數,損失函數也會“吐”出一個結果,且通常是數值形式,以便告訴我們它與真實情況到底差了多少。

這就是第一輪學習過程。但僅知道差了多少并沒有什么用,我們要的是一個能進行有效預測的假設函數。那么,我們就會根據損失函數的返回結果,用一個名為優化方法的過程來調整假設函數。初始的假設函數就像沒有經過訓練的動物,需要“喂”給它數據,經過多輪學習后才終于打通任督二脈,成為絕世高手。

前面我們反復提到一個詞——擬合,而假設函數和損失函數可以算是驅動擬合不斷進行的兩枚重要齒輪,通過二者的配合產生源源不斷的動力,驅動著機器學習模型不斷朝著損失值最小化的方向逼近,最終完成學習。

1.4.3 優化方法

上面已經反復提到了優化方法,優化方法可以算是假設函數和損失函數之間的傳聲筒。假設函數通過調整參數,能夠對輸入的數據產生期望的輸出,即預測值。損失函數則可以通過比較預測值和實際值計算出損失值。可是損失函數得到損失值之后,好像有一點害羞,不好意思直接告訴假設函數出現了錯誤以及應該怎樣修改。這時就輪到優化方法上場了,損失函數把損失值告訴優化方法,優化方法再告訴假設函數如何調整參數。

聽起來好像很厲害,實際上優化方法可能非常簡單,甚至簡單做一下減法就可以是一種優化方法:

新參數值=舊參數值-損失值

不過這種優化方法過于簡單粗暴,只能在極特殊的情況下才能奏效。幸運的是,有一類數學家專門研究優化方法(譬如牛頓法、擬牛頓法、共軛梯度法等)。

也許僅看到這些優化方法的名字就會讓你倒吸一口涼氣,幸好優化方法的目的只有一個,就是通過調整假設函數的參數,令損失函數的損失值達到最小。不妨先把優化方法當作min(L(x))函數,就好比排序算法雖然種類眾多,但經典的僅有冒泡排序、選擇排序、插入排序等十多種,思路和方法不同,執行效率也各不相同,但效果是完全一樣的。

梯度下降(Gradient Descent)法是機器學習中常用的一種優化方法,梯度是微積分學的術語,某個函數在某點的梯度指向該函數取得最大值的方向,那么它的反方向自然就是取得最小值的方向。所以只要對損失函數采用梯度下降法,讓假設函數朝著梯度的負方向更新權值,就能達到令損失值最小化的效果。

梯度下降法涉及微積分學的相關知識,需要了解其背后的性質才能更好地理解。不過梯度下降法的原理和日常生活中很常見的倒車入庫非常類似。如果把車尾部和車庫底桿之間的距離看成損失值,那么倒車也可以看作一個不斷調整、讓損失值逼近最小的過程。

我們怎么指揮司機倒車呢?首先觀察倒車的方向是否正確,確保不會倒歪了,接著檢查車尾部后面還有多少空間,如果還有空間,車子就會一點一點地往后蹭,當車差不多貼上底桿了,我們就喊一句“停”,倒車完成。不過總是一點點蹭,未免太浪費時間,所以當離底桿還有一段距離時,我們會讓車子一次性多倒一點,如果已經很接近底桿了,我們就會提醒司機放慢倒車速度。總之,希望能夠盡快縮小車尾部和底桿的距離。梯度下降法也是如此,首先由梯度確定方向,當損失值比較大時,梯度會比較大,假設函數的參數更新幅度也會大一些,隨著損失值慢慢變小,梯度也隨之慢慢變小,假設函數的參數更新也就隨之變小了。這就是采用梯度下降作為優化方法時,利用梯度調整假設函數的參數,最終使損失值取得最小值的過程。

如果樣本數量龐大,完成一次完整的梯度下降需要耗費很長時間,在實際工作中會根據情況調整每次參與損失值計算的樣本數量。每次迭代都使用全部樣本的,稱為批量梯度下降(Batch Gradient Descent);每次迭代只使用一個樣本的,稱為隨機梯度下降(Stochastic Gradient Descent)。因為需要計算的樣本小,隨機梯度下降的迭代速度更快,但更容易陷入局部最優,而不能達到全局最優點。

主站蜘蛛池模板: 百色市| 林周县| 丹寨县| 昂仁县| 鄂尔多斯市| 沽源县| 通化县| 光泽县| 桃源县| 灵石县| 芮城县| 朝阳市| 长春市| 吉水县| 兴业县| 濮阳市| 泰安市| 红原县| 洪湖市| 宜春市| 抚宁县| 玛多县| 门头沟区| 错那县| 渑池县| 巍山| 峨边| 望城县| 翁牛特旗| 务川| 嘉兴市| 梨树县| 万宁市| 平谷区| 山东省| 莎车县| 龙门县| 元朗区| 东台市| 富裕县| 秭归县|