AWS-ML認證筆記 — Domain 3 Part 1

Modeling建模(佔考試的36%)

任務一:定義業務問題成為ML問題

  • 決定何時使用與不使用ML
  • 理解監督式與非監督式學習
  • 從分類(classification)、迴歸(Regression)、預測(Forecasting)、聚類(Clustering)、推薦(Recommendation)和基礎模型中進行選擇

任務二: 對於特定的ML問題選擇正確的模型

  • XGBoost、logistic regression, k-means、linear regression、決策樹、隨機森林樹、RNN、CNN、ensemble、transfer learning與 LLM(large language models)
  • 表達模型背後的概念

任務三: 訓練ML模型

  • 在訓練和驗證之間分割資料。如,Cross validation
  • 了解 ML 訓練的最佳化技術。如梯度下降(gradient descent)、損失函數(loss functions)、收斂(convergence)
  • 選擇正確的運算資源。如CPU?GPU?,分布式?非分布式?。選擇正確的運算平台,如Spark或非Spark
  • 更新與維持模型。Btach或Real time的方式

任務四:進行超參數優化(hyperparameter optimization)

  • 正規化(regularization) — Dropout/L1/L2
  • Cross-validation
  • 初始化模型
  • 理解"神經網路架構(Layers and nodes)、learning rate與啟動函數(Activation functions)"
  • 理解tree-based模型(有多少顆樹,樹有幾層)
  • 理解線性模型(linear models) — learning rate

任務五:評估ML模型

  • 避免過度擬合(overfitting)或低擬合(underfitting)。所以需要處理偏差(bias)或變異(variance)
  • 評估指標(metrics)。如AUC(area under curve)、ROC(receiver operating characteristics)、準確度(accuracy)、精確度(precision)、recall、RMSE(Root Mean Square Error)、F1 score
  • 進行 cross-validation

深度學習基礎與AWS最佳實踐

所謂的神經網路:

  • 大腦皮層中的神經元透過軸突(axons)連接
  • 當足夠的輸入訊號被啟動時,神經元會向與其連接的神經元「發射電流」
  • 在單一神經元層面上非常簡單,但以這種方式連接的神經元層可以產生學習行為
  • 數十億個神經元,每個神經元有數千個連接,所以產生了一個思想

皮質柱(Cortical columns):

  • 皮層中的神經元被排列成許多堆疊(stacks)或“columns”,能平行處理訊息
  • 大約 100 個神經元的「mini-columns」被組織成更大的hyper-columns」。人類的皮質有 1 億個mini-columns

而 GPU 的作業方式與人類神經元運作非常相似…

深度神經網路

深度學習框架

  • Tensorflow / Keras
  • MXNet
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=30))
model.add(Dropout(0.6))
model.add(Dense(128, activation='relu')) model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

神經網路的類型

  • Feedforward Neural Network
  • CNN(Convolutional Neural Networks) — 圖像分類
  • RNN(Recurrent Neural Networks) — LSTM、GRU
    處理一種有時間序列的資料,例如預測幣圈走勢、理解語句中的詞彙、翻譯等等

啟動函數(Activation Functions)

一種資料輸入所定義的"節點/神經元"的輸出

Linear activation Function

它並沒有真正“做”任何事情,並且無法進行反向傳播(backpropagation)。

Binary step function

只分"有"或"沒有",所以無法處理多重分類(multiple classification) — — 畢竟它是二元的(Binary)。垂直斜率不適用於微積分。相反,我們需要非線性啟動函數:

  • 這些可以在輸入和輸出之間建立複雜的映射(mapping)
  • 允許反向傳播(backpropagation)。因為它們有著能用的導數(derivative)
  • 允許多層(multiple layers)。線性函數退化為single layer

Sigmoid / Logistic / TanH

將所有一切縮放到 0到1(Sigmoid/Logistic)或 -1 到1(tanh/hyperbolic tangent)。但是:高值或低值變化緩慢,而且有“梯度消失”問題,這樣進一步導致運算成本昂貴。

ReLU(Rectified Linear Unit)

多數人會選的,因為運算容易且快速。但是,當輸入為零或負數時,我們就會遇到線性函數及其所有問題 — “Dying ReLU 問題”。

Leaky ReLU

透過引入低於 0 的負斜率(通常沒有這麼陡)來解決“Dying ReLU”問題

(PReLU)Parametric ReLU

ReLU,但負部分的斜率是透過反向傳播學習的(backpropagation),但複雜。

