1. 程式人生 > >搞懂這些,你也能轉型70W年薪的機器學習工程師

搞懂這些,你也能轉型70W年薪的機器學習工程師

人工智慧的熱潮依舊,相關人才缺口隨勢增長,頂著“高薪”、“稀缺”、“大佬”標籤的機器學習專家成為了程式設計師、工程師、資料分析師的轉型風向標。根據 Indeed 在美國 2018 年的最佳工作報告,機器學習工程師在美國前十的“最佳”工作排名中佔據前列,年薪高達 13.62 萬美元。

機器學習是什麼?應用場景有哪些?成為機器學習專家難不難? 11月1日的資料俠實驗室,Tapas資料倉庫管理員寇冠東和大家分享了機器學習的那些事兒~本文為其演講實錄。

大家好,我是寇冠東,是一名資料倉庫管理員,今天分享的主要內容,包括:

  • 機器學習的定義
  • 機器學習的應用場景
  • 機器學習的上下游
  • 學習機器學習所要掌握的相關知識點
  • 機器學習與人類學習之間的關係。

▍驗證碼與機器學習

上網的時候,我們會看到很多各種各樣的驗證碼,有的簡單,有的複雜。普通使用者非常討厭這些驗證碼,因為它浪費了大家的時間,但這些驗證碼的作用是能夠阻攔爬蟲爬取資料。

在實際的網路請求中,只有非常少的一部分是真正的使用者行為,大部分的網路請求都是由爬蟲發起的,爬蟲的目的就是為了採集資料。

實際工作中,爬蟲工程師會使用一些機器學習技術解決驗證碼的問題,比如利用計算機視覺識別數字和字母,利用語義識別文字,並且將二者進行匹配處理。

而後端開發工程師的任務則是防止爬蟲爬取資料及減輕伺服器的壓力。除了採用驗證碼防止爬蟲,另一種方式是採用機器學習中的異常檢測。

異常檢測是指識別出哪些是普通的使用者訪問的行為,哪些是爬蟲或惡意的網路請求。通過這樣的識別,讓正常的使用者請求獲取到正常的資料,讓爬蟲和其他的惡意網路請求獲取到假資料、髒資料或者驗證碼。

▍到底什麼是機器學習?

根據Tom Mitchell 1997年提出的定義,機器學習是一種計算機程式,這種程式能夠針對特定任務,表現隨經驗的增加而增加,即機器學習包含三大要素,分別是經驗、任務和效能。機器學習的經驗來自於資料,它的任務是解決特定的問題,它的效能取決於我們如何評估模型的表現。

▍機器學習的上下游

機器學習的上游是數學和電腦科學,它的下游是軟體工程和商業應用。

其中,各個環節不是完全絕對劃分的,各環節彼此之間有非常高的重疊度。比如說數學和電腦科學,兩個學科在演算法方面有很大重疊度,電腦科學和機器學習重疊度更高。

機器學習和軟體工程一樣,因為機器學習工程師很大一部分任務就是在編寫軟體程式碼,而軟體工程又與商業應用最接近,我們日常所用的一些所謂機器學習的應用,大部分都是通過軟體工程師經過封裝之後才能夠使用。

▍要想入門機器學習,你需要掌握哪些知識點?

機器學習中的數學

機器學習最上游靠近學術研究方向的是數學,機器學習中的數學包含但不限於微積分、線性代數、統計學、凸優化。

其中,統計學研究的物件就是資料和資料背後的規律。在學統計學專業的人看來,機器學習就是統計學的一種應用,但二者之間存在細微的差別,統計學的側重點在於統計結果的可解釋性,要用人類能夠聽懂的語言來解釋它的結論;而機器學習的重點在於模型預測的準確性,而不是人類能不能理解模型的原理。

總的來說,數學是一門理論指導學科。如果不懂這些數學原理,其實也可以做機器學習工程師,但是如果偏學術方面的話,還是要更多地掌握一些數學原理。

機器學習中的電腦科學

相比於數學這一門純粹性的學科,電腦科學更講究實用主義,因為電腦科學會經常提及計算成本、效率這些非常實際的問題。所以有一些問題在數學上是可解的,但因為計算機的計算能力有限,所以我們認為它是不可解的。

比如說HTTPS的RSA加密演算法、比特幣的加密演算法,從數學角度而言都是可以暴力破解的,但是以目前計算機的算力,要完成暴力破解,需要非常長的計算時間。從實用方面來考慮,我們認為這些加密演算法是不可破解的。

決定機器學習過程中計算成本的最大因素是演算法複雜度,演算法複雜度分為兩方面,一方面是時間複雜度,另一個是空間複雜度。其中時間複雜度是我們更關心的。

嚴格的說,時間複雜度不是指計算時間的長短,而是計算所需的操作次數。

如上圖所示,隨著輸入資料量的增加,不同的演算法複雜度,增長不同。其中增長最快的是指數增長、冪增長,增長較慢的是平方根增長、對數增長。

