05.15 機器學習-我媽媽也能看懂的入門篇

內容導讀

機器學習打開了一個新世界的大門,我們不需告訴機器如何做,只需要給大量樣本,它就能自動從中發掘規律, 這也是一個哲學問題,改變人類思考問題的方式,將關注點從數學科學轉移到自然科學上,觀察不確定的未知世界,用統計信息而非邏輯來分析實驗結果 。下圖簡單的解釋了TensorFlow的工作原理,它就象我媽用的壓面機一樣,把和好的麵糰塞進去,攪拌幾下,可以擠壓出不同形狀的麵條: 刀削麵,掛麵等,粗細寬窄隨人。再寫一行代碼看看數據結構print(image.shape)得到輸出結果是(512, 512, 3), 這就是一個3階張量啊,說明這個圖片的高和寬都是512像素,有三個顏色通道。最後寫一行代碼看看數據結構的長度print(image.size)打印結果是786432,等於512x512x3, 多階數據扁平化以後TensorFlow才能線性的使用它。也就是說,機器要通過訓練集數據調參優化,overall_score的計算公式裡那些權重值都是我拍腦袋定出來的,一定不是最優組合,機器需要發現規律找到最合理的權重設置對未來的目標榴蓮做出最精準的預測。偏差值允許分類器代表的直線左右平移(右圖),它影響輸出,但並不和原始數據產生關聯。

前面幾篇文章可以算作是機器學習中計算機視覺處理的範疇但並未真正涉及到學習二字,現在開始準備寫一系列真正的學習相關的文章,還是主要和圖片識別相關,包括這個入門篇,手寫數字識別,時尚商品識別,魚類甚至是細分魚的品種的識別。

寫這篇文章也希望讓我媽也能看懂機器學習,所以力求從不同視角用大白話把這件事說清楚,文中也會盡量避免出現數學公式,如果我媽都能看懂,那麼非技術人員也就能看懂。正如一篇近日刷屏的文章提到那樣,真正的AI並未實現,現在無非是在做一些比較高效的統計概率分析工作而已,但是這已經足夠對各行各業帶來深遠影響,前提是非技術人員也能明白機器學習是怎麼回事,它能做什麼,能給業務場景創造什麼樣的價值。

機器學習打開了一個新世界的大門,我們不需告訴機器如何做,只需要給大量樣本,它就能自動從中發掘規律,這也是一個哲學問題,改變人類思考問題的方式,將關注點從數學科學轉移到自然科學上,觀察不確定的未知世界,用統計信息而非邏輯來分析實驗結果

因為後續文章會用到TensorFlow來計算,所以這裡先提一下。Google開源的TensofFlow是目前最流行的深度學習框架,在計算機視覺,音頻處理,自然語言處理,推薦系統等場景下都有廣泛應用,雖然深度學習框架有很多選擇,但我相信選擇最主流的框架是最安全的。

TensorFlow 按照字面理解就是張量(Tensor)流(Flow), 表示通過張量的流動來表達計算。下圖簡單的解釋了TensorFlow的工作原理,它就象我媽用的壓面機一樣,把和好的麵糰塞進去,攪拌幾下,可以擠壓出不同形狀的麵條: 刀削麵,掛麵等,粗細寬窄隨人。TensorFlow 的內核是數據流圖(Data Flow Graphs), 所有的變量和計算都是存儲在這個圖上,構建完這張圖後,打開一個會話(Session)就可以運行整張圖了。

機器學習-我媽媽也能看懂的入門篇

Tensor到底是什麼?

首先要明白什麼是張量(Tensor)。這個名詞起源於力學,它最初是用來表示彈性介質中各點應力狀態的,愛因斯坦的廣義相對論就是用張量語言來表述的,後來張量也成為了數學的一個重要分支學科。解釋張量之前,我們再看幾個名詞: 標量(Scalar), 向量(Vector)和矩陣(Matrix), 用我媽可以看懂的語言來描述,標量是點(即0階張量),向量是線(即1階張量),矩陣是平面(即2階張量),不僅於此,張量還可以有無窮多階的形式存在,3階張量就想象成三維空間吧,N階張量自然就是N維空間了。

之所以引入張量,是因為這是讓機器理解世間萬物的基礎,任何物體用機器的語言描述都是多維的特徵向量,為了形象的說明這個道理我們還是拿Playboy美女Lena圖片來做分析。

機器學習-我媽媽也能看懂的入門篇

寫兩行代碼打開圖片直接打印出來

import cv2

image = cv2.imread('C:/dev/lena_std.jpg')
print(image)

機器學習-我媽媽也能看懂的入門篇

原來在機器的理解中,這張圖片就是一大堆的數字的張量形式表達。每行有三個數字代碼的是每個像素點的顏色,RGB(紅綠藍)三種顏色。

再寫一行代碼看看數據結構
print(image.shape)


得到輸出結果是(512, 512, 3), 這就是一個3階張量啊,說明這個圖片的高和寬都是512像素,有三個顏色通道。如果是黑白圖片的話只有一個顏色通道,那麼用2階張量來描述即可。如果有多張彩色圖片則可以用4階張量來描述,加多一個圖片編號的維度即可。

