Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

gruLayer

再帰型ニューラル ネットワーク (RNN) 用のゲート付き回帰型ユニット (GRU) 層

R2020a 以降

説明

GRU 層は、時系列データおよびシーケンス データのタイム ステップ間の依存関係を学習する RNN 層です。

作成

説明

layer = gruLayer(numHiddenUnits) は、GRU 層を作成し、NumHiddenUnits プロパティを設定します。

layer = gruLayer(numHiddenUnits,Name,Value) は、1 つ以上の名前と値のペアの引数を使用して、追加の OutputMode活性化状態パラメーターと初期化学習率および正則化、および Name の各プロパティを設定します。複数の名前と値のペアの引数を指定できます。各プロパティ名を引用符で囲みます。

プロパティ

すべて展開する

GRU

隠れユニットの数 (隠れサイズとも呼ばれる)。正の整数として指定します。

隠れユニットの数は、タイム ステップ間に層によって記憶された情報 (隠れ状態) の量に相当します。隠れ状態には、シーケンス長に関係なく、以前のすべてのタイム ステップからの情報を含めることができます。隠れユニットの数が大きすぎる場合、層が学習データに対して過適合する可能性があります。

隠れ状態によって、1 回の反復の間に層で処理されるタイム ステップ数が制限されることはありません。関数 trainnet および trainNetwork を使用するときにシーケンスをより小さなシーケンスに分割するには、SequenceLength 学習オプションを使用します。

この層は、NumHiddenUnits 個のチャネルをもつデータを出力します。

GRULayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。GRULayer オブジェクトの作成後、このプロパティは読み取り専用になります。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

出力モード。次のいずれかの値として指定します。

  • "sequence" — シーケンス全体を出力します。

  • "last" — シーケンスの最後のタイム ステップを出力します。

GRULayer オブジェクトは、このプロパティを文字ベクトルとして格納します。

GRULayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。GRULayer オブジェクトの作成後、このプロパティは読み取り専用になります。

層への状態入力のフラグ。0 (false) または 1 (true) として指定します。

HasStateInputs プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層は HiddenState プロパティを使用して層処理を行います。

HasStateInputs プロパティが 1 (true) の場合、層は、それぞれ入力データおよび隠れ状態に対応する "in" および "hidden" という名前の 2 つの入力をもちます。この場合、層は、ネットワークによってこれらの入力に渡された値を使用して層処理を行います。HasStateInputs1 (true) の場合、HiddenState プロパティは空でなければなりません。

GRULayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。GRULayer オブジェクトの作成後、このプロパティは読み取り専用になります。

層からの状態出力のフラグ。0 (false) または 1 (true) として指定します。

HasStateOutputs プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。

HasStateOutputs プロパティが 1 (true) の場合、層は、それぞれ出力データおよび隠れ状態に対応する "out" および "hidden" という名前の 2 つの出力をもちます。この場合、層は、層処理中に計算された状態値も出力します。

GRULayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。GRULayer オブジェクトの作成後、このプロパティは読み取り専用になります。

リセット ゲート モード。次のいずれかの値として指定します。

  • "after-multiplication" — 行列乗算後にリセット ゲートを適用します。このオプションは cuDNN に対応しています。

  • "before-multiplication" — 行列乗算前にリセット ゲートを適用します。

  • "recurrent-bias-after-multiplication" — 行列乗算後にリセット ゲートを適用し、さらに、再帰重みに関する一連のバイアス項を使用します。

リセット ゲートの計算に関する詳細については、ゲート付き回帰型ユニット層を参照してください。

R2023a より前: dlnetwork オブジェクトは、ResetGateMode"after-multiplication" に設定されている GRU 層のみをサポートします。

この プロパティ は読み取り専用です。

入力サイズ。正の整数または "auto" として指定します。InputSize"auto" の場合、学習時に入力サイズが自動的に割り当てられます。

InputSize"auto" の場合、GRULayer オブジェクトは、このプロパティを文字ベクトルとして格納します。

データ型: double | char | string

活性化

