RNN の理論から PyTorch まで

RNN の理論から PyTorch まで

RNN とは何か、どこで使用されているか、どのように前方および後方に伝播するか、そして PyTorch でどのように使用するかについて説明します。

ほとんどの種類のニューラル ネットワークは、トレーニングに使用した例について予測を行うことができます。その代表的な例が MNIST データセットです。 MLP のような通常のニューラル ネットワークは、10 桁の数字があることを認識しており、画像がネットワークのトレーニングに使用されたものと大きく異なる場合でも、それらの数字のみに基づいて予測を行います。

[[376266]]

ここで、このネットワークを使用して、9 つの順序付けられた数字のシーケンスを提供し、ネットワークに 10 番目の数字を推測するように依頼することで、シーケンス分析を実行できるとします。ネットワークは 10 桁の数字を区別する方法を知っているだけでなく、0 から 8 までの順序で次の桁が 9 になる可能性が高いことも知っています。

シーケンス データを分析すると、シーケンス内の要素は通常、何らかの形で関連しており、相互に依存していることがわかります。したがって、シーケンスのアイデアを理解するには、各要素を考慮する必要があります。

Cambridge University Press では、シーケンスを「物事や出来事が次々に続く順序」、または最も重要な点として「関連する一連の物事や出来事」と定義しています。この定義をディープラーニングのコンテキストに当てはめると、シーケンスはトレーニング可能なコンテキストを含むデータのセットであり、一部の要素を削除すると役に立たなくなる可能性があります。

しかし、シーケンスには何が含まれているのでしょうか? どのグループ化されたデータにコンテキストがあるのでしょうか? また、ニューラル ネットワークのパワーを活用するためにコンテキストをどのように抽出できるのでしょうか? ニューラル ネットワーク自体について説明する前に、リカレント ニューラル ネットワーク (RNN) を使用して頻繁に解決される 2 種類の問題について説明します。

時系列予測

最初の例は時系列予測の問題です。ここでは、一連の既存の値 (青) に基づいてニューラル ネットワークをトレーニングし、将来の時間ステップ (赤) を予測します。

これらの世帯を長年にわたる毎月のエネルギー支出順に並べてみると、突然の上昇と急激な下降を伴う正弦波の傾向が見られます。

正弦波部分の背景には、年間を通じてのエネルギー需要の違い(夏から冬、そして再び夏)が考えられます。エネルギー消費量の増加は、より多くの電化製品やデバイスを使用すること、またはより多くのエネルギーを必要とする可能性のあるより強力な電化製品やデバイスに切り替えることによって発生する可能性があります。突然の転倒という状況は、その人が家を出られるほど成長し、その人に必要なエネルギーがもう残っていないことを意味しているのかもしれません。

知っているコンテキストが多いほど、入力ベクトルを連結してネットワークに提供できる情報が多くなり、ネットワークがデータを理解できるようになります。この場合、各月について、エネルギーにさらに 3 つの値を関連付けることができます。これらの値には、電化製品と機器の数、それらのエネルギー効率、および世帯に収容される人数が含まれます。

自然言語処理

メアリーは自転車に乗ります。自転車は____です。

2 番目の例は、自然言語処理の問題です。これは、ニューラル ネットワークが既存の文によって提供されるコンテキストを考慮して文を完成させる必要があるため、良い例でもあります。

私たちのネットワークが所有代名詞を含む文を完成するようにトレーニングされているとします。よく訓練されたネットワークは、その文が三人称単数で構成されており、メアリーはおそらく女性の名前であることを理解します。したがって、予測される代名詞は、男性形の「his」や複数形の「their」ではなく、「her」になるはずです。

データのソートの例を 2 つ見てきたので、ネットワークを介した前方伝播と後方伝播のプロセスを調べてみましょう。

RNN 構成

ご覧のとおり、RNN はシーケンスから情報を抽出して予測力を向上させます。

> シンプルな再帰ネットワーク図。図は著者によるものです。

上には単純な RNN グラフが示されています。緑のノードは入力 x^t を受け取り、値 h^t を出力します。この値もこのノードに送られ、入力から収集された情報が含まれます。ノードに入力される内容にどのようなパターンがあっても、ノードはその情報を学習し、次の入力のために保持します。上付き文字の t は時間ステップを表します。

> 再帰的ネットワーク構成。図は著者による。

入力または出力の形状に応じて、ニューラル ネットワークの構成が少し変わります。ノード内で何が起こるかは後で確認します。

多対 1 構成とは、異なる時間ステップで複数の入力を取得して 1 つの出力を取得する場合であり、映画のシーンの個々のフレームでキャプチャされた感情分析などがこれに該当します。

