跳到主要內容

ML |【ML Study Jam 機器學習培訓計劃】課程心得 其二

前一篇文章當中,我摘要了 Coursera 上【ML Study Jam 機器學習進階培訓計劃】訓練課程當中的前兩部課程的重點,而另外三部課程的重點彙整,就集結在這篇文章當中!
1. How Google does Machine Learning
2. Launching into Machine Learning
3. Intro to TensorFlow
4. Feature Engineering
5. Art and Science of Machine Learning

【Intro to TensorFlow】

如題,該部課程介紹近幾年來最火紅的開源 ML 開發工具:TensorFlow。內容不外乎是 TensorFlow 在資料科學模型建構上的優勢、再來介紹其變數、語法,以及非常重要的 Estimator API,這項 Estimator API 是 TensorFlow 1.3 版本之後才有的功能,它能讓使用者可以更快速、方便的建構的模型。我個人認為 TensorFlow 它最強的優勢在於,它的語法和 Python 有 87% 像,這讓許多對於 Python 有一定水準的使用者們能夠快速上手。
除了上述內容之外,該課程也示範如何使用 BigQuery 來進行分散式訓練(Distributed Training),這對於要建構較大規模的 ML 模型、或者有龐大訓練資料的訓練過程,非常有幫助。

【Feature Engineering】

接著,可以說是這一系列課程當中,我最喜歡的一項。我的資料科學啟蒙之路,是從資料分析這個領域發跡的,特徵工程(Feature Engineering)這個主題,可以說是資料科學和資料分析這兩個領域當中,交集最大的一個項目之一。該課程主要回答了以下的問題:
  1. 何謂特徵?
  2. 何謂特徵工程?
  3. 何謂組合特徵?
所謂特徵(Feature),如其名,就是資料當中具有代表性、能夠挖掘出更多潛在價值的資料欄位、或者特定的資料分佈狀態、變化趨勢等等,在統計學領域當中,也稱為「變數」(Variable) 而特徵工程,就是從原始資料當中,找出潛在特徵的一系列方法及過程。
這個章節當中,有許多觀念和統計學其實十分相近。但 ML 的特徵工程與統計學的變數處理,無論在觀念還是處理方法上,還是有些差異。其中一個最重要的差異即是,統計學在處理樣本資料時,會將極端值捨去。但 ML 則允許資料當中存在極端值。容我引用一下課程內容:
  • ML = lot of data, keep outliers and build models for them
  • Statistics = “I’ve got all the data I’ll ever get”, throw away outliers

接著我們進一步來看 ML 特徵工程的一些細部方法,這裡提及的方法包含:Bucket、Scaling、Embedding、One-hot-encoding 等等。而實作的工具,這裡則是使用 Apache BeamCloud Dataflow 來建立起整個數據處理的串接流程

# Feature Crosses

課程的後半部介紹到了另一個特徵工程的重點:特徵交叉(Feature Crosses,或稱特徵組合)
簡單地說,就是在模型當中變數相乘、或者將單獨的變數賦予高次方,藉而創造出新的特徵。這種方法可以簡化資料的複雜度、但是提高模型的彈性。
但 Feature Crosses 也非萬靈丹,過度使用 Feature Crosses 有可能導致模型產生「過適」的情形。為了避免該情形發生,通常會將模型的複雜度,添加到模型的損失函數當中,以在模型的複雜度(complexity)與泛用性(generalizability)之間取得平衡。


【Art and Science of Machine Learning】

作為本系列課程的壓軸,該部課程的重點著重在教導學員,如何建構出一個客製化的 Deep Learning 模型。課程的一開始會先介紹,如何對模型 Regularization,再介紹 Hyperparameter(超參數)與 parameter。筆者在觀看這部分課程的時候,就產生了一個很大的疑問:

在機器學習領域,Generalization、Regularization、Normalization、Standardization 這四樣流程到底有什麼差異

