exponenta event banner

Инициализация обучаемых параметров для функции модели

При обучении сети с использованием слоев, графиков слоев или dlnetwork , программное обеспечение автоматически инициализирует обучаемые параметры в соответствии со свойствами инициализации уровня. При определении модели глубокого обучения как функции необходимо инициализировать обучаемые параметры вручную.

Инициализация обучаемых параметров (например, весов и отклонений) может оказать большое влияние на то, как быстро сходится модель глубокого обучения.

Совет

В этом разделе объясняется, как инициализировать обучаемые параметры для модели глубокого обучения, определяющей функцию в индивидуальном цикле обучения. Чтобы узнать, как задать инициализацию обучаемого параметра для уровня глубокого обучения, используйте соответствующее свойство уровня. Например, для установки инициализатора весов convolution2dLayer объект, используйте WeightsInitializer собственность.

Инициализации слоев по умолчанию

В этой таблице показаны инициализации по умолчанию для обучаемых параметров для каждого уровня, а также ссылки, показывающие, как инициализировать обучаемые параметры для функций модели с помощью одной и той же инициализации.

СлойОбучаемый параметрИнициализация по умолчанию
convolution2dLayerВесаИнициализация Glorot
УклонИнициализация нулей
convolution3dLayerВесаИнициализация Glorot
УклонИнициализация нулей
groupedConvolution2dLayerВесаИнициализация Glorot
УклонИнициализация нулей
transposedConv2dLayerВесаИнициализация Glorot
УклонИнициализация нулей
transposedConv3dLayerВесаИнициализация Glorot
УклонИнициализация нулей
fullyConnectedLayerВесаИнициализация Glorot
УклонИнициализация нулей
batchNormalizationLayerСмещениеИнициализация нулей
МасштабИнициализация единиц
lstmLayerВходные весаИнициализация Glorot
Повторяющиеся весаОртогональная инициализация
УклонИнициализация литника Unit Forget
gruLayerВходные весаИнициализация Glorot
Повторяющиеся весаОртогональная инициализация
УклонИнициализация нулей
wordEmbeddingLayerВесаГауссова инициализация, со средним значением 0 и стандартным отклонением 0,01

Размеры обучаемых параметров

При инициализации обучаемых параметров для функций модели необходимо указать параметры правильного размера. Размер обучаемых параметров зависит от типа операции глубокого обучения.

ОперацияОбучаемый параметрРазмер
batchnormСмещение

[numChannels 1], где numChannels - количество входных каналов

Масштаб

[numChannels 1], где numChannels - количество входных каналов

dlconvВеса

[filterSize numChannels numFilters], где filterSize является 1-by-K вектор, задающий размер фильтра, numChannels - количество входных каналов, numFilters - количество фильтров, и K - количество пространственных измерений

Уклон

Одно из следующих:

  • [numFilters 1], где numFilters - количество фильтров

  • [1 1]

dlconv (сгруппировано)Веса

[filterSize numChannelsPerGroup numFiltersPerGroup numGroups], где filterSize является 1-by-K вектор, задающий размер фильтра, numChannelsPerGroup - количество входных каналов для каждой группы, numFiltersPerGroup - количество фильтров для каждой группы, numGroups - количество групп, и K - количество пространственных измерений

Уклон

Одно из следующих:

  • [numFiltersPerGroup 1], где numFiltersPerGroup - количество фильтров для каждой группы.

  • [1 1]

dltranspconvВеса

[filterSize numFilters numChannels], где filterSize является 1-by-K вектор, задающий размер фильтра, numChannels - количество входных каналов, numFilters - количество фильтров, и K - количество пространственных измерений

Уклон

Одно из следующих:

  • [numFilters 1], где numFilters - количество фильтров для каждой группы.

  • [1 1]

dltranspconv (сгруппировано)Веса

[filterSize numFiltersPerGroup numChannelsPerGroup numGroups], где filterSize является 1-by-K вектор, задающий размер фильтра, numChannelsPerGroup - количество входных каналов для каждой группы, numFiltersPerGroup - количество фильтров для каждой группы, numGroups - количество групп, и K - количество пространственных измерений

Уклон

Одно из следующих:

  • [numFiltersPerGroup 1], где numFiltersPerGroup - количество фильтров для каждой группы.

  • [1 1]

fullyconnectВеса

[outputSize inputSize], где outputSize и inputSize - количество выходных и входных каналов соответственно

Уклон

