🐈

Act 32. サルがLSTMを学んでみた

に公開

はじめに

FXの相場予測をするぞー!ということで、サル以下の知能だと自他ともに認める自分でも、LSTMを使うことが出来るのか試してみる。

LSTMとは

その前にLSTMについて良く分かっていないので調べた。
LSTMとはLong Short-term memory(訳:長期・短期記憶)の頭文字をとったもの。

時系列データや順序が重要なデータを扱うのに適したニューラルネットワークの一種らしい。
特に従来のRNNが苦手とする「長期依存関係」をうまく学習できるように設計されているんだってさ。

確かに、FXに置いて時系列データはかなり大事になってくる。
トレンド相場とレンジ相場のどちらなのか、極端なトレンドなのか、押し目がある綺麗なトレンドなのかなど、ぱっと思いつくだけでも過去の情報というのは大事そう。

また、LSTMは名前にある通り、長期記憶と短期記憶を使用する。
忘れるべき情報」と「覚えておくべき情報」を動的に制御し、過去の重要な情報を必要に応じて保持するらしいので自分より圧倒的に優秀。

何となく概要は理解したと思う。

意外と簡単なのか!?と淡い期待を抱いてYouTubeでDeep Learning入門:数式なしで理解するLSTM (Long short-term memory)という動画を見てみた。

結果は全く理解できず、後半はBGMのピアノの音ばかり聞いていた。

LSTMの内容で登場したよく分からない単語集

今回ここまでの内容で自分が理解できなかった単語について学ぼうと思う。
以下の単語を学ぶ上で、さらに分からない単語が出てきた場合は、必要に応じて別記事でまとめて行こうと思う。

記事内で分からなかった単語

  • ニューラルネットワーク
  • RNN(Recurrent Neural Network)

動画内で分からなかった単語

  • ニューロン
  • Hidden State
  • Cell State
  • InputGate
  • OutputGate
  • ForgetGate
  • Concatenate
  • Affine
  • Tanh
  • シグモイド関数
  • バッチ勾配降下法
  • バックプロパゲーション
  • アダマール積

ニューラルネットワーク

色々な動画を見たが、この動画が一番分かりやすかった。
ニューラルネットワークの仕組み | Chapter 1, 深層学習(ディープラーニング)

出てくる重要そうな用語としては、ニューロン、レイヤー、重み、バイアス、シグモイド関数かな?
動画では 28 × 28 の画像を識別するという内容だったから、784のニューロンが最初のレイヤーに存在し、そこから次のレイヤーに移る際に重みをかけて、それらの総和にバイアスを足す。

その結果にシグモイド関数(活性化関数)をかけて0 ~ 1に収めると…。
分からなかった単語のニューロンとシグモイドについてもここで登場したから少し焦ったけど、しっかりと話を聞いていればなんとなくは理解できた。

このニューラルネットワークの概念を時系列に変えたものがRNNなのかな?
とりあえず次を学んでみよう。

RNN(Recurrent Neural Network)

RNNについてはこの動画が分かりやすかった。が、ピアノのBGMの音量をもう少し下げていてほしかった…(笑)
Deep Learning入門:Recurrent Neural Networksとは?

RNNはニューラルネットワークとかなり密接な関係にあるということが分かったし、どのように異なるのかも何となくは理解できた。

これ以上は深追いしないで次に行こう!

ニューロン

これに関してはニューラルネットワークで出てきた内容。
入力を受け取って出力するやつ。

Hidden State(隠れ状態)

過去の入力データから学んだ短期的な情報を保持しておく場所。
LSTMの各ステップで更新され、次のステップに値を渡す。

Cell State(セル状態)

こちらはHidden stateとは逆で長期的な情報を保持しておく場所。
必要に応じて情報をInputGate(入力ゲート)やForgetGate(忘却ゲート)を使って調整する。

InputGate(入力ゲート)

モデルが現在の入力データをセル状態にどの程度反映させるかを制御するもの。
どの情報が重要か判断しセル状態に加える。

流れとしては以下の通り。

  1. 入力データと隠れ状態を結合(concatenate)し重みを掛けてバイアスを加算する。
  2. シグモイド関数を使い入力データの各要素がどれだけ重要か0~1でスコアリングする
  3. 入力ゲートで選別された重要な情報を、現在のセル状態に加算する

