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

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

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

Совет

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

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

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

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

Настраиваемые параметры

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

ОперацияНастраиваемый параметрРазмер
batchnormСмещение

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

Шкала

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

dlconvВеса

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

Уклон

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

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

  • [1 1]

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

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

Уклон

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

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

  • [1 1]

dltranspconvВеса

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

Уклон

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

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

  • [1 1]

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

[filterSize numFiltersPerGroup numChannelsPerGroup numGroups], где filterSize является 1-байт- 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 количество скрытых модулей измерения операции

Инициализация Глорота

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

ОперацияНастраиваемый параметрNoNi
dlconvВеса

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

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

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

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

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

dltranspconvВеса

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

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

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

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

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

dltranspconvВеса

prod(filterSize)*numChannelsPerGroup, где filterSize является 1-байт- 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);

Модуль Забудь Gate Initialization

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

Чтобы легко инициализировать настраиваемые параметры с помощью ортогонального инициализатора, можно задать пользовательскую функцию. Функция 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 скрытыми модулей с помощью инициализатора модуля 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);

Хранение настраиваемых параметров

Рекомендуется хранить настраиваемые параметры для заданной функции модели в одном объекте, такой как struct, таблица или массив ячеек. Для примера, показывающего, как инициализировать настраиваемые параметры как struct, смотрите Обучите сеть Используя Функцию Модели.

Хранение параметров на графическом процессоре

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

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

parameters = dlupdate(@gather,parameters);

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

parameters = dlupdate(@gpuArray,parameters);

Ссылки

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

[2] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. «Delving Deep Into Rectifiers: Overpassing Human-Level Performance on ImageNet Classification». В работе Международной конференции IEEE по компьютерному зрению 2015 года, 1026-1034. Вашингтон, округ Колумбия: IEEE Компьютерное Зрение Society, 2015.

См. также

| | |

Похожие темы