ゼファーネットのロゴ

長短期記憶(LSTM):少し深く掘り下げる

日付:

この記事は、の一部として公開されました データサイエンスブログソン.

 長短期記憶の紹介

「見たことがありますか形見」またはonmの短期記憶の問題があります。 LSTMはRNNの特別なバージョンであり、ゲートの概念を通じてRNNのこの問題を解決します。

シーケンス予測の問題は、長い間最も困難な問題の3つと見なされています。 それらには、文の次の単語を予測することから、映画のプロットを理解することからあなたの話し方を認識することまで、株式市場データのパターンを見つけることまで、幅広い問題が含まれています。 すでに説明したように、tLSTMはゲートの概念に取り組んでいます。 にXNUMXつのメインゲートがあります LSTM 命名 ゲートを忘れて、入力ゲート & 出力ゲート.

前回の記事では、長短期記憶がRNNSの制限をどのように解決するかについてすでに説明しました。この記事では、すべてのゲートを詳細に理解し、このアルゴリズムの簡単な実装を見ていきます。

LSTMの背後にある基本的な考え方

長期短期記憶またはLSTMは、長期依存性を学習することができます。 このアルゴリズムは、1997年にHochreiterとSchmidhuberによって最初に導入されました。LSTMはさまざまなシーケンシャル問題でうまく機能し、現在では業界で広く使用されています。 文の文脈を長期間覚えることは彼らのデフォルトの行動であり、彼らが学ぶのに苦労していることではありません。

リカレントニューラルネットワークは、単一のtan-h層など、非常に単純な構造を持っています。

一方、長短期記憶もチェーンのような構造ですが、RNNとは少し異なります。 彼らはゲートの概念に取り組んでいます。

LSTMモデル2

このアーキテクチャを使用しないでください。簡単な手順に分解して、これを簡単に入手できるようにします。 LSTMには主に3つのゲートがあります

  • ゲートを忘れる
  • 入力ゲート
  • 出力ゲート

これらすべてのゲートを詳しく見て、これらすべてのゲートの背後にある本質的な詳細を理解してみましょう。

ゲートを忘れる

テキスト予測問題の例を見てみましょう。

ゲートを忘れる

'while'に遭遇するとすぐに、忘却ゲートは、文の主語または文の文脈に変更がある可能性があることを認識します。 したがって、文の主題は忘れられ、主題の場所は空けられます。 「Chirag」について話し始めると、主題のこの位置は「Chirag」に割り当てられます。

無関係な情報はすべて、フィルターの乗算によって削除されます。 これは、LSTMネットワークの実行を最適化するために必要です。

ゲートを忘れる

以前の隠された状態HT-1 および現在のイベントベクトルXt は一緒に結合され、Sigmoidアクティベーションのアドオンといくつかのバイアスを使用して重み行列と乗算され、確率スコアが生成されます。 シグモイドアクティベーションが適用されているため、出力は常に0または1になります。セル状態の特定の値に対して出力が0の場合、忘却ゲートはその情報を忘れたいことを意味します。 同様に、1は、情報を記憶したいことを意味します。 ここで、シグモイド関数から出力されたこのベクトルにセルの状態が乗算されます。

ゲートを忘れる

ここに:

Xt 現在の入力ベクトルです

Uf 入力に関連付けられた重みです

HT-1 以前の隠された状態です

Wf 隠された状態に関連付けられている重みです

Bf それに追加されたバイアスです

一般的な重みをとると、この式は次のように書くことができます。

式

次に、メモリセルの状態の方程式を見てみましょう。

式

ここに表示されている場合、忘却ゲートは前のタイムスタンプのセル状態で乗算され、これは要素ごとの乗算です。 忘却ゲートマトリックスに1がある場合は常に値を保持し、忘却ゲートに0がある場合は常にその情報を削除します。 例を見てみましょう:

タブ

モデルがワトソン氏を見るときはいつでも、その情報またはそのコンテキストをセル状態Cに保持します。1 。 これでCは行列になりますよね? したがって、その価値の一部は、ワトソン氏がここに持っている情報を保持し、現在、忘却ゲートは情報を変更することを許可しません。そのため、情報は全体にわたって保持されます。 RNNでは、モデルが次の単語を認識すると、この情報はすぐに変更されます。 さて、別の言葉に出くわしたとき、メアリーさんとしましょう。忘れた門はワトソンさんの情報を忘れて、メアリーさんの情報を追加します。 この新しい情報の追加は、次に検討する入力ゲートと呼ばれる別のゲートによって行われます。

入力ゲート

この背後にある直感を得るために、別の例を見てみましょう。

入力ゲート

ここで重要なのは、「王子様」が吐き気を催していたため、パーティーを楽しむことができなかったということです。 彼がこのすべてを電話で話したという事実は重要ではなく、無視することができます。 いくつかの新しい知識/情報を追加するこの手法は、  ゲート。 これは基本的に、入力によって運ばれる新しい情報の重要性を定量化するために使用されます。