隠れ状態を更新する活性化関数。次のいずれかの値として指定します。

  • "tanh" — 双曲線正接関数 (tanh) を使用します。

  • "softsign" — ソフトサイン関数 softsign(x)=x1+|x| を使用します。

層は、隠れ状態を更新する計算における関数 σs としてこのオプションを使用します。

GRULayer オブジェクトは、このプロパティを文字ベクトルとして格納します。

GRULayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。GRULayer オブジェクトの作成後、このプロパティは読み取り専用になります。

ゲートに適用する活性化関数。次のいずれかの値として指定します。

  • "sigmoid" — シグモイド関数 σ(x)=(1+ex)1 を使用します。

  • "hard-sigmoid" — ハード シグモイド関数を使用します。

    σ(x)={00.2x+0.51if x<2.5if2.5x2.5if x>2.5.

層は、層のゲートの計算における関数 σg としてこのオプションを使用します。

GRULayer オブジェクトは、このプロパティを文字ベクトルとして格納します。

GRULayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。GRULayer オブジェクトの作成後、このプロパティは読み取り専用になります。

状態

層処理で使用される隠れ状態。NumHiddenUnits 行 1 列の数値ベクトルとして指定します。この値は、データが層に渡されるときの隠れ状態の初期値に対応します。

このプロパティを手動で設定した後に関数 resetState を呼び出すと、隠れ状態がこの値に設定されます。

HasStateInputs1 (true) の場合、HiddenState プロパティは空でなければなりません。

データ型: single | double

パラメーターと初期化

入力の重みを初期化する関数。次のいずれかに指定します。

  • "glorot" — Glorot 初期化子[2] (Xavier 初期化子とも呼ばれる) を使用して入力の重みを初期化します。Glorot 初期化子は、平均 0、分散 2/(InputSize + numOut) の一様分布から個別にサンプリングを行います。ここで、numOut = 3*NumHiddenUnits です。

  • "he" — He 初期化子[3]を使用して入力の重みを初期化します。He 初期化子は、平均 0、分散 2/InputSize の正規分布からサンプリングを行います。

  • "orthogonal" — 直交行列 Q を使用して入力の重みを初期化します。この直交行列は、単位正規分布からサンプリングされた乱数行列 Z に対する Z = QR の QR 分解によって与えられます。[4]

  • "narrow-normal" — 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、入力の重みを初期化します。

  • "zeros" — 0 で入力の重みを初期化します。

  • "ones" — 1 で入力の重みを初期化します。

  • 関数ハンドル — カスタム関数で入力の重みを初期化します。関数ハンドルを指定する場合、関数は weights = func(sz) という形式でなければなりません。ここで、sz は入力の重みのサイズです。

この層では、InputWeights プロパティが空の場合にのみ入力の重みが初期化されます。

GRULayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。

データ型: char | string | function_handle

再帰重みを初期化する関数。次のいずれかに指定します。

  • "orthogonal" — 直交行列 Q を使用して再帰重みを初期化します。この直交行列は、単位正規分布からサンプリングされた乱数行列 Z に対する Z = QR の QR 分解によって与えられます。[4]

  • "glorot" — Glorot 初期化子[2] (Xavier 初期化子とも呼ばれる) を使用して再帰重みを初期化します。Glorot 初期化子は、平均 0、分散 2/(numIn + numOut) の一様分布から個別にサンプリングを行います。ここで、numIn = NumHiddenUnits および numOut = 3*NumHiddenUnits です。

  • "he" — He 初期化子[3]を使用して再帰重みを初期化します。He 初期化子は、平均 0、分散 2/NumHiddenUnits の正規分布からサンプリングを行います。

  • "narrow-normal" — 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、再帰重みを初期化します。

  • "zeros" — 0 で再帰重みを初期化します。

  • "ones" — 1 で再帰重みを初期化します。

  • 関数ハンドル — カスタム関数で再帰重みを初期化します。関数ハンドルを指定する場合、関数は weights = func(sz) という形式でなければなりません。ここで、sz は再帰重みのサイズです。

この層では、RecurrentWeights プロパティが空の場合にのみ再帰重みが初期化されます。

GRULayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。

データ型: char | string | function_handle

バイアスを初期化する関数。次のいずれかの値として指定します。

  • "zeros" — 0 でバイアスを初期化します。

  • "narrow-normal" — 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、バイアスを初期化します。

  • "ones" — 1 でバイアスを初期化します。

  • 関数ハンドル — カスタム関数でバイアスを初期化します。関数ハンドルを指定する場合、関数は bias = func(sz) という形式でなければなりません。ここで、sz はバイアスのサイズです。

この層では、Bias プロパティが空の場合にのみバイアスが初期化されます。

GRULayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。

データ型: char | string | function_handle

入力の重み。行列として指定します。

この入力重み行列は、GRU 層にあるコンポーネントの 3 つの入力重み行列の連結です。3 つの行列は、以下の順で垂直に連結されています。

  1. リセット ゲート

  2. 更新ゲート

  3. 候補状態

入力の重みは学習可能なパラメーターです。関数 trainnet または trainNetwork によってニューラル ネットワークに学習させる際、InputWeights が空ではない場合、ソフトウェアは InputWeights プロパティを初期値として使用します。InputWeights が空の場合、InputWeightsInitializer によって指定された初期化子が使用されます。

学習時、InputWeights3*NumHiddenUnitsInputSize 列の行列です。

再帰重み。行列として指定します。

この再帰重み行列は、GRU 層にあるコンポーネントの 3 つの再帰重み行列の連結です。3 つの行列は、以下の順で垂直に連結されています。

  1. リセット ゲート

  2. 更新ゲート

  3. 候補状態

再帰重みは学習可能なパラメーターです。関数 trainnet または trainNetwork によって RNN に学習させる際、RecurrentWeights が空ではない場合、ソフトウェアは RecurrentWeights プロパティを初期値として使用します。RecurrentWeights が空の場合、RecurrentWeightsInitializer によって指定された初期化子が使用されます。

学習時、RecurrentWeights3*NumHiddenUnitsNumHiddenUnits 列の行列です。

層のバイアス。数値ベクトルとして指定します。

ResetGateMode"after-multiplication" または "before-multiplication" の場合、このバイアス ベクトルは、層処理に含まれるコンポーネントの 3 つのバイアス ベクトルの連結です。この層は、これらのベクトルを次の順序で垂直に連結します。

  1. リセット ゲート

  2. 更新ゲート

  3. 候補状態

この場合、学習時、Bias3*NumHiddenUnits 行 1 列の数値ベクトルです。

ResetGateMode"recurrent-bias-after-multiplication" の場合、このバイアス ベクトルは、GRU 層にあるコンポーネントの 6 つのバイアス ベクトルの連結です。この層は、これらのベクトルを次の順序で垂直に連結します。

  1. リセット ゲート

  2. 更新ゲート

  3. 候補状態

  4. リセット ゲート (再帰バイアス)

  5. 更新ゲート (再帰バイアス)

  6. 候補状態 (再帰バイアス)

この場合、学習時、Bias6*NumHiddenUnits 行 1 列の数値ベクトルです。

層のバイアスは学習可能なパラメーターです。ニューラル ネットワークの学習時に、Bias が空ではない場合、関数 trainnet および trainNetworkBias プロパティを初期値として使用します。Bias が空の場合、ソフトウェアは BiasInitializer によって指定された初期化子を使用します。

リセット ゲートの計算に関する詳細については、ゲート付き回帰型ユニット層を参照してください。

学習率および正則化

入力の重みの学習率係数。数値スカラーまたは 1 行 3 列の数値ベクトルとして指定します。

この係数にグローバル学習率が乗算されて、層の入力の重みの学習率係数が決定されます。たとえば、InputWeightsLearnRateFactor2 の場合、層の入力の重みの学習率係数は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。

InputWeights に含まれる 3 つの個々の行列について学習率係数の値を制御するには、1 行 3 列のベクトルを指定します。InputWeightsLearnRateFactor のエントリは、以下の値の学習率係数に対応します。

  1. リセット ゲート

  2. 更新ゲート

  3. 候補状態

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1]