簡單來說,可以區分成以下兩類:
Normalization 和 Standardization 是針對數據的前置處理,從而使數值都落入到統一的數值範圍,從而在建模過程中,各個特徵量沒差別對待。消除一些數值差異帶來的特種重要性偏見,加快訓練速度,促進演算法的收斂。
Regularization 是在損失函數(Loss function 或稱為 Cost function)裡面加入懲罰項,增加建模的模糊性,從而把捕捉到的趨勢從局部細微趨勢,調整到整體大概趨勢。雖然一定程度上的放寬了建模要求,但是能有效防止過適的問題,並增加模型準確性。
而我在前一篇文章當中即有提到,Generalization 是對模型的普適化,是指透過各式方法來增進模型對於新數據時,依舊能保有一定程度的準確度,並避免過適的情況發生。廣義而言,Regularization、Normalization、Standardization都包含在 Generalization 的範圍內。
而針對 Normalization,當中提到的是 L1 與 L2 Normalization,更詳細的說明與比較,可以參考下列連結:


# Hyperparameter vs parameter

Hyperparameter 這個概念對於純粹商管領域的朋友們可能會比較陌生,它和一般的parameter又有甚麼差異?簡單來說,兩者最大的差異為是否由訓練階段學習而來?

課程當中就進一步提到,在 Deep Learning 當中如何透過調整 Learning rates 與資料的 Batch size 來改善模型。


課程的後半部,專注在訓練Deep Learning模型的一些細節,尤其在使用梯度下降法(Gradient descent)尋求最適解的時候,這一塊的內容細節稍多,我就借用課程當中提到的一個彙整表格來介紹這部份:


Problem
Gradient can vanish
Gradient can explore
ReLu layers can die
Insight
Each additional layer can successively reduce signal vs. noise
Learning rates are important here
Monitor fraction of zero weight in TensorFlow
Solution
Using ReLu interested of sigmoid/tanh can help
Batch normalization (useful knob) can help
Lower your learning rates

--

作為本系列課程的心得總結,我想該課程帶給我最大的收穫,就是我從當中瞭解到 Google Cloud Platform、TensorFlow、Deep Learning、Big Query、Cloud Dataflow、Apache Beam 等工具大致上的使用方法,以及對 Deep Learning 有個更完整的認識 這不是廢話嗎???。

這樣的心得內容對我而言一點也不理所當然,我自己的資料科學之路,是從資料分析這個領域發跡,再加上我主要的資歷科學啟蒙工是 R 與 SQL。雖然 Python 的語法的可讀性很高,但是「看得懂」與「能夠自己寫出來」是兩碼子事,再加上本系列課程實質上介紹的是如何透過上述工具與平台、來建立一個完整的資料科學架構與流程,這當中會需要一點數據工程(Data Engineering)的先備知識,對於並非正統 IT 背景的我,仍需要花較多的時間,來理解諸如 Cloud Dataflow、Apache Beam 的操作細節。

另一點是方法論的部分,本系列課程所主打的是Deep Learning,但這套機器學習方法,正好就是我過去較少接觸的部分(或者說,刻意不去接觸)。對於 Deep Learning 與 Python,過去我的想法是,「既然大家都會,而且都搶著做這一塊,那我為什麼要去跟人家擠這一塊?尤其我還是在先天條件不足的情況下?不如我把我較熟悉的、較擅長的那一塊練好,專門做這一塊。」

於是,工具部份我選擇了 R;機器學習方法論的部分我選擇了 Bayesian Network、SVM、K-mean、Logistic Regression、以及我本身最熟悉的 Operation Research 領域開始摸索。但過去半年多來的求職經驗告訴我,要在同一個圈子裡討飯吃,大家都懂的東西,你最好也懂一點,正是因為市場當中有那樣的工作需求,才會有那麼多的人才供給 還有一缸子聽起來很炫砲但不見得多有用的補習班課程跟講座