当你用层,层图或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 |
抵消 |
|
规模 |
|
|
dlconv |
权重 |
|
偏见 | 下列其中之一:
|
|
dlconv (分组) |
权重 |
|
偏见 | 下列其中之一:
|
|
dltranspconv |
权重 |
|
偏见 | 下列其中之一:
|
|
dltranspconv (分组) |
权重 |
|
偏见 | 下列其中之一:
|
|
fullyconnect |
权重 |
|
偏见 |
|
|
格勒乌 |
输入重量 |
|
复发性权重 |
|
|
偏见 |
|
|
lstm |
输入重量 |
|
复发性权重 |
|
|
偏见 |
|
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 是操作的隐藏单元数吗 |
操作的隐藏单元数 |
要使用gloria初始化器轻松初始化可学习参数,您可以定义一个自定义函数。这个函数initializeGlorot
将可学习参数的大小作为输入深圳
和值No和N我(numOut
和numIn
,并以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]样本权值来自于均值和方差为零的正态分布 ,其中值N我取决于深度学习操作的类型。
操作 | 可学的参数 | N我 |
---|---|---|
dlconv |
权重 |
|
dltranspconv |
权重 |
|
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上的训练数据来训练模型,那么模型函数的可学习参数将被转换为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。
dlarray
|dlgradient
|dlfeval
|dlnetwork