1 対多では、1 つの入力を使用して複数の出力を取得します。たとえば、多対 1 の構成を使用して特定の感情を表現した詩をエンコードし、1 対多の構成を使用して同じ感情を持つ新しい詩行を作成できます。

多対多では、複数の入力を使用して複数の出力を取得します。たとえば、値の範囲 (エネルギー使用量など) を取得して、1 か月ではなく 12 か月先を予測します。

スタック構成は、単に複数の層の隠しノードを持つネットワークです。

RNN フォワードパス

ニューラル ネットワーク ノード内で何が起こっているかを理解するために、「時系列予測」の例として単純なデータセットを使用します。以下は、トレーニング データセットとテスト データセットとして再構成された値の完全なシーケンスです。

この例は、ディープラーニング全般に関する優れたリソースであるこの Web サイトから引用しました。それでは、データセットをバッチに分割しましょう。

ここでは示していませんが、データセットを正規化する必要があることに注意してください。ニューラル ネットワークはデータセット内の値のサイズに敏感なので、これは重要です。

将来の値を予測することが目的です。したがって、バッチの最初の行 [10 20 30] を選択したと仮定すると、ネットワークをトレーニングした後、40 という値が得られるはずです。ニューラル ネットワークをテストするには、ベクトル [70 80 90] を入力し、ネットワークが適切にトレーニングされていれば 100 に近い値が得られると予想できます。

各シーケンスに 3 つのタイム ステップを提供する、多対 1 構成を使用します。再帰型ネットワークを使用する場合、入力値だけがネットワークに入る値ではなく、ノード間でシーケンスのコンテキストを渡す構造を持つ隠し配列も存在します。これをゼロの配列に初期化し、入力に接続します。サイズ (1 x 2) は個人の選択であり、1 x 1 ステッパー入力とは異なるサイズを使用するだけです。

> 再帰フォワードパス。図は著者による。

よく見ると、重みマトリックスが 2 つの部分に分かれていることがわかります。最初の関数は入力を処理して 2 つの出力を作成し、2 番目の関数は隠し配列を処理して 2 つの出力を作成します。次に、これら 2 セットの出力を加算し、最初の入力 (10) からの情報を含む新しい隠し配列を取得して、次のタイム ステップ入力 (20) に送ります。重み行列とバイアス行列は時間ステップ間で同じであることに注意してください。

上記は、グローバル入力ベクトル X^t、重み行列 W、バイアス行列 B、および隠し配列の計算を示しています。前進を完了するにはあと一歩です。私たちは将来の値を予測しようとしています。出力として各入力の情報を含む 3 つの隠し配列があるため、それらを単一の値に変換する必要があります。この値は、トレーニングを何回も実行した後に正しい値になるはずです。

配列を連結して形状を変更することで、線形レイヤーを追加して最終結果を計算できます。完全なネットワークの形式は次のようになります。

> 完全な回帰図。図は著者によるものです。

多対 1 の構成がわかりますか? シーケンスから 3 つの入力をフィードし、そのコンテキストが重み行列とバイアス行列によってキャプチャされ、各タイム ステップで新しい情報で更新される非表示の配列に格納されます。最終的に、隠し配列に格納されたコンテキストは別の重みとバイアスのセットを通過し、シーケンスのすべての時間ステップがネットワークに入力された後、値が出力されます。

隠れ状態の線形形式、線形層の重みとバイアス行列、および予測値 (y ハット) の計算を確認できます。

さて、これは RNN のフォワード パスですが、バックワード パスはまだ見ていません。

RNN 後方パス

バックプロパゲーションは、あらゆるニューラル ネットワークのトレーニングにおいて非常に重要なステップです。ここで、予測出力と実際の値の間の誤差は、重みとバイアスを改善することを目的としてニューラル ネットワークに伝播され、各反復でより優れた予測が得られます。

ほとんどの場合、この手順は複雑なため省略されます。重要な点に触れつつ、できるだけわかりやすく説明させていただきます。

後方パスは、微積分の連鎖律を使用して損失からすべての重みとバイアス パラメータへの一連の導出です。つまり、次の値(多次元の場合は配列)が必要になります。

一次導関数の数学的意味に詳しくないが、実際には、一次導関数がゼロの場合の勾配降下法について読むことをお勧めします。これは通常、システムの最小値が見つかったことを意味し、理想的にはそれ以上改善することはできないことを意味します。

