このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
層、層グラフ、またはdlnetwork
オブジェクトを使用してネットワークに学習させる場合、ソフトウェアは、層の初期化プロパティに従って、学習可能なパラメーターを自動的に初期化します。関数として深層学習モデルを定義する場合、学習可能なパラメーターを手動で初期化しなければなりません。
学習可能なパラメーター (重みやバイアスなど) の初期化は、深層学習モデルの収束速度に大きな影響を与える可能性があります。
ヒント
このページでは、カスタム学習ループにおいて、関数として定義された深層学習モデルの学習可能なパラメーターを初期化する方法を説明します。深層学習層の学習可能なパラメーターの初期化を指定する方法を学ぶために、対応する層のプロパティを使用します。たとえば、convolution2dLayer
オブジェクトの重み初期化子を設定するには、WeightsInitializer
プロパティを使用します。
この表は、各層の学習可能なパラメーターに関する既定の初期化を示しています。また、同じ初期化を使用して、モデル関数の学習可能なパラメーターを初期化する方法を示すリンクが記載されています。
層 | 学習可能なパラメーター | 既定の初期化 |
---|---|---|
convolution2dLayer |
重み | Glorot の初期化 |
Bias | ゼロでの初期化 | |
convolution3dLayer |
重み | Glorot の初期化 |
Bias | ゼロでの初期化 | |
groupedConvolution2dLayer |
重み | Glorot の初期化 |
Bias | ゼロでの初期化 | |
transposedConv2dLayer |
重み | Glorot の初期化 |
Bias | ゼロでの初期化 | |
transposedConv3dLayer |
重み | Glorot の初期化 |
Bias | ゼロでの初期化 | |
fullyConnectedLayer |
重み | Glorot の初期化 |
Bias | ゼロでの初期化 | |
batchNormalizationLayer |
オフセット | ゼロでの初期化 |
スケール | 1 での初期化 | |
lstmLayer |
入力重み | Glorot の初期化 |
再帰重み | 直交初期化 | |
Bias | ユニット忘却ゲートによる初期化 | |
gruLayer |
入力重み | Glorot の初期化 |
再帰重み | 直交初期化 | |
Bias | ゼロでの初期化 | |
wordEmbeddingLayer |
重み | ガウスによる初期化、平均 0、標準偏差 0.01 とする。 |
モデル関数の学習可能なパラメーターを初期化する場合、正しいサイズのパラメーターを指定しなければなりません。学習可能なパラメーターのサイズは、深層学習演算のタイプによって異なります。
操作 | 学習可能なパラメーター | サイズ |
---|---|---|
batchnorm |
オフセット |
|
スケール |
|
|
dlconv |
重み |
|
Bias | 次のいずれかを選択。
|
|
dlconv (グループ化) |
重み |
|
Bias | 次のいずれかを選択。
|
|
dltranspconv |
重み |
|
Bias | 次のいずれかを選択。
|
|
dltranspconv (グループ化) |
重み |
|
Bias | 次のいずれかを選択。
|
|
fullyconnect |
重み |
|
Bias |
|
|
gru |
入力重み |
|
再帰重み |
|
|
Bias |
|
|
lstm |
入力重み |
|
再帰重み |
|
|
Bias |
|
Glorot (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
) を入力として受け取り、基となる型が'single'
のdlarray
オブジェクトとして、サンプリングされた重みを返します。
functionweights = initializeGlorot(sz,numOut,numIn) Z = 2*rand(sz,'single') - 1; bound = sqrt(6 / (numIn + numOut)); weights = bound * Z; weights = dlarray(weights);end
サイズ 5 x 5 のフィルター 128 個、入力チャネル 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 初期化子[44]は、平均 0、分散 の正規分布から重みをサンプリングします。ここで、値 Niは、深層学習演算のタイプによって決まります。
操作 | 学習可能なパラメーター | Ni |
---|---|---|
dlconv |
重み |
|
dltranspconv |
重み |
|
fullyconnect |
重み | 演算の入力チャネル数 |
gru |
入力重み | 演算の入力チャネル数 |
再帰重み | 演算の隠れユニット数。 | |
lstm |
入力重み | 演算の入力チャネル数 |
再帰重み | 演算の隠れユニット数。 |
He 初期化子を使用して学習可能なパラメーターを簡単に初期化するために、カスタム関数を定義できます。関数initializeHe
は、学習可能なパラメーターsz
のサイズと値 Niを入力として受け取り、基となる型が'single'
のdlarray
オブジェクトとして、サンプリングされた重みを返します。
functionweights = initializeHe(sz,numIn) weights = randn(sz,'single') * sqrt(2/numIn); weights = dlarray(weights);end
サイズ 5 x 5 のフィルター 128 個、入力チャネル 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
を入力として受け取り、基となる型が'single'
のdlarray
オブジェクトとして、サンプリングされた重みを返します。
functionweights = initializeGaussian(sz,mu,sigma) weights = randn(sz,'single')*sigma + mu; weights = dlarray(weights);end
平均 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
は、学習可能なパラメーターsz
のサイズと分布境界bound
を入力として受け取り、基となる型が'single'
のdlarray
オブジェクトとして、サンプリングされた重みを返します。
functionparameter = initializeUniform(sz,bound) Z = 2*rand(sz,'single') - 1; parameter = bound * Z; parameter = dlarray(parameter);end
一様分布初期化子を使用して、サイズ 100 x 100、境界 0.1 でアテンション メカニズムの重みを初期化します。
sz = [100 100]; bound = 0.1; parameters.attentionn.Weights = initializeUniform(sz,bound);
直交初期化子は、Z = QR の QR 分解によって与えられる直交行列 Q を返します。ここで、Z は単位正規分布からサンプリングされ、Z のサイズは学習可能なパラメーターのサイズと一致します。
直交初期化子を使用して学習可能なパラメーターを簡単に初期化するために、カスタム関数を定義できます。関数initializeOrthogonal
は、学習可能なパラメーターsz
のサイズを入力として受け取り、基となる型が'single'
のdlarray
オブジェクトとして、直交行列を返します。
functionparameter = initializeOrthogonal(sz) Z = randn(sz,'single'); [Q,R] = qr(Z,0); D = diag(R); Q = Q * diag(D ./ abs(D)); parameter = dlarray(Q);end
直交初期化子を使用して、100 個の隠れユニットで LSTM 演算の反復重みを初期化します。
numHiddenUnits = 100; sz = [4*numHiddenUnits numHiddenUnits]; parameters.lstm.RecurrentWeights = initializeOrthogonal(sz);
ユニット忘却ゲート初期化子は、バイアスの忘却ゲート成分が 1、残りのエントリが 0 になるように、LSTM 演算のバイアスを初期化します。
直交初期化子を使用して学習可能なパラメーターを簡単に初期化するために、カスタム関数を定義できます。関数initializeUnitForgetGate
は、LSTM 演算の隠れユニットの数を入力として受け取り、基となる型が'single'
のdlarray
オブジェクトとしてバイアスを返します。
functionbias = initializeUnitForgetGate(numHiddenUnits) bias = zeros(4*numHiddenUnits,1,'single'); idx = numHiddenUnits+1:2*numHiddenUnits; bias(idx) = 1; bias = dlarray(bias);end
ユニット忘却ゲート初期化子を使用して、100 個の隠れユニットで LSTM 演算のバイアスを初期化します。
numHiddenUnits = 100; parameters.lstm.Bias = initializeUnitForgetGate(numHiddenUnits,'single');
学習可能なパラメーターを 1 で簡単に初期化するために、カスタム関数を定義できます。関数initializeOnes
は、学習可能なパラメーターsz
のサイズを入力として受け取り、基となる型が'single'
のdlarray
オブジェクトとして、パラメーターを返します。
functionparameter = initializeOnes(sz) parameter = ones(sz,'single'); parameter = dlarray(weights);end
128 個の入力チャネルで 1 を使用してバッチ正規化演算のスケールを初期化します。
numChannels = 128; sz = [numChannels 1]; parameters.bn.Scale = initializeOnes(sz);
学習可能なパラメーターをゼロで簡単に初期化するために、カスタム関数を定義できます。関数initializeZeros
は、学習可能なパラメーターsz
のサイズを入力として受け取り、基となる型が'single'
のdlarray
オブジェクトとして、パラメーターを返します。
functionparameter = initializeZeros(sz) parameter = zeros(sz,'single'); parameter = dlarray(weights);end
128 個の入力チャネルでゼロを使用してバッチ正規化演算のオフセットを初期化します。
numChannels = 128; sz = [numChannels 1]; parameters.bn.Offset = initializeZeros(sz);
[1] Glorot, Xavier, and Yoshua Bengio. "Understanding the difficulty of training deep feedforward neural networks." In Proceedings of the thirteenth international conference on artificial intelligence and statistics, pp. 249-256. 2010.
[1] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving deep into rectifiers: Surpassing human-level performance on imagenet classification." In Proceedings of the IEEE international conference on computer vision, pp. 1026-1034. 2015.
dlarray
|dlgradient
|dlfeval
|dlnetwork