[outputSize 1], где outputSize - количество выходных каналов

gruВходные веса

[3*numHiddenUnits inputSize], где numHiddenUnits - количество скрытых блоков операции и inputSize - количество входных каналов

Повторяющиеся веса

[3*numHiddenUnits numHiddenUnits], где numHiddenUnits - количество скрытых блоков операции

Уклон

[3*numHiddenUnits 1], где numHiddenUnits - количество скрытых блоков операции

lstmВходные веса

[4*numHiddenUnits inputSize], где numHiddenUnits - количество скрытых блоков операции и inputSize - количество входных каналов

Повторяющиеся веса

[4*numHiddenUnits numHiddenUnits], где numHiddenUnits - количество скрытых блоков операции

Уклон

[4*numHiddenUnits 1], где numHiddenUnits - количество скрытых блоков операции

Инициализация Glorot

Инициализатор Глорота (также известный как Ксавье) [1] отсчитывает веса из равномерного распределения с границами [6No + Ni, 6No + Ni], где значения No и Ni зависят от типа операции глубокого обучения.

ОперацияОбучаемый параметрНетNi
dlconvВеса

prod(filterSize)*numFilters, где filterSize является 1-by-K вектор, содержащий размер фильтра, numFilters - количество фильтров, и K - количество пространственных измерений

prod(filterSize)*numChannels, где filterSize является 1-by-K вектор, содержащий размер фильтра, numChannels - количество входных каналов, и K - количество пространственных измерений

dlconv (сгруппировано)Веса

prod(filterSize)*numFiltersPerGroup, где filterSize является 1-by-K вектор, содержащий размер фильтра, numFiltersPerGroup - количество фильтров для каждой группы, и K - количество пространственных измерений

prod(filterSize)*numChannelsPerGroup, где filterSize является 1-by-K вектор, содержащий размер фильтра, numChannelsPerGroup - количество входных каналов для каждой группы, и K - количество пространственных измерений

dltranspconvВеса

prod(filterSize)*numFilters, где filterSize является 1-by-K вектор, содержащий размер фильтра, numFilters - количество фильтров, и K - количество пространственных измерений

prod(filterSize)*numChannels, где filterSize является 1-by-K вектор, содержащий размер фильтра, numChannels - количество входных каналов, и K - количество пространственных измерений

dltranspconv (сгруппировано)Веса

prod(filterSize)*numFiltersPerGroup, где filterSize является 1-by-K вектор, содержащий размер фильтра, numFiltersPerGroup - количество фильтров для каждой группы, и K - количество пространственных измерений

prod(filterSize)*numChannelsPerGroup, где filterSize является 1-by-K вектор, содержащий размер фильтра, numChannelsPerGroup - количество входных каналов для каждой группы, и K - количество пространственных измерений

fullyconnectВесаКоличество выходных каналов операцииКоличество входных каналов операции
gruВходные веса3*numHiddenUnits, где numHiddenUnits - количество скрытых блоков операцииКоличество входных каналов операции
Повторяющиеся веса3*numHiddenUnits, где numHiddenUnits - количество скрытых блоков операцииКоличество скрытых блоков операции
lstmВходные веса4*numHiddenUnits, где numHiddenUnits - количество скрытых блоков операцииКоличество входных каналов операции
Повторяющиеся веса4*numHiddenUnits, где numHiddenUnits - количество скрытых блоков операцииКоличество скрытых блоков операции

Чтобы легко инициализировать обучаемые параметры с помощью инициализатора Glorot, можно определить пользовательскую функцию. Функция initializeGlorot принимает в качестве входных данных размер обучаемых параметров sz и значения No и Ni (numOut и numIn, соответственно) и возвращает дискретизированные веса в виде dlarray объект с базовым типом 'single'.

function weights = initializeGlorot(sz,numOut,numIn)

Z = 2*rand(sz,'single') - 1;
bound = sqrt(6 / (numIn + numOut));

weights = bound * Z;
weights = dlarray(weights);

end

Пример

Инициализируйте весовые коэффициенты для сверточной операции с 128 фильтрами размера 5 на 5 и 3 входными каналами.

filterSize = [5 5];
numChannels = 3;
numFilters = 128;

sz = [filterSize numChannels numFilters];
numOut = prod(filterSize) * numFilters;
numIn = prod(filterSize) * numFilters;

parameters.conv.Weights = initializeGlorot(sz,numOut,numIn);

Инициализация

