PyTorch LSTMCell — 入力、隠れ状態、セル状態、および出力の形状

PyTorch LSTMCell - 入力、隠れ状態、セル状態、出力の形状

Pytorchでは、nn.LSTMCellを使用するためには、入力時系列隠れ状態ベクトル、およびセル状態ベクトルを表すテンソルの形状を理解する必要があります。この記事では、多変量時系列で作業していると仮定します。データセットの各多変量時系列には、複数の単変量時系列が含まれています。

この記事では、次の用語を使用します。

バッチ = データセットからの単一バッチの多変量時系列の数

入力特徴量 = 1つの多変量時系列内の単変量時系列の数

タイムステップ = 各多変量時系列の時間ステップの数

LSTMCellに与えられる多変量時系列のバッチは、形状(タイムステップ、バッチ、入力特徴量)のテンソルである必要があります。

次の図は、この入力の形状を理解するためのものです:

LSTMCellへの入力は、特定のタイムステップのベクトルx_tとして与えられます。単一のタイムステップのベクトルの処理には、LSTMCellには1つの隠れ状態ベクトルと1つのセル状態ベクトルが必要です。これらはh_0およびc_0として表されます。LSTMCellの出力は、次の時間インスタンスの入力ベクトルを処理する際に使用される隠れ状態とセル状態です。これらの隠れ状態とセル状態は、後続の時間ステップのh_0およびc_0として渡されるループ内でLSTMCellが呼び出されます。このコンセプトは、次のコードスニペットで説明されています。

LSTMCellオブジェクトを初期化する際には、input_featuresおよびhidden_sizeの引数を指定する必要があります。

ここで、

input_features = 1つの多変量時系列内の単変量時系列の数(上記のinput_featuresと同じ値)

hidden_size = 隠れ状態ベクトルの次元数。セル状態ベクトルの次元数にも同じサイズが使用される必要があります。

LSTMCellの初期の隠れ状態とセル状態の値は、形状(バッチ、hidden_size)で作成する必要があります。ここで、バッチは入力多変量時系列のバッチと一致する必要があります。つまり、入力バッチの各MTSには、対応するhidden_stateとcell_stateがあります。

初期の隠れ状態と初期のセル状態の時系列は、LSTMCellを通じた前方伝播のために入力として与えられる必要があります。

入力MTSの特定のタイムステップのベクトル、初期の隠れ状態、および初期のセル状態をLSTMCellオブジェクトを介して前方伝播する形式は次のとおりです:

LSTMCell(x_t, (h_0, c_0))

次の図は、隠れ状態とセル状態の形状を理解するためのものです:

以下にコードの例を示します。コードの説明は後続します。

import torchimport torch.nn as nn lstm_0 = nn.LSTMCell(10, 20) # (input_features, hidden_size)inp = torch.randn(7, 3, 10) # (time_steps, batch, input_features) -> input time serieshx = torch.randn(3, 20) # (batch, hidden_size) -> initial value of hidden statecx = torch.randn(3, 20) # (batch, hidden_size) -> initial value of cell statefor i in range(inp.size()[0]):     hx, cx = lstm_0(inp[i], (hx, cx)) # forward propogation of input through LSTMCell     output.append(hx)output = torch.stack(output, dim=0)

nn.LSTMCell()を呼び出すと、__init__()のダンダーマジックメソッドが呼び出され、LSTMCellオブジェクトが作成されます。上記のコードでは、このオブジェクトはlstm_0として参照されています。

一般的にRNN(LSTMはRNNの一種)では、入力時系列の各タイムステップはRNN内で順序通りに1つずつ渡され、RNNによって処理される必要があります。

LSTMCellを使用してバッチで多変量時系列を処理するためには、バッチ内のすべてのMTSの各タイムステップを順番にLSTMCellに渡す必要があります。

これはforループによって実現されます。このループはMTSの各タイムステップ(inp.size()の最初の次元はタイムステップの数です)を反復処理し、バッチ内の各MTSのタイムステップのベクトルを並列にLSTMCellに渡します。LSTMCellへの単一の呼び出しは、MTS内の1つのタイムステップのベクトルのみを処理します。

forループ内のlstm_0(inp[i], (hx, cx))の呼び出しの出力は、各タイムステップの次のhidden_stateとcell stateの作成です。出力されたhidden_state(hx)とcell_state(cx)は、前のhxとcxに基づいて再帰的に計算されます。

出力:(h_1, c_1)

この出力は、バッチ全体の各時系列に対して計算されます。出力の形状は(batch, hidden_size)です。

次の図は、出力されるhidden stateとcell stateの形状を理解するためのものです:

入力バッチ内の各MTSの各タイムステップで作成される計算されたhxは、出力テンソルに追加され、0軸に沿ってスタックされます。したがって、出力の次元は(time_steps, batch, hidden_size)です。

上記のコード例の出力は次のようになります:

tensor([[[ 0.0087,  0.0365, -0.1233, -0.2641,  0.2908, -0.5075,  0.2587,           0.1057, -0.2079, -0.2327,  0.1390,  0.1023, -0.1186,  0.3302,           0.1139,  0.1591, -0.0264, -0.0499,  0.0153,  0.3881],         [ 0.3585, -0.4133, -0.0259,  0.2490, -0.0936, -0.2756, -0.1941,          -0.0967,  0.1501, -0.0334, -0.1904, -0.3945, -0.1036, -0.2091,           0.0545,  0.1937, -0.2338,  0.0382,  0.2344,  0.1169],         [-0.2532,  0.0745, -0.0329,  0.0971, -0.1057, -0.0383,  0.1328,           0.1263, -0.1422,  0.0351,  0.3957, -0.4115, -0.2951, -0.5560,           0.1941,  0.0100,  0.3028, -0.1803,  0.0028,  0.3210]],        [[ 0.1105, -0.1295, -0.0636, -0.2510,  0.1923, -0.2457,  0.2401,           0.1379, -0.1373, -0.2451,  0.0387,  0.1004, -0.0580,  0.3430,          -0.0149,  0.1827, -0.0229, -0.2061,  0.1718,  0.3146],         [ 0.2741, -0.2413, -0.1310,  0.1206,  0.0379, -0.1738, -0.0568,           0.0417,  0.0756,  0.1020,  0.0262, -0.3280, -0.0352, -0.1713,           0.1065,  0.0458, -0.3404, -0.0795,  0.0586,  0.0026],         [-0.0112,  0.0883, -0.1755, -0.0438,  0.0193,  0.0151,  0.1010,           0.1614, -0.0524,  0.0970,  0.2092, -0.3518, -0.0715, -0.3941,           0.1422,  0.1164,  0.2946, -0.1919,  0.1493,  0.1203]]],       grad_fn=<StackBackward0>)

入力の各タイムステップ(入力のtime_steps = 2)ごとに配列が作成されます(2つの配列が作成されます)。これらの配列のそれぞれには、バッチ内の各MTSごとに配列が含まれます(batch_size = 3)。MTSの各タイムステップごとに、hidden_size次元(ここではhidden_size = 20)の隠れ状態ベクトル出力が得られます。したがって、各タイムステップでは、MTSの値はベクトルです。このベクトルはタイムステップごとに20次元のhidden_stateベクトルにマップされます。

次の図は、出力の多変量時系列バッチの形状を理解するためのものです:

上記のコードで1つのタイムステップ(ループ内の1回の反復)のhxを出力する場合、以下が出力されます:

tensor([[ 0.1034, -0.0192, -0.0581, -0.0772, -0.1578, -0.1450,  0.0377, -0.0013,         -0.2641, -0.1821,  0.0431, -0.2262,  0.3025,  0.0952,  0.4113, -0.2968,         -0.4377,  0.0794,  0.3683, -0.0021],        [ 0.0309,  0.3957,  0.2143,  0.1020,  0.0640, -0.0628,  0.4390,  0.1818,          0.0373,  0.2497, -0.1768, -0.2038, -0.1249, -0.2995,  0.0786, -0.0522,         -0.0080, -0.3095, -0.0815,  0.2874],        [-0.2458,  0.1622,  0.2564, -0.3136,  0.0631,  0.0643,  0.4036,  0.3293,         -0.1806, -0.0251, -0.4505, -0.1437, -0.1718, -0.0479, -0.1116, -0.1065,         -0.3289,  0.1137,  0.1160,  0.1227]], grad_fn=<MulBackward0>)

1つのタイムステップに対応する1つの配列があります。このタイムステップ内には、バッチ内の3つのMTSに対応する3つの配列があります。1つのMTSに対応するこれらの配列のそれぞれは、20次元の隠れベクトルです。したがって、1つのタイムステップの出力は(batch, hidden_size)です。

この出力サイズは、次の図を使用して理解することができます:

nn.LSTMCellの初期化引数は次のとおりです:

input_size

hidden_size

bias

device

dtype

num_layersはありません。これは単一のセルであるため、複数のLSTMレイヤーを持つことはできません。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

「学生として、私がChatGPTを使って生産性を10倍にする方法」

現代の忙しい世界では、学生たちは常に生産性と効率を高める方法を求めています私自身も学生であり、一日中とても忙しかった...

人工知能

「目標をより早く達成するための25のChatGPTプロンプト」

「自分の目標を達成することに苦しんでいると感じたときはいつでも、この記事を読んでください... 効果があります」

機械学習

「インドにおけるAI規制のためのPMモディのビジョン:B20サミット2023」

2023年、B20サミットインドがデリーで終了するにつれ、ナレンドラ・モディ首相の言葉の響きは続きました。ビジネスリーダーた...

データサイエンス

「オンライン大規模な推薦のためのデュアル拡張二つのタワーモデル」

推薦システムは、ユーザーに個別にカスタマイズされた提案を提供するために設計されたアルゴリズムですこれらのシステムは、...

AIテクノロジー

フリートテクノロジーのためのAI駆動エッジインサイトの実装

「エッジインサイトをフリートテクノロジーに導入し、効率と安全性を向上させ、ドライバーとフリートマネージャーにほぼリア...

人工知能

すべての開発者が知るべき6つの生成AIフレームワークとツール

この記事では、トップのジェネラティブAIフレームワークとツールについて探求しますあなたの想像力を解き放ち、ジェネラティ...