當資料量在1000條的時候,以上幾種不同複雜度的演算法的耗時都是一毫秒。對於線性增長的模型,資料每增加一千倍,它的時間也會擴大為原來的一千倍,這是比較常見的一種模式,就如一個人1分鐘吃1個混沌,10分鐘吃10個餛飩,這是日常生活中最常見的演算法。

對數增長非常慢。當資料量從1000增大到100萬的時候,資料量變成了原來的平方,而實際的計算時間只增加了兩倍。

平方根增長也比較慢。當資料量增加1000倍的時候,1000個平方根相當於32左右,比線性增長要慢很多。

平方和立方這類冪增長則非常可怕,當我的資料量增加1000倍的時候,平方增長變成了原來的100萬倍,立方增長變成了原來的10億倍。

為機器學習選擇演算法的時候,儘量選擇演算法複雜度比較低的演算法,尤其是在資料量比較大的時候。

▍機器學習的經驗來源:資料

資料是機器學習的原料,是機器學習的經驗來源。機器學習輸入的是資料,輸出的是一個具有預測能力的模型。

資料有多種形式,狹義的資料指數字形式,比如說網站的訪問量、使用者數量;廣義的資料則包含一切能夠被記錄下來的資訊,比如說文字、圖片、視訊、音訊,雖然它們的編碼格式和資料壓縮的方式不一樣,但它們都是基於二進位制的資料。這些資料都可以用來訓練機器學習的模型。

資料經過採集、預處理、探索性資料分析之後,確定機器學習的任務和演算法,進行機器學習的模型訓練,通過資料視覺化輸出一個產品。這樣一個迴圈不是一次性完成的,它往往要經過多次迭代。

在資料採集過程中會涉及網站本身積累的使用者資料、爬蟲資料、人工標註資料;資料的預處理包括資料清洗、特徵工程,通過預處理將資料去重、剔除髒資料;探索性資料分析(EDA)能夠做一些統計性的描述,幫助我們更好地定義問題。

用來訓練機器學習的資料非常重要,但是並不是所有的資料都用來訓練模型。一般而言,使用60%的資料訓練模型,使用20%的資料驗證模型,並且調節優化模型引數,最後剩餘20%的資料用於評估模型表現。

通過對資料的這樣一種劃分,能夠讓模型得到一個最初的訓練、優化和評估。

▍如何定義機器學習的任務?

機器學習的任務型別主要分為監督式學習和無監督學習,除此以外,還有半監督學習和強化學習。

監督式學習與無監督式學習

監督式學習,表現為訓練資料的因變數有標註。

在定義一個函式的時候,往往包括自變數和因變數,自變數是函式的輸入值,因變數是函式的輸出值。訓練資料的因變數指的是預測模型所輸出的值。比如利用一個房子的面積來預測一個房子的價格,房子的面積是自變數,價格是因變數。而這樣一條既有面積又有價格的資料,它就是一個因變數有標註的訓練資料,可以用來做監督式學習。

無監督學習,表現為訓練資料的因變數沒有標註。

比如我們採集了很多的使用者行為資料,但是我們並不知道哪一類使用者和哪一類使用者是相似的,通過機器學習可以讓使用者行為相似的群體劃分成小的分組,這就是無監督學習,其中的訓練資料並沒有提供一個明確的標註。

監督式學習:迴歸問題、分類問題

監督式學習中通常可以分為兩類,一類是迴歸問題,一類是分類問題。

所謂迴歸問題,表現為因變數是連續值或者有序整數。比如說產品銷量、房價和股票等市場預測問題;溫度、溼度、風速等天氣預測問題,它們的輸出值都是連續數值或有序的數字,屬於迴歸問題。

(圖片說明:座標軸中橫座標是特徵,縱座標是輸出;橫座標是自變數,縱座標是因變數,使用一條直線或者曲線去擬合模型,這個模型解決的是一個迴歸問題。)

監督式學習中另外一種常見的問題叫做分類問題,表現為因變數是離散並且無序的。

(圖片說明:圖中橫、縱座標都是特徵;象限中的資料是模型的因變數)

解決分類問題的目的在於找到一個分類器,劃分出不同類資料之間的區別。分類問題不僅限於二分類,也可以是多分類,即對多種類進行劃分。

驗證碼識別是一個典型的分類問題,如果是數字和字母驗證碼,對它的識別就是把驗證碼中的每一個數字或大小寫字母分到可能的62個(26+26+10)分類中;垃圾與正常郵件識別也是一個二分類問題;文章分類則是個多分類(科技、經濟、軍事、體育等)問題。

(圖片說明:在微軟應用how old上,上傳一張帶有人物照片的圖片,能自動識別出人臉的位置,並標註出其中人物的性別和年齡。其中,關於性別預測是一個二分類問題,關於年齡的預測是一個迴歸問題。)

無監督學習:聚類、降維

無監督學習中常見的一種問題是聚類問題。

(圖片說明:聚類問題的應用及未經過人工標註的資料座標圖。)

聚類問題的目的在於解決如何使機器自動將相近的資料點劃分為一組。聚類問題的應用非常廣泛,包括電商消費者劃分、基於使用者位置的商業選址、動植物種群劃分等。

無監督學習中的另一類常見問題是降維問題。

