Recurrent Neural Networks (1) – RNN への序説 (翻訳/要約)
* Recurrent Neural Networks Tutorial, Part 1 – Introduction to RNNs の簡単な要約です。
* 原文の図を参照しながらお読みください。
チュートリアルの一部として RNN ベースの言語モデルを実装します。言語モデルのアプリケーションは2つの fold を持ちます : 最初に、現実世界で起きることの尤もらしさをベースに任意の文に点数をつけることを可能にします。これは文法的、意味的な正確性の尺度を提供します。そのようなモデルは典型的には機械翻訳システムの一部として使用されます。2つ目に、言語モデルは新しいテキストの生成を可能にします。(よりクールなアプリケーションでしょう。)Shakespeare 上で言語モデルを訓練すれば Shakespeare ライクなテキストの生成を可能にします。Andrej Karpathy による 興味深い投稿 (要約)は RNN ベースの文字レベル言語モデルが何ができるかを示しています。
基本的な NN にある程度慣れていることを仮定しています。そうでないなら、Implementing A Neural Network From Scratch へ進むことを望むかもしれません、これは Non-RNN の背後のアイデアや実装を紹介ます。
RNN とは何か?
RNN の背後のアイデアはシーケンシャル情報を利用することです。伝統的な NN では全ての入力(そして出力)は互いに独立です。しかしそれは多くのタスクに対しては非常に悪い考えです。文で次の単語を予測したければその前にどの単語が来たか知る方が良いでしょう。RNN は “recurrent (再発的・周期的)” と呼ばれますが、これはシークエンスの全ての要素に対して(前の計算に依存する出力とともに)同じタスクを遂行するからです。RNN について考える他の方法はそれが “メモリ” を持つことです、これはそれまでに何が計算されたかについての情報を捕捉します。理論的には RNN は任意の長さのシーケンスの情報を利用できますが、しかし実践的には 2, 3 ステップ(後でそれ以上)を look back することに制限されます。典型的な RNN がどのように見えるかをここに示します : (図/省略)
上の図は RNN がフル・ネットワークに展開される (unrolled, unfolded) ことを示しています。この展開は、完全なシーケンスのためのネットワークを書き出していることを単に意味しています。例えば、気にかけるシーケンスが5つの単語の文の場合、ネットワークは 5-層 NN に展開されます、各単語のために 1 層です。RNN で起きる計算を統治する数式は以下のようなものです :
はタイム・ステップ
における入力です。例えば、
は文の2番目の単語に相当する one-hot ベクトルです。
-
はタイム・ステップ
における隠れ状態 (hidden state) です。これはネットワークの「メモリ」です。
は前の隠れ状態と現在のステップの入力をベースに計算されます :
。
関数は通常は tanh あるいは ReLU のような非線形性です。
、これは最初の隠れ状態の計算に必要ですが、典型的には全て 0 に初期化されます。
はステップ
における出力です。例えば、文の次の単語を予測することを望む場合、それは確率のベクトルになります。
.
ここで2、3の注意すべき点があります :
- 隠れ状態
はネットワークのメモリとして考えて良いです。
は全ての前の時間ステップにおいて発生したことについての情報を捕捉します。ステップ
における出力は時間
におけるメモリをベースに単独で計算されます。簡単に上述したように、実践ではもう少し複雑です、何故ならば
は通常は非常に多くの過去の時間ステップから情報を捕捉することはできないからです。
- 各層で異なるパラメータを使用する伝統的な DNN と違って、RNN は同じパラメータ ((
) を全てのステップに渡り共有します。これは各ステップで同じタスクを、異なる入力だけで、遂行しているという事実を反映しています。これは学習しなければならないパラメータの総数を大きく減らします。
- 上図は各時間ステップで出力を持ちますが、タスクによってはこれは必要ないかもしれません。例えば、文の感情を予測する時、各単語の後の感情ではなくて、最終的な出力のみに注意を払うかもしれません。同様に、各時間ステップで入力は必要ないかもしれません。RNN の主要な特徴はその隠れ状態にあります、これはシーケンスについての幾つかの情報を捕捉します。
RNN は何ができるか?
RNN は多くの NLP タスクで大きな成功を見せてきました。ここで RNN の最も共通的に使用されるタイプは LSTM であることに言及すべきでしょう。これは long-term 依存を捕捉する点で vanilla RNN よりも遥に優れています。しかし心配しないでください、LSTM は本質的にはこのチュートリアルで開発るる RNN と同じものです、それらは隠れ状態の異なる計算方法を持つだけです。
ここで NLP における RNN の幾つかの例となるアプリケーションを示します。
言語モデルとテキスト生成
単語のシーケンスが与えられた時、前の単語群が与えられた時の各単語の確率を予測したいです。言語モデルは文の尤もらしさを計測することを可能にし、これは機械翻訳のための重要な入力となります。(何故なら高い確率の文は典型的には正しいからです。)次の単語を予測することができる副次的効果は生成モデルを得られることです、これは出力確率からのサンプリングによる新しいテキストの生成を可能にします。そして訓練データに依存して あらゆるもの が生成できます。 言語モデルでは入力は典型的には(例えば one-hot ベクトルとしてエンコードされた)単語のシーケンスで、出力は予測された単語のシーケンスです。ネットワークを訓練する時には とします、何故ならステップ
における出力を実際の次の単語として望むからです。
言語モデルとテキスト生成についての研究論文です :
- Recurrent neural network based language model
- Extensions of Recurrent neural network based language model
- Generating Text with Recurrent Neural Networks
機械翻訳
機械学習は、入力がソース言語(例えばドイツ語)における単語のシーケンスである、という言語モデルと同様です。ターゲット言語(例えば英語)における単語のシーケンスを出力することを望みます。鍵となる違いは、出力が完全な入力を見た後でのみ始まることです。何故なら訳文の最初の単語は完全な入力文から捕捉された情報を必要とするかもしれないからです。
機械翻訳についての研究論文です :
- A Recursive Recurrent Neural Network for Statistical Machine Translation
- Sequence to Sequence Learning with Neural Networks
- Joint Language and Translation Modeling with Recurrent Neural Networks
音声認識
音波からの音響信号の入力シーケンスが与えられた時、音声セグメント (phonetic segments) を確率と一緒に予測できます。
音声認識についての研究論文です :
画像説明(文)を生成する
畳み込み NN と一緒に、RNN は unlabeled 画像のための generate descriptions へのモデルの一部として使用されています。これがどれほど上手く動作しているか驚異的です。combined モデルは、画像で見られる特徴と生成された単語を連携させる (align) ことさえします。
RNN を訓練する
RNN の訓練は伝統的な NN の訓練と同様です。backpropagation アルゴリズムもまた使いますが、少し捻っています。パラメータがネットワークの全ての時間ステップで共有されますので、各出力の勾配は現在の時間ステップの計算上だけではなく、前のステップにも依存します。例えば、 における勾配を計算するためには 3 ステップを backpropagate して勾配を加算する必要があるでしょう。これは BPTT – Backpropagation Through Time と呼ばれます。今のところ、BPTT で訓練された vanilla RNN は long-term 依存(= 遠く離れたステップ間の依存)を学習するには、勾配消失/発散問題 (vanishing/exploding gradient problem) と呼ばれるもののために 困難を持つ という事実を知っておいてください。これらの問題を扱うために幾つかの機械が存在して、(LSTM のような)あるタイプの RNN がこれを回避するために特に設計されました。
RNN 拡張
何年もの間、vanilla RNN モデルの欠点の幾つかに対処するために、研究者は RNN のより洗練されたタイプを開発してきました。この章はモデルの分類に慣れるように簡単な概要を提供します。
Bidirectional RNN は時間 における出力がシーケンスの前の要素だけではなく、未来の要素にも依存するというアイデアをベースにしています。例えば、文の欠けた単語を予測するためには左側と右側のコンテキストを見たいでしょう。Bidirectional RNN は非常に単純です。それらは互いのトップに積み重ねた、単に2つの RNN です。そして出力は両方の RNN の隠れ状態をベースにして計算されます。
Deep (Bidirectional) RNN は Bidirectional RNN と同様ですが、時間ステップ毎に多層を持ちます。実際にこれはより高い学習キャパシティを与えてくれます。(しかしまた沢山の訓練データが必要になりますが。)
LSTM ネットワーク は最近極めて人気があり上でも簡単に話題にしました。LSTM は基本的には RNN と違うアーキテクチャを持つわけではありませんが、隠れ状態を計算するために異なる関数を使用します。LSTM のメモリはセルと呼ばれ、それらを、入力として前の状態 と現在の入力
を取るブラックボックスと考えることができます。内部的にはこれらのセルは何をメモリに保持するか(そしてそこから何を消すか)を決めます。そしてそれらは前の状態、現在のメモリ、そして入力を結合します。これらのタイプのユニットは long-term 依存を捕捉するために非常に効率的であることが分かっています。
以上