Main Content

比较层权重初始化函数

此示例说明如何使用不同权重初始化函数来训练深度学习网络。

在训练深度学习网络时,层权重和偏置的初始化会对网络训练的效果产生重大影响。初始化函数的选择对没有批量归一化层的网络的影响更大。

根据层的类型,您可以使用 WeightsInitializerInputWeightsInitializerRecurrentWeightsInitializerBiasInitializer 选项更改权重和偏置初始化。

此示例说明在训练 LSTM 网络时使用以下三种不同权重初始化函数的效果:

  1. 格罗洛特初始化函数 - 用格罗洛特初始化函数初始化输入权重。[1]

  2. He 初始化函数 - 用 He 初始化函数初始化输入权重。[2]

  3. 窄正态初始化函数 - 通过从零均值和标准差为 0.01 的正态分布中独立采样来初始化输入权重。

加载数据

加载日语元音数据集,该数据集包含不同长度的序列,特征维数为 12,标签分类向量为 1、2、...、9。序列是具有 12 行(每个特征一行)和不同列数(每个时间步一列)的矩阵。

load JapaneseVowelsTrainData
load JapaneseVowelsTestData

指定网络架构

指定网络架构。对于每个初始化函数,使用相同的网络架构。

将输入大小指定为 12(输入数据的特征数量)。指定具有 100 个隐含单元的 LSTM 层,并输出序列的最后一个元素。最后,通过包含一个大小为 9 的全连接层,后跟一个 softmax 层,来指定九个类。

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,OutputMode="last")
    fullyConnectedLayer(numClasses)
    softmaxLayer]
layers = 
  4x1 Layer array with layers:

     1   ''   Sequence Input    Sequence input with 12 dimensions
     2   ''   LSTM              LSTM with 100 hidden units
     3   ''   Fully Connected   9 fully connected layer
     4   ''   Softmax           softmax

训练选项

指定训练选项。对于每个初始化函数,使用相同的训练选项来训练网络。

maxEpochs = 30;
miniBatchSize = 27;
numObservations = numel(XTrain);
numIterationsPerEpoch = floor(numObservations / miniBatchSize);

options = trainingOptions("adam", ...
    ExecutionEnvironment="cpu", ...
    MaxEpochs=maxEpochs, ...
    InputDataFormats="CTB", ...
    Metrics="accuracy", ...
    MiniBatchSize=miniBatchSize, ...
    GradientThreshold=2, ...
    ValidationData={XTest,TTest}, ...
    ValidationFrequency=numIterationsPerEpoch, ...
    Verbose=false, ...
    Plots="training-progress");

格罗洛特初始化函数

指定在示例前面部分列出的网络架构,并将 LSTM 层的输入权重初始化函数和全连接层的权重初始化函数设置为 "glorot"

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,OutputMode="last",InputWeightsInitializer="glorot")
    fullyConnectedLayer(numClasses,WeightsInitializer="glorot")
    softmaxLayer];

使用具有格罗洛特权重初始化函数的 trainnet 函数来训练网络。

[netGlorot,infoGlorot] = trainnet(XTrain,TTrain,layers,"crossentropy",options);

He 初始化函数

指定在示例前面部分列出的网络架构,并将 LSTM 层的输入权重初始化函数和全连接层的权重初始化函数设置为 "he"

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,OutputMode="last",InputWeightsInitializer="he")
    fullyConnectedLayer(numClasses,WeightsInitializer="he")
    softmaxLayer];

使用具有 He 权重初始化函数的层来训练网络。

[netHe,infoHe] = trainnet(XTrain,TTrain,layers,"crossentropy",options);

窄正态初始化函数

指定在示例前面部分列出的网络架构,并将 LSTM 层的输入权重初始化函数和全连接层的权重初始化函数设置为 "narrow-normal"

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,OutputMode="last",InputWeightsInitializer="narrow-normal")
    fullyConnectedLayer(numClasses,WeightsInitializer="narrow-normal")
    softmaxLayer];

使用具有窄正态权重初始化函数的层来训练网络。

[netNarrowNormal,infoNarrowNormal] = trainnet(XTrain,TTrain,layers,"crossentropy",options);

绘制结果

trainNetwork 函数的信息结构体输出中提取验证准确度。

validationAccuracy = [
    infoGlorot.ValidationHistory.Accuracy,...
    infoHe.ValidationHistory.Accuracy,...
    infoNarrowNormal.ValidationHistory.Accuracy];

对于未计算验证准确度的迭代,验证准确度向量包含 NaN。删除 NaN 值。

idx = all(isnan(validationAccuracy));
validationAccuracy(:,idx) = [];

对于每个初始化函数,绘制轮次编号对验证准确度的图。

figure
epochs = 0:maxEpochs;
plot(epochs,validationAccuracy)
ylim([0 100])
title("Validation Accuracy")
xlabel("Epoch")
ylabel("Validation Accuracy")
legend(["Glorot" "He" "Narrow-Normal"],Location="southeast")

该图显示了不同初始化函数的整体效果,以及每个初始化函数的训练收敛速度。

参考书目

  1. Glorot, Xavier, and Yoshua Bengio."Understanding the difficulty of training deep feedforward neural networks."In Proceedings of the thirteenth international conference on artificial intelligence and statistics, pp. 249-256. 2010.

  2. He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun."Delving deep into rectifiers:Surpassing human-level performance on imagenet classification."In Proceedings of the IEEE international conference on computer vision, pp. 1026-1034. 2015.

另请参阅

| |

相关主题