其他ReLu變異方式

  • ELU(Exponential Linear Unit)
  • Swish
    來自Google,效能非常好。主要是非常深的網路(40層以上)的效益
  • Maxout
    輸出(output)的是輸入(input)的最大值。從技術上講,ReLU 是 maxout 的一個特例。但需要訓練的參數加倍,通常不實用。

Softmax(重要-會考)

  • 用於多類別分類(multi-class classification)問題的最終輸出層
  • 基本上將輸出轉換為每個分類的機率
  • 無法為某事物產生多個標籤(sigmoid 可以)

不要擔心考試的實際函數,只要知道它的用途就好

啟動函數的選擇

對於多重分類(multiple classification),在輸出層使用softmax。而RNN 與 Tanh 可以搭配得很好。其他的:

  1. 從 ReLU 開始
  2. 如果需要做得更好,嘗試 Leaky ReLU
  3. 最後的手段:PReLU、Maxout
  4. Swish 真正深度的網路

CNN(卷積神經網路)

當資料沒有整齊地排列在column中時,像是:

  • 在圖像中尋找特徵
  • 機器翻譯
  • 句子分類
  • 情緒分析

CNN可以找到不在特定位置的特徵,就像圖片中的停車標誌一樣
或句子中的單字 — 它們是“特徵位置不變”。

CNN作業原理

這是受到視覺皮層生物學的啟發:

  • 局部感受區域(Local receptive fields)是一組神經元,僅對眼睛看到的部分內容做出反應(subsampling)
  • 它們相互重疊以覆蓋整個視野(convolutions)

它們進入更高層次來識別逐漸複雜的圖像

  • 一些receptive fields會辨識水平線、不同角度的線等(filters)
  • 這些將輸入到識別形狀的層次中
  • 這可能會進入識別對象的層次

對於彩色影像,光之三原色的額外圖層。從一張圖片中,我們如何告知機器我們要尋找圖片中一個特定的綠色物品呢?

  • 各個”local receptive fields”掃描影像尋找邊緣,並拾取圖層中特定物品的邊緣
  • 這些邊緣又被更高等級的convolution拾取,辨識特定物品的形狀(以及字母,如果有的話)
  • 然後,該形狀與我們想要尋找的特定物品的模式相匹配,同時還使用來自綠色層的強綠色信號
  • 這些資訊不斷向上處理,直到我們停下來

CNN 與 Keras / Tensorflow

  • 來源資料必須具有適當的維度 — 即width x length x color channels
  • Conv2D 層類型在 2D 影像上進行實際convolution — Conv1D 和 Conv3D 也可用 — 不一定是影像資料
  • MaxPooling2D 層可用於透過取特定block中的最大值來減少 2D 層
  • 扁平化層(Flatten layers)會將 2D 層轉換為 1D 層,以便傳遞到神經元的hidden layer
  • 典型用法:
    Conv2D -> MaxPooling2D -> Dropout -> Flatten -> Dense -> Dropout -> Softmax

CNN是困難的

  • 需要大量資源(CPU、GPU 和 RAM)
  • 很多超參數
    核心大小、具有不同數量單元的多個層…除了層數、優化器選擇等常見內容之外
  • 取得訓練資料通常是最困難的部分 (以及儲存和存取它)

專門的 CNN 架構