最後寫一行代碼看看數據結構的長度
print(image.size)
打印結果是786432,等於512x512x3, 多階數據扁平化以後TensorFlow才能線性的使用它。

機器到底是怎麼學習的?

現在已經瞭解一個對象如何用數字化呈現讓機器可以理解和計算,可是到底機器學習是怎麼個學習法? 如何讓機器能夠通過自我學習判斷一張圖片是貓還是狗呢? 簡單來說就是通過已知數據預測未來,我買榴蓮比較多,買多了自然就有經驗什麼樣的榴蓮好吃。

機器學習-我媽媽也能看懂的入門篇

要挑選榴蓮第一個關心的問題是熟了沒有,不能買生榴蓮也不能買熟過頭的,所以先看開裂情況,要找開裂了一點點但裂口不能太大的,然後聞一聞氣味是否誘人,如果有發酵的味道就是熟過頭了。還可以捏一下尖刺,如果捏不動就是太生。

第二個問題是果肉多不多,主要看形狀,挑比較渾圓的可能肉包多一些。

第三個問題是肉質,挑果肉小的,顏色黃的,不能有水分。也可以聽聲辨認,狠狠地拍下果殼,邦邦聲的就好吃,哼哼聲的就不好。當然了,挑選的時候帶好創可貼。

有了這些經驗以後我就能預測一個榴蓮是否好吃,不是百分百準確但是概率比較高,如果要讓機器學會挑選榴蓮就要把我的經驗用機器能夠理解的語言傳遞給機器。因此我定義了三個評估指標,還定義了決定每個評估指標的關鍵因子。

成熟度: (裂口[無/小/大],氣味[無/香/發酵],硬度[軟/硬/適中])
飽滿度: (形狀[渾圓/長條/異形])
肉質: (顏色[黃/白],肉包大小[大/中/小], 聲音[邦邦/哼哼],溼度[乾燥/多水])

根據這些規則機器要對水果店裡的所有榴蓮掃描一次收集全部數據,通過計算得到一個量化分值,對榴蓮品質的好壞進行預測,分值越高的好吃的概率就越高。三個評估指標對於判斷一個榴蓮好壞的影響力有大有效小,如果我覺得肉質最重要,成熟度其次,飽滿度最次,那麼大概會有一個類似這樣的公式:

overall_score = 成熟度 * 0.3 + 飽滿度 * 0.2 + 肉質 * 0.5
這裡我假設了幾個權重值,因為肉質最重要因此權重最高,所有權重值的總和為1

同樣對於成熟度這個評估指標而言,關鍵因子也有主次之分,可能味道最靠譜,其次看裂口,最後看硬度,那麼成熟度的分值大概也有個公式:

maturity_score = 氣味 * 0.6 + 裂口 * 0.2 + 硬度 * 0.1

飽滿度和肉質的計算也類似,都代入overall_score的計算就是完整的公式。

overall_score = (味道 * 0.6 + 裂口 * 0.2 + 硬度 * 0.1) * 0.3 + (形狀 * 1) * 0.2 + (顏色 * 0.3 + 肉包大小 * 0.2 + 聲音 * 0.2 + 溼度 * 0.3) * 0.5

這個公式就是用來預測榴蓮好壞的模型,我以前購買過的榴蓮所擁有的數據就是訓練集,未來要預測的榴蓮數據就是測試集,訓練集數量越多代表經驗越豐富,預測也越準確。假設我以前購買過100個榴蓮,現在給它們編號生成100條記錄,包括所有特徵向量,還有我對這些榴蓮好壞的一個經驗評估分(好榴蓮3分,普通榴蓮2分,差榴蓮1分),也就是我把榴蓮的好壞分成三個檔次,把這個問題轉化成了一個分類問題。

這個表格裡有些字段屬性可能空缺,比如榴蓮沒有裂口的話很可能就聞不到氣味,看不到果肉顏色,更無從觀察果肉的溼度。你可能也會注意到有的特徵維度是冗餘的,即從其它特徵維度能推導出這些維度的屬性,比如裂口大則果殼肯定是軟的,那麼有可能這個冗餘特徵是一個無效因子。

機器學習-我媽媽也能看懂的入門篇

注意上表中所有特徵向量的屬性值在實際計算的時候也都會用數字來量化,比如形狀(圓型=1,長條=2, 異形=3)

不過先等一等,如果就用上面這個固定規律來計算榴蓮好壞算什麼機器學習,所謂機器學習是要通過訓練集的數據對公式的參數不斷進行調整以求最大化逼近目標。也就是說,機器要通過訓練集數據調參優化,overall_score的計算公式裡那些權重值都是我拍腦袋定出來的,一定不是最優組合,機器需要發現規律找到最合理的權重設置對未來的目標榴蓮做出最精準的預測。

