收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

Jinkey發表於2019-02-28

0 引言

  • 為了尊重原意,部分名詞不進行翻譯。
  • 為了更通俗易懂的解釋概念,使用低維度的情況來解釋。

1 機器學習概念

1.1 主要術語

標籤

預測的事物,即 y = ax + b 中的 y 變數,如房價、動物種類、是否垃圾郵件等。

特徵

輸入變數,即 y = ax + b 中的 x 變數,x 可以是一個,也可以是多個,用 {x1, x2, ..., xn} 組成的向量來表示。比如 電子郵件的文字字詞、郵箱地址、傳送時間等

樣本

具體某一個示例,比如一封郵件。 有標籤樣本:郵件(x) + 是否垃圾郵件(y) 無標籤樣本:郵件(x)

模型

模型定義了特徵與標籤之間的關係。

簡單的理解為 y = ax + b 中的 a和 b。

訓練:輸入(0, 1) , (1, 3) , (2, 5) 求出 a = 2, b = 1

預測:輸入 x = 10, 推斷出 y = 10*2 +1 = 13

迴歸

預測連續值, 如:

  • 加利福尼亞州一棟房產的價值是多少?
  • 使用者點選此廣告的概率是多少?

分類

預測離散值, 如:

  • 某個指定電子郵件是垃圾郵件還是非垃圾郵件?
  • 這是一張狗、貓還是倉鼠圖片?
  • 這是 Jinkey(公眾號 jinkey-love) 寫的文章還是其他人寫的文章?

損失

預測值和目標值的差距。

左側模型的損失較大;右側模型的損失較小。
一種常見的損失函式就是我們的義務教育階段都學過的"兩點間的直線距離",其中 x1=x2:
收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

1.2 降低損失

大家都玩過猜數字遊戲,主持人出一個 1-100 內的數字,其他人輪流猜測,玩家 A 提出一個數字,主持人只會說大了還是小了。這個過程靠猜測不停地逼近真實值(也就是不停地縮小損失的過程)

Gradient Descent 其中一個常見的降低損失的方法就是梯度下降(Gradient Descent),用高中知識就可以理解了。

假如損失函式 loss = x^2 + 2x + 1 的梯度函式就是 loss' = 2x + 2

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

假如一開始輸入x 等於 -3, -2, -1, 1, 2, 3,y’即梯度分別等於 -4, -2, 0, 2, 4,所以如果輸入的樣本是(-2, ?) 則梯度下降的方向就是從 -2 -> -1 移動,如果輸入的樣本是 (2, ?)就是從 -2 -> -1 來降低損失函式的值,慢慢移動到 -1 得到了損失函式的極小值。

看到這裡你是否覺得直接通過高中的知識求導得到極小值就可以了?

但如果變數不止一個,如果上述垃圾郵件樣本包含的特徵:文字內容包含“貸款”的數量、郵箱地址、傳送時間等等,損失函式就可能是三維甚至多維的,存在一個或多個“區域性最低小”,並且導數或偏導數不能求出的情況下,只能通過“有技巧地猜數字”來逼近真實值:

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創
梯度下降方法有 隨機梯度下降 SGD小批量梯度下降 mini-batch SGD。至於具體差異,本文不展開說明,谷歌的教程也是為了速成。一般採用 mini-batch SGD 會更加高效。

你可能會問不知道演算法怎麼寫程式碼? 在谷歌的 Tensorflow 框架裡面,梯度下降就是一行程式碼而已, 所以初學者有個初步概念即可:

tf.train.GradientDescentOptimizer()
複製程式碼

Learning Rate

上面所說

-2 -> -1 來降低損失函式的值

這裡引入了學習率的概念-2到-1移動說明學習率是1。如果從-2移動到-1.8,學習率則是0.2。

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

學習率太大容易跳過最小值(or 極小值),如藍線所示,學習率太小導致學習時間很長。

學習率 Playground:

https://developers.google.com/machine-learning/crash-course/fitter/graph

1.3 過擬合

損失很低,但仍然是糟糕的模型,因為過度擬合了訓練集資料,導致在測試集或訓練集等新樣本上效果很差。

過擬合

1.4 拆分資料

訓練集和測試集 (Training and Test Sets)

  • 訓練集 - 用於訓練模型的子集。
  • 測試集 - 用於測試訓練後模型的子集。

訓練集和測試集 Playground:

https://developers.google.cn/machine-learning/crash-course/training-and-test-sets/playground-exercise

某些情況下為了防止不小心在訓練過程引入對測試集的擬合,引入驗證集(就是把資料分成三份)

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

1.5 特徵工程

