Когда вы обучаете сеть с помощью слоев, графиков слоев или dlnetwork
объекты, программное обеспечение автоматически инициализирует настраиваемые параметры в соответствии со свойствами инициализации слоя. Когда вы задаете модель глубокого обучения как функцию, необходимо инициализировать настраиваемые параметры вручную.
То, как вы инициализируете настраиваемые параметры (для примера, весов и смещений), может оказать большое влияние на то, как быстро сходится модель глубокого обучения.
Совет
В этой теме объясняется, как инициализировать настраиваемые параметры для модели глубокого обучения, заданной функцией в пользовательском цикле обучения. Чтобы узнать, как задать инициализацию настраиваемого параметра для слоя глубокого обучения, используйте соответствующее свойство слоя. Для примера установите инициализатор весов convolution2dLayer
объект, используйте WeightsInitializer
свойство.
Эта таблица показывает инициализацию по умолчанию для настраиваемых параметров для каждого слоя и предоставляет ссылки, которые показывают, как инициализировать настраиваемые параметры для функций модели с помощью той же инициализации.
Слой | Настраиваемый параметр | Инициализация по умолчанию |
---|---|---|
convolution2dLayer | Веса | Инициализация Глорота |
Уклон | Инициализация нулей | |
convolution3dLayer | Веса | Инициализация Глорота |
Уклон | Инициализация нулей | |
groupedConvolution2dLayer | Веса | Инициализация Глорота |
Уклон | Инициализация нулей | |
transposedConv2dLayer | Веса | Инициализация Глорота |
Уклон | Инициализация нулей | |
transposedConv3dLayer | Веса | Инициализация Глорота |
Уклон | Инициализация нулей | |
fullyConnectedLayer | Веса | Инициализация Глорота |
Уклон | Инициализация нулей | |
batchNormalizationLayer | Смещение | Инициализация нулей |
Шкала | Инициализация таковых | |
lstmLayer | Входные веса | Инициализация Глорота |
Периодические веса | Ортогональная инициализация | |
Уклон | Модуль Забудь Gate Initialization | |
gruLayer | Входные веса | Инициализация Глорота |
Периодические веса | Ортогональная инициализация | |
Уклон | Инициализация нулей | |
wordEmbeddingLayer | Веса | Гауссова инициализация со средним значением 0 и стандартным отклонением 0,01 |
При инициализации настраиваемых параметров для функций модели необходимо задать параметры правильного размера. Размер настраиваемых параметров зависит от типа операции глубокого обучения.
Операция | Настраиваемый параметр | Размер |
---|---|---|
batchnorm | Смещение |
|
Шкала |
| |
dlconv | Веса |
|
Уклон | Одно из следующих:
| |
dlconv (сгруппирован) | Веса |
|
Уклон | Одно из следующих:
| |
dltranspconv | Веса |
|
Уклон | Одно из следующих:
| |
dltranspconv (сгруппирован) | Веса |
|
Уклон | Одно из следующих:
| |
fullyconnect | Веса |
|
Уклон |
| |
gru | Входные веса |
|
Периодические веса |
| |
Уклон |
| |
lstm | Входные веса |
|
Периодические веса |
| |
Уклон |
|
Инициализатор Глорота (также известный как Xavier) [1] отсчитывает веса из равномерного распределения с границами , где значения No и Ni зависят от типа операции глубокого обучения.
Операция | Настраиваемый параметр | No | Ni |
---|---|---|---|
dlconv | Веса |
|
|
dlconv (сгруппирован) | Веса |
|
|
dltranspconv | Веса |
|
|
dltranspconv (сгруппирован) | Веса |
|
|
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] отсчитывает веса из нормального распределения с нулем среднего и отклонением , где Ni значения зависит от типа операции глубокого обучения.
Операция | Настраиваемый параметр | Ni |
---|---|---|
dlconv | Веса |
|
dltranspconv | Веса |
|
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);
Инициализатор затвора забывания модуля инициализирует смещение для операции 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.
dlarray
| dlfeval
| dlgradient
| dlnetwork