比较层权重初始化函数
此示例说明如何使用不同权重初始化函数来训练深度学习网络。
在训练深度学习网络时,层权重和偏置的初始化会对网络训练的效果产生重大影响。初始化函数的选择对没有批量归一化层的网络的影响更大。
根据层的类型,您可以使用 'WeightsInitializer'
、'InputWeightsInitializer'
、'RecurrentWeightsInitializer'
和 'BiasInitializer'
选项更改权重和偏置初始化。
此示例说明在训练 LSTM 网络时使用以下三种不同权重初始化函数的效果:
Glorot 初始化函数 - 用 Glorot 初始化函数初始化输入权重。[1]
He 初始化函数 - 用 He 初始化函数初始化输入权重。[2]
窄正态初始化函数 - 通过从零均值和标准差为 0.01 的正态分布中独立采样来初始化输入权重。
加载数据
加载日语元音数据集。XTrain
是包含 270 个不同长度序列的元胞数组,特征维数为 12。Y
是标签 1、2、...、9 的分类向量。XTrain
中的条目是具有 12 行(每个特征一行)和不同列数(每个时间步一列)的矩阵。
[XTrain,YTrain] = japaneseVowelsTrainData; [XValidation,YValidation] = japaneseVowelsTestData;
指定网络架构
指定网络架构。对于每个初始化函数,使用相同的网络架构。
将输入大小指定为 12(输入数据的特征数量)。指定具有 100 个隐含单元的 LSTM 层,并输出序列的最后一个元素。最后,通过包含大小为 9 的全连接层,后跟 softmax 层和分类层,来指定九个类。
numFeatures = 12; numHiddenUnits = 100; numClasses = 9; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer]
layers = 5x1 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 5 '' Classification Output crossentropyex
训练选项
指定训练选项。对于每个初始化函数,使用相同的训练选项来训练网络。
maxEpochs = 30; miniBatchSize = 27; numObservations = numel(XTrain); numIterationsPerEpoch = floor(numObservations / miniBatchSize); options = trainingOptions('adam', ... 'ExecutionEnvironment','cpu', ... 'MaxEpochs',maxEpochs, ... 'MiniBatchSize',miniBatchSize, ... 'GradientThreshold',2, ... 'ValidationData',{XValidation,YValidation}, ... 'ValidationFrequency',numIterationsPerEpoch, ... 'Verbose',false, ... 'Plots','training-progress');
Glorot 初始化函数
指定在示例前面部分列出的网络架构,并将 LSTM 层的输入权重初始化函数和全连接层的权重初始化函数设置为 'glorot'
。
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last','InputWeightsInitializer','glorot') fullyConnectedLayer(numClasses,'WeightsInitializer','glorot') softmaxLayer classificationLayer];
使用具有 Glorot 权重初始化函数的层来训练网络。
[netGlorot,infoGlorot] = trainNetwork(XTrain,YTrain,layers,options);
He 初始化函数
指定在示例前面部分列出的网络架构,并将 LSTM 层的输入权重初始化函数和全连接层的权重初始化函数设置为 'he'
。
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last','InputWeightsInitializer','he') fullyConnectedLayer(numClasses,'WeightsInitializer','he') softmaxLayer classificationLayer];
使用具有 He 权重初始化函数的层来训练网络。
[netHe,infoHe] = trainNetwork(XTrain,YTrain,layers,options);
窄正态初始化函数
指定在示例前面部分列出的网络架构,并将 LSTM 层的输入权重初始化函数和全连接层的权重初始化函数设置为 'narrow-normal'
。
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last','InputWeightsInitializer','narrow-normal') fullyConnectedLayer(numClasses,'WeightsInitializer','narrow-normal') softmaxLayer classificationLayer];
使用具有窄正态权重初始化函数的层来训练网络。
[netNarrowNormal,infoNarrowNormal] = trainNetwork(XTrain,YTrain,layers,options);
绘制结果
从 trainNetwork
函数的信息结构体输出中提取验证准确度。
validationAccuracy = [ infoGlorot.ValidationAccuracy; infoHe.ValidationAccuracy; infoNarrowNormal.ValidationAccuracy];
对于未计算验证准确度的迭代,验证准确度向量包含 NaN
。删除 NaN
值。
idx = all(isnan(validationAccuracy)); validationAccuracy(:,idx) = [];
对于每个初始化函数,绘制轮次编号对验证准确度的图。
figure epochs = 0:maxEpochs; plot(epochs,validationAccuracy) title("Validation Accuracy") xlabel("Epoch") ylabel("Validation Accuracy") legend(["Glorot" "He" "Narrow-Normal"],'Location','southeast')
该图显示了不同初始化函数的整体效果,以及每个初始化函数的训练收敛速度。
参考书目
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.
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.
另请参阅
trainNetwork
| trainingOptions