В этом примере показано, как обучать сети глубокого обучения с различными инициализаторами веса.
При обучении сети глубокого обучения инициализация весов слоев и отклонений может оказать большое влияние на то, насколько хорошо работает сеть. Выбор инициализатора оказывает большее влияние на сети без уровней пакетной нормализации.
В зависимости от типа слоя, можно изменить веса и инициализацию смещения с помощью 'WeightsInitializer', 'InputWeightsInitializer', 'RecurrentWeightsInitializer', и 'BiasInitializer' варианты.
В этом примере показан эффект использования этих трех различных инициализаторов веса при обучении сети LSTM:
Glorot Initializer - инициализация входных весов инициализатором Glorot. [1]
He Initializer - инициализация входных весов инициализатором He. [2]
Narrow-Normal Initializer (Узко-нормальный инициализатор) - инициализация входных весов путем независимой выборки из нормального распределения с нулевым средним значением и стандартным отклонением 0,01.
Загрузите набор данных японских гласных. XTrain - массив ячеек, содержащий 270 последовательностей различной длины с характерной размерностью 12. Y - категориальный вектор меток 1,2,..., 9. Записи вXTrain представляют собой матрицы с 12 строками (по одной строке для каждого признака) и различным количеством столбцов (по одному столбцу для каждого временного шага).
[XTrain,YTrain] = japaneseVowelsTrainData; [XValidation,YValidation] = japaneseVowelsTestData;
Укажите архитектуру сети. Для каждого инициализатора используйте одну и ту же архитектуру сети.
Укажите размер ввода как 12 (количество элементов входных данных). Укажите уровень LSTM со 100 скрытыми единицами измерения и для вывода последнего элемента последовательности. Наконец, укажите девять классов, включив полностью соединенный слой размера 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');
Укажите сетевую архитектуру, указанную выше в примере, и установите для инициализатора входных весов уровня 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);

Укажите сетевую архитектуру, указанную выше в примере, и установите для инициализатора входных весов уровня LSTM и инициализатора весов полностью подключенного уровня значение 'he'.
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last','InputWeightsInitializer','he') fullyConnectedLayer(numClasses,'WeightsInitializer','he') softmaxLayer classificationLayer];
Выполните обучение сети с использованием уровней с помощью инициализаторов He weights.
[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')

Этот график показывает общий эффект различных инициализаторов и то, как быстро тренинг сходится для каждого.
Глорот, Ксавье и Йошуа Бенгио. «Понимание сложности обучения глубоким нейронным сетям». В материалах тринадцатой международной конференции по искусственному интеллекту и статистике, стр. 249-256. 2010.
Он, Каймин, Сянъу Чжан, Шаоцин Жэнь и Цзянь Сунь. «Углубляясь в выпрямители: Превосходя показатели человеческого уровня по классификации имаженетов». В трудах международной конференции IEEE по компьютерному зрению, стр. 1026-1034. 2015.
trainingOptions | trainNetwork