降維的目的在於降低資料的維度、計算成本、以資訊損失最少的代價壓縮資料和高維資料視覺化。降維常用的方法包括主成分分析、奇異值分解等。

▍模型訓練

機器學習中的演算法選擇

  • 資料量對於機器學習訓練的效果有什麼影響?

一般資料量越大,演算法訓練出來的模型結果表現越好,而有的演算法是在資料量比較小的時候表現更好,而有的演算法則是在資料量更大的時候表現更好。

(圖片說明:某公司根據文字進行的模型訓練,隨著資料量的增加,不同模型的表現都在提升)

  • 如何選擇合適的演算法?

以線性迴歸問題為例,其中有兩種常見的演算法,一種是正規方程,直接用數學去求出它的解析解,這種演算法的複雜度是N的立方;另一種演算法叫做梯度下降法,其中又分為批量梯度下降和隨機梯度下降,他們的演算法複雜度分別是N的平方和N。

對比正規方程和梯度下降,正規方程的精確度比較高,因為它是解析解,而梯度下降的精確度在可接受範圍內,它最大的優點在於計算成本非常低,所以在資料量很大的時候,傾向於選擇用梯度下降法來訓練線性迴歸模型。

簡單來說,梯度下降法就是把一個函式的梯度求出來,然後選擇一個初始位置,讓它進行梯度方向的迭代。梯度下降法的優點是演算法複雜度較低,可以降低到N的平方或者N,缺點在於它有可能會陷入一個區域性最優解。

(圖片說明:右圖中,如果用梯度下降法進行模型訓練的起始位置是靠近右側的凹坑,那麼它最終迭代的結果則會是一個區域性最小值,而不是中間這個凹坑的全域性最優解。)

模型訓練最重要的是要通過大量的迭代來達到最優解。

▍模型評估

泛化能力

模型的評估涉及模型的泛化能力,模型的泛化能力包括欠擬合、剛好擬合和過擬合。

什麼是過擬合?什麼是欠擬合?舉例來說,比如大家對親戚中某一個熊孩子非常不喜歡,你可以送她一件最好的禮物——五年高考三年模擬,如果熊孩子背下了所有往年的高考題,但遇上沒有見過的題他就不會做,這就是一種過擬合;如果熊孩子並沒有學會往年的高考題,在面臨真實高考題時,他自然答得不好,這是一種欠擬合。

過擬合就是模型對於訓練資料表現得非常好,對於新資料它不能夠很好的預測;欠擬合與過擬合相反。評估機器學習模型時,最好能夠達到剛好擬合,在此狀態下,不論是訓練資料還是新的資料,它都能夠有非常好的一個擬合的狀態。

為了更好地理解欠擬合和過擬合,需要引入兩個新概念,分別是偏差(bias)和方差(variance)。

模型評估時,最不希望看到的結果,就是偏差方差都很大。

不同模型複雜度對於模型表現會有怎樣的影響?

(圖片說明:橫軸是模型的複雜度,縱軸是模型的預測出來的誤差。)

當模型非常簡單的時候,即靠左的時候,我們可以看到模型的偏差非常大,但是方差比較小;隨著模型複雜度的增加,到中間這部分時,模型的偏差和方差都相對比較小,這是模型評估希望看到結果;隨著模型進一步變得複雜化,它的的偏差會變得比較小,但是方差變得比較大,出現了過擬合。

過擬合和欠擬合都是模型評估不希望看到的結果,但是它們的原理和情況是不一樣的。欠擬合是由於模型過於簡單,過擬合是由於模型過於複雜。在訓練機器學習模型的時候,更多遇到的是過擬合。

▍機器學習與人類學習

機器學習和人類學習之間是有一定聯絡的。

不積跬步,無以至千里

機器學習中的“跬步”,就是降低代價函式過程中的每一次迭代,每一次迭代,模型引數的更新可能都比較小,它只是沿著梯度的方向下降了一小步,但是迭代次數只要足夠多,那麼最終的模型還是能夠收斂到全域性最優解。機器學習模型要經過大量的迭代。

吾嘗終日而思矣,不如須臾之所學也

基於現有知識進行思考,相當於是基於現有的資料去訓練模型;學習新知識,增加新的訓練資料。

很多情況下,在一個有限的資料集上進行更多的迭代次數的訓練,不如增加訓練資料的量,這樣最終達到的模型,它的表現會更好。機器學習和大資料之間的結合非常緊密,因為足夠的資料量是機器學習的一個先決條件。

吾嘗跂而望矣,不如登高之博見也

當使用梯度下降法訓練模型時,如果只是基於當前位置去做小步長迭代,很可能會陷入一個區域性最優解,而不是全域性最優解。一旦梯度下降方法陷入區域性最優解,就再也沒有辦法跳出區域性最優解。我們所做的每一個小決定,就像模型訓練中的一次次迭代,要放眼全域性考慮問題,而不能只看到眼前的一點點。

注:以上內容根據嘉賓寇冠東在資料俠線上實驗室的演講實錄整理。圖片來自其現場PPT,已經本人審閱。點選“閱讀原文”,獲取作者直播回放。