モデル関数の学習可能なパラメーターの初期化
層配列または dlnetwork オブジェクトを使用してネットワークに学習させる場合、ソフトウェアは、層の初期化プロパティに従って、学習可能なパラメーターを自動的に初期化します。関数として深層学習モデルを定義する場合、学習可能なパラメーターを手動で初期化しなければなりません。
学習可能なパラメーター (重みやバイアスなど) の初期化方法は、深層学習モデルの収束速度に大きな影響を与える可能性があります。
ヒント
このトピックでは、カスタム学習ループにおいて、関数を定義した深層学習モデルの学習可能なパラメーターを初期化する方法を説明します。深層学習層の学習可能なパラメーターの初期化を指定する方法を学ぶために、対応する層のプロパティを使用します。たとえば、convolution2dLayer オブジェクトの重み初期化子を設定するには、WeightsInitializer プロパティを使用します。
層の既定の初期化
この表は、各層の学習可能なパラメーターに関する既定の初期化を示しています。また、同じ初期化を使用して、モデル関数の学習可能なパラメーターを初期化する方法を示すリンクが記載されています。
| 層 | 学習可能なパラメーター | 既定の初期化 |
|---|---|---|
convolution2dLayer | 重み | Glorot の初期化 |
| バイアス | ゼロでの初期化 | |
convolution3dLayer | 重み | Glorot の初期化 |
| バイアス | ゼロでの初期化 | |
groupedConvolution2dLayer | 重み | Glorot の初期化 |
| バイアス | ゼロでの初期化 | |
transposedConv2dLayer | 重み | Glorot の初期化 |
| バイアス | ゼロでの初期化 | |
transposedConv3dLayer | 重み | Glorot の初期化 |
| バイアス | ゼロでの初期化 | |
fullyConnectedLayer | 重み | Glorot の初期化 |
| バイアス | ゼロでの初期化 | |
batchNormalizationLayer | オフセット | ゼロでの初期化 |
| スケール | 1 での初期化 | |
lstmLayer | 入力重み | Glorot の初期化 |
| 再帰重み | 直交初期化 | |
| バイアス | ユニット忘却ゲートによる初期化 | |
gruLayer | 入力重み | Glorot の初期化 |
| 再帰重み | 直交初期化 | |
| バイアス | ゼロでの初期化 | |
wordEmbeddingLayer | 重み | ガウスによる初期化、平均 0、標準偏差 0.01 とする |
学習可能なパラメーターのサイズ
モデル関数の学習可能なパラメーターを初期化する場合、正しいサイズのパラメーターを指定しなければなりません。学習可能なパラメーターのサイズは、深層学習演算のタイプによって異なります。
| 操作 | 学習可能なパラメーター | サイズ |
|---|---|---|
batchnorm | オフセット |
|
| スケール |
| |
dlconv | 重み |
|
| バイアス | 次のいずれかを選択。
| |
dlconv (グループ化) | 重み |
|
| バイアス | 次のいずれかを選択。
| |
dltranspconv | 重み |
|
| バイアス | 次のいずれかを選択。
| |
dltranspconv (グループ化) | 重み |
|
| バイアス | 次のいずれかを選択。
| |
fullyconnect | 重み |
|
| バイアス |
| |
gru | 入力重み |
|
| 再帰重み |
| |
| バイアス |
| |
lstm | 入力重み |
|
| 再帰重み |
| |
| バイアス |
|
Glorot の初期化
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 オブジェクトとして、サンプリングされた重みを返します。
function weights = 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) * numChannels; parameters.conv.Weights = initializeGlorot(sz,numOut,numIn);
He の初期化
He 初期化子[2]は、平均 0、分散 の正規分布から重みをサンプリングします。ここで、値 Ni は、深層学習演算のタイプによって決まります。
| 操作 | 学習可能なパラメーター | Ni |
|---|---|---|
dlconv | 重み |
|
dltranspconv | 重み |
|
fullyconnect | 重み | 演算の入力チャネル数 |
gru | 入力重み | 演算の入力チャネル数 |
| 再帰重み | 演算の隠れユニット数。 | |
lstm | 入力重み | 演算の入力チャネル数 |
| 再帰重み | 演算の隠れユニット数。 |
He 初期化子を使用して学習可能なパラメーターを簡単に初期化するために、カスタム関数を定義できます。関数 initializeHe は、学習可能なパラメーター sz のサイズと値 Ni を入力として受け取り、基となる型が 'single' の dlarray オブジェクトとして、サンプリングされた重みを返します。
function weights = 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) * numChannels; parameters.conv.Weights = initializeHe(sz,numIn);
ガウスによる初期化
ガウス初期化子は、正規分布から重みをサンプリングします。
ガウス初期化子を使用して学習可能なパラメーターを簡単に初期化するために、カスタム関数を定義できます。関数 initializeGaussian は、学習可能なパラメーター sz のサイズ、分散平均 mu、および分散標準偏差 sigma を入力として受け取り、基となる型が 'single' の dlarray オブジェクトとして、サンプリングされた重みを返します。
function weights = 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 オブジェクトとして、サンプリングされた重みを返します。
function parameter = 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 オブジェクトとして、直交行列を返します。
function parameter = 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 オブジェクトとしてバイアスを返します。
function bias = 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 での初期化
学習可能なパラメーターを 1 で簡単に初期化するために、カスタム関数を定義できます。関数 initializeOnes は、学習可能なパラメーター sz のサイズを入力として受け取り、基となる型が 'single' の dlarray オブジェクトとして、パラメーターを返します。
function parameter = initializeOnes(sz) parameter = ones(sz,'single'); parameter = dlarray(parameter); end
例
128 個の入力チャネルで 1 を使用してバッチ正規化演算のスケールを初期化します。
numChannels = 128; sz = [numChannels 1]; parameters.bn.Scale = initializeOnes(sz);
ゼロでの初期化
学習可能なパラメーターをゼロで簡単に初期化するために、カスタム関数を定義できます。関数 initializeZeros は、学習可能なパラメーター sz のサイズを入力として受け取り、基となる型が 'single' の dlarray オブジェクトとして、パラメーターを返します。
function parameter = initializeZeros(sz) parameter = zeros(sz,'single'); parameter = dlarray(parameter); end
例
128 個の入力チャネルでゼロを使用してバッチ正規化演算のオフセットを初期化します。
numChannels = 128; sz = [numChannels 1]; parameters.bn.Offset = initializeZeros(sz);
学習可能なパラメーターの保存
特定のモデル関数の学習可能なパラメーターを、構造体、table、cell 配列などの単一のオブジェクトに保存することを推奨します。学習可能なパラメーターを struct として初期化する方法を示す例については、モデル関数を使用したネットワークの学習を参照してください。
GPU 上のパラメーターの保存
GPU を使用してモデルに学習させる場合、モデル関数の学習可能なパラメーターが gpuArray オブジェクトに変換されて GPU に保存されます。
学習可能なパラメーターを GPU のないマシンに簡単に読み込めるように、それらを保存する前にすべてのパラメーターをローカル ワークスペースに収集しておくことを推奨します。関数 dlupdate と関数 gather を使用し、構造体、table、または dlarray オブジェクトの cell 配列として保存されている学習可能なパラメーターを収集します。たとえば、ネットワークの学習可能なパラメーターが、構造体、table、または cell 配列 parameters で GPU に保存されている場合、次のコードを使用してパラメーターをローカル ワークスペースに転送できます。
parameters = dlupdate(@gather,parameters);
GPU にない学習可能なパラメーターを読み込む場合、関数 dlupdate と関数 gpuArray を使用することで、パラメーターを GPU に移動できます。そうすることで、入力データが保存されている場所に関係なく、ネットワークが必ず GPU 上で学習と推論を実行するようになります。たとえば、構造体、table、または cell 配列 parameters で保存されている学習可能パラメーターを移動する場合、次のコードを使用してパラメーターを GPU に転送できます。
parameters = dlupdate(@gpuArray,parameters);
参照
[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, 249–356. Sardinia, Italy: AISTATS, 2010. https://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
[2] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification." In 2015 IEEE International Conference on Computer Vision (ICCV), 1026–34. Santiago, Chile: IEEE, 2015. https://doi.org/10.1109/ICCV.2015.123
参考
dlarray | dlgradient | dlfeval | dlnetwork