入力ゲートの式は次のとおりです。

入力ゲート式

ここに:

Xt タイムスタンプtでの現在の入力ベクトルです

Ui 入力に関連付けられた重み行列です

HT-1 以前の隠された状態です

Wi 隠された状態に関連付けられている重みです

bi それに追加されたバイアスです

数式入力ゲーム

一般的な重みをとると、この式は次のように書くことができます。

入れてゲーム画像1

次に、候補者の価値を理解する必要があります。 メモリセルの状態方程式をもう一度見てみましょう。

画像2の式

場所 画像 は、次の式で表される候補値です。

画像2の式

候補値の方程式は、単純なリカレントニューラルネットワークと非常によく似ています。 この候補値は、新しい情報の追加を担当します。その名前が示すように、「候補値」は、追加できる潜在的な新しい情報を意味する候補値であり、潜在的な新しい情報はこの入力ゲートによってフィルタリングされます。

入力ゲートでシグモイド活性化関数を使用しているため、入力ゲートの出力は0〜1の範囲になり、候補値がtan-であるため、追加する新しい情報が除外されます。 hその値が1から-1の範囲になることを意味する活性化関数。 値が負の場合、情報はセルの状態から差し引かれ、正の場合、情報は現在のタイムスタンプでセルの状態に追加されます。 例を見てみましょう。

タブ

今では明らかに「彼女」の代わりに「彼」である必要があり、「だった」の代わりに「意志」である必要があります。コンテキストを見ると、読者は未来について話しているからです。 したがって、モデルがこの「明日」という言葉に到達するたびに、以前に持っていた情報とともにその情報を追加する必要もあります。 つまり、これは何も忘れる必要がない例ですが、以前持っていた有用な情報を保持しながら新しい情報を追加するだけなので、このモデルには、情報を追加するとともに古い情報を長期間保持する能力があります。

出力ゲート

メモリセルの状態を流れるすべての情報が出力に適しているわけではありません。 例を使ってこれを視覚化してみましょう。

出力ゲート

この文では、空白スペースに対して多数の出力が存在する可能性があります。 人間がこのフレーズを読んだ場合、最後の単語「brave」は名詞を表す形容詞であると推測するため、答えは名詞である必要があると推測します。 したがって、このブランクの適切な出力は「Bob」になります。

メモリセルの状態から有用な情報を選択する作業は、出力ゲートを介して行われます。 出力ゲートの式を見てみましょう。

出力ゲート式1

ここでUo とWo は、それぞれ入力ベクトルと非表示状態に割り当てられた重みです。 シグモイド活性化関数を使用しているため、出力ゲートの値も0〜1です。 非表示の状態を計算するには、出力ゲートとメモリセルの状態を使用します。

出力ゲート式2

ここでOt は出力ゲートとCのマトリックスですt セル状態マトリックスです。

Tab3

LSTMの全体的なアーキテクチャは次のようになります。

LSTMビュー

これらのゲートがどの情報を忘れ、どの情報を追加するかをどのように知るのか疑問に思う必要があります。答えは重み行列にあります。 このモデルをトレーニングし、トレーニング後、これらの重みの値が一定レベルの理解を構築するように更新されることを忘れないでください。つまり、トレーニング後、モデルはどの情報が有用で、どの情報が有用であるかを理解するようになります。情報は無関係であり、この理解は何千ものデータを見ることによって構築されます。

実装が必要です

いくつかを予測できるモデルを構築しましょう n マクベスの元のテキストの後の文字数。 元のテキストを見つけることができます ページ をご覧ください .txtファイルの改訂版を見つけることができます こちらをご覧ください。.

We

ライブラリのインポート

#依存関係のインポートnumpyとkeras import numpy from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout from keras.layers import LSTM from keras.utils import np_utils

テキストファイルの読み込み

#load text filename = "macbeth.txt" text =(open(filename).read())。lower()#整数を使用した文字のマッピングunique_chars = sort(list(set(text)))char_to_int = {} int_to_char = { } for i、c in enumerate(unique_chars):char_to_int.update({c:i})int_to_char.update({i:c})

上記のコードでは、システムから「.txt」ファイルを読み取ります。 の unique_chars テキストにはすべての固有の文字が含まれています。 の char_to_int コンピュータが単語を理解できないため、テキスト内のすべての一意の文字に番号が割り当てられているため、機械語に変換する必要があります。 これは、計算部分を簡単にするために行われます。

データセットの準備

#入力および出力データセットの準備X = [] Y = [] for i in range(0、n-50,1):sequence = text [I:i + 50] label = text [i + 50] X.append( [char_to_int [char] for char in s])Y.append(char_to_int [label])

「HELLO」で「O」を予測したい場合、入力として['H'、'E'、'L'、'L']を感じ、[ 'O']を出力として。 同様に、ここでは必要なウィンドウの長さを固定し(例では50に設定)、Xの最初の49文字のエンコーディングと、期待される出力、つまりYの50番目の文字を保存します。

