スポンサーリンク
ペンしお

国立大学4年生。趣味でブログをやっている者です。現在のブログ収益は500円くらい。大学では医療系ICTやAIについて研究します。面白い記事を書いたりしてこうと思ってます。趣味はテニス、スロット、アニメです。Twitterふぉろーしてね。

ペンしおをフォローする

LSTM

LSTMとは

LSTMは機械学習(AI)の手法の一つです。音声認識や機械翻訳など、様々な部分で使われていてなかなか有能な方法の一つです。

RNNとは

LSTMはRNNの改良版なのでまずRNNについて説明します。

この文章を読んでいるとき、人間は前の単語の理解に基づいて各単語を理解します。これを時系列のデータに基づくといいます。従来のニューラルネットワークではこれを行うことが出来ません。例えばグーグル翻訳は昔全然使えないなどといわれていましたが、それは日本語訳を単語レベルでしか英語と対応することができなかったりしたのが原因なんだと思います。この問題を対処したのがリカレントニューラルネットワーク(RNN)で、内部にループを持つことで、情報を持続させることができるネットワークです。

RNNは同じネットワークの複数のコピーで、それぞれが次のネットワークに情報を渡すと考えることが出来ます。このようにRNNは前のデータを参考にして予測や分類などをします。例えばh2を予測するときにx0の入力情報が必要だったとすると、ニューラルネットワークを逆算して求めます。これを逆伝播計算と呼びますが、必要な情報がもっと前の時系列のものになってしまうと計算回数が多くなってしまいます。そして、毎回0.1倍の逆算をしたとすると、100個前の情報を得るにはとてつもなく値が小さくなってしまいます。また、逆算の値が大きすぎてもとてつもなく値が大きくなってしまい、情報を関連づけて学習、予測することが出来なくなってしまいます。RNNでは10ステップあたりがさかのぼる限界で、長期の記憶が出来ないといえます。この問題を勾配消失問題といいます。RNNではこの長期依存的な関係が課題となっていましたが、LSTMではこの問題を解決することが出来ます。

LSTM

LSTMはゲートと呼ばれる仕組みを導入し、これにより過去の情報を忘れるか忘れないかを判断しながら必要な情報だけを引き継ぐことが出来ます。機能としてはRNN+長期の記憶保存みたいなイメージです。


まずはRNNから、NNの中身では入力xを式に埋め込んで新たな値を求めます。RNNではこれに前回の出力hが加わります。そして、その値をきれいにするために活性化関数という関数が使われます。これは、活性化関数に値を入れることで100~-100の数値を1~-1の数値に変換してくれるものです。数値を取り扱う上で1~-1の数値の方が取り扱いやすいという理由で活性化関数が使われます。(詳しくはもっといろいろあるけど)この活性化関数にもいろいろ種類があり、例えばtanhでは値を代入するとその結果の値はー1~1の間の数値になります。

今回使うその他の活性化関数としてsigmoid関数というものがあります。呼び方はかっこいいけど数式は意外とシンプルです。この関数は0~1の値に変換してくれます。これ、実はめっちゃ使えてスイッチの役割をしてくれます。例えば、このデータは使いたくないものをシグモイド関数に入れると0になるように調節します。そしてこのデータに、このデータの数値を入れたシグモイド関数(値が0)をかけるとどうなるでしょうか。(いらないデータ)×(シグモイド関数(いらないデータ))=0になります。つまり、いらないデータが0になって使わないとすることが出来ます。シグモイド関数はこのようにデータをどのくらい使うかというダムのような役割をしてくれます。

ここに、RNNを改善するための機能を付け加えていきます。

まず完成形を置いときます。

  • CECは記憶セルいって過去のデータを線形和(足し算のような割かし簡単な計算)で記憶しています。
  • 入力ゲートは入力xと一つ前の出力hをどの程度使うかを調節するためのゲートです。シグモイド関数を使ってゲートの役割をしています。
  • 出力ゲートは一つ前の出力とNNの部分で新たに計算したデータを次の入力にどの程度使うかを調節するためのゲートです。
  • 忘却ゲートは記憶セルを導入した後に、これも導入したほうが良いのでは?ということで加わりました。これは過去の情報が入っているCECの内容をどの程度残すかを調節するためのゲートです。

入力ゲート、出力ゲートが必要なわけ

RNNでは勾配消失問題の他にもう一つ問題がありました。「重みパラメータwの更新矛盾」です。学習はwの値をそのデータに適応するように値をどんどん更新していきます。新たな入力が来た時、

前と同じパターンなら、今回のパターンにより適応するように重みwの値が大きくなるように調整します。

逆に、前と違うパターンのときはこの情報はいらないと判断し、重みwの値を小さくするように更新します。

このように、重みwの値が大きくなったり小さくなったりして収束してくれないことがあるという問題がありました。これを改善するために入力ゲートと出力ゲートを導入し、いらないデータはゲートによって影響が少なくなるように調整されて使われます。

忘却ゲート

入力と一つ前の出力を見て、CEC(記憶セル)(情報でいうとCt-1)から捨てる情報を判定し、シグモイド関数がゲートの役割をすることで不必要な情報を0にすることで、勾配の消失、爆発を防ぎます。

入力ゲート

入力ゲートでは入力xと一つ前の出力hを組み合わせた情報をtanhによって計算しやすい数値に変換します。(記憶セルに保存します)また、この情報が今後どの程度使うかをシグモイド関数によって判断して、取捨選択します。こうすることによって不必要な情報によって重みがミス更新されるのを防ぎます。

出力ゲート

出力ゲートも入力ゲートとほとんど同じで、次の計算へこの情報をどれくらい使うのか取捨選択します。tanhでは、入力ゲートで計算した情報(短期記憶)とCECの情報(長期記憶)を合わせることでより精度を上げようとしています。

まとめ

以上で簡単にLSTMの解説を終わります。ちょっとわかりにくいかもしれませんが参考になればうれしいです。

フォローお願いします!
ペンしおをフォローする
未分類
スポンサーリンク
ペンしおをフォローする
スポンサーリンク
penshioblog

コメント

タイトルとURLをコピーしました