前面寫了這麼多廢話才引入下面的機器學習第一公式,也是機器學習中最常見的公式,實際上就是線性分類函數(linear classifier),訓練分類器的目標就是求出(w,b)。

機器學習-我媽媽也能看懂的入門篇

d個特徵因子

一般用向量形式表達簡化為

機器學習-我媽媽也能看懂的入門篇

向量形式

w就是前面提到的權重設置的d維向量,b是bias, 即一個偏差值。為什麼還需要這個偏差值呢? 如果沒有偏差值,無論權重如何,在x=0時分類分值始終為0。這樣所有分類器的直線都不得不穿過原點(左圖),這顯然不合理,實際上絕大多數情況下這條線肯定不過原點。偏差值允許分類器代表的直線左右平移(右圖),它影響輸出,但並不和原始數據產生關聯。在右圖中,w就是直線的斜率,而b則是直線的位移。

機器學習-我媽媽也能看懂的入門篇

with and without bias

線性分類器主要由兩個部分組成:

一個是評分函數(score function),它是一個從原始圖像到類別分值的映射函數,就是我計算榴蓮overall_score的那個函數。另一個是損失函數(loss function),它是用來量化預測得到的分類標籤的得分與真實標籤之間的一致性, 評估算法的好壞,損失函數越小則預測結果越準。所以線性分類器可以轉化成為一個最優化問題,在最優化過程中,通過更新score function的參數來最小化loss function。上面的右圖中,所有紅點到直線的距離之和就是損失函數的誤差。我們的目標不是縮小某一個點和直線間的最大誤差,而是所有點和直線間的誤差最小,因此引入了方差的評估方式,即數據集上的L2損失。

機器學習-我媽媽也能看懂的入門篇

將方差值除以樣本的數量就可以得到均方差,也就是以前的文章中用來對比圖像的指標MSE

下面兩張圖中,左邊更符合預期,但是如果簡單的計算所有點到直線的距離之和就變成右邊損失更小,如果用方差來評估會發現左邊更優。

機器學習-我媽媽也能看懂的入門篇

損失函數評估

用我媽能看懂的話來說,要讓機器找到最準確的規律,判斷一個好的榴蓮到底是看熟不熟更重要,還是看果肉多不多重要,或者是看肉質好壞重要,三者之中的權重到底如何設定最佳,判斷熟不熟到底是觀察裂口靠譜還是聞味道或者試硬度靠譜,這幾個特徵的權重又該如何設置最好。當然了,我媽定義好榴蓮的標準和我可能不一樣,她也可以自己對過往的榴蓮數據做標註打上分數,重新訓練數據再去預測出符合她預期的結果。

用官話來總結,我定義了一個監督式機器學習的任務,因為規則是我提供的,標註也是我提供的。同時我已經生成了一個有標註的樣本,包含一百條歷史購買榴蓮的數據信息,其中既有榴蓮的特徵(氣味,硬度,顏色等),也有榴蓮品質的標註(1到3分)。我希望通過一個評分函數模型定義了特徵和標註之間的關係,讓機器逐漸學習和發現特徵與標註的關係完善模型,這是機器學習的核心。最終目標是對未來要購買的榴蓮進行

預測,找到最優的權重偏差組合,讓預測結果儘可能逼近真相。也就是讓預測的分值和我人工判斷的分值,也就是讓損失函數最小化, 損失函數的評估是L2方差。如果我預測榴蓮是需要分為三種離散值(好/普通/差),這就是一個分類模型,如果我預測榴蓮需要給出連續的分值(10分最高,0分最低,允許小數),這就是一個迴歸模型

最後說一下機器如何逼近真相將損失降到最低,先想想猜數字遊戲,讓朋友想一個1到100的數字不要說出來,我們去猜這個數字的時候可能會用二分法,先問這個數字是否小於50,小於50的話是否小於25,大於50的話是否大於75,就這麼經過幾次迭代離答案越來越近。機器也是這麼多次迭代找到答案的,關鍵點在於如何高效的找到答案,尤其是當我們有幾十萬數百萬數據集的時候。

迴歸問題可以映射到下圖中的曲線函數找最低點問題,最低點就是損失函數最小的解。通過計算整個數據集中 w 每個可能值的損失函數來找到收斂點這種方法效率太低,所以通過

梯度下降法來逼近,梯度具備兩個特徵: 方向和大小,即往哪個方向移動,每次移動的步長有多大。步長太小迭代速度慢,步長過大則可能衝過頭了。所以要看梯度的傾斜度來決定,如果梯度斜率很大,下降的很快,就縮小步長,否則可以放心使用較大的步長。

雖然樣本數可能非常多但是其中有很多冗餘樣本,所以拿樣本的子集來回歸可以加快學習速度,一個折中的方案是採取小批量隨機梯度下降法(SGD)來回歸, 每次迭代只抽樣拿少量樣本(10-1000)

機器學習-我媽媽也能看懂的入門篇

梯度下降

Reference:
1. Google 十幾天前新出的 Machine Learning Crash Course
2. 香港科技大學TensorFlow課件


分享到:


相關文章: