初始化模型函数的可学习参数
当你使用层,层图,或者dlnetwork
对象时,软件根据层初始化属性自动初始化可学习参数。将深度学习模型定义为函数时,必须手动初始化可学习参数。
如何初始化可学习参数(例如,权重和偏差)会对深度学习模型的收敛速度产生很大影响。
提示
本主题解释了如何为在自定义训练循环中定义函数的深度学习模型初始化可学习参数。要了解如何为深度学习层指定可学习参数初始化,请使用相应的层属性。例如,要设置a的权重初始化器convolution2dLayer
对象,则使用WeightsInitializer
财产。
默认图层初始化
该表显示了每一层可学习参数的默认初始化,并提供了显示如何通过使用相同的初始化来初始化模型函数的可学习参数的链接。
层 | 可学的参数 | 默认初始化 |
---|---|---|
convolution2dLayer |
权重 | Glorot初始化 |
偏见 | 零初始化 | |
convolution3dLayer |
权重 | Glorot初始化 |
偏见 | 零初始化 | |
groupedConvolution2dLayer |
权重 | Glorot初始化 |
偏见 | 零初始化 | |
transposedConv2dLayer |
权重 | Glorot初始化 |
偏见 | 零初始化 | |
transposedConv3dLayer |
权重 | Glorot初始化 |
偏见 | 零初始化 | |
fullyConnectedLayer |
权重 | Glorot初始化 |
偏见 | 零初始化 | |
batchNormalizationLayer |
抵消 | 零初始化 |
规模 | 的初始化 | |
lstmLayer |
输入重量 | Glorot初始化 |
复发性权重 | 正交初始化 | |
偏见 | 单元遗忘门初始化 | |
gruLayer |
输入重量 | Glorot初始化 |
复发性权重 | 正交初始化 | |
偏见 | 零初始化 | |
wordEmbeddingLayer |
权重 | 高斯函数初始化,平均值为0,标准差为0.01 |
可学习参数大小
在初始化模型函数的可学习参数时,必须指定正确大小的参数。可学习参数的大小取决于深度学习操作的类型。
操作 | 可学的参数 | 大小 |
---|---|---|
batchnorm |
抵消 |
|
规模 |
|
|
dlconv |
权重 |
|
偏见 | 下列之一:
|
|
dlconv (分组) |
权重 |
|
偏见 | 下列之一:
|
|
dltranspconv |
权重 |
|
偏见 | 下列之一:
|
|
dltranspconv (分组) |
权重 |
|
偏见 | 下列之一:
|
|
fullyconnect |
权重 |
|
偏见 |
|
|
格勒乌 |
输入重量 |
|
复发性权重 |
|
|
偏见 |
|
|
lstm |
输入重量 |
|
复发性权重 |
|
|
偏见 |
|
Glorot初始化
gloot(也称为Xavier)初始化器[1]从有界的均匀分布中采样权值 的值No和N我取决于深度学习操作的类型。
操作 | 可学的参数 | No | N我 |
---|---|---|---|
dlconv |
权重 |
|
|
dlconv (分组) |
权重 |
|
|
dltranspconv |
权重 |
|
|
dltranspconv (分组) |
权重 |
|
|
fullyconnect |
权重 | 操作的输出通道数 | 操作的输入通道数 |
格勒乌 |
输入重量 | 3 * numHiddenUnits ,在那里numHiddenUnits 是操作的隐藏单元数吗 |
操作的输入通道数 |
复发性权重 | 3 * numHiddenUnits ,在那里numHiddenUnits 是操作的隐藏单元数吗 |
操作的隐藏单元数 | |
lstm |
输入重量 | 4 * numHiddenUnits ,在那里numHiddenUnits 是操作的隐藏单元数吗 |
操作的输入通道数 |
复发性权重 | 4 * numHiddenUnits ,在那里numHiddenUnits 是操作的隐藏单元数吗 |
操作的隐藏单元数 |
要使用gloot初始化器轻松地初始化可学习的参数,可以定义一个自定义函数。这个函数initializeGlorot
将可学习参数的大小作为输入深圳
还有这些值No和N我(numOut
和numIn
),并将采样的权重返回为dlarray
具有基础类型的对象“单一”
。
函数weight = initializeGlorot(sz,numOut,numIn)“单一”) - 1;bound = sqrt(6 / (numIn + numOut));weights = bound * Z;Weights = darray (Weights);结束
例子
初始化卷积操作的权重,该操作具有128个大小为5 × 5的过滤器和3个输入通道。
filterSize = [5 5];numChannels = 3;numFilters = 128;sz = [filterSize numChannels numFilters];numOut = prod(filterSize) * numFilters;numIn = prod(filterSize) * numChannels;parameters. conf . weights = initializeGlorot(sz,numOut,numIn);
他的初始化
He初始化式[2]样本权值来自均值和方差均为零的正态分布 ,其中值N我取决于深度学习操作的类型。
操作 | 可学的参数 | N我 |
---|---|---|
dlconv |
权重 |
|
dltranspconv |
权重 |
|
fullyconnect |
权重 | 操作的输入通道数 |
格勒乌 |
输入重量 | 操作的输入通道数 |
复发性权重 | 操作的隐藏单元数。 | |
lstm |
输入重量 | 操作的输入通道数 |
复发性权重 | 操作的隐藏单元数。 |
要使用He初始化器轻松地初始化可学习的参数,可以定义一个自定义函数。这个函数initializeHe
将可学习参数的大小作为输入深圳
,值N我,并将采样的权重作为dlarray
具有基础类型的对象“单一”
。
函数weight = initializeHe(sz,numIn)“单一”) * sqrt(2/numIn);Weights = darray (Weights);结束
例子
初始化卷积操作的权重,该操作具有128个大小为5 × 5的过滤器和3个输入通道。
filterSize = [5 5];numChannels = 3;numFilters = 128;sz = [filterSize numChannels numFilters];numIn = prod(filterSize) * numChannels;parameters. conf . weights = initializeHe(sz,numIn);
高斯函数初始化
高斯初始化器从正态分布中采样权值。
要使用高斯初始化器轻松地初始化可学习的参数,可以定义一个自定义函数。这个函数initializeGaussian
将可学习参数的大小作为输入深圳
,分布均值μ
,分布标准差σ
,并将采样的权重作为dlarray
具有基础类型的对象“单一”
。
函数weights = randn(sz, mu,sigma)“单一”)*sigma + mu;Weights = darray (Weights);结束
例子
使用均值为0、标准差为0.01的高斯初始化器,初始化维度为300、词汇表大小为5000的嵌入操作的权重。
embeddingDimension = 300;vocabularySize = 5000;Mu = 0;Sigma = 0.01;sz = [embeddingDimension vocabularySize];parameters.emb.Weights = initializeGaussian(sz,mu,sigma);
统一的初始化
均匀初始化器从均匀分布中采样权重。
要使用统一初始化器轻松地初始化可学习的参数,可以定义自定义函数。这个函数initializeUniform
将可学习参数的大小作为输入深圳
,以及分布界绑定
,并将采样的权重作为dlarray
具有基础类型的对象“单一”
。
函数参数= initializeUniform(sz,bound) Z = 2*rand(sz, bound)“单一”) - 1;参数= bound * Z;参数=数组(参数);结束
例子
使用统一初始化器初始化大小为100 * 100、绑定为0.1的注意力机制的权重。
Sz = [100 100];Bound = 0.1;parameters.attention . weights = initializeUniform(sz,bound);
正交初始化
正交初始化器返回正交矩阵问由的QR分解给出Z = qr,在那里Z是从单位正态分布中抽样,大小为Z匹配可学习参数的大小。
要使用正交初始化器轻松地初始化可学习的参数,可以定义一个自定义函数。这个函数initializeOrthogonal
将可学习参数的大小作为输入深圳
,并返回正交矩阵为adlarray
具有基础类型的对象“单一”
。
函数参数= initializeOrthogonal(sz) Z = randn(sz)“单一”);[Q,R] = qr(Z,0);D = diag(R);Q = Q * diag(D ./ abs(D));参数= darray (Q);结束
例子
使用正交初始化器初始化具有100个隐藏单元的LSTM操作的循环权值。
numHiddenUnits = 100;sz = [4*numHiddenUnits];parameters.lstm.RecurrentWeights = initializeOrthogonal(sz);
单元遗忘门初始化
单元遗忘门初始化器初始化LSTM操作的偏置,使偏置的遗忘门分量为1,其余项为0。
要使用正交初始化器轻松地初始化可学习的参数,可以定义一个自定义函数。这个函数initializeUnitForgetGate
将LSTM操作中的隐藏单元数作为输入,并以a的形式返回偏置dlarray
具有基础类型的对象“单一”
。
函数bias = 0 (4*numHiddenUnits,1,“单一”);idx = numHiddenUnits+1:2*numHiddenUnits;Bias (idx) = 1;Bias = darray (Bias);结束
例子
使用单元遗忘门初始化器初始化带有100个隐藏单元的LSTM操作的偏置。
numHiddenUnits = 100;parameters.lstm.Bias = initializeUnitForgetGate(numHiddenUnits,“单一”);
的初始化
为了方便地初始化可学习的参数,您可以定义一个自定义函数。这个函数initializeOnes
将可学习参数的大小作为输入深圳
,并返回参数dlarray
具有基础类型的对象“单一”
。
函数参数参数= ones(sz)“单一”);参数=数组(参数);结束
例子
初始化具有128个1输入通道的批处理规范化操作的比例。
numChannels = 128;sz = [numChannels 1];parameters.bn.Scale = initializeOnes(sz);
零初始化
为了方便地用零初始化可学习的参数,可以定义一个自定义函数。这个函数initializeZeros
将可学习参数的大小作为输入深圳
,并返回参数dlarray
具有基础类型的对象“单一”
。
函数参数= initializezero (sz)“单一”);参数=数组(参数);结束
例子
初始化带有128个带零输入通道的批处理规范化操作的偏移量。
numChannels = 128;sz = [numChannels 1];parameters.bn.Offset = initializezero (sz);
存储可学习参数
建议将给定模型函数的可学习参数存储在单个对象中,例如结构、表或单元格数组。有关如何将可学习参数初始化为结构体的示例,请参见使用模型函数的列车网络。
在GPU上存储参数
如果你使用GPU训练你的模型,那么软件将模型函数的可学习参数转换为gpuArray
对象,存储在GPU上。
为了在没有GPU的机器上更容易地加载可学习的参数,建议在保存它们之前将所有参数收集到本地工作空间。的结构、表或单元格数组中收集可学习的参数dlarray
对象,使用dlupdate
函数收集
函数。例如,如果你有网络可学习的参数存储在GPU上的结构,表,或单元数组参数
,您可以使用以下代码将参数转移到本地工作区:
参数= dlupdate(@gather, Parameters);
如果您加载了不在GPU上的可学习参数,则可以使用dlupdate
函数gpuArray
函数。这样做可以确保你的网络在GPU上执行训练和推理,而不管输入数据存储在哪里。例如,移动存储在结构、表或单元格数组中的参数参数
,可以使用以下代码将参数传递给GPU:
参数= dlupdate(@gpuArray,参数);
参考文献
格罗洛特、泽维尔和约书亚·本吉奥。“理解训练深度前馈神经网络的难度。”在第十三届国际人工智能与统计会议论文集, 249 - 356。撒丁岛,意大利:AISTATS, 2010。https://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
[10]何凯,张翔宇,任少卿,孙健。“深入研究整流器:在ImageNet分类上超越人类水平的表现。”在2015 IEEE计算机视觉国际会议论文集, 1026 - 1034。华盛顿特区:IEEE计算机视觉学会,2015。https://doi.org/10.1109/ICCV.2015.123
另请参阅
dlarray
|dlgradient
|dlfeval
|dlnetwork