Инициализатор He [2] отсчитывает веса из нормального распределения с нулевым средним и дисперсионным 2Ni, где значение Ni зависит от типа операции глубокого обучения.

ОперацияОбучаемый параметрNi
dlconvВеса

prod(filterSize)*numChannelsPerGroup, где filterSize является 1-by-K вектор, содержащий размер фильтра, numChannelsPerGroup - количество входных каналов для каждой группы, и K - количество пространственных измерений

dltranspconvВеса

prod(filterSize)*numChannelsPerGroup, где filterSize является 1-by-K вектор, содержащий размер фильтра, numChannelsPerGroup - количество входных каналов для каждой группы, и K - количество пространственных измерений

fullyconnectВесаКоличество входных каналов операции
gruВходные весаКоличество входных каналов операции
Повторяющиеся весаКоличество скрытых блоков операции.
lstmВходные весаКоличество входных каналов операции
Повторяющиеся весаКоличество скрытых блоков операции.

Чтобы легко инициализировать обучаемые параметры с помощью инициализатора He, можно определить пользовательскую функцию. Функция initializeHe принимает в качестве входных данных размер обучаемых параметров szи значение Ni, и возвращает дискретизированные веса как dlarray объект с базовым типом 'single'.

function weights = initializeHe(sz,numIn)

weights = randn(sz,'single') * sqrt(2/numIn);
weights = dlarray(weights);

end

Пример

Инициализируйте весовые коэффициенты для сверточной операции с 128 фильтрами размера 5 на 5 и 3 входными каналами.

filterSize = [5 5];
numChannels = 3;
numFilters = 128;

sz = [filterSize numChannels numFilters];
numIn = prod(filterSize) * numFilters;

parameters.conv.Weights = initializeHe(sz,numIn);

Гауссова инициализация

Гауссов инициализатор отсчитывает веса из нормального распределения.

Чтобы легко инициализировать обучаемые параметры с помощью гауссова инициализатора, можно определить пользовательскую функцию. Функция initializeGaussian принимает в качестве входных данных размер обучаемых параметров sz, среднее значение распределения muи стандартное отклонение распределения sigmaи возвращает дискретизированные веса в виде dlarray объект с базовым типом 'single'.

function weights = initializeGaussian(sz,mu,sigma)

weights = randn(sz,'single')*sigma + mu;
weights = dlarray(weights);

end

Пример

Инициализируйте веса для операции встраивания с размером 300 и словарным размером 5000 с помощью гауссова инициализатора со средним значением 0 и стандартным отклонением 0,01.

embeddingDimension = 300;
vocabularySize = 5000;
mu = 0;
sigma = 0.01;

sz = [embeddingDimension vocabularySize];

parameters.emb.Weights = initializeGaussian(sz,mu,sigma);

Единообразная инициализация

Однородный инициализатор отсчитывает веса из однородного распределения.

Чтобы легко инициализировать обучаемые параметры с помощью унифицированного инициализатора, можно определить пользовательскую функцию. Функция initializeUniform принимает в качестве входных данных размер обучаемых параметров sz, и границы распределения boundи возвращает дискретизированные веса в виде dlarray объект с базовым типом 'single'.

function parameter = initializeUniform(sz,bound)

Z = 2*rand(sz,'single') - 1;
parameter = bound * Z;
parameter = dlarray(parameter);

end

Пример

Инициализируйте веса для механизма внимания размером 100 на 100 и ограничивайте 0,1 с помощью однородного инициализатора.

sz = [100 100];
bound = 0.1;

parameters.attentionn.Weights = initializeUniform(sz,bound);

Ортогональная инициализация

Ортогональный инициализатор возвращает ортогональную матрицу Q, заданную QR разложением Z = QR, где Z дискретизируется из единичного нормального распределения, и размер Z соответствует размеру обучаемого параметра.

Чтобы легко инициализировать обучаемые параметры с помощью ортогонального инициализатора, можно определить пользовательскую функцию. Функция initializeOrthogonal принимает в качестве входных данных размер обучаемых параметров szи возвращает ортогональную матрицу в виде dlarray объект с базовым типом 'single'.

function parameter = initializeOrthogonal(sz)

Z = randn(sz,'single');
[Q,R] = qr(Z,0);

D = diag(R);
Q = Q * diag(D ./ abs(D));

parameter = dlarray(Q);

end

Пример

Инициализируйте повторяющиеся веса для операции LSTM со 100 скрытыми единицами с помощью ортогонального инициализатора.

