主要内容

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

当你用层,层图或dlnetwork对象时,软件根据层初始化属性自动初始化可学习参数。将深度学习模型定义为函数时,必须手动初始化可学习参数。

初始化可学习参数(例如权重和偏差)的方式对深度学习模型的收敛速度有很大影响。

提示

本主题说明如何为自定义训练循环中定义函数的深度学习模型初始化可学习参数。要了解如何为深度学习层指定可学习参数初始化,请使用相应的层属性。例如,要设置属性的权重初始化式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 -K向量指定过滤器大小,numChannels为输入通道的个数,numFilters是过滤器的数量,和K是空间维度的数目吗

偏见

下列其中之一:

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

  • [1]

dlconv(分组) 权重

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

偏见

下列其中之一:

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

  • [1]

dltranspconv 权重

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

偏见

下列其中之一:

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

  • [1]

dltranspconv(分组) 权重

[filterSize numFiltersPerGroup numChannelsPerGroup numGroups],在那里filterSize是1 -K向量指定过滤器大小,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 -K包含滤波器大小的向量,numFilters是过滤器的数量,和K是空间维度的数目吗

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

dlconv(分组) 权重

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

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

dltranspconv 权重

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

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

dltranspconv(分组) 权重

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

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

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

要使用gloria初始化器轻松初始化可学习参数,您可以定义一个自定义函数。这个函数initializeGlorot将可学习参数的大小作为输入深圳和值NoNnumOutnumIn,并以a的形式返回采样的权重dlarray具有底层类型的对象“单一”

函数Z = 2*rand(sz, numOut,numIn)“单一”) - 1;bound =√(6 / (numIn + numOut));weights = bound * Z;重量= dlarray(重量);结束

例子

初始化带有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(深圳、numOut numIn);

他的初始化

他初始化[2]样本权值来自于均值和方差为零的正态分布 2 N ,其中值N取决于深度学习操作的类型。

操作 可学的参数 N
dlconv 权重

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

dltranspconv 权重

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

fullyconnect 权重 操作的输入通道数
格勒乌 输入重量 操作的输入通道数
复发性权重 操作的隐藏单元数。
lstm 输入重量 操作的输入通道数
复发性权重 操作的隐藏单元数。

要使用He初始化器轻松初始化可学习参数,可以定义一个自定义函数。这个函数initializeHe将可学习参数的大小作为输入深圳,价值N,并以a的形式返回采样的权重dlarray具有底层类型的对象“单一”

函数(sz,numIn) =初始化“单一”) *√2 / numIn);重量= dlarray(重量);结束

例子

初始化带有128个大小为5 × 5的滤波器和3个输入通道的卷积运算的权值。

filterSize = [5 5];numChannels = 3;numFilters = 128;sz = [filterSize numChannels numFilters];numIn = prod(filterSize) * numFilters;numIn parameters.conv.Weights = initializeHe(深圳);

高斯函数初始化

高斯初始化器从正态分布中采样权值。

要使用高斯初始化器轻松初始化可学习参数,您可以定义一个自定义函数。这个函数initializeGaussian将可学习参数的大小作为输入深圳,分布均值μ,和分布标准差σ,并以a的形式返回采样的权重dlarray具有底层类型的对象“单一”

函数权重= initializgauss (sz,mu,sigma)“单一”σ)* +μ;重量= dlarray(重量);结束

例子

使用高斯初始化器(平均值为0,标准偏差为0.01)初始化维度为300、词汇量为5000的嵌入操作的权重。

embeddingDimension = 300;vocabularySize = 5000;μ= 0;σ= 0.01;sz = [embedingdimension vocabularySize];parameters.emb.Weights = initializeGaussian (sz、μ、σ);

统一的初始化

均匀初始化器从均匀分布中采样权重。

要使用统一初始化器轻松初始化可学习参数,您可以定义一个自定义函数。这个函数initializeUniform将可学习参数的大小作为输入深圳,以及分布的界限绑定,并以a的形式返回采样的权重dlarray具有底层类型的对象“单一”

函数参数= initializeUniform(sz,bound) Z = 2*rand(sz,“单一”) - 1;参数= bound * Z;参数= dlarray(参数);结束

例子

初始化大小为100 * 100的注意机制的权重,并使用统一初始化器将其绑定为0.1。

