主要内容

初始化模型函数的可学习参数

当你使用层,层图,或者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 抵消

[numChannels 1],在那里numChannels是输入通道的数量吗

规模

[numChannels 1],在那里numChannels是输入通道的数量吗

dlconv 权重

[filterSize numChannels numFilters],在那里filterSize是1 × 1K指定过滤器大小的向量,numChannels为输入通道数,numFilters是过滤器的数量,和K是空间维度的数量吗

偏见

下列之一:

  • [numFilters 1],在那里numFilters过滤器的数量是多少

  • [1]

dlconv(分组) 权重

[filterSize numChannelsPerGroup numFiltersPerGroup numGroups],在那里filterSize是1 × 1K指定过滤器大小的向量,numChannelsPerGroup为每组的输入通道数,numFiltersPerGroup为每个组的过滤器数量,numGroups基团的个数,和K是空间维度的数量吗

偏见

下列之一:

  • [numFiltersPerGroup 1],在那里numFiltersPerGroup是每个组的过滤器数量。

  • [1]

dltranspconv 权重

[filterSize numFilters numChannels],在那里filterSize是1 × 1K指定过滤器大小的向量,numChannels为输入通道数,numFilters是过滤器的数量,和K是空间维度的数量吗

偏见

下列之一:

  • [numFilters 1],在那里numFilters是每个组的过滤器数量。

  • [1]

dltranspconv(分组) 权重

[filterSize numFiltersPerGroup numChannelsPerGroup numGroups],在那里filterSize是1 × 1K指定过滤器大小的向量,numChannelsPerGroup为每组的输入通道数,numFiltersPerGroup为每个组的过滤器数量,numGroups基团的个数,和K是空间维度的数量吗

偏见

下列之一:

  • [numFiltersPerGroup 1],在那里numFiltersPerGroup是每个组的过滤器数量。

  • [1]

fullyconnect 权重

[outputSize inputSize],在那里outputSizeinputSize输出和输入通道的数量分别是多少

偏见

[outputSize 1],在那里outputSize输出通道的数量

格勒乌 输入重量

(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初始化

gloot(也称为Xavier)初始化器[1]从有界的均匀分布中采样权值 6 N o + N 6 N o + N 的值NoN取决于深度学习操作的类型。

操作 可学的参数 No N
dlconv 权重

刺激(filterSize) * numFilters,在那里filterSize是1 × 1K包含过滤器大小的向量,numFilters是过滤器的数量,和K是空间维度的数量吗

刺激(filterSize) * numChannels,在那里filterSize是1 × 1K包含过滤器大小的向量,numChannels是输入通道的个数,和K是空间维度的数量吗

dlconv(分组) 权重

刺激(filterSize) * numFiltersPerGroup,在那里filterSize是1 × 1K包含过滤器大小的向量,numFiltersPerGroup是每个组的过滤器数量,和K是空间维度的数量吗

刺激(filterSize) * numChannelsPerGroup,在那里filterSize是1 × 1K包含过滤器大小的向量,numChannelsPerGroup每组的输入通道数是多少K是空间维度的数量吗

dltranspconv 权重

刺激(filterSize) * numFilters,在那里filterSize是1 × 1K包含过滤器大小的向量,numFilters是过滤器的数量,和K是空间维度的数量吗

刺激(filterSize) * numChannels,在那里filterSize是1 × 1K包含过滤器大小的向量,numChannels是输入通道的个数,和K是空间维度的数量吗

dltranspconv(分组) 权重

刺激(filterSize) * numFiltersPerGroup,在那里filterSize是1 × 1K包含过滤器大小的向量,numFiltersPerGroup是每个组的过滤器数量,和K是空间维度的数量吗

刺激(filterSize) * numChannelsPerGroup,在那里filterSize是1 × 1K包含过滤器大小的向量,numChannelsPerGroup每组的输入通道数是多少K是空间维度的数量吗

fullyconnect 权重 操作的输出通道数 操作的输入通道数
格勒乌 输入重量 3 * numHiddenUnits,在那里numHiddenUnits是操作的隐藏单元数吗 操作的输入通道数
复发性权重 3 * numHiddenUnits,在那里numHiddenUnits是操作的隐藏单元数吗 操作的隐藏单元数
lstm 输入重量 4 * numHiddenUnits,在那里numHiddenUnits是操作的隐藏单元数吗 操作的输入通道数
复发性权重 4 * numHiddenUnits,在那里numHiddenUnits是操作的隐藏单元数吗 操作的隐藏单元数

要使用gloot初始化器轻松地初始化可学习的参数,可以定义一个自定义函数。这个函数initializeGlorot将可学习参数的大小作为输入深圳还有这些值NoNnumOutnumIn),并将采样的权重返回为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]样本权值来自均值和方差均为零的正态分布 2 N ,其中值N取决于深度学习操作的类型。

操作 可学的参数 N
dlconv 权重

刺激(filterSize) * numChannelsPerGroup,在那里filterSize是1 × 1K包含过滤器大小的向量,numChannelsPerGroup每组的输入通道数是多少K是空间维度的数量吗

dltranspconv 权重

刺激(filterSize) * numChannelsPerGroup,在那里filterSize是1 × 1K包含过滤器大小的向量,numChannelsPerGroup每组的输入通道数是多少K是空间维度的数量吗

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

另请参阅

|||

相关的话题