所有型別的資料,最終都要轉換為數字的形式,計算機才能學習。使用的特徵要注意:

  • 在資料集中出現大約 5 次以上,比如不能用資料的唯一 id 作為特徵
  • 具有清晰明確的含義
  • 不包含超出範圍的異常斷點或“神奇”的值,比如電影評分為 -1 或 NaN
  • 特徵的定義不應隨時間發生變化,比如地點:北京是固定的,但不要用地點:219

特徵組合 Playground:

https://developers.google.cn/machine-learning/crash-course/feature-crosses/playground-exercises

1.5.1 資料型別

數值資料

離散資料(直接用或者先離散化)0、1、2 連續資料 0.001、0.2、1.0、2.2

文字資料

作為分類標籤

{'Netherlands', 'Belgium', 'Luxembourg'} 轉換為 {0, 1, 2}

作為自然語言學習

A = “Jinkey 是中國人”

B = “Jinkey 是中國的學生”

A + B 的詞列表:(Jinkey, 是, 中國, 人, 的, 學生)

如果具有某個詞就用1表示、不具有就用0表示,這樣就把 A 表示成:

A = (1, 1, 1, 1, 0, 0)

B = (1, 1, 1, 0, 1, 1)

影象資料

彩色圖片是分開 RGBA 四通道的值作為圖片特徵,灰度圖把灰度作為圖片特徵,黑白圖黑色的畫素為1白色為0。

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

1.5.2 資料清洗

縮放特徵值

有一個特徵 A (欄位)的值是500000, 有一個特徵B(欄位)的值是0.1,這時候需要根據所有樣本的 A 特徵的最大值和最小值把特徵值縮放到[0, 1]之間:

縮放值 = (真實值 - 平均值)/ 標準差

處理極端值

  • 對每個值取對數
  • 對大於某個值的特徵值進行截斷,比如 (1, 2, 3, 666, 2,3)-> (1, 2, 3, 3, 2,3)

分箱

其實就是把數值離散化成一個個區間,然後用某個符號來標識

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創
比如緯度37.4可以轉換成兩種形式:

  • 6(第6個區間)
  • [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0] (作為一個11維張量,37.4屬於第6個區間,所以為1) 這種方式也成為 one-hot 編碼(具有一個特徵為1,否則為0)

特徵組合

特徵組合是指通過將兩個或多個輸入特徵相乘來對特徵空間中的非線性規律進行編碼的合成特徵。 [A X B]:將兩個特徵的值相乘形成的特徵組合。 [A x B x C x D x E]:將五個特徵的值相乘形成的特徵組合。 [A x A]:對單個特徵的值求平方形成的特徵組合。

其他

  • 遺漏值。 例如,有人忘記為某個房屋的年齡輸入值。
  • 重複樣本。 例如,伺服器錯誤地將同一條記錄上傳了兩次。
  • 不良標籤。 例如,有人錯誤地將一顆橡樹的圖片標記為楓樹。
  • 不良特徵值。 例如,有人輸入了多餘的位數,或者溫度計被遺落在太陽底下。

1.5.3 正則化

L2 正則

為什麼要正則化? 懲罰複雜的模型(過擬合的模型)

機器學習訓練目標是損失函式最小化,如果複雜模型也算是一種損失,那麼可以把模型複雜度加入到損失函式的公式裡面。

如何衡量一個模型的複雜程度? 各變數權重的平方和(L2正則)

效果:

  • 使權重值接近於 0(但並非正好為 0)
  • 使權重的平均值接近於 0,且呈正態(鐘形曲線或高斯曲線)分佈

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

Lambda正則係數

在正則項前加係數 Lambda,其對權重的影響如圖:

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

lambda 值過高 -> 模型會非常簡單 -> 欠擬合 lambda 值過低 -> 模型會非常複雜 -> 過擬合

L1 正則

為什麼有 L2 正則 還要 L1 正則

L2 正則化可以使權重變小,但是並不能使它們正好為 0.0,這樣高維度特徵向量會消耗大量的記憶體

L1 正則項是絕對值

正則化 Playground:

L2 https://developers.google.cn/machine-learning/crash-course/regularization-for-simplicity/playground-exercise-overcrossing

L1 https://developers.google.cn/machine-learning/crash-course/regularization-for-sparsity/playground-exercise

1.6 邏輯迴歸 (Logistic Regression)

怎麼分析一個句子屬於褒義還是貶義? 把從句子推倒出(褒義詞數量,貶義詞數量)二維向量做為特徵 X,把人工標記的特徵標為 Y,就進行邏輯迴歸。

比如我們有一系列人工標記的樣本:

罩杯 腿長(m) 是否美女
A 0.4
A 1.0
C 0.5
C 1.0
D 1.2
D 0.4

通過一個神奇的公式,機器學習到一些規律,比如機器學習到罩杯是 C 的女生是美女的概率為0.5; 腿長 為 1m 的女生被判斷為美女的概率是 0.5。