定義層次、padding和超參數的具體排列

  • LeNet-5 — 用於於手寫識別
  • AlexNet — 影像分類,比LeNet更多層
  • GoogleNet
    — 更多層,但效能更好
    — 導入初始模組(groups of convolution layers)
  • ResNet((Residual Network)
    更深層 — — 透過skip connections來保持效能

RNN(Recurrent Neural Networks)

時間序列資料:

  • 當我們想根據過去的行為預測未來的行為時,例如網路日誌、感測器日誌、股票交易。或是根據過去的軌跡將自動駕駛汽車駕駛到哪裡

由任意長度的序列組成的資料,如:

  • 機器翻譯
  • 圖片說明
  • 機器生成的音樂

一個recurrent神經元

另一種看待它的方式:

稱為 Memory Cell

一層recurrent神經元:

RNN topologies

  • Sequence to sequence
    如根據一系列歷史資料預測股票價格
  • Sequence to vector
    如句子中表達情感的單字
  • Vector to sequence
    如即從圖片中建立標題
  • Encoder -> Decoder
    Sequence -> vector -> sequence,即機器翻譯

訓練RNN

  • 隨時間反向傳播(Backpropagation)
    就像 NLP 上的反向傳播一樣,但應用於每個time step
  • 所有這些time step加起來很快
    — 最終看起來就像一個非常非常深層的神經網路。
    — 可以將反向傳播限制為有限數量的time step(透過時間截斷反向傳播)

早期time steps的狀態會隨著時間的推移而被稀釋,這可能是一個問題,例如在學習句子結構時

  • LSTM(Long Short-Term Memory) Cell
    保持單獨的短期和長期狀態
  • GRU Cell
    Gated Recurrent Unit
    效能差不多的簡化版 LSTM Cell

這真很困難,就像薛西弗斯一樣。因為RNN對拓樸、超參數的選擇非常敏感,且需要大量的運算資源。而錯誤的選擇可能導致 RNN運算根本無法收斂。

現代NLP(Natural Language Processing)

Transformer 深度學習架構(如BERT、RoBERTa、T5、GPT-2 等)採用「self-attention」機制:

  • 權衡輸入資料各部分的重要性
  • 處理順序資料(如單詞、RNN),但同時處理整個輸入
  • Attentation機制提供了上下文,因此不需要一次處理一個單字。

而DistilBERT:使用知識蒸餾(knowledge distillation)將模型大小減少 40%。

Transfer Learning

  • NLP 模型(和其他模型)太大太複雜,無法從頭開始建造並每次都重新訓練,可能有幾千億個參數。
  • Hugging Face 等Model zoos提供預訓練模式作為起點。透過 Hugging Face 深度學習容器與 Sagemaker 整合。
  • 我們可以根據自己的狀況微調這些模型

範例: BERT(會考)

  • Hugging Face 為 BERT 提供DLC(Deep Learning Container)
  • 它已在 BookCorpus 和 Wikipedia 上進行了預訓練

我們可以透過transfer learning使用自己的附加訓練資料微調(fine-tune) BERT(或 DistilBERT 等)。將我們的訓練資料標記為相同的格式,只需開始用我們的資料進一步訓練它,較低learning rate。

Transfer Learning方法

繼續訓練預訓練模型((fine-tuning),用於微調模型,該模型的訓練資料量比我們以往有的要多得多。使用較低的learning rate來確保我們只是逐步優化模型。

將新的trainable layers添加到frozen model的頂部,學習將舊特徵轉化為對新資料的預測。可以兩者兼得:新增層,然後fine tune。如果從頭開始重新訓練,如果我們有大量的訓練資料,而且它與模型預訓練的資料根本不同。

深度學習的EC2/EMR選擇

EMR支援Apache MXNet與GPU instance type。針對深度學習的適合的Instance type:

  • P3: 8 Tesla V100 GPU’s
  • P2: 16 K80 GPU’s
  • G3: 4 M60 GPU’s (all Nvidia chips)
  • G5g: AWS Graviton 2 processors / Nvidia T4G Tensor Core GPU’s(EMR尚未支援),也可以用在Android game streaming
  • P4d — A100 “UltraClusters” for supercomputing

另外也有針對深度學習的AMI提供。

Trn1 instances:

  • Powered by Trainium
  • Optimized for training (50% savings)
  • 800 Gbps of Elastic Fabric Adapter (EFA) networking for fast clusters
  • 提供更多的頻寬 (1600 Gbps)

Inf2 instances

  • Powered by AWS Inferentia2
  • Optimized for inference

調整神經網路

Learning Rate(會考)

神經網路透過是梯度下降(gradient descent)進行訓練。我們從某個隨機點開始,在多個epochs採樣不同的權重(weights),尋求最小化某些成本函數。這些樣本的距離就是learning rate。

會影響Learning rate的因素

  • learning rate太高意味著可能會超出最佳解決方案
  • learning rate太小會花太長時間找到最佳解
  • learning rate是超參數的一種

Batch size

Batch是指每個epoch的每個batch使用多少訓練樣本。這有點違反直覺:

  • 較小的batch可以比較少會有“local minima”
  • Batch太大可能最終會陷入錯誤的解決方案
  • 每個epoch的shuffling可能會使epoch之間每次的運行的結果看起來非常不一致

重點提示(很重要):

Small batch sizes往往不會陷入local minima

Large batch sizes可能會隨機收斂到錯誤的解決方案

大的learning rates可能會超出正確的解決方案

小的learning rates會增加訓練時間

神經網路正規化技術(Neural Network Regularization Techniques)

預防過度擬合(Overfitting):

  • 模型擅長對所訓練的資料進行預測,但不擅長對以前從未見過的新資料進行預測
  • 過度擬合的模型在訓練資料中學習到的模式無法推廣到現實世界
  • 通常被認為在訓練資料集上精確度較高,但在測試或評估資料集上精確度較低

正規化技術(Regularization Techniques)是防止過度擬合。而過多的神經層與神經元可能會產生過度擬合,所以可以使用Dropout方法。

也可以用Early Stopping

梯度的問題

梯度消失(Vanishing Gradient)

當梯度的斜率接近零時,訓練作業可能會就不會動了。而這樣我們可能會使用非常小的learning rate,這會減慢訓練速度,甚至產生數值錯誤。隨著這些「梯度消失」傳播到更深的層次,這成為更深網路和 RNN 的問題。而梯度消失的相反:“梯度爆炸”。

修復梯度消失

利用Multi-level heirarchy,將level分解為單獨訓練的子網路。如:

  • LSTM(Long short-term memory)
  • Residual Networks,即 ResNet,較短網路的整合
  • 或是更好地選擇啟動函數,如 ReLU

梯度檢查

這是一種debugging技術,對訓練期間計算的導數(derivatives)進行數值檢查。對於驗證神經網路訓練的代碼很有用,但我們可能不會寫這段代碼…

L1與L2正規化

一般來說,防止機器學習中的過度擬合。主要是在學習權重(weights)時加入正規化項。

L1是權重的總和:

L2 是權重的平方和:

同樣的想法可以應用在損失函數(loss functions)

L1與L2不同之處(會考):

L1 -權重的總和

  • 執行特徵選擇(feature selection) — 整個特徵變成 0
  • 運算效率很差
  • Sparse output

L2 — 權重平方和

  • 所有特徵仍然被考量,只是加權值有所不同
  • 運算效率高
  • Dense output

為何要用L1?

  • 特徵選擇可以降低維度。例如在 100 個特​​徵中,也許只有 10 個最終具有非零係數(non-zero coefficients)。由此產生的稀疏性(sparsity)可以彌補其運算效率低下的問題。但是,如果我們認為所有特徵都很重要,L2 可能是更好的選擇

混淆矩陣(Confusion Matrix)

有時候準確性(Accuracy)不代表事情的全貌。例如一種罕見疾病的測試,只要一直猜“否”,準確率可達 99.9%。所以我們需要了解以下四種術語:

  • true positives
  • true negative
  • false positives
  • false negatives.

混淆矩陣呈現的就是這四種組合。

例如以下是一個ML針對圖片是不是"狗"的圖片進行辨識後的結果:

圖一:混淆矩陣

另一種混淆矩陣的延伸

另一種來自AWS文件的範例

  • 每個class正確和錯誤預測的數量(從每個單元格的顏色推斷)
  • 每個class的F1數字
  • 真實class頻率:每個column的加總
  • 預測的class頻率:每個row的加總

Recall

Recall = True positives / (True positive + False negative)。

Recall也稱Sensitivity或True Positive rate或Completeness。正確預測的陽性(positive)百分比。這通常用在我們聚焦的是false negatives,該報時沒有報。例如詐欺偵測。

我們依上圖"圖一:混淆矩陣"的範例來計算Recall。

Recall = TP/(TP+FN),也就是5/(5+10) = 5/15 = 1/3 = 33%

Precision

Precision = True positives / (True positive + False positive)。

Precision也稱Correct Positives,是一種相關結果的百分比。這通常用在我們聚焦的是false positives。例如醫學篩檢、藥物測試。預測是有發病,但其實沒病。

我們依上圖”圖一:混淆矩陣”的範例來計算Precision。

Precision = TP/(TP+FP),5/(5+20) = 5/25 = 1/5 = 20%

其他指標

Specificity = TN / (TF + FP) = True negative rate

F1 score:

  • 2TP / (2TP+FP+FN)
  • 2 x[ (Precision x Recall) /(Precision + Recall)]

precision和sensitivity的調和平均值。這是我們聚焦precision AND recall時

RMSE(Root mean squared error):

  • 準確度量測
  • 只聚焦正確與錯誤的答案

對於regression tasks,AWS ML 使用業界標準RMSE指標。它是預測數字目標和實際數字答案(真實狀況)之間的距離度量。 RMSE 的值越小,模型的預測精度越好。預測完全正確的模型的 RMSE 為 0。

ROC(Receiver Operating Characteristic) Curve

  • 不同閾值設定下的positive rate(recall)與false positive。
  • 對角線上方的點代表良好的分類(優於隨機)
  • 理想的曲線只是左上角的一個點
  • 越向左上方越「彎曲」越好

AUC(Area Under the)

  • 等於分類器將隨機選擇的Positive instance排名高於隨機選擇的negative instance的機率
  • 0.5的ROC AUC是一個無用的分類器,1.0 是完美的
  • 比較分類器的常用指標

AWS ML 為二元分類模型提供了業界標準的準確度指標,稱為AUC。 AUC 衡量模型預測正例(Positive example)比負例(Negative example)得分更高的能力。因為它與score cut-off無關,所以我們可以從 AUC 指標了解模型的預測準確性,而無需選擇閾值。

AUC 指標傳回 0 到 1 之間的十進位值。接近 0.5 的值表示 ML 模型並不比隨機猜測好。接近 0 的值較不常見,通常表示資料有問題。本質上,接近 0 的 AUC 表示 ML 模型已經學習了正確的模式,但正在使用它們來做出與現實相反的預測(“0”被預測為“1”,反之亦然)。

P-R(Precision / Recall) Curve

曲線涵蓋的左下方面積越大越好。類似於ROC curve:

  • 但更適合資訊檢索問題
  • 如果在大量文件中搜尋少量相關內容,ROC 可能會得到非常小的值

隨機森林樹

  • 決策樹容易過度擬合
  • 因此,製作大量決策樹並讓它們都對結果進行投票
  • 這是一個隨機森林
  • 它們有何不同?

Bagging

  • 透過"random sampling with replacement"來產生 N 個新的訓練集
  • 每個resampled model都可以平行訓練

Boosting

  • 觀察值(Observations)被加權
  • 有些觀察值會更頻繁地加入到新的訓練集
  • 訓練是按順序的;每個分類器都會考量前一個分類器的成功

Bagging 與 Boosting的不同

  • XGBoost是最多人用的
  • Boosting 通常會產生更好的準確性(Accuracy)
  • 但 bagging 可以避免過度擬合(overfitting)
  • Bagging 更容易平行運算

所以,一切取決於我們的目標是甚麼。

AWS SageMaker

SageMaker 旨在處理整個機器學習工作流程。

SageMaker的訓練與佈署

SageMaker Notebook(底層是EC2):

  • S3資料存取
  • Scikit_learn、Spark、Tensorflow
  • 內建多種模型
  • 能夠啟動訓練實例
  • 能夠部署訓練有素的模型來進行大規模預測

SageMaker — 準備資料

  • 資料通常來自S3。理想的格式因演算法而異 — — 通常是 RecordIO / Protobuf
  • 也可以從 Athena、EMR、Redshift 和 Amazon Keyspaces DB 提取資料
  • Apache Spark 能與 SageMaker 整合
  • Scikit_learn、numpy、pandas 都可以在Notebook中使用

SageMaker — 資料處理

  1. 從 S3 複製資料
  2. 啟動資料處理容器-這是由SageMaker 內建或由使用者自己客製的
  3. 將處理後的資料輸出到S3

SageMaker — 訓練

首見建立一個training job:

  • 包含訓練資料的 S3 bucket的 URL
  • ML的運算資源
  • 用於輸出的 S3 bucket的 URL
  • ECR 訓練代碼的路徑

選項有:

  • 內艦訓練演算法
  • Spark MLLib
  • Custom Python Tensorflow / MXNet code
  • PyTorch, Scikit-Learn, RLEstimator
  • XGBoost, Hugging Face, Chainer
  • 自己客製的 Docker image
  • 從AWS marketplace買的演算法

佈署訓練完成的模型

模型通常儲存在S3中,有兩種部署方式:

  1. Real time:
    根據需要進行單獨預測的運行端點(也就是有一個endpoint)
  2. Batch
    使用SageMaker Batch Transform以取得整個資料集的預測

其他可用選項:

  • 用於更複雜處理的Inference Pipelines
  • 用於部署到邊緣設備的 SageMaker Neo
  • 用於加速深度學習模型的Elastic Inference
  • 自動縮放(根據需要增加endpoints數量)
  • Shadow Testing根據目前部署的模型會來評估新模型以捕獲錯誤

--

--

運用"雲端服務"加速企業的數位轉型願景
運用"雲端服務"加速企業的數位轉型願景

Written by 運用"雲端服務"加速企業的數位轉型願景

我們協助您駕馭名為"雲端運算"的怪獸,馴服它為您所用。諮詢請來信jason.kao@suros.com.tw. https://facebook.com/jason.kao.for.cloud

No responses yet