投稿

LSTM -- Gateを持つRNN

イメージ
RNNは、基本的には、単純な三層構造を持つネットワークをユニットとして、その隣り合う隠れ層同士をフルコネクトで横につなげたものだ。ただし、Feed ForwardのDNNのように、実際に、ユニットを積み重ねるのではなく、隠れ層を結合する重みのパラメーターを共有し、再帰的にシステムを記述する。 RNNの発展系LSTMも、こうしたRNNの基本的なアイデアを踏襲している。ただ、組み合わせの基本となるユニットが少し複雑な構成をしている。LSTMのユニット(Cellと呼ばれる)に導入された新しいアイデアの中心にあるのが、今回、取り上げるGateである。 LSTMの働きを理解するのに、Gateの働きの理解は必須であるのだが、同時に、それは、LSTMの働きを理解する、最も早い近道でもある。 今回は、RNNやLSTMの文脈を離れて、その意味では、天下り的であるが、ニューラル・ネットワーク上のGate回路について見てみようと思う。 次の図の左側が、Gateの構成をグラフで示したものである。 Gateは、入力( In )を出力( Out )に渡すのだが、その流れをGateに与えられる第三の情報( X )でコントロールするのだ。 Gateを構成しているのは、二つの回路だ。(図の右) 一つの回路(図右下)は、Gateに与えられる情報 Xを、Gateを直接コントロールする情報 Controlに変える。もう一つの回路は、Control 情報の元で、入力 In を出力 Out に変える。 Gate内部で、XからControlを生成する回路(図右下)は、Sigmoid関数を活性化関数とする一層のフルコネクトのニューラル・ネットワークである。図中の四角の中に書かれたσは、この層の活性化関数がSigmoidであることを表している。ただし、この層の重み W やバイアス b は、この図では省略されている。 ContorolとInから、Outを生成する回路(図右上)が行なっているのは、簡単な演算である。二つの量を掛け合わせるだけ。ただし、掛け合わせは、ベクトルの要素ごとに行われる。これは、Hadamard積と呼ばれるものだ。Hadamard積については、次の図を参考にされたい。 こうして、Gateが行なっている働きは、次の二つの式で表

Google様にAdSense落とされた!

1月からblogを始めた。 Google様謹製のBloggerを使ったので、どうせならAdSenseも使ってみようと申し込んだ。 ところが、先日、こんな通知が来て、Google様にAdSense落とされた! ----------------------------------------------------- お客様のアカウントで次の違反が確認されましたので、アカウントは不承認となりました。 承認されなかった理由は次のとおりです。 不十分なコンテンツ (ここ太字): AdSense の承認を得てサイトに関連性の高い広告を掲載していただくには、AdSense の担当者による審査とクローラによる解析でページの内容を判断できるだけのテキストがページに含まれている必要があります。 この問題を解決するには、次のヒントをお試しください。 ・ページで十分なテキストを使用してください。画像や動画、Flash アニメーションがほとんどを占めるウェブサイトは承認されません。 ・コンテンツには、タイトルだけでなく、意味のある文章や段落が含まれている必要があります。 .....(以下略) ----------------------------------------------------- 僕のblog は、「ページの内容を判断できるだけのテキストがページに含まれて」いないと判断されたらしい。コンテンツでWelqにも負け、「担当者による審査」Welqチェックにも敗れたということなのかしら? 「コンテンツには、タイトルだけでなく、意味のある文章や段落が含まれている必要があります。」と言われるのは、なんかおかしいと思うけど、まあ、いいか。いろいろあらーな。 明日から、SEO対策しよ。 それよりも、Google様にいぢめられた丸山が、かわいそうだと思ったら、丸山のblogにアクセスしてください。

TensorFlow Fold Blocks チュートリアル (Google翻訳バージョン)

