Main Content

bilstmLayer

再帰型ニューラル ネットワーク (RNN) 用の双方向長短期記憶 (BiLSTM) 層

説明

双方向 LSTM (BiLSTM) 層は、時系列データまたはシーケンス データのタイム ステップ間の双方向の長期的な依存関係を学習する RNN 層です。これらの依存関係は、各タイム ステップで時系列全体から RNN に学習させる場合に役立ちます。

作成

説明

layer = bilstmLayer(numHiddenUnits) は、双方向 LSTM 層を作成し、NumHiddenUnits プロパティを設定します。

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

プロパティ

すべて展開する

BiLSTM

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

データ型: double | char | string

活性化

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

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

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

  • "relu" (R2024b 以降) — 正規化線形ユニット (ReLU) 関数 ReLU(x)={x,x>00,x0 を使用します。

ソフトウェアは、セル状態と隠れ状態を更新する計算における関数 σc としてこのオプションを使用します。

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

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

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

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

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

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

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

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

状態

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

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

HasStateInputstrue の場合、CellState プロパティは空でなければなりません。

データ型: single | double

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

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

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

データ型: single | double

パラメーターと初期化

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

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

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

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

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

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

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

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

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

データ型: char | string | function_handle

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

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

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

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

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

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

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

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

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

データ型: char | string | function_handle

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

  • "unit-forget-gate" — 忘却ゲート バイアスを 1 で初期化し、残りのバイアスを 0 で初期化します。

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

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

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

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

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

データ型: char | string | function_handle

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

この入力重み行列は、双方向 LSTM 層にあるコンポーネント (ゲート) の 8 個の入力重み行列の連結です。8 個の行列は、以下の順で垂直に連結されています。

  1. 入力ゲート (順方向)

  2. 忘却ゲート (順方向)

  3. セル候補 (順方向)

  4. 出力ゲート (順方向)

  5. 入力ゲート (逆方向)

  6. 忘却ゲート (逆方向)

  7. セル候補 (逆方向)

  8. 出力ゲート (逆方向)

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

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

データ型: single | double

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

この再帰重み行列は、双方向 LSTM 層にあるコンポーネント (ゲート) の 8 個の再帰重み行列の連結です。8 個の行列は、以下の順で垂直に連結されています。

  1. 入力ゲート (順方向)

  2. 忘却ゲート (順方向)

  3. セル候補 (順方向)

  4. 出力ゲート (順方向)

  5. 入力ゲート (逆方向)

  6. 忘却ゲート (逆方向)

  7. セル候補 (逆方向)

  8. 出力ゲート (逆方向)

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

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

データ型: single | double

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

このバイアス ベクトルは、双方向 LSTM 層にあるコンポーネント (ゲート) の 8 個のバイアス ベクトルの連結です。8 個のベクトルは、以下の順で垂直に連結されています。

  1. 入力ゲート (順方向)

  2. 忘却ゲート (順方向)

  3. セル候補 (順方向)

  4. 出力ゲート (順方向)

  5. 入力ゲート (逆方向)

  6. 忘却ゲート (逆方向)

  7. セル候補 (逆方向)

  8. 出力ゲート (逆方向)

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

学習時、Bias8*NumHiddenUnits 行 1 列の数値ベクトルです。

データ型: single | double

学習率および正則化

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

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

InputWeights に含まれる 4 つの個々の行列について学習率係数の値を制御するには、1 行 8 列のベクトルを割り当てます。ここで、エントリは以下の学習率係数に対応します。

  1. 入力ゲート (順方向)

  2. 忘却ゲート (順方向)

  3. セル候補 (順方向)

  4. 出力ゲート (順方向)

  5. 入力ゲート (逆方向)

  6. 忘却ゲート (逆方向)

  7. セル候補 (逆方向)

  8. 出力ゲート (逆方向)

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

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

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

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

RecurrentWeights に含まれる 4 つの個々の行列について学習率の値を制御するには、1 行 8 列のベクトルを割り当てます。ここで、エントリは以下の学習率係数に対応します。

  1. 入力ゲート (順方向)

  2. 忘却ゲート (順方向)

  3. セル候補 (順方向)

  4. 出力ゲート (順方向)

  5. 入力ゲート (逆方向)

  6. 忘却ゲート (逆方向)

  7. セル候補 (逆方向)

  8. 出力ゲート (逆方向)

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

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

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

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

Bias に含まれる 4 つの個々の行列について学習率係数の値を制御するには、1 行 8 列のベクトルを割り当てます。ここで、エントリは以下の学習率係数に対応します。

  1. 入力ゲート (順方向)

  2. 忘却ゲート (順方向)

  3. セル候補 (順方向)

  4. 出力ゲート (順方向)

  5. 入力ゲート (逆方向)

  6. 忘却ゲート (逆方向)

  7. セル候補 (逆方向)

  8. 出力ゲート (逆方向)

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

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

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

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

InputWeights に含まれる 4 つの個々の行列について L2 正則化係数の値を制御するには、1 行 8 列のベクトルを割り当てます。ここで、エントリは以下の L2 正則化係数に対応します。

  1. 入力ゲート (順方向)

  2. 忘却ゲート (順方向)

  3. セル候補 (順方向)

  4. 出力ゲート (順方向)

  5. 入力ゲート (逆方向)

  6. 忘却ゲート (逆方向)

  7. セル候補 (逆方向)

  8. 出力ゲート (逆方向)

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

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

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

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

RecurrentWeights に含まれる 4 つの個々の行列について L2 正則化係数の値を制御するには、1 行 8 列のベクトルを割り当てます。ここで、エントリは以下の L2 正則化係数に対応します。

  1. 入力ゲート (順方向)

  2. 忘却ゲート (順方向)

  3. セル候補 (順方向)

  4. 出力ゲート (順方向)

  5. 入力ゲート (逆方向)

  6. 忘却ゲート (逆方向)

  7. セル候補 (逆方向)

  8. 出力ゲート (逆方向)

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

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

バイアスの L2 正則化係数。非負のスカラーとして指定します。

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

Bias に含まれる 4 つの個々の行列について L2 正則化係数の値を制御するには、1 行 8 列のベクトルを割り当てます。ここで、エントリは以下の L2 正則化係数に対応します。

  1. 入力ゲート (順方向)

  2. 忘却ゲート (順方向)

  3. セル候補 (順方向)

  4. 出力ゲート (順方向)

  5. 入力ゲート (逆方向)

  6. 忘却ゲート (逆方向)

  7. セル候補 (逆方向)

  8. 出力ゲート (逆方向)

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

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

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

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

データ型: char | string

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

層への入力の数。

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

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

データ型: double

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

層の入力名。

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

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

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

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

層への出力の数。

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

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

データ型: double

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

層の出力名。

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

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

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

すべて折りたたむ

名前が bilstm1 で、隠れユニットが 100 個の双方向 LSTM 層を作成します。

layer = bilstmLayer(100,Name="bilstm1")
layer = 
  BiLSTMLayer with properties:

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

   Hyperparameters
                  InputSize: 'auto'
             NumHiddenUnits: 100
                 OutputMode: 'sequence'
    StateActivationFunction: 'tanh'
     GateActivationFunction: 'sigmoid'

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

   State Parameters
                HiddenState: []
                  CellState: []

Use properties method to see a list of all properties.

配列 Layer に双方向 LSTM 層を含めます。

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

layers = [ ...
    sequenceInputLayer(inputSize)
    bilstmLayer(numHiddenUnits)
    fullyConnectedLayer(numClasses)
    softmaxLayer]
layers = 
  4x1 Layer array with layers:

     1   ''   Sequence Input    Sequence input with 12 dimensions
     2   ''   BiLSTM            BiLSTM with 100 hidden units
     3   ''   Fully Connected   9 fully connected layer
     4   ''   Softmax           softmax

アルゴリズム

すべて展開する

参照

[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

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

拡張機能

バージョン履歴

R2018a で導入

すべて展開する