長・短期記憶

長・短期記憶（ちょう・たんききおく、英: Long short-term memory、略称: LSTM）は、深層学習（ディープラーニング）の分野において用いられる人工回帰型ニューラルネットワーク（RNN）アーキテクチャである。標準的な順伝播型ニューラルネットワークとは異なり、LSTMは自身を「汎用計算機」（すなわち、チューリングマシンが計算可能なことを何でも計算できる）にするフィードバック結合を有する。LSTMは（画像といった）単一のデータ点だけでなく、（音声あるいは動画といった）全データ配列を処理できる。例えば、LSTMは分割されていない、つながった手書き文字認識や音声認識といった課題に適用可能である。ブルームバーグ ビジネスウィーク誌は「これらの力がLSTMを、病気の予測から作曲まで全てに使われる、ほぼ間違いなく最も商業的なAIの成果としている」と書いた。 一般的なLSTMユニットは、記憶セル、入力ゲート、出力ゲート、および忘却ゲートから構成される。記憶セルは任意の時間間隔にわたって値を記憶し、3つの「ゲート」は記憶セルを出入りする情報の流れを制御する。 LSTMネットワークは時系列データに基づく分類、処理（英語版）、予測によく適している。これは、LSTMネットワークが時系列中の重要な事象間の未知の期間の時間差となることができるためである。LSTMは、従来のRNNを訓練する際に遭遇しうる勾配爆発および消失問題に対処するために開発された。ギャップの長さに対する相対的な鈍感さが、多数の応用におけるRNNや隠れマルコフモデル、その他の系列学習法に対するLSTMの優位性である[要出典]。 LSTMは2010年代まで主流の地位にあったが、2017年以降は更に高性能なTransformerという基盤モデルに取って代わられていった。 LSTMは1997年にゼップ・ホッフライター（英語版）とユルゲン・シュミットフーバー（英語版）によって提唱された。Constant Error Carousel（定誤差カルーセル、CEC）ユニットの導入によって、LSTMは勾配爆発および消失問題を解決しようとする。LSTMブロックの最初の型はセル、入力ゲート、および出力ゲートを含んでいた。 1999年、フェリックス・ゲルス（英語版）と彼のアドバイザーのユルゲン・シュミットフーバーとFred CumminsはLSTMアーキテクチャへ忘却ゲート（「保持ゲート」とも）を導入した。これはLSTMが自身の状態をリセットすることを可能にする。2000年、 ゲルス、シュミットフーバー、CumminsはLSTMアーキテクチャへ覗き穴（peehole）結合（セルからゲートへの結合）を追加した。加えて、出力活性化関数は削除された。 2014年、Kyunghyun Cho（조 경현）らはゲート付き回帰型ユニット（Gated recurrent unit、GRU）と呼ばれる単純化した変異型を提案した 。 その他の成功の中で、LSTMは自然言語テキスト圧縮と分割されていないつながった手書き文字認識で新記録を達成し、IDCAR（英語版）手書き文字認識大会（2009年）で優勝した。LSTMネットワークは2013年に、古典的なTIMIT（英語版）自然音声データセットで新記録となる音素誤り率17.7%を達成したネットワークの主要な構成要素であった。 2016年時点で、Google、Apple、マイクロソフトを含む主要なテクノロジー企業は新製品の基本要素としてLSTMを使用していた。例えば、Googleはスマートフォン上での音声認識、スマートアシスタントAllo、およびGoogle翻訳のためにLSTMを使用した。AppleはiPhone上の「Quicktype」機能、SiriのためにLSTMを使用する。AmazonはAmazon AlexaのためにLSTMを使用する。 2017年、FacebookはLSTMネットワークを使用して毎日45億回の自動翻訳を実行した。 2017年、ミシガン州立大学、IBM基礎研究所、コーネル大学の研究者らは、Knowledge Discovery and Data Mining（KDD）会議において研究発表を行った。彼らの研究は、広く使われるLSTMニューラルネットワークよりも特定のデータセットに対して優れた性能を示す新規ニューラルネットワークに関するものである。 さらに2017年、マイクロソフトは16万5千語の語彙を含むSwitchboardコーパスにおいて95.1%の認識精度に達したと報告した。この手法は「対話セッションに基づく長・短期記憶」を使用した。 理論的には、古典的な（バニラな）RNNは入力配列における任意の長期依存性を追跡できる。バニラRNNの問題は本質的に計算的（あるいは実務的な）なものである。誤差逆伝播法を使ってバニラRNNを訓練する時、逆伝播される勾配は「消失」（すなわち勾配がゼロに収束する）あるいは「爆発」（すなわち無限に発散する）しうる。これは、計算が有限精度数（英語版）を用いる過程を含むためである。LSTMユニットを用いるRNNは、LSTMユニットが勾配を「不変」のまま流れることも可能とするため、勾配消失問題を部分的に解決する。しかしながら、LSTMネットワークは勾配爆発問題にはまだ悩まされうる。 複数のLSTMユニットのアーキテクチャが存在する。一般的なアーキテクチャは、セル（LSTMユニットの記憶部分）と大抵ゲートと呼ばれるLSTMユニット内部の情報の流れの3つの「調整器」（入力ゲート、出力ゲート、忘却ゲート）から構成される。LSTMユニットの一部の変異型はこれらのゲートの1つ以上を持たない、あるいは別のゲートを持つこともある。例えばゲート付き回帰型ユニット（GRU）は出力ゲートを持たない。 直感的には、「セル」は入力配列中の要素間の依存性を追跡するために必要である。「入力ゲート」はセルへの新たな値の流れの度合いを制御し、「忘却ゲート」はセル中に値が留まる度合いを制御し、「出力ゲート」はセル中の値がLSTMユニットの出力活性化を計算するために使われる度合いを制御する。LSTM「ゲート」の活性化関数にはロジスティック関数（英語版）が使われることが多い。 LSTMゲートへの、そしてLSTMからの結合が存在し、そのうちいくつかは回帰結合（リカレント）している。訓練中に学習される必要があるこれらの結合の重みが、ゲートがどのように動作するかを決定する。 以下の方程式において、小文字の変数はベクトルを表わす。行列 W q {\displaystyle W_{q}} および U q {\displaystyle U_{q}} はそれぞれ入力および回帰結合の重みを含み、添字 q {\displaystyle _{q}} は、計算される活性化に依存して、入力ゲート i {\displaystyle i} 、出力ゲート o {\displaystyle o} 、忘却ゲート f {\displaystyle f} 、または記憶セル c {\displaystyle c} になりうる。この節では、ゆえに「ベクトル表記」を使用する。そのため、例えば、 c t ∈ R h {\displaystyle c_{t}\in \mathbb {R} ^{h}} は単に1つのLSTMユニットの1つのセルではなく、 h {\displaystyle h} 個のLSTMユニットのセルを含む。演算子 ∘ {\displaystyle \circ } はアダマール積（要素ごとの積）を示す。 忘却ゲートを持つLSTMユニットの順方向通路のための方程式のコンパクト形は以下の通りである。 f t = σ g ( W f x t + U f h t − 1 + b f ) i t = σ g ( W i x t + U i h t − 1 + b i ) o t = σ g ( W o x t + U o h t − 1 + b o ) c t = f t ∘ c t − 1 + i t ∘ σ c ( W c x t + U c h t − 1 + b c ) h t = o t ∘ σ h ( c t ) {\displaystyle {\begin{aligned}f_{t}&=\sigma _{g}(W_{f}x_{t}+U_{f}h_{t-1}+b_{f})\\i_{t}&=\sigma _{g}(W_{i}x_{t}+U_{i}h_{t-1}+b_{i})\\o_{t}&=\sigma _{g}(W_{o}x_{t}+U_{o}h_{t-1}+b_{o})\\c_{t}&=f_{t}\circ c_{t-1}+i_{t}\circ \sigma _{c}(W_{c}x_{t}+U_{c}h_{t-1}+b_{c})\\h_{t}&=o_{t}\circ \sigma _{h}(c_{t})\end{aligned}}} 上式において、初期値は c 0 = 0 {\displaystyle c_{0}=0} および h 0 = 0 {\displaystyle h_{0}=0} 、を示す。添字 t {\displaystyle t} は時間ステップにインデックスを付ける。 x t ∈ R d {\displaystyle x_{t}\in \mathbb {R} ^{d}} : LSTMユニットへの入力ベクトル f t ∈ R h {\displaystyle f_{t}\in \mathbb {R} ^{h}} : 忘却ゲートの活性化ベクトル i t ∈ R h {\displaystyle i_{t}\in \mathbb {R} ^{h}} : 入力ゲートの活性化ベクトル o t ∈ R h {\displaystyle o_{t}\in \mathbb {R} ^{h}} : 出力ゲートの活性化ベクトル h t ∈ R h {\displaystyle h_{t}\in \mathbb {R} ^{h}} : LSTMユニットの出力ゲートとも呼ばれる隠れ状態ベクトル c t ∈ R h {\displaystyle c_{t}\in \mathbb {R} ^{h}} : セル状態ベクトル W ∈ R h × d {\displaystyle W\in \mathbb {R} ^{h\times d}} 、 U ∈ R h × h {\displaystyle U\in \mathbb {R} ^{h\times h}} 、 b ∈ R h {\displaystyle b\in \mathbb {R} ^{h}} : 訓練中に学習される必要がある重み行列およびバイアスベクトルのパラメータ 上付き文字 d {\displaystyle d} および h {\displaystyle h} はそれぞれ入力要素の数および隠れユニットの数を示す。 σ g {\displaystyle \sigma _{g}} : シグモイド関数 σ c {\displaystyle \sigma _{c}} : 双曲線正接関数 σ h {\displaystyle \sigma _{h}} : 双曲線正接関数または、覗き穴LSTMの論文が提案しているように σ h ( x ) = x {\displaystyle \sigma _{h}(x)=x} 重み行列と活性化関数を集約することで ( f t T , i t T , o t T , c i t T ) T = σ ( W x t + U h t − 1 + b ) c t = f t ∘ c t − 1 + i t ∘ c i t h t = o t ∘ σ h ( c t ) {\displaystyle {\begin{aligned}(f_{t}^{T},i_{t}^{T},o_{t}^{T},ci_{t}^{T})^{T}&=\sigma (Wx_{t}+Uh_{t-1}+b)\\c_{t}&=f_{t}\circ c_{t-1}+i_{t}\circ ci_{t}\\h_{t}&=o_{t}\circ \sigma _{h}(c_{t})\end{aligned}}} となる。この式から c t − 1 {\displaystyle c_{t-1}} が直接回帰し、 h t − 1 {\displaystyle h_{t-1}} がゲート・セルを通じて回帰していることがわかる。また入力と重みの積は時間を跨いで回帰無しに計算できることがわかる（ W X = W ( x 0 x 1 . . . x n ) {\displaystyle WX=W{\bigl (}{\begin{smallmatrix}x_{0}&x_{1}&...&x_{n}\end{smallmatrix}}{\bigr )}} で一括計算が可能）。 右図は覗き穴結合を持つLSTMユニット（すなわち覗き穴LSTM）の図式的な表現である。覗き穴結合によって、ゲートが定誤差カルーセル（CEC。その活性化がセル状態である）へアクセスすることが可能となる。 h t − 1 {\displaystyle h_{t-1}} は使われず、ほんどの場所で c t − 1 {\displaystyle c_{t-1}} が代わりに使われる。 f t = σ g ( W f x t + U f c t − 1 + b f ) i t = σ g ( W i x t + U i c t − 1 + b i ) o t = σ g ( W o x t + U o c t − 1 + b o ) c t = f t ∘ c t − 1 + i t ∘ σ c ( W c x t + U c c t − 1 + b c ) h t = o t ∘ σ h ( c t ) {\displaystyle {\begin{aligned}f_{t}&=\sigma _{g}(W_{f}x_{t}+U_{f}c_{t-1}+b_{f})\\i_{t}&=\sigma _{g}(W_{i}x_{t}+U_{i}c_{t-1}+b_{i})\\o_{t}&=\sigma _{g}(W_{o}x_{t}+U_{o}c_{t-1}+b_{o})\\c_{t}&=f_{t}\circ c_{t-1}+i_{t}\circ \sigma _{c}(W_{c}x_{t}+U_{c}c_{t-1}+b_{c})\\h_{t}&=o_{t}\circ \sigma _{h}(c_{t})\end{aligned}}} 覗き穴畳み込みLSTM。 ∗ {\displaystyle *} は畳み込み演算子を示す。 f t = σ g ( W f ∗ x t + U f ∗ h t − 1 + V f ∘ c t − 1 + b f ) i t = σ g ( W i ∗ x t + U i ∗ h t − 1 + V i ∘ c t − 1 + b i ) o t = σ g ( W o ∗ x t + U o ∗ h t − 1 + V o ∘ c t + b o ) c t = f t ∘ c t − 1 + i t ∘ σ c ( W c ∗ x t + U c ∗ h t − 1 + b c ) h t = o t ∘ σ h ( c t ) {\displaystyle {\begin{aligned}f_{t}&=\sigma _{g}(W_{f}*x_{t}+U_{f}*h_{t-1}+V_{f}\circ c_{t-1}+b_{f})\\i_{t}&=\sigma _{g}(W_{i}*x_{t}+U_{i}*h_{t-1}+V_{i}\circ c_{t-1}+b_{i})\\o_{t}&=\sigma _{g}(W_{o}*x_{t}+U_{o}*h_{t-1}+V_{o}\circ c_{t}+b_{o})\\c_{t}&=f_{t}\circ c_{t-1}+i_{t}\circ \sigma _{c}(W_{c}*x_{t}+U_{c}*h_{t-1}+b_{c})\\h_{t}&=o_{t}\circ \sigma _{h}(c_{t})\end{aligned}}} LSTMを用いるRNNは、一連の訓練において、教師あり学習のやり方で訓練できる。訓練では、最適化プロセス中で必要な勾配を計算するための通時的誤差逆伝播法（英語版）（Backpropagation through time、BPTT）と組み合わせて最急降下法のような最適化アルゴリズムを使って、（LSTMネットワークの出力層における）誤差の微分に比例してLSTMネットワークの個々の重みを変化させる。 標準的なRNNに対して最急降下法を使用することの問題点は、誤差勾配が重要な事象間の時間のずれの大きさにしたがって指数関数的にすばやく消失することである。これは、 W {\displaystyle W} のスペクトル半径が1よりも小さいと lim n → ∞ W n = 0 {\displaystyle \lim _{n\to \infty }W^{n}=0} となるためである。 しかしながら、LSTMユニットを使うと、誤差値が出力層から逆伝播される時、誤差はLSTMユニットのセル内に留まる。この「誤差カルーセル」はLSTMユニットのゲートが値のカットオフを学習するまで、個々のゲートへ誤差を絶えずフィードバックする。 多くの応用がLSTM RNNのスタックを使用し、訓練セット中のラベル配列の確率を最大化する重み行列を探すために、それらをコネクショニスト時系列分類（英語版）（CTC）によって訓練する。CTCはアラインメントと認識の両方を達成する。 特に「教師」（すなわち訓練ラベル）が存在しない時は、Neuroevolutionまたは⽅策勾配法によってLSTM（の一部）を訓練するのが有利なことがありうる。 LSTMユニットを持つRNNを教師なしで訓練した複数の成功例がある。 2018年、ビル・ゲイツは、OpenAIによって開発されたボットがゲームDota 2で人間を破ることができた時、これを「人工知能の進歩における巨大な一里塚」と呼んだ。OpenAI Fiveは5つの独立した、しかし協調したニューラルネットワークから成る。個々のネットワークは教師なしで方策勾配法によって訓練され、現在のゲーム状態を見て、複数の可能な動作から動作を出す単層の1024ユニットLSTMを含む 。 2018年、OpenAIはかつてないほどの器用さで物体を巧みに扱う人間のようなロボットハンドを制御するために方策勾配法によって同様のLSTMを訓練した。 2019年、DeepMindのプログラムAlphaStarは複雑なビデオゲームスタークラフトに秀でるためにディープなLSTMコアを使用した。これは、人工汎用知能へ向けた重要な前進と見なされた。 単純RNNと比較してより長い系列の情報を保持する能力を持つ。一方、長期記憶を評価するCopyingタスクでは系列長200以上での学習に失敗することが知られている。 LSTMの応用には以下の事柄が含まれる。 ロボット制御（英語版） 時系列予想 音声認識 リズム学習 作曲 文法学習 手書き文字認識 人物行動認識 手話学習 タンパク質相同性検出 タンパク質の細胞内局在の予測 時系列異常検出 ビジネスプロセス管理の分野におけるいくつかの予測課題 医療パスにおける予測 意味的構文解析（英語版） 被写体共セグメンテーション（英語版）