Xの再形成

#再形成、正規化、および50,1つのホットエンコーディングX_modified = numpy.reshape(X、(len(X)、XNUMX))X_modified = X_modified / float(len(ujique_chars))Y_modified = np_utils.to_categorical(Y)

正しい形で入力を取得することは、この実装の最も重要な部分です。 LSTMが入力を受け入れる方法と、入力がどのような形である必要があるかを理解する必要があります。 ドキュメントをチェックすると、[サンプル、タイムステップ、機能]に入力が必要であることがわかります。ここで、サンプルはデータポイントの数、タイムステップはウィンドウサイズ(見たい単語数)です。次の単語を予測するために戻って)、機能は、Yの対応する実際の値に対して持っている変数の数を指します。

値のスケーリングは、モデルを構築する際の非常に重要な部分であるため、X_modifiedの値を0-1からXNUMXつのホットエンコードして、Y_modifiedの真の値をスケーリングします。

LSTMモデルの定義

#LSTMモデルの定義model = Sequential()model.add(LSTM(300、input_shape =(X_modified.shape [1]、X_modified.shape [2])、return_sequences = True))model.add(Dropout(0.2)) model.add(LSTM(300))model.add(Dropout(0.2))model.add(Dense(Y_modified.shape [1]、activation ='softmax'))model.compile(loss ='categorical_crossentropy'、optimizer = 'adam)model.summary()

最初のレイヤーでは、300のメモリユニットを使用し、ハイパーパラメータリターンシーケンスも使用して、次のレイヤーがランダムデータだけでなくシーケンスを受信するようにします。 ここでハイパーパラメータ「input_shape」を見てください。タイムステップといくつかの機能を渡しました。デフォルトでは、使用可能なすべてのデータポイントが選択されます。 それでも混乱する場合は、X_modifiedの形状を印刷してください。そうすれば、私が何を言おうとしているのか理解できます。 次に、過剰適合を避けるために、ここでドロップアウトレイヤーを使用しています。 最後に、「softmax」活性化関数と、固有の文字の数に等しいニューロンを備えた完全に接続されたレイヤーがあります。

モデルの適合と予測の作成

#モデルのフィッティング
model.fit(X_modified、Y_modified、epochs = 200、batch_size = 40)

#ランダムシードを選ぶ
start_index = numpy.random.randint(0、len(X)-1)
予測文字列=X[start_index]

#文字を生成する
範囲(50)のiの場合:
    x = numpy.reshape(predict_string、(1、len(predict_string)、1))
    x = x / float(len(unique_chars))

    #予測
    pred_index = numpy.argmax(model.predict(x、verbose = 0))
    char_out = int_to_char [pred_index]
    seq_in = [int_to_char [value] for value inpredict_string]
    print(char_out)

    予測する_string.append(pred_index)
    予測する_string = prefix_string [1:len(predict_string)]

モデルは200エポック以上に適合し、バッチサイズは40です。予測のために、最初にランダムに開始インデックスを取得します。 そのランダムな文を「predict_string」という名前の変数に入れます。 次に、モデルからgetを再形成して、予測された文字のcharエンコードを出力します。つまり、出力は数値になるため、デコードして文字値に戻し、パターンに追加します。 最終的には、十分なトレーニングエポックの後、時間の経過とともにより良い結果が得られます。 これは、LSTMを使用してシーケンス予測タスクを解決する方法です。

長短期記憶に関する結論

LSTMまたはLong-shorttermmemoryは、RNNが直面する問題を解決しようとするRNNの特殊なケースです。 長期依存性、消失、および爆発的な勾配の問題などの問題は、ゲートの助けを借りて非常に簡単に長短期記憶によって解決されます。 主にForgetGate、Input Gate、OutputGateの3つのゲートがあります。 忘れゲートは、不要な情報を忘れるために使用されます。 入力ゲートは、モデルに新しい重要な情報を追加するために使用されます。 これに対して、RNNとは異なり、情報はすぐには更新されません。

以下は、記事からのいくつかの重要なポイントです。

  • 長短期記憶またはLSTMは、時系列データ、オーディオデータなどのシーケンシャルデータに使用されます。
  • モデルに長期依存性から学習させたい場合、Long ShortTermMemoryまたはLSTMは他のモデルよりも優れています。
  • RNNが直面する問題(勾配の消失と爆発の問題)を解決します。
  • ゲートの概念(Forgetゲート、Inputゲート、およびOutputゲート)で機能します。
  • 非表示状態とセル状態の2つの状態が次のタイムスタンプに渡されます。
  • 情報を忘れ、記憶し、更新するLong Short Term Memoryの機能は、RNNよりも一歩進んでいます。

もしそうなら、あなたがこの記事を気に入ってくれたら、コメントして友達と共有し、彼らがそれを利用できるようにしてください。 任意の 疑いや質問、 お気軽にご連絡ください メール

私とつながる LinkedIn & Twitter

この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。

スポット画像

最新のインテリジェンス

スポット画像