numHiddenUnits = 100;

sz = [4*numHiddenUnits numHiddenUnits];

parameters.lstm.RecurrentWeights = initializeOrthogonal(sz);

Инициализация литника Unit Forget

Инициализатор вентиля «unit forget» инициализирует смещение для операции LSTM таким образом, что компонент вентиля «forget» смещений равен единицам, а остальные записи являются нулями.

Чтобы легко инициализировать обучаемые параметры с помощью ортогонального инициализатора, можно определить пользовательскую функцию. Функция initializeUnitForgetGate принимает в качестве входных данных количество скрытых единиц в операции LSTM и возвращает смещение в виде dlarray объект с базовым типом 'single'.

function bias = initializeUnitForgetGate(numHiddenUnits)

bias = zeros(4*numHiddenUnits,1,'single');

idx = numHiddenUnits+1:2*numHiddenUnits;
bias(idx) = 1;

bias = dlarray(bias);

end

Пример

Инициализируйте смещение операции LSTM со 100 скрытыми блоками с помощью инициализатора «unit forget gate».

numHiddenUnits = 100;

parameters.lstm.Bias = initializeUnitForgetGate(numHiddenUnits,'single');

Инициализация единиц

Чтобы легко инициализировать обучаемые параметры с их помощью, можно определить пользовательскую функцию. Функция initializeOnes принимает в качестве входных данных размер обучаемых параметров szи возвращает параметры в виде dlarray объект с базовым типом 'single'.

function parameter = initializeOnes(sz)

parameter = ones(sz,'single');
parameter = dlarray(parameter);

end

Пример

Инициализируйте масштаб для операции пакетной нормализации с 128 входными каналами и единицами.

numChannels = 128;

sz = [numChannels 1];

parameters.bn.Scale = initializeOnes(sz);

Инициализация нулей

Чтобы легко инициализировать обучаемые параметры с нулями, можно определить пользовательскую функцию. Функция initializeZeros принимает в качестве входных данных размер обучаемых параметров szи возвращает параметры в виде dlarray объект с базовым типом 'single'.

function parameter = initializeZeros(sz)

parameter = zeros(sz,'single');
parameter = dlarray(parameter);

end

Пример

Инициализируйте смещение для операции пакетной нормализации с 128 входными каналами с нулями.

numChannels = 128;

sz = [numChannels 1];

parameters.bn.Offset = initializeZeros(sz);

Хранение обучаемых параметров

Рекомендуется сохранять обучаемые параметры для данной функции модели в одном объекте, таком как структура, таблица или массив ячеек. Пример инициализации обучаемых параметров в виде структуры см. в разделе Подготовка сети с использованием функции модели.

Сохранение параметров на GPU

При обучении модели с использованием обучающих данных, хранящихся в GPU, обучаемые параметры функции модели преобразуются в объекты gpuArray и сохраняются в GPU.

Перед сохранением обучаемых параметров рекомендуется собрать все параметры, если они загружены в машину без графического процессора. Использовать dlupdate для сбора обучаемых параметров, хранящихся в виде структуры, таблицы или массива ячеек. Например, если в структуре, таблице или массиве ячеек хранятся сетевые обучаемые параметры графического процессора. parameters, вы можете собрать все параметры на CPU, используя следующий код:

parameters = dlupdate(@gather,parameters);

При загрузке обучаемых параметров, не находящихся на GPU, можно переместить параметры на GPU с помощью dlupdate. Это гарантирует, что сеть будет выполняться на GPU для обучения и вывода независимо от того, где хранятся входные данные. Для перемещения обучаемых параметров в графический процессор используйте dlupdate функция:

parameters = dlupdate(@gpuArray,parameters);

Ссылки

[1] Глорот, Ксавье и Йошуа Бенгио. «Понимание сложности обучения глубоким нейронным сетям». Материалы тринадцатой Международной конференции по искусственному интеллекту и статистике, 249-356. Сардиния, Италия: AISTATS, 2010.

[2] Хэ, Каймин, Сянъу Чжан, Шаоцин Жэнь и Цзянь Сунь. «Углубляясь в выпрямители: превосходя показатели на уровне человека по классификации ImageNet». В трудах Международной конференции IEEE 2015 по компьютерному зрению, 1026-1034. Вашингтон, округ Колумбия: Общество компьютерного зрения IEEE, 2015.

См. также

| | |

Связанные темы