當輸入一個新的樣本,系統就能根據學習到的模型1 / (1+exp(w0+w1*x1+w2*x2+...+wm*xm)),算出新加入的女生屬於美女的概率是多少,比如說算出來是0.6的概率,那麼如果定義閾值為 0.5, 那麼0.6>0.5,所以就認為她是個美女。

0.5 稱為分類閾值 classification threshold,為了將邏輯迴歸值(是美女的概率)對映到二元類別(是美女/不是美女),您必須指定分類閾值。

邏輯迴歸的損失函式

和線性迴歸採用平方損失不同,邏輯迴歸的損失函式是對數損失函式Log Loss,定義如下

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創
入門的你,你大可不必記住這個公司,因為在 tensorflow 裡面要使用這個損失函式,只需要一行程式碼:

loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=model_output, labels=y_target))

混淆矩陣 Confusion Matrix

對於二分類,我們使用混淆矩陣來表示所有可能的分類結果。

名詞 解析
真正例 模型將正類別樣本正確地預測為正類別
真負例 模型將負類別樣本正確地預測為負類別
假正例 模型將負類別樣本錯誤地預測為正類別
假負例 模型將正類別樣本錯誤地預測為負類別

以《狼來了》的故事為例:

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

精確率 Precision

在被識別為正類別的樣本中,確實為正類別的比例是多少?

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

召回率 Recall

在所有正類別樣本中,被正確識別為正類別的比例是多少?

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

精確率和召回率往往是此消彼長的情況。也就是說,提高精確率通常會降低召回率值

ROC 曲線 Receiver Operating Characteristic Curve, 用於繪製採用不同分類閾值時的 TPR 與 FPR。

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

AUC 面積 ROC 曲線下面積,Area under the ROC Curve。

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

1.7 神經網路

為什麼有邏輯迴歸等傳統機器學習方法還要神經網路?

處理非線性問題(y = ax + b 這種叫做線性模型)

彩色小球代表神經元

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

神經網路 Playground:

https://developers.google.cn/machine-learning/crash-course/introduction-to-neural-networks/playground-exercises

1.7.1 啟用函式

把y = ax + b的 結果作為自變數輸入啟用函式: f(ax+b) 來作為神經元的輸出值

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

1.7.2 訓練神經網路

方法:反向傳播

具體過程你可以拿起筆,自己按照本文作者(公眾號jinkey-love)之前翻譯的文章來推演一遍:《用筆一步步演示人工神經網路的反向傳播演算法——Jinkey 翻譯》

可能出現的異常:

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創
上圖是之前網路很流行的圖,說每天進步一點點,一年就會有很大收穫;每天退步一點點,一年就會落後很多。這裡就可以引出梯度消失梯度爆炸的概念。

梯度消失 在深度網路中,計算這些梯度時,可能涉及許多小項的乘積

當較低層的梯度逐漸消失到 0 時,這些層的訓練速度會非常緩慢,甚至不再訓練。

梯度爆炸 網路中的權重過大,則較低層的梯度會涉及許多大項的乘積

在這種情況下,梯度就會爆炸:梯度過大導致難以收斂。

批標準化可以降低學習速率,因而有助於防止梯度爆炸。

隨機失活 Dropout

在梯度下降法的每一步中隨機丟棄一些網路單元。丟棄得越多,正則化效果就越強:

  • 0.0 = 無丟棄正則化
  • 1.0 = 丟棄所有內容。模型學不到任何規律
  • 0.0 和 1.0 之間的值更有用

1.7.3 多類別神經網路

收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創

二分類 多分類
硬幣正面 40%,反面 60% 貓 20%, 狗 50%, 猴 30%
概率和為 1 概率和為 1
啟用函式為Sigmoid 啟用函式為Softmax

1.7.4 巢狀 (Embedding)

高維空間向低維空間的轉換,用於計算兩個實體的相似度。 比如電影類別有科幻、成人、卡通 那麼, 《小豬佩奇》就可以轉換成one-hoting編碼(0,0,1) 《星球大戰》就可以轉換成one-hoting編碼(1,1,0) 《喜愛夜蒲》就可以轉換成one-hoting編碼(0,1,0)

《小豬佩奇》和《星球大戰》的距離3,《星球大戰》和 《喜愛夜蒲》的距離為1,所以當一個使用者看了電影《星球大戰》,可以給他推薦《喜愛夜蒲》而不是《小豬佩奇》。

2 機器學習工程

2.1 生產環境機器學習系統

  • 儘可能重複使用常規機器學習系統元件。
  • Google CloudML 解決方案包括 Dataflow 和 TF Serving
  • 可以在 Spark、Hadoop 等其他平臺中找到元件
  • 瞭解機器學習系統的一些範例及其要求,找到自己需要哪些元件?