ここで注意すべき点が 1 つあります。ゼロは最大値になる可能性もありますが、これは不安定なので最適化すべきではありません。また、鞍点になる可能性もありますが、鞍点自体もあまり安定していません。最小値は、グローバル値 (関数の最小値) またはローカル値にすることができます。これは私の説明にとって重要ではありませんが、もっと詳しく知りたい場合は調べてみてください。

> 勾配降下法の例。丘を転がり落ちる 2 つのボール。図は著者によるものです。

写真に写っているのは、谷を転がり落ちる 2 つのボールです。視覚的には、1 次導関数によって丘の大きさがわかります。 W が増加する方向 (左から右) に移動する場合、傾きは緑のボールの場合は負 (下向き)、赤のボールの場合は正 (上向き) になります。

次の段落を注意深く読み、必要に応じてこの図に戻ってください。

損失を最小限に抑えたい場合は、ボールが谷の最も低い地点に到達するようにします。 W は重みとバイアスの値を表すため、緑のボールの位置にいる場合は、負の導関数の一部 (正にする) を緑のボールの W 位置から減算して右に移動し、正の導関数の一部 (負にする) を減算して赤いボールの W 位置を左に移動する (負にする) ことで、両方のボールが最小値に近くなるようにします。

数学的に言えば、次のようになります。

η は重みとバイアスを更新するために使用する導関数のスケールを調整します。

さて、バックワードパスの問題に移りましょう。損失からすべてのパラメータまでの連鎖導関数を順に見ていき、各導関数が何を表しているかを確認します。上記で紹介したレイヤーの方程式とそのパラメーター マトリックスを覚えておくことが重要です。

覚えておくべきことの 1 つは、探している 1 次導関数の 4 つの配列は、更新するパラメーターと同じ形状でなければならないということです。たとえば、配列 dL/dW_h の形状は、重み配列 W_h と同じである必要があります。上付き文字の T は、行列が転置されていることを意味します。

これを線形層のパラメータまで遡ってみます。隠し状態配列を線形ベクトルに再形成したので、dL/dH^t を連結された隠し状態配列の元の形状に再形成する必要があります。現在は 6 x 1 配列ですが、再帰層から計算された隠し配列の形状は 3 x 2 です。また、すべてのグローバル入力を連結し (t = 1、2、3)、逆方向パスに進むことができます。

残っているのは、先ほど見た勾配降下法の方程式を適用してパラメータを更新することだけです。これで、モデルは次の反復の準備が整います。 PyTorch を使用して簡単な RNN を構築する方法を見てみましょう。

PyTorch での RNN

PyTorch では、後方パスについて心配する必要がないため、これは非常に簡単です。しかし、直接使用しない場合でも、それがどのように機能するかを理解することは重要だと私は考えています。

次に、PyTorch のドキュメントを参照すると、使用できる RNN オブジェクトがすでに存在していることがわかります。定義する際には、2 つの基本パラメータがあります。

  • input_size — 入力xに含まれる予想される特徴の数
  • hidden_​​size — 隠れ状態の特徴の数 h

input_size が 1 なのは、各シーケンスの 1 つのタイム ステップを一度に使用するためです (たとえば、シーケンス 10、20、30 の場合は 10)。hidden_​​size が 2 なのは、2 つの値を含む隠し状態を取得するためです。

n_layers パラメータを 2 に定義すると、2 つの隠し層を持つスタックされた RNN が作成されます。

さらに、パラメータ batch_first を True として定義します。これは、入力と出力のバッチサイズが最初に来ることを意味します(入力と出力を間違えないでください)

入力: 入力、h_0

  • 形状 (seq_len、batch、input_size) の入力: 入力シーケンス機能を含むテンソル。
  • 形状 (num_layers * num_directions、batch、hidden_​​size) の h_0: バッチ内の各要素の初期の隠し状態を含むテンソル。

RNN への入力は、形状が 1 x 3 x 1 の入力配列である必要があります。このシーケンスには、データセットの最初の 10、20、30 の 3 つの時間ステップが含まれます。各バッチから、サイズ 1 の入力が、シーケンスの 3 つの時間ステップとして 3 回ネットワークに供給されます。

隠し状態 h_0 は最初の隠し配列であり、形状 1 x 1 x 2 の最初のタイム ステップ入力とともにネットワークに供給されます。

出力: 出力、h_n

  • 形状 (seq_len、batch、num_directions * hidden_​​size) の出力: 各 t の RNN の最後のレイヤーの出力特徴 (h_t) を含むテンソル。
  • 形状 (num_layers * num_directions、batch、hidden_​​size) の h_n: t = seq_len の隠し状態を含むテンソル。

