1. 程式人生 > >DAGNN:有向無環圖神經網路

DAGNN:有向無環圖神經網路

1.綜述:

DagNN是用來代替SimpleNN的CNN wrapper。它是面向物件的,並且允許採用有向無環圖構建神經網路。與SimpleNN相比,DagNN速度有點慢但是更加靈活。

一個DAG物件包括以下資料成員:

  • layers: 神經網路層

  • vars: 網路變數

  • params: 網路引數

  • meta: 額外的補充資訊

同時,DAG還包括有一些臨時的資料成員:

  • mode [normal] : 這個標誌可以是“normal”或者“test”。在後面一種情況,某些模組轉向測試模式,適合驗證和評估;
  • accumulateParamDer [false] : 如果設定為“true”,那麼網路引數的導數就會被累計,而不是在下次計算時重寫;
  • conserveMemory [true] : 如果這個標記位設定為“true”,DagNN將會丟棄中間變數值,一旦在計算過程中不再需要它們;
  • device [cpu] : 這個標誌的意思是,DagNN駐留在CPU記憶體中或者GPU記憶體中,使用 DagNN.move()可以在裝置之間移動DagNN。

2. DAGNN相關函式

2.1 初始化為空

obj = DagNN() %初始化為空的DAGNN結構體

2.2  獲取網路輸入變數的名字

inputName = getInputs(obj) % 獲取網路輸入的名字

返回一個cell型別的輸入組合。

2.3 獲取網路輸出變數的名字

outputName = getOutputs(obj); % 獲取網路輸出名稱

2.4 獲取網路層索引

index = getLayerIndex(obj, layerName); % 根據神經網路層的名字獲取索引,用於網路評價;

obj.layers(index); % 用於網路評價

% 返回如下資訊
% name = 'DCF'
% inputs = {'x', 'z'}
% outputs = {'response'}
% params = {}
% inputIndexsx = [7,14]
% outputIndexes = 15
% paramIndexes = []
% forwardTime = 0.6927
% backwardTime = 0.2452
% block = [1x1 dagnn.DCF]

2.5 獲取網路變數的索引

index = getVarIndex(obj, varName); % 返回指定變數名的索引

obj.vars(index); % 對變數進行評價

% 返回如下資訊
% name = 'conv1'
% value = []
% der = []
% fanin = 1
% fanout = 1
% precious = 0

2.6 獲取引數的索引

index = getParamIndex(obj, paramName); % 指定引數名獲取引數的索引號

obj.params(index);

% 返回如下資訊:
% name = 'conv1f'
% value =  3x3x1x32 gpuArray
% der = 3x3x1x32 gpuArray
% fanout = 2
% trainMethod = 'gradient'
% learningRate = 0.01
% weightDecay = 0.0005

2.7 層、變數、引數拷貝

layer = getLayer(obj, layerName); %

var = getVar(obj, varName); %

param = getParam(obj, paramName); %
getLayerExecutionOrder(obj);

% 例如,孿生網路:
% 1    2 —— 3    4 —— 5     6 —— 13 —— 14 —— 15
% |    |    |    |    |     |
% 7 —— 8    9 —— 10   11 —— 12
% 

2.8 新增變數、引數、層

addVar(obj, varName);

addParam(obj, paramName);

addLayer(layerName, layer, input, output, params);

3. 評價DAGNN

eval(obj, inputs); % 指定輸入值,評價DAGNN。
% 輸入應該是cell矩陣,如 input = {'inputName', inputValue, ...},該語句的呼叫將導致網路的正向資訊傳遞;並計算輸出變數的值;

eval(obj, inputs, derOutputs); % 評價DAGNN前向和反向,執行誤差反向傳播演算法。
% 和inputs很類似,的人Outputs也是cell矩陣,{‘outputName’, outputDerValue, ...};

4. 理解反向傳播

4.1 損失函式權重分配層

通常,對應到損失函式,網路從表來那個的輸入開始進行反向傳播。在這種情況下,outputDerValue可以解釋為輸出的權重,通常設定為1.例如, {‘objective’, 1}。從‘objective’輸出變數(權重為1)開始反向傳播。

然而,很多情況下DAGNN會包括很多損失函式,在這種情況下,就需要設定不同的權重去平衡不同的目標,例如:{‘objective1’, w1, 'objective2', w2, ... }

4.2 影響evaluation的因素

  1. 評價模式可以是‘normal’ 或者 ‘test’; 在不同模式下,行為是不一樣的。例如,在‘test’模式下,Dropout變成一個 Pass-through層; batch normalization使用固定的動量(通常極大提高了測試的效能);
  2. 在預設情況下,DAG會主動採用節省記憶體模式 conserve memory。對於GPU來說這是至關重要的,因為GPU的資源很稀缺。然而,這也意味著,在訓練過程中,大多數的變數值和他們的導數都被丟棄了。 為了便於除錯,這些中間變數有時對我們很重要, 在這種情況下,我們可以設定 obj.conserveMemory = false; 當然,我們也可以利用 obj.vars(v).precious = true 進行中間變數儲存。