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 可以搭配得很好。其他的:
- 從 ReLU 開始
- 如果需要做得更好,嘗試 Leaky ReLU
- 最後的手段:PReLU、Maxout
- Swish 真正深度的網路
CNN(卷積神經網路)
當資料沒有整齊地排列在column中時,像是:
- 在圖像中尋找特徵
- 機器翻譯
- 句子分類
- 情緒分析
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神經元
另一種看待它的方式:
一層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 — 資料處理
- 從 S3 複製資料
- 啟動資料處理容器-這是由SageMaker 內建或由使用者自己客製的
- 將處理後的資料輸出到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中,有兩種部署方式:
- Real time:
根據需要進行單獨預測的運行端點(也就是有一個endpoint) - Batch
使用SageMaker Batch Transform以取得整個資料集的預測
其他可用選項:
- 用於更複雜處理的Inference Pipelines
- 用於部署到邊緣設備的 SageMaker Neo
- 用於加速深度學習模型的Elastic Inference
- 自動縮放(根據需要增加endpoints數量)
- Shadow Testing根據目前部署的模型會來評估新模型以捕獲錯誤