出力には、形状 1 x 3 x 2 の各タイム ステップでニューラル ネットワークによって計算されたすべての隠し状態が含まれ、h_n は最後のタイム ステップでの隠し状態です。スタックされた再帰型ネットワークを使用することを選択した場合、これが最初のタイム ステップで入力される隠し状態となり、形状が 1 x 1 x 2 になるため、これを覚えておくと便利です。

これらの配列はすべて上記の例で表されており、RNN 図で確認できます。もう一つ注意すべき点は、再帰型ネットワークと「時系列予測」の具体的な例を使用する場合、num_directions を 2 に設定すると、過去だけでなく未来も予測することになるということです。このタイプの構成はここでは考慮されません。

RNN を実装し、それをトレーニングする方法を示すコード スニペットを残しておきます。必要に応じて、希望するデータセットで使用するかどうかもお任せします。ネットワークを使用する前に、データを正規化し、データセットとデータ ローダーを作成することを忘れないでください。

終わりに

最後に簡単にまとめると、まず、リカレント ネットワークを使用して一般的に解決される 2 種類の問題、つまり時系列予測と自然言語処理について説明しました。

その後、一般的な構成の例と、多対 1 の構成を使用して未来の 1 ステップを予測することを目標とした実用的な例をいくつか見ました。

フォワードパスでは、入力状態と隠し状態がリカレント層の重みとバイアスとどのように相互作用するか、また隠し状態に含まれる情報を使用して次のタイムステップ値を予測する方法を確認しました。

後方パスは、予測に関する損失の勾配から、最適化しようとしているパラメータに関する損失の変化に至るまでの連鎖律の単なる応用です。

最後に、PyTorch ドキュメントの RNN に関するセクションを確認し、基本的な再帰型ネットワークを構築するための最も重要な部分について説明しました。

読んでいただきありがとうございます。この長い物語から何かインスピレーションを得たかもしれません。新しい概念を理解するために、そしてできれば他の人にも役立つように、私は記事を書いています。

オリジナルリンク: https://towardsdatascience.com/rnns-from-theory-to-pytorch-f0af30b610e1

<<:  知能ロボット技術の応用と開発動向

>>:  中国の人工知能産業市場はどれくらい大きいのでしょうか? 2021年の6つの主要トレンド

ブログ    

推薦する

2019 年に読むべき 5 つの無料機械学習電子書籍

[51CTO.com クイック翻訳] 現在、機械学習は主要なソフトウェアエンジニアリング分野における...

歴史を作ろう!地球からのドローンが火星へ飛び立ち、NASAはこのようにライト兄弟に敬意を表す

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

アルゴリズムによる管理下にある労働者:労働の退化と集団不安

[[426039]]かつて人々は、技術の進歩が労働者に大きな解放をもたらし、人類が牧歌的な生活を送れ...

AIビジョンを取り入れることで、ガソリンスタンドは非常に「スマート」になることができます

[[354264]]石油貯蔵所、ガソリンスタンド、石油荷降ろしトラックには大量の完成燃料が保管され...

マスク氏:ヒューマン・マシン・インターフェース技術は「間もなく利用可能になる」、人間のIQはAIに匹敵する

イーロン・マスク氏は、人工知能が人類にもたらす避けられない課題に対処するためには、人間が機械と「つな...

自然言語処理におけるディープラーニングの応用

自然言語処理とは、自然言語を使用して人間とコンピューターが効果的にコミュニケーションするためのさまざ...

...

リカレントニューラルネットワークの父:未来のロボットはアリを見るように人間を見るだろう

4月19日、ガーディアン紙は、ロボットの将来について語ったインタビューで、再帰型ニューラルネットワー...

産業オートメーションにおけるコンピュータビジョンの応用と利点

コンピューター ビジョンは、製造および生産プロセスを自動化および最適化して、効率を高め、製品の品質を...

清朗智能の新型消毒ロボットが海外市場を席巻

新型コロナウイルスの感染力が高いため、防疫期間中、一般の人々は、インテリジェント消毒ロボットが医療産...

AI エージェントに協力と競争を教えましょう。最初の大規模マルチエージェントフレームワークであるCAMELは3.6kのスターを獲得しました

「どんな魔法が私たちを賢くするのでしょうか?魔法は魔法がないことです。知性の力は、単一の完璧な原理か...

よく使われる8つのソートアルゴリズム - Javaコード実装

1. バブルソート改良版: 2. 選択ソート3. 挿入ソート4. シェルソート5. クイックソート6...

マスク氏の最新インタビュー:自動運転、AI、テスラのヒューマノイドロボットについて

最近、世界一の富豪イーロン・マスク氏がTEDディレクターのクリス・アンダーソン氏が主催する独占インタ...

...