再帰重みの学習率係数。数値スカラーまたは 1 行 3 列の数値ベクトルとして指定します。

この係数にグローバル学習率が乗算されて、層の再帰重みの学習率が決定されます。たとえば、RecurrentWeightsLearnRateFactor2 の場合、層の再帰重みの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。

RecurrentWeights に含まれる 3 つの個々の行列について学習率係数の値を制御するには、1 行 3 列のベクトルを指定します。RecurrentWeightsLearnRateFactor のエントリは、以下の値の学習率係数に対応します。

  1. リセット ゲート

  2. 更新ゲート

  3. 候補状態

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1]

バイアスの学習率係数。非負のスカラーまたは 1 行 3 列の数値ベクトルとして指定します。

この係数にグローバル学習率が乗算されて、この層のバイアスの学習率が決定されます。たとえば、BiasLearnRateFactor2 の場合、層のバイアスの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。

Bias に含まれる 3 つの個々のベクトルについて学習率係数の値を制御するには、1 行 3 列のベクトルを指定します。BiasLearnRateFactor のエントリは、以下の値の学習率係数に対応します。

  1. リセット ゲート

  2. 更新ゲート

  3. 候補状態

ResetGateMode"recurrent-bias-after-multiplication" の場合、ソフトウェアは再帰バイアス ベクトルについても同じベクトルを使用します。