TensorFlow Foldの Blocks Tutorial を翻訳しました。 嘘です。全部、Google翻訳です。 Blocks Tutorial Introduction  Motivating example Basic concepts Primitive blocks  Converting Python objects into tensors. Using TensorFlow tensors. Functions and Layers Python operations Block composition Wiring blocks together Dealing with sequences Dealing with records Wiring things together, in more complicated ways. Recursion and forward declaration Introduction 読者がTensorFlowの基本的な概念と深い理解を理解していると仮定します。そうでない場合は、TensorFlowチュートリアルを開始するのがよいでしょう。 Foldモデルへの入力は、Pythonオブジェクトのミニバッチです。これらのオブジェクトは、プロトコルバッファ、JSON、XML、またはある種のカスタムパーサをデシリアライズして生成することができます。入力オブジェクトは木構造であると仮定される。 Foldモデルの出力は、TensorFlowテンソルの集合であり、通常の方法で損失関数とオプティマイザに接続できます。 入力としてデータ構造のミニバッチが与えられた場合、Foldは入力データを走査し、TensorFlowによって効率的に実行できる方法で操作を結合およびスケジューリングします。たとえば、ツリー内の各ノードが、共有ウェイトを持つ完全に接続されたレイヤーを使用してベクトルを出力する場合、Foldはツリーを単にトラバースするだけでなく、ベクトル行列の乗算演算を行います。代わりに、ツリー内の同じ深さのノードをマージします。これは、より大きい、より効率的な行列 - 行列乗算演算に並行して実行され、その後、出力行列を再びベクトルに分割します。 Moti

2/28 マルレク「RNNの基礎」参考資料まとめ

イメージ
2/28開催のマルレク「RNNの基礎」では、第一部「RNN」、第二部「LSTM」という構成を考えています。 この間、blogに書いた情報のインデックスをまとめておきました。 「2/28 マルレク「RNNの基礎」参考資料まとめ」 http://maruyama097.blogspot.com/2017/02/228-rnn.html ご利用ください。 2/28 マルレク「RNNの基礎」 第一部 「RNN」 「RNNとは何か?」  http://maruyama097.blogspot.jp/2017/02/rnn_7.html 「Sequence to Sequence」  http://maruyama097.blogspot.jp/2017/02/sequence-to-sequence.html 「RNNでの φ ( WX + b ) の応用」 http://maruyama097.blogspot.jp/2017/02/rnn-wx-b.html   「20数年前、いったん放棄されたRNN」 http://maruyama097.blogspot.jp/2017/02/20rnn.html 「Back to the Future -- RNNの復活」 http://maruyama097.blogspot.com/2017/02/back-to-future-rnn.html 第二部 「LSTM」  これからです。乞うご期待。

TensorFlow Foldについて

