Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

モデル関数の学習可能なパラメーターの初期化

層、層グラフ、または 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オフセット

[numChannels 1]numChannels は入力チャネル数。

スケール

[numChannels 1]numChannels は入力チャネル数。

dlconv重み

[filterSize numChannels numFilters]filterSize はフィルター サイズを指定する 1 行 K 列のベクトル、numChannels は入力チャネル数、numFilters はフィルター数、K は空間次元数。

Bias

次のいずれかを選択。

  • [numFilters 1]numFilters はフィルター数

  • [1 1]

dlconv (グループ化)重み

[filterSize numChannelsPerGroup numFiltersPerGroup numGroups]filterSize はフィルター サイズを指定する 1 行 K 列のベクトル、numChannelsPerGroup は各グループの入力チャネル数、numFiltersPerGroup は各グループのフィルター数、numGroups はグループ数、K は空間次元数。

Bias

次のいずれかを選択。

  • [numFiltersPerGroup 1]numFiltersPerGroup は各グループのフィルター数。

  • [1 1]

dltranspconv重み

[filterSize numFilters numChannels]filterSize はフィルター サイズを指定する 1 行 K 列のベクトル、numChannels は入力チャネル数、numFilters はフィルター数、K は空間次元数。

Bias

次のいずれかを選択。

  • [numFilters 1]numFilters は各グループのフィルター数。

  • [1 1]

dltranspconv (グループ化)重み

[filterSize numFiltersPerGroup numChannelsPerGroup numGroups]filterSize はフィルター サイズを指定する 1 行 K 列のベクトル、numChannelsPerGroup は各グループの入力チャネル数、numFiltersPerGroup は各グループのフィルター数、numGroups はグループ数、K は空間次元数。

Bias

次のいずれかを選択。

  • [numFiltersPerGroup 1]numFiltersPerGroup は各グループのフィルター数。

  • [1 1]

fullyconnect重み

[outputSize inputSize]outputSizeinputSize はそれぞれ出力チャネル数と入力チャネル数。

Bias

[outputSize 1]outputSize は出力チャネル数。

gru入力重み

[3*numHiddenUnits inputSize]numHiddenUnits は演算の隠れユニット数、inputSize は入力チャネル数。

再帰重み

[3*numHiddenUnits numHiddenUnits]numHiddenUnits は演算の隠れユニット数。

Bias

[3*numHiddenUnits 1]numHiddenUnits は演算の隠れユニット数。

lstm入力重み

[4*numHiddenUnits inputSize]numHiddenUnits は演算の隠れユニット数、inputSize は入力チャネル数。

再帰重み

[4*numHiddenUnits numHiddenUnits]numHiddenUnits は演算の隠れユニット数。

Bias

[4*numHiddenUnits 1]numHiddenUnits は演算の隠れユニット数。

Glorot の初期化

Glorot (Xavier とも呼ばれる) 初期化子[1]は、範囲指定付きの一様分布 [6No+Ni,6No+Ni] から重みをサンプリングします。ここで、No と Ni の値は、深層学習演算のタイプによって異なります。

操作学習可能なパラメーターNoNi
dlconv重み

prod(filterSize)*numFiltersfilterSize はフィルター サイズを含む 1 行 K 列のベクトル、numFilters はフィルター数、K は空間次元数。

prod(filterSize)*numChannelsfilterSize はフィルター サイズを含む 1 行 K 列のベクトル、numChannels は入力チャネル数、K は空間次元数。

dlconv (グループ化)重み

prod(filterSize)*numFiltersPerGroupfilterSize はフィルター サイズを含む 1 行 K 列のベクトル、numFiltersPerGroup は各グループのフィルター数、K は空間次元数。

prod(filterSize)*numChannelsPerGroupfilterSize はフィルター サイズを含む 1 行 K 列のベクトル、numChannelsPerGroup は各グループの入力チャネル数、K は空間次元数。

dltranspconv重み

prod(filterSize)*numFiltersfilterSize はフィルター サイズを含む 1 行 K 列のベクトル、numFilters はフィルター数、K は空間次元数。

prod(filterSize)*numChannelsfilterSize はフィルター サイズを含む 1 行 K 列のベクトル、numChannels は入力チャネル数、K は空間次元数。

dltranspconv (グループ化)重み

prod(filterSize)*numFiltersPerGroupfilterSize はフィルター サイズを含む 1 行 K 列のベクトル、numFiltersPerGroup は各グループのフィルター数、K は空間次元数。

prod(filterSize)*numChannelsPerGroupfilterSize はフィルター サイズを含む 1 行 K 列のベクトル、numChannelsPerGroup は各グループの入力チャネル数、K は空間次元数。

fullyconnect重み演算の出力チャネル数演算の入力チャネル数
gru入力重み3*numHiddenUnitsnumHiddenUnits は演算の隠れユニット数。演算の入力チャネル数
再帰重み3*numHiddenUnitsnumHiddenUnits は演算の隠れユニット数。演算の隠れユニット数。
lstm入力重み4*numHiddenUnitsnumHiddenUnits は演算の隠れユニット数。演算の入力チャネル数
再帰重み4*numHiddenUnitsnumHiddenUnits は演算の隠れユニット数。演算の隠れユニット数。

Glorot 初期化子を使用して学習可能なパラメーターを簡単に初期化するため、カスタム関数を定義できます。関数 initializeGlorot は、学習可能なパラメーター sz のサイズ、ならびに値 No および Ni (それぞれ numOutnumIn) を入力として受け取り、基となる型が '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) * numFilters;

parameters.conv.Weights = initializeGlorot(sz,numOut,numIn);

He の初期化

He 初期化子[44]は、平均 0、分散 2Ni の正規分布から重みをサンプリングします。ここで、値 Ni は、深層学習演算のタイプによって決まります。

操作学習可能なパラメーターNi
dlconv重み

prod(filterSize)*numChannelsPerGroupfilterSize はフィルター サイズを含む 1 行 K 列のベクトル、numChannelsPerGroup は各グループの入力チャネル数、K は空間次元数。

dltranspconv重み

prod(filterSize)*numChannelsPerGroupfilterSize はフィルター サイズを含む 1 行 K 列のベクトル、numChannelsPerGroup は各グループの入力チャネル数、K は空間次元数。

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) * numFilters;

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(weights);

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(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.

参考

| | |

関連するトピック