すべてのベクトルに同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1]

入力の重みの L2 正則化係数。数値スカラーまたは 1 行 3 列の数値ベクトルとして指定します。

この係数にグローバル L2 正則化係数が乗算されて、層の入力の重みの L2 正則化係数が決定されます。たとえば、InputWeightsL2Factor2 の場合、層の入力の重みの L2 正則化係数は現在のグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、L2 正則化係数が決定されます。

InputWeights に含まれる 3 つの個々の行列の L2 正則化係数の値を制御するには、1 行 3 列のベクトルを指定します。InputWeightsL2Factor のエントリは、以下の値の L2 正則化係数に対応します。

  1. リセット ゲート

  2. 更新ゲート

  3. 候補状態

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1]

再帰重みの L2 正則化係数。数値スカラーまたは 1 行 3 列の数値ベクトルとして指定します。

この係数にグローバル L2 正則化係数が乗算されて、層の再帰重みの L2 正則化係数が決定されます。たとえば、RecurrentWeightsL2Factor2 の場合、層の再帰重みの L2 正則化係数は現在のグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、L2 正則化係数が決定されます。

RecurrentWeights に含まれる 3 つの個々の行列の L2 正則化係数の値を制御するには、1 行 3 列のベクトルを指定します。RecurrentWeightsL2Factor のエントリは、以下の値の L2 正則化係数に対応します。

  1. リセット ゲート

  2. 更新ゲート

  3. 候補状態

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1]

バイアスの L2 正則化係数。非負のスカラーまたは 1 行 3 列の数値ベクトルとして指定します。

この係数にグローバル L2 正則化係数が乗算されて、この層のバイアスの L2 正則化が決定されます。たとえば、BiasL2Factor2 の場合、この層のバイアスの L2 正則化はグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル L2 正則化係数が決定されます。

Bias に含まれる個々のベクトルの L2 正則化係数の値を制御するには、1 行 3 列のベクトルを指定します。BiasL2Factor のエントリは、以下の値の L2 正則化係数に対応します。

  1. リセット ゲート

  2. 更新ゲート

  3. 候補状態

ResetGateMode"recurrent-bias-after-multiplication" の場合、ソフトウェアは再帰バイアス ベクトルについても同じベクトルを使用します。

すべてのベクトルに同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1]

層の名前。文字ベクトルまたは string スカラーとして指定します。Layer 配列入力の場合、関数 trainnettrainNetworkassembleNetworklayerGraph、および dlnetwork は、名前が "" の層に自動的に名前を割り当てます。

GRULayer オブジェクトは、このプロパティを文字ベクトルとして格納します。