イメージ
Googleが、TensorFlow Foldというライブラリーを発表しました。 "Announcing TensorFlow Fold: Deep Learning With Dynamic Computation Graphs" (論文は、 こちら ) この図の意味について簡単に説明したいと思います、 "computer scientists love "という文は、文字列あるいはwordのSepquence として見ることができます。普通のRNNやLSTMでは、こうしたSequenceとして入力を受け付けます。 ただ、先のSequenceは、文法的な構造を持っています。"computer scientists"が主語(節)で、"love"が動詞、"putting data in trees"が目的語(節)です。 構文の構造は、((Cpmputer scientists) (love ((putting data) (in tree)))) こんな感じですね。 ただ、先の文字列をSequenceとして入力すると、そうした文法構造の情報は、皆、失われます。それでは、文の持つ情報を正しく引き出すことはできません。 と言って、一つの文ごとに、その文法構造に対応したニューラルネットを構築していたのでは、沢山の文を解析するには、沢山のニューラルネットを構築しないといけなくなります。 一つのモデルで、SGDのバッチを回すというやり方だと、個々にモデルが違うような場合には、うまく、バッチの処理ができません。 この図では、次のようなプログラムが中心的な役割を果たしています。キャプチャーのタイミングが悪くて、図が書けていますが、本当は、単純なループです。 先の図と、この図を足したものが、本当のプログラムに近いかな。 先のデータ((Cpmputer scientists) (love ((putting data) (in tree)))) ですが、データの結合がわかりやすいように、色をつけます。(オレンジ (青 Cpmputer scientists) (紫 love ((赤 pu

Back to the Future -- RNNの復活

イメージ
RNNは、その"Sequence to Sequence"の能力を生かして、現在は、Deep Learningの主役の一人に返り咲いている。では、前回のポストで見たRNNの抱えていた困難は、どのように克服されたのであろうか? ここでは、そのことを詳しく述べることはできない。 ただ、RNNの復活に大きな役割を果たしたのは、皮肉なことに、RNNの抱えている困難を原理的に明らかにし、いわば、かつてRNNに「引導」を渡した二人、Hochreiter とBengioであることに気づく。 それは、本当は、皮肉なことではないのかもしれない。問題の難しさを一番よく理解している人が、問題の解決に一番近いところにいるのは、ある意味自然なことであるのだから。 1997年に、Hochreiter と Schmidhuberが論文  " Long Short Term Memory  "で導入したLSTMは、現在のRNN技術の中核となった。Googleの「ニューラル機械翻訳」もLSTMベースである。LSTMについては、次回以降のポストで、詳しく見てみたいと思う。 去年 2016年の6月の ICML (International Conference on Machine Learning)で、Bengioが、面白いタイトルの講演をしている。タイトルは、"Learning Long-Term Dependencies with Gradient Descent is Difficult" 。そう、1994年に、彼がRNNの原理的な困難を明らかにした論文と同じタイトルである。 ポイントは、この講演が、このカンファレンスの " Neural Nets Back to the Future " というワークショップで行われていること。 このワークショップの目的は、次のようなものだ。(LSTMを使ったGoogle翻訳を使って見た。十分、下訳として使える!) As research in deep learning is extremely active today, we could take a step back and examine its foundations. We p

20数年前、いったん放棄されたRNN

イメージ
テキストの文字列や音素のつらなりである人間の発話、あるいは音楽の音やビデオのフレームのようなSequentialなデータは、我々の周りに多数存在している。こうしたSequentialなデータを、単純なニューラル・ネットを横に連ねたニューラル・ネットで解析しようとするRNNは、当初、大きな関心を集めたようだ。今から、20数年前のことだ。 隠れ層をつなぐ接続を同じ重みのパラメーター W を共有し、同一のネットワークを繰り返し利用するというアイデアで、実装の負担も抑えられそうに見えた。 ところが、この試みはうまくいかなかった。RNNでは、Back Propargation / Gradient Descent を使った学習アルゴリズムがうまく働かないのだ。横に並ぶネットワークの数が増えるにつれて、パラメーターを修正する勾配が、どんどんゼロに近づいてゆくのだ(時には、爆発的に増大することもあった)。「勾配の消失(あるいは、爆発)の問題」という。 当時のRNNは、次のような形をしていたらしい。 (この繰り返し) この式に問題があったわけではない。この構成のRNNは、繰り返しの少ない短い系列なら、ちゃんと動くのだ。問題は、他のところにあった。 Full ConnectのDNNとRNNとでは、単純なニューラルネットを、縦に並べる、横に並べるだけではない違いがある。 Full ConnectのDNNでは、各層ごとの重みのパラメーター Wi は、一般には、異なっている。RNNでは、隠れ層を結ぶ重みのパラメーター W は、常に同じである。DNNの場合には、勾配の消失が起きそうになったら、一つ一つの層の「学習率」を個別に修正して、問題に対応できる。これは、いささか姑息な手段だが、DNNでは有効である。しかし、この方法は、常に全く同じ形でパラメーターを適用するRNNには、適用できない。 さらに、一般的には、DNNでの縦への積み重ねより、RNNでの横の繰り返しは長くなる傾向がある。50段重ねのDNNは、あまり見たことないが、50文字以上の文字列を扱うRNNを作ろうとするのは自然である。 20数年前、皆さんいろいろやって見たらしいが、実験結果は、思わしくなかった。 そこにある論文が登場する。1994年、Beng