入力ゲートは、LSTMが新しい情報を「受け入れるべきか」を決めるフィルターのようなもの。

OutputGate

モデルが現在のセル状態と隠れ状態から、どの情報を取り出して次の層や時間ステップに渡すかを決定する仕組み。

流れとしては以下の通り。

  1. 現在の入力データと前の時間の隠れ状態を結合(concatenate)し重みを掛けてバイアスを加算する。
  2. シグモイド関数を使いセル状態からどのデータを出力するか0~1でスコアリングする
  3. セル状態に活性化関数(tanh)を適用し、出力ゲートのスコアと掛け合わせる

セル状態に含まれる情報を柔軟に調整し、必要な部分だけを出力に反映する。
出力ゲートは、LSTMが「今何を伝えるべきか」を決めるフィルターのような役割を担う。

ForgetGate

過去のセル状態に記憶されている情報の内、どれを「保持する」か「忘却する」かを決定する仕組み。
不要な情報を適切に切り捨て、重要な情報だけを次のステップに引き継ぐ役割をしている。

流れとしては以下の通り。

  1. 現在の入力データと前の時間の隠れ状態を結合(concatenate)し重みを掛けてバイアスを加算する。
  2. シグモイド関数を使いセル情報の各要素がどれだけ重要か0~1でスコアリングする
  3. セル状態の各要素に対して、忘却ゲートのスコアを掛け合わせる

スコアが「1」に近い情報は保持され、「0」に近い情報は削除される。

Concatenate(結合)

複数のデータや配列を結合するという意味。
例えば入力データと隠れ状態を結合して処理するなど。

Affine

線形変換(行列の積)と平行移動(バイアスの追加)を掛け合わせた変換のことをいう。
ニューラルネットワークの動画でいう、各ニューロンで行っている処理の部分かな。

LSTMでは、ゲート(入力ゲート、忘却ゲート、出力ゲートなど)の計算や隠れ状態の更新時にアフィン変換が使われる。

入力データ x = [2, 3]、重み行列 W = [[1, 2], [3, 4]]、バイアス b = [1, 1] の場合

y = Wx + b

計算すると:

y = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} \cdot \begin{bmatrix} 2 \\ 3 \end{bmatrix} + \begin{bmatrix} 1 \\ 1 \end{bmatrix} = \begin{bmatrix} 8 \\ 18 \end{bmatrix} + \begin{bmatrix} 1 \\ 1 \end{bmatrix} = \begin{bmatrix} 9 \\ 19 \end{bmatrix}

Tanh(双曲線正接関数)

ニューラルネットワークやLSTMで使用される活性化関数の一つ。
ちなみにシグモイド関数も活性化関数の一つ。

非線形変換を行うことで、モデルが複雑なパターンや関係性を学ぶことが出来る。
Tanhの出力は-1 ~ 1の間となり、セル状態や隠れ状態のスケール調整に使用される。

入力が小さいときは、出力をほぼそのまま通し(線形的)、入力が大きくなると、出力を適度に圧縮して「飽和」状態にする。

シグモイド関数

入力値を非線形に変換し、出力を0から1の範囲に圧縮する。
ゲート(入力ゲート、忘却ゲート、出力ゲート)で情報の重要性を0~1で評価するために使用

バッチ勾配降下法

最適化アルゴリズムの一種。
線形回帰でいう勾配降下法のようなイメージ。

全てのトレーニングデータを用いて、一度に勾配(損失関数の傾き)を計算しモデルのパラメータ(重みやバイアス)を計算する。

パラメータが収束するまで(損失が十分小さくなるまで)、更新を繰り返し行う。

バックプロパゲーション

ニューラルネットワークの訓練で使用されるアルゴリズム。
誤差(損失)をネットワークの出力層から入力層に逆伝播させ、各層の重みやバイアスなどを効率的に更新する仕組み。

バックプロパゲーションは、勾配降下法を用いてパラメータを更新するための勾配を計算する。

アダマール積

行列やベクトルの要素ごとの積を計算する操作。
LSTMでは、ゲート(入力ゲート、忘却ゲート、出力ゲート)の計算やセル状態の更新にアダマール積が使われる。

さいごに

メモ程度にまとめてみた。
LSTMについて何となくは理解できたから。
次回は実際にPythonで実装してみようと思う!

Discussion