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 numFiltersPerGroupnumGroups]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]は、範囲指定付きの一様分布 [ 6 N o + N i , 6 N o + N i ] から重みをサンプリングします。ここで、Noと Niの値は、深層学習演算のタイプによって異なります。

操作 学習可能なパラメーター No Ni
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オブジェクトとして、サンプリングされた重みを返します。

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 の初期化

He 初期化子[44]は、平均 0、分散 2 N i の正規分布から重みをサンプリングします。ここで、値 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オブジェクトとして、サンプリングされた重みを返します。

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 での初期化

学習可能なパラメーターを 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.

参考

|||

関連するトピック