2.2 訓練方法

靜態模型 - 離線訓練

  • 易於構建和測試 - 使用批量訓練和測試,對其進行迭代,直到達到良好效果。
  • 仍然需要對輸入進行監控
  • 模型容易過時

動態模型 - 線上訓練

  • 隨著時間推移不斷為訓練資料注入新資料,定期同步更新版本。
  • 使用漸進式驗證,而不是批量訓練和測試
  • 需要監控、模型回滾和資料隔離功能
  • 會根據變化作出相應調整,避免了過時問題

2.3 預測方法

離線預測

使用 MapReduce 或類似方法批量進行所有可能的預測。 記錄到表格中,然後提供給快取/查詢表。

優點

  • 不需要過多擔心推理成本。
  • 可以使用批量方法。
  • 可以在推送之前對資料預測執行後期驗證。

缺點

  • 只能對我們知曉的資料進行預測,不適用於存在長尾的情況。
  • 更新可能延遲數小時或數天。

線上預測

使用伺服器根據需要進行預測。

優點

  • 可在新專案加入時對其進行預測,非常適合存在長尾的情況。
  • 計算量非常大,對延遲較為敏感,可能會限制模型的複雜度。 缺點
  • 監控需求更多。

2.4 資料依賴關係

可靠性

訊號是否始終可用?訊號來源是否不可靠?

比如

  • 訊號是否來自因負載過重而崩潰的伺服器?
  • 訊號是否來自每年 8 月去度假的人群?

版本控制

計算此資料的系統是否發生過變化?

比如

  • 多久一次?
  • 您如何知道系統發生變化的時間?

必要性

特徵的實用性是否能證明值得新增此特徵?

相關性

是否有任何特徵密不可分,以至於需要採取額外策略來梳理它們?

反饋環

一個模型是否會影響另一個模型 比如兩個股價預測模型為例:

  • 模型 A - 不理想的預測模型
  • 模型 B

由於模型 A 有誤,因此會導致錯誤地決定購買股票 X 的股票,而購買這些股票會抬高股票 X 的價格。模型 B 將股票 X 的股價用作輸入特徵,因此它很容易對股票 X 的價值得出錯誤結論。然後,模型 B 會根據模型 A 的錯誤行為購買或銷售股票 X 的股份,反過來,模型 B 的行為會影響模型 A,而這樣很可能會觸發鬱金香狂熱效應或導致 X 公司的股價下滑。

3 機器學習系統在現實世界裡的應用

3.1 癌症預測

特徵:病人年齡、性別、 醫療狀況、醫院名稱、生命體徵、檢驗結果

預測:是否會患有癌症

以上設定存在什麼問題?

模型中包含的一個特徵是醫院名稱,比如"癌症中心"等專門治療癌症的機構,已經暗含了在醫生的診斷結論,這叫做標籤洩露**。當模型嘗試取代醫生去判斷新樣本時(還未就醫 ),模型無法得知該資訊,導致預測的結果非常糟糕。

3.2 文學

特徵:文學語句

預測:作者的政治派別

以上設定存在什麼問題?

當我們建立測試訓練和驗證拆分內容時, 我們是通過逐句拆分樣本來實現的。也就是說,同一個作者的語句會一部分會被編入訓練集,一部分會編入測試集,這導致訓練的模型可以瞭解某個作者在語言使用方面的特質, 而不僅僅是瞭解他使用的隱喻手法。所以應該在作者的層面,這個作者的所有語句要麼都作為訓練集,要麼都作為測試集。

3.3 機器學習準則

  • 確保第一個模型簡單易用
  • 著重確保資料管道的正確性
  • 使用簡單且可觀察的指標進行訓練和評估
  • 擁有並監控您的輸入特徵
  • 將您的模型配置視為程式碼:進行稽核並記錄在案
  • 記下所有實驗的結果,尤其是“失敗”的結果

程式設計練習

Pandas 簡介

使用 TensorFlow 的起始步驟

合成特徵和離群值

驗證:程式設計練習

特徵集:程式設計練習

特徵組合程式設計練習

邏輯迴歸程式設計練習

稀疏性和 L1 正則化:程式設計練習

神經網路簡介:程式設計練習

提高神經網路效能:程式設計練習

MNIST 數字分類程式設計練習

巢狀程式設計練習

原文連結

https://jinkey.ai/post/tech/shou-cang-!836fen-zhong-de-gu-ge-ji-qi-xue-xi-jiao-cheng-dai-ni-10fen-zhong-kan-wan

本文作者 Jinkey(微信公眾號 jinkey-love,官網 https://jinkey.ai) 文章允許非篡改署名轉載,刪除或修改本段版權資訊轉載的,視為侵犯智慧財產權,我們保留追求您法律責任的權利,特此宣告!

相關文章