Leo Yeh's Blog

SAS 深度學習 (6)

教學目標

初步了解如何透過 CASL 程式碼以 CAS 動作建立和訓練深度學習模型的基本概念。

重點概念

首先 SAS 深度學習工具包是基於雲端分析服務的深度神經網路動作集合,所謂深度學習是指神經網路中使用的眾多隱藏層,然而深度學習的真正實質主要是能夠從來自具有多個隱藏層的神經網路的資訊增加提取率的方法,如果增加更多隱藏層卻沒有深度學習方法的支持,則神經網路的各層將對於有效提取資訊將無濟於事。此外 SAS 軟體具有構建神經網路的功能,主要是使用具有許多隱藏層的神經網路 NEURAL 程序已經有數十年了,而在許多隱藏層的情況下持續存在許多考量的關鍵因素,其中主要包括激活函數比常規激活函數更耐飽和、考慮輸入資訊量的權重初始化、新的丟失和批次處理正規化技術、基於快速移動梯度的優化、分散式運算的創新、… 等。至於深度學習主要在解決那些曾經認為無法解決的問題,基本上我們主要能夠針對深度學習三大類別的神經網路範例進行實機練習,至於常見用於深度學習的實機練習範例,請參考下表。

類別 範例
多層感知器 銀行行銷分類 (BANK MARKETING)
多層感知器 鳶尾花分類 (IRIS)
卷積神經網路 手寫數字識別 (MNIST)
卷積神經網路 圖像分類識別 (CIFAR-10)
循環神經網路 電影評論分類 (IMDB)
循環神經網路 餐廳評論分類 (Yelp)

接著我們將能夠透過 CASL 程式碼以 CAS 動作建立和訓練深度學習模型,一開始則必須先載入深度學習動作集,深度學習動作集主要包括 DNN、CNN 和 RNN 這三種類型的深度學習模型,僅需要第一次載入即可,請參以下 CASL 程式碼。

載入深度學習動作集

1
2
3
PROC CAS;
LoadActionSet 'DeepLearn';
RUN;

更進一步我們能夠針對不同類別的練習範例建立一個空的深度學習模型,通常 DNN 用於解決更一般分類問題, CNN 用於解決圖像分類問題, RNN 用於解決時間序列或文本分析問題,請參考以下 CASL 程式碼。

多層感知器

1
2
3
PROC CAS;
BuildModel/modeltable={name='model1'} type='DNN';
RUN;

卷積神經網路

1
2
3
PROC CAS;
BuildModel/modeltable={name='model1'} type='CNN';
RUN;

循環神經網路

1
2
3
PROC CAS;
BuildModel/modeltable={name='model1'} type='RNN';
RUN;

再來當我們建立空的深度學習模型之後,此時就能夠使用 AddLayer 動作將數個圖層增加到模型中,第一個是輸入層,主要會以 TYPE 選項設為 INPUT , DROPOUOT 選項設定丟失率,並且在每個完全連接的隱藏層使用 NAME 選項設定隱藏層名稱,TYPE 選項設為 FULLCONNECT, ACT 選項設為 ReLU 激活函數 ,INIT 選項設為 Xavier 權重初始化方法,SRCLAYERS 選項指示與傳入連接有關的來源層,最後一個是輸出層,主要會以 TYPE 設為 OUTPUT,ACT 選項設為 Logstic 激活函數 ,請參考以下 CASL 程式碼。

1
2
3
4
5
6
7
PROC CAS;
AddLayer/model='DNN' name='inputlayer' layer={type='INPUT' std='std' dropout='0.05'};
AddLayer/model='DNN' name='layer1' layer={type='FULLCONNECT' n=15 act='RELU' init='xavier' dropout=0.05} srcLayer={'inputlayer'};
AddLayer/model='DNN' name='layer2' layer={type='FULLCONNECT' n=10 act='RELU' init='xavier' dropout=0.05} srcLayer={'layer1'};
AddLayer/model='DNN' name='layer3' layer={type='FULLCONNECT' n=5 act='RELU' init='xavier' dropout=0.05} srcLayer={'layer2'};
AddLayer/model='DNN' name='outputlayer' layer={type='OUTPUT' act='LOGISTIC'} srcLayers={'layer3'};
RUN;

其中 Xavier 初始化是深度學習中最常見的權重初始化之一,使用的初始化方法主要是隨機且具有方差, 但是 Xavier 初始化的潛在缺點則是初始化方法是假定線性激活函數,在隱藏單元中通常不是這種情況。此時 MSRA 初始化方法主要考慮到 ReLU 激活函數,因為在非零均值的假設下執行激活函數產生的輸出,並且 MSRA 初始化方法的標準化隨機高斯分佈,此外 MSRA 的第二種變體,稱為 MSRA2,其與 MSRA 初始化類似,但是 MSRA2 初始化方法的標準化隨機高斯分佈不同。至於 RELU 激活函數主要是是分段線性變換,當組合使用時可以近似非線性函數,對於 RELU 有效區域輸出的導數變換的結果是 1 ,非活動區域為 0 ,RELU 的非活動區域可以將轉換視為轉換的弱點,因為它會抑制單位為基於梯度的學習做出貢獻,此時我們將能夠透過巧妙地初始化權重來避免 RELU 的飽和負輸出值,像是在考慮針對圖像資料建模的業務場景,每個非標準輸入像素值的範圍在 0 到 255 之間,在這種情況下,權重可以是初始化並嚴格限制為正值,以避免產生負值,避免 RELU 的無效輸出區域,至於 RELU 的其他變體可以使學習在組合函數解析為負值。

最後當我們已經建立完全連接模型之後,此時就能夠透過資料訓練模型,此時就會使用 dlTrain 動作用於訓練模型,其中 TABLE 選項設為有載入到 CAS 中的訓練資料集的名稱, MODEL 選項設為主要建立模型的名稱,MODELWEIGHTS 選項為所建立模型中每個執行週期 (Epochs) 的權重資料表,BESTWEIGHTS 選項為以及對最佳權重資料表,請參考以下 CASL 程式碼。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PROC CAS;
dlTrain/table='trainData' model='DNN'
modelWeights={name='trainedweights_d',replace=1}
bestWeights={name='bestweights',replace=1}
optimizer={minibatchsize=60,algorithm={method='ADAM',
lrpolicy='Step',
gamma=0.5,
stepsize=10,
beta1=0.9,
beta2=0.999,
learningrate=0.001}
regL1=0.003,
regL2=0.002,
maxepochs=50
}
seed=12345;
RUN;

此外透過資料訓練模型時,更包括優化選項,像是使用 ADAM 方法最小批次為 60,學習率為 0.001,LRPOLICY 選項指定學習率策略為整個培訓過程中用於降低學習率。所謂 ADAM 方法主要是調整應用於每個模型參數的學習梯度,其基於先前觀察到的小批次梯度透過近似有關目標函數的資訊以進行自適應,在 ADAM 方法中引入了兩個混合新的超參數,分別為 Beta1 值和 Bata2 值,使用可調整的 Beta 值近似用於縮放步長的信噪比,當近似單噪聲比小,步長接近零,這是一個很好的功能,因為較低的單噪聲比表示較高的不確定性。若要使用 ADAM 方法,則要將 METHOD 選項設為 ADAM,並且 ADAM 的作者建議超參數 Beta1 值為 0.9 和 Beta2 值為 0.999 和學習率 Alpha 值為 0.001,請注意 ADAM 優化可估算用於縮放的信噪比步長,如果信噪比高,則會增加步長,反之如果信噪比低,則會減少步長。

相關資源

⬅️ Go back