データ型: char | string

この プロパティ は読み取り専用です。

層への入力の数。

HasStateInputs プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層は HiddenState プロパティを使用して層処理を行います。

HasStateInputs プロパティが 1 (true) の場合、層は、それぞれ入力データおよび隠れ状態に対応する "in" および "hidden" という名前の 2 つの入力をもちます。この場合、層は、ネットワークによってこれらの入力に渡された値を使用して層処理を行います。HasStateInputs1 (true) の場合、HiddenState プロパティは空でなければなりません。

データ型: double

この プロパティ は読み取り専用です。

層の入力名。

HasStateInputs プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層は HiddenState プロパティを使用して層処理を行います。

HasStateInputs プロパティが 1 (true) の場合、層は、それぞれ入力データおよび隠れ状態に対応する "in" および "hidden" という名前の 2 つの入力をもちます。この場合、層は、ネットワークによってこれらの入力に渡された値を使用して層処理を行います。HasStateInputs1 (true) の場合、HiddenState プロパティは空でなければなりません。

GRULayer オブジェクトは、このプロパティを文字ベクトルの cell 配列として格納します。

この プロパティ は読み取り専用です。

層からの出力の数。

HasStateOutputs プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。

HasStateOutputs プロパティが 1 (true) の場合、層は、それぞれ出力データおよび隠れ状態に対応する "out" および "hidden" という名前の 2 つの出力をもちます。この場合、層は、層処理中に計算された状態値も出力します。

データ型: double

この プロパティ は読み取り専用です。

層の出力名。

HasStateOutputs プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。

HasStateOutputs プロパティが 1 (true) の場合、層は、それぞれ出力データおよび隠れ状態に対応する "out" および "hidden" という名前の 2 つの出力をもちます。この場合、層は、層処理中に計算された状態値も出力します。

GRULayer オブジェクトは、このプロパティを文字ベクトルの cell 配列として格納します。

すべて折りたたむ

名前が 'gru1' で、隠れユニットが 100 個の GRU 層を作成します。

layer = gruLayer(100,'Name','gru1')
layer = 
  GRULayer with properties:

                       Name: 'gru1'
                 InputNames: {'in'}
                OutputNames: {'out'}
                  NumInputs: 1
                 NumOutputs: 1
             HasStateInputs: 0
            HasStateOutputs: 0

   Hyperparameters
                  InputSize: 'auto'
             NumHiddenUnits: 100
                 OutputMode: 'sequence'
    StateActivationFunction: 'tanh'
     GateActivationFunction: 'sigmoid'
              ResetGateMode: 'after-multiplication'

   Learnable Parameters
               InputWeights: []
           RecurrentWeights: []
                       Bias: []

   State Parameters
                HiddenState: []

Use properties method to see a list of all properties.

Layer 配列に GRU 層を含めます。

inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;

layers = [ ...
    sequenceInputLayer(inputSize)
    gruLayer(numHiddenUnits)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer]
layers = 
  5x1 Layer array with layers:

     1   ''   Sequence Input          Sequence input with 12 dimensions
     2   ''   GRU                     GRU with 100 hidden units
     3   ''   Fully Connected         9 fully connected layer
     4   ''   Softmax                 softmax
     5   ''   Classification Output   crossentropyex

アルゴリズム

すべて展開する

参照

[1] Cho, Kyunghyun, Bart Van Merriënboer, Caglar Gulcehre, Dzmitry Bahdanau, Fethi Bougares, Holger Schwenk, and Yoshua Bengio. "Learning phrase representations using RNN encoder-decoder for statistical machine translation." arXiv preprint arXiv:1406.1078 (2014).

[2] 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

[3] 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

[4] Saxe, Andrew M., James L. McClelland, and Surya Ganguli. "Exact Solutions to the Nonlinear Dynamics of Learning in Deep Linear Neural Networks.” Preprint, submitted February 19, 2014. https://arxiv.org/abs/1312.6120.

拡張機能

バージョン履歴

R2020a で導入

すべて展開する