Sz = [100 100];绑定= 0.1;parameters.attentionn.Weights = initializeUniform(深圳、绑定);

正交初始化

正交初始化器返回正交矩阵的QR分解Z = QR,在那里Z是否从单位正态分布中抽样Z匹配可学习参数的大小。

要使用正交初始化器轻松初始化可学习参数,可以定义自定义函数。这个函数initializeOrthogonal将可学习参数的大小作为输入深圳,并返回正交矩阵adlarray具有底层类型的对象“单一”

函数参数= initializeOrthogonal(sz)“单一”);(Q, R) = qr (Z, 0);D =诊断接头(R);Q = Q * diag(D ./ abs(D));参数= dlarray (Q);结束

例子

使用正交初始化器初始化带有100个隐藏单元的LSTM操作的循环权值。

numHiddenUnits = 100;sz = [4*numHiddenUnits numHiddenUnits];parameters.lstm.RecurrentWeights = initializeOrthogonal(深圳);

单元遗忘门初始化

单元遗忘门初始化器初始化LSTM操作的偏差,以便偏差的遗忘门组件为1,其余条目为0。

要使用正交初始化器轻松初始化可学习参数,可以定义自定义函数。这个函数initializeUnitForgetGate将LSTM操作中的隐藏单元数作为输入,并将偏差作为a返回dlarray具有底层类型的对象“单一”

函数bias = initializeUnitForgetGate(numHiddenUnits) bias = 0 (4*numHiddenUnits,1,“单一”);idx = numHiddenUnits + 1:2 * numHiddenUnits;偏见(idx) = 1;偏见= dlarray(偏差);结束

例子

使用单元遗忘门初始化器用100个隐藏单元初始化LSTM操作的偏差。

numHiddenUnits = 100;parameters.lstm.Bias = initializeUnitForgetGate (numHiddenUnits,“单一”);

的初始化

为了方便地用参数初始化可学习参数,可以定义自定义函数。这个函数initializeOnes将可学习参数的大小作为输入深圳,并将参数作为dlarray具有底层类型的对象“单一”

函数sz, sz, sz, sz,“单一”);参数= dlarray(参数);结束

例子

用1初始化128个输入通道的批处理规范化操作的比例。

numChannels = 128;sz = [numChannels 1];parameters.bn.Scale = initializeOnes(深圳);

零初始化

要用零轻松初始化可学习参数,可以定义自定义函数。这个函数initializeZeros将可学习参数的大小作为输入深圳,并将参数作为dlarray具有底层类型的对象“单一”

函数参数= initializeZeros(sz)“单一”);参数= dlarray(参数);结束

例子

用128个带零的输入通道初始化批处理规范化操作的偏移量。

numChannels = 128;sz = [numChannels 1];parameters.bn.Offset = initializeZeros(深圳);

存储可学的参数

建议将给定模型函数的可学习参数存储在单个对象中,如结构体、表或单元格数组。有关如何将可学习参数初始化为结构体的示例,请参见使用模型函数的列车网络

GPU存储参数

如果您使用存储在GPU上的训练数据来训练模型,那么模型函数的可学习参数将被转换为gpuArray对象并存储在GPU上。

在保存可学习的参数之前,建议收集所有参数,以防它们被加载到没有GPU的机器上。使用dlupdate收集存储为结构体、表或单元格数组的可学习参数。例如,如果你在GPU的结构、表或单元阵列中存储了网络可学习参数参数,您可以使用以下代码收集CPU上的所有参数:

参数= dlupdate (@gather、参数);

如果您加载了不在GPU上的可学习参数,您可以将参数移动到GPU上使用dlupdate.这样做可以确保您的网络在GPU上执行训练和推理,而不管输入数据存储在哪里。要将可学习参数移动到GPU上,请使用dlupdate功能:

参数= dlupdate (@gpuArray、参数);

参考文献

[1]格洛洛,泽维尔,还有约书亚·本吉奥。理解训练深度前馈神经网络的困难在第十三届国际人工智能和统计会议论文集, 249 - 356。撒丁岛,意大利:AISTATS, 2010。

何开明,张翔宇,任少青,孙健深入研究整流器:在图像网分类上超越人类水平的表现。在2015 IEEE计算机视觉国际会议论文集, 1026 - 1034。计算机视觉,2015。

另请参阅

|||

相关的话题