投稿

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

Convolution パラパラ漫画

イメージ
以前にもConvolutionのパラパラ漫画作ったことあるのですが、例が少し単純で、「3Dのかたまりから3Dのかたまりの変換」としてのConvolutionをうまく伝えられなかったような気がします。 その時のは、厚さ3のデータに、フィルター2つでコンボリューションをかけて、厚さ2のデータを作るというものでしたので、薄いんです。 もう一度、Convolutionのパラパラ漫画作ってみました。お気軽にご利用ください。 https://goo.gl/IeZccS

RNNでの φ ( WX + b ) の応用

イメージ
前回、次のようなグラフの表記法を導入した。 大きな流れは分かりやすくなるのだが、実際に、どのような処理がなされているのかは、この表記ではわからない。その点では、TensorFlowでのグラフ表記の方が、細かいところまでよくわかった。 このTensorFlowのグラフが表しているのは、フルコネクトのニューラルネットのある層の出力は、 φ ( WX + b ) という形で表せるということである。ここに φ は、その層の活性化関数、 W  はその層の重み、 b  はその層のバイアス、 X  はその層への入力である。 この計算式  φ ( WX + b )  は、とても基本的なものである。 ここでは、復習を兼ねて、三層からなる単純なネットワークの新しいグラフ表記を、この式で表してみよう。それが、次の図である。 内容的には、先の図で、TensorFlowのグラフが表しているものと同じである。ただ、グラフが表しているものを式で表すと、細かなところまではっきりとわかる。これは大事なことで、RNNのような複雑なネットワークでは、グラフだけすますと、肝心のところがわからなくなる。グラフと式を併用するのがいい。もちろん、基本的な情報は、式の方にある。 さて、今日の本題だが、RNNのグラフ表記を式で表してみようと思う。それが、次の図である。 出力層の式は同じだが、隠れ層の式に、ちょっとした変化がある。それは、RNNの隠れ層が、入力層からだけでなく、隣の隠れ層からの入力も受けるので当然のことである。 上の図で、赤い字で書かれた部分が、それである。 RNNでは、隣り合う隠れ層は、フルコネクトでつながっている。隠れ層同士のつながりの重みを W とすれば、隣の隠れ層 h(t-1) から受け取るベクトルは、 W と h(t-1) をかけたものになる。それは、隠れ層が、重み U でフルコネクトでつながっている入力層 x(t) から受け取るベクトルが、 U と x(t) をかけたものになるのと同じことである。 こうして、RNNの隠れ層が外から受け取るベクトルは、入力層からくるベクトルに、隠れ層からくるベクトルを足したものだと考えればいいことになる。

Sequence to Sequence

イメージ
ここでは、RNNがなぜ " Sequence to Sequence " のNeural Network と呼ばれるのかを説明しようと思う。 まず、RNNのグラフを見やすく表現し、以下の議論を分かりやすくするために、グラフの表記を少し変えてみよう。 入力層・隠れ層・出力層の三層からなる単純なネットワークを考えよう(次の図の上)。 これを、TensorFlowのグラフで書けば次のようになる(次の図の中)。ここでは、ニューラル・ネットワークの基本的な計算式 φ( WX + b ) が、明示的に図示されている。 新しい表記は、このグラフの細部を省略したものだ(次の図の下)。 重みのパラメーターの U, V のみを残して、二つのバイアス b も二つの活性化関数 φ も表記上からは消えている。ただ、入力ベクトル x が、パラメーター U の作用を受けて隠れ層のベクトル h を形成し、隠れ層ベクトル h が、パラメーター V の作用を受けて、出力ベクトル o に変換されることは、きちんと表現されている。 こうした表記(ただし、今度は、入力層を下に、出力層を上にしている(次の図の左))を用いると、単純な三層のニューラル・ネットワークを横に並べ、隣り合う隠れ層のノードをフル・コネクトで結んだネットワーク(次の図の右上)は、次の図の右下のように表されることになる。 この図では、パラメーターの U1, U2, U3 も、 V1, V2, V3 も、 W1, W2 も、それぞれ異なっていることに注意しよう。これは、横につなげられたニューラル・ネットワークが、それぞれ異なったパラメーターを持つ、異なったネットワークであることを表している。 ところで、単純なニューラルネットを横につなげたものがRNNではないのだ。 次の図の右の方を見て欲しい。そこには、パラメーターは、 U, V, W の三つしかない。 左の図の U1=U2=U3=U, V1=V2=V3=V, W1=W2=W としたものが、右のグラフである。これが、RNNのグラフになる。 RNNは、同じパラメーターを持つ、同じニューラル・ネットワークを横につなげたものだ。この図では、三つのニューラルネットが横につ

RNNとは何か?

イメージ
最初にRNNとは、どのような形のニューラル・ネットワークなのかを説明しておこう。 入力層・隠れ層・出力層の三層からなる単純な、フル・コネクトのネットワークを考えよう(図右上)。これをユニットとして組み合わせて複雑なネットワークを構成することを考える。 一つの方法は、これを縦に並べることである(図左)。 一つ上に積み上げるごとに、上のユニットの入力層のノードの数を、すぐ下のユニットの出力層のノードの数とを同じにして、重ね合わせれば、どんどん縦に積み重ねることができる。しかも、出来上がったグラフは、自然にフル・コネクトのネットワークになる。 これがDNNである。(正式には、Full ConnectのFeed Forward Network である。) もう一つの方法は、ユニットを横に並べることである。 ただ、横に並べただけでは、一つのネットワークにはならない。そこで、隣り合うユニットの隠れ層のノード同士を、フル・コネクトでつなぐこととする(図右下)。 これがRNNである。 と言いたいところだが、RNNには、ユニットを横につなげる時に、大きな条件が課せられている。それは、横につながるユニットは、同じ形のユニット(それぞれの入力層・隠れ層・出力層のノード数が同じ)でなければならないという条件である。 要するに、RNNとは、同じ形のユニットが、横に「繰り返される」形のネットワークなのである。 ただ、それだけではない。RNNには、もっと強い条件がある。横に繰り返されるのは、「同じ形」のユニットではなく、全く「同じ」ユニット(各ノードの重み、バイアスといったパラメーターも同一)であるという条件である。 このことは、先の図だけでは、少しわかりにくいかもしれない。全く「同じ」ユニットだと言いながら、先の図では、横ならびに「別々」に描かれているから。 そのことは、RNNが、"Recurrent" Neural Network であることと関係している。それについては、別のポストで。