投稿

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 であることと関係している。それについては、別のポストで。

自然言語理解でのRNNの能力について

イメージ
画像認識の分野でディープラーニングの手法が、これまでにない大きな成功を収めていることは、現在では、多くの人が知っている。 そこで利用されているのは、基本的には、CNN(Convolutional Neural Network)というモデルである。マルレクでもCNNについては、大きな柱として取り上げてきた。 IT技術者を対象に、ディープラーニングの講座をやろうと思ったとき、僕は、「IT技術者は、当面は、Full ConnectとCNNまで理解すれば充分」だと考えてきた。 これまでのマルレクでは、RNNについては、Ilya SutskeverのWikipedia風やNewyork Times風の文章の生成や、Andrei Karpathy の数学論文「もどき」やCコード「もどき」の生成を紹介をしてきた。 そこでは、RNNが構文規則を理解する驚くべき能力を持っていることを紹介しながら、むしろ、「意味」を理解する能力の無さを強調してきた。 次は、RNNが生成したWikipedia風文章。 https://goo.gl/cxKzTd から。 次は、RNNが生成した数学論文「もどき」とCのソースである。  https://goo.gl/FodLp5 から。 英語が得意な人、数学が得意な人、C言語が得意な人、よく見て欲しいのだが、これらに意味はない。というか、意味をなさないのだ。支離滅裂な、全くのfakeである。 ただ、どうも、それだけでは済まないようだ。 大事なことは、自然言語の分野でのRNNの利用は、文法的には正しいが、意味のない文章・記号列を生成するだけでないのだということ。 そのことを鮮やかに示したのは、何と言っても、去年の暮れにGoogleが発表した、「ニューラル機械翻訳システム(Neural Machine Translation System)」である。これは、素晴らしい! 今回のマルレクでは、改めて、RNNを取り上げようと思う。 注意すべきなのは、Googleの「ニューラル機械翻訳」で、RNNが、突然、言語の意味理解の能力を獲得したわけではないだろうということ。(もっとも、これは、僕の考えなのだが。) ある言語Aを母語とするある人が、ある「意味」を込めた文S_Aを発話したとする。もちろんこ

グラフ描きが嫌になる

イメージ
2/28 マルレク「RNNの基礎」の準備を始めているのだが、いろいろとつまづいている。 発端は、ニューラルネットの図を、キレイに描こうと思ったこと。いつもは、パワポで図形を描いているのだが、あまりキレイに書けない。何か他のツールを使ってみようと思った。 で、illustratorの代わりにと、Inkscapeを使おうと思った。ところが、Mac Port経由でのInkscapeをビルドしようとしたのだが、うまくいかない。何時間か無駄にする。 しょうがないので、古いInkscapeバイナリーをインストール。立ち上がるのだが、これがなかなかいうことを聞かない。ファイルに名前をつけて保存すると、必ず落ちる。でも、不幸中の幸いで、ファイルに保存してから落ちているようなので、何度も立ち上げ直して使う。 Inkscapeで書いたのが、最初の図。全然、キレイじゃない。(多分、何本か線が抜けている)パワポで根性入れれば、これくらいはできるかも。手動で訂正しようとしたのだが、線が混みすぎて、動かしたい線が選択できない。これじゃ、パワポと変わらないじゃないか。半日が、不毛にすぎる。 しょうがないので、別の手段を探す。結局、Jupyterで、Matplotlibを使うことに。使い方がわからず、泣きながら作業する。なんとかできたのが、二つ目の図。線の抜けはないはずだが。引数の型がよくわからず、試行錯誤とコピペと根性で作ったので、ループを使っていない。バカなプログラム。これなら、Latexで図を書いても、同じ手間でできたかもしれない。これで、半日。 RNNの解説には、このグラフを最低でも3つは横に並べて、隣り合う隠れ層のノードを結んだグラフが必要なのだが。直線だと、みんな重なっちゃうから、アークで結ぶしかないのだ。これは、僕のスキルだと、手書きになるだろうな。なんか嫌になって来た。 グラフを抽象化したグラフや、ノテーションの工夫や、何よりも、アクティベータをφとした時のφ(WX+b)という式(Wは重み、Xは入力、bはバイアス)の形が大事なのだが、そのことを理解してもらう為には、あとでは必要なくなるのだが、中間のステップが必要だと思う。 いくつか、やりたいことが残っている。 一つは、CNNの働きのビジュアル化。以前、パラパラ漫画を作ったのだが、コンボリ