投稿

2月, 2017の投稿を表示しています

Google機械翻訳に注目!

科学でも技術でも、その発展には、飛躍がある。もちろん、飛躍にも小さいものから大きいものまでいろいろあるのだが。 面白いことに、何かが共鳴するように、いろんな飛躍が、ある時期に集中して起きることがある。 人工知能の分野では、2012年がそうした時期であった。ImageNetの画像認識の国際的コンテストで、CNNを使ったAlexNetが圧勝し、Googleの巨大なシステム DistBeliefが、教師なしでも猫の認識に成功する。それが、2012年だ。 この時から、人工知能ブームが起き、技術的には、ニューラル・ネットワークを用いたDeep Learning技術が花形となる。そして、そうした技術的な達成は、ただちに、ビジネスの世界で応用を見つけ出していく。 現在、各社が取り組んでいる自動運転技術と、Alexa, Google Now, Siri 等のボイス・アシスタント・システムが、コンシューマー向けのAIプロダクトとしては、最も大きなマーケットになるのだが、そこでは、Deep Learning技術のCNNが、中心的な役割を演じている。 ただ、技術の変化は早い。 今また、2012年のブレークスルーに匹敵する目覚ましい飛躍が、AIの世界で起きようとしている。昨年11月にサービスが始まった、Googleの「ニューラル機械翻訳」がそのさきがけである。 そこで使われている技術は、RNN/LSTMと呼ばれるものである。 Googleの新しい機械翻訳のシステムは、LSTMのお化けのような巨大なシステムなのだが、その基本原理を理解することは、誰にでもできる。(今度のマルレクにいらしてください) 2012年に続く、この第二の飛躍が、どのようにビジネスに生かされるかは、まだ未知数だが、必ず、現実の世界で利用されていくようになるだろう。 今の眼で、2012年の「Googleの猫」のDistBeliefを振り返れば、かつては驚嘆して見上げたそのシステムが、ハードワイアーでプログラミングをしていた、かつての「巨大システム」ENIACのようなものに、見える。 Googleの機械翻訳のシステムも、いずれ、スマートフォンに収まるようになるだろう。僕の好きな「翻訳こんにゃく」は、早晩、実現されるだろう。 さらに、変化は加速している。 第三の飛

ダメだこりゃ。LSTMの図を書き直すの巻。

イメージ
マルレクの準備で、図を書いているのだが、文章よりも図の方を先に書いていると、どうも、スライドがパラパラ漫画風になってしまう。ま、それは、楽しいし、そんなに悪いことではないと思っているのだが。 ただ、問題は、書いているうちに、前の図が気に食わなくなることがあること。文章の訂正は簡単だが、図の訂正は手間がかかる。その上、パラパラ漫画になっていると、同じような図が連続してたくさんあって、修正箇所も多くなる。うーん。 今回、でも、どうしても気に食わなくて、というか自分の認識不足があって、図を描き直そうと決心した。 実は、もっと深刻な問題もあって、講演の発表予定順に、スライドを準備しているわけではないので、後からの図の訂正は、実は、すでに完成している大量のスライドの図に影響が出る。自業自得なのだが、さあ、どうするか。 昨日、LSTMの形として、次のものを提示した。 今日になって、この図が、どうしても、気に入らなくなった。真ん中の丸の、「\(C_t\)を生成」の部分が気に入らないのだ。 この丸では、二つの演算が行われている。下から「tanh」の部分と、その上の「+」の部分だ。実際に、「\(C_t\)を生成」しているのは、「+」の部分だけだ。この丸は大きすぎる。 気に入らない、もう一つの理由は、LSTMの内部の演算は、全て、LSTM内部のGateと関連していることがある。図の一番左にあるGateは、この図では、ちょっと仲間外れにされている気がする。そうではなく、このGateは、演算「+」の仲間なのだ、 他にも問題がある。僕が、不都合に気づいたのは、実は、この図はLSTMの展開形なのだが、それをループを含む再帰形で表そうとして、うまくいかなかったからである。 修正版は、こちら。各ユニットが、一つの計算を行い、それぞれがGateに関連づけられているのが、見やすいのがわかると思う。 この展開形を、ループを含む再帰形で表したのが、こちらになる。図中の黒い四角は、データを変えることはないが、変数の添字の時間の部分だけを、一つ進めることを表している。 このように、LSTMの再帰形は、二つのループを含む。それは、LSTMの展開形が、横串二本で貫かれていたことから、想像できること

LSTMの中の三つのGate

イメージ
ここでは、LSTMの中で、Gateがどのようなところに配置されているかを見てみよう。 あらためて、RNNとLSTMの比較をしてみよう。 まずは、RNNから。 隠れ層に、横串が一本通っているが、RNNは単純な三層構造のニューラル・ネットワークが単位であることは、わかると思う。 では、LSTMは、どうであろうか? 横串が、一本増えた。 ただ、この二つの図を見ているだけではわからないことがある。もう少しだけ詳しく、内部の様子を見てみよう。 まずは、RNNから。 基本となるのは、RNNの次のような構成である。この図では、矢印に添えられた文字は、情報の名前ではなく、重みであることに注意されたい。 これまでも、また、これからも繰り返し登場する 重要な式 は、Full Connectなニューラル・ネットワーク一層の出力は、入力をX、重みをW、バイアスをb とした時に、\( \phi ( W \cdot X + b) \) で表されるということである。 RNNでは、隣り合う隠れ層もFull Connectである。ここでは、RNNの隠れ層が受け取る二つの入力 \(h_{t-1}\) と \(x_t\) から、次の式で、出力が計算されている。 $$ h_t = \phi _h ( U \cdot x_t + W \cdot h_{t-1} + b_h $$ ここで、基本式に新たに付け加えられた \(W \cdot h_{t-1}\)が、隣の隠れ層からの入力に対応している。 この関係式を、先のRNNのグラフに書き込んでみよう。次の図が、それである。 出力層では、活性化関数とバイアスが省略されている。 この図に対応するLSTMのグラフは、次のようになる。 似ているようでもあり、似ていないような気もするが。 ただ、先の図には、重要な情報が抜けている。LSTMが、もっともRNNと異なるのは、それが内部にGateを持つということだ。それを図示したのが、次の図である。 LSTMは、内部に三つのGateを持っている。それが、LSTMの振る舞いを、RNNとは大きく変えることになる。

LSTMをRNNと比較する

イメージ
LSTMは、RNNの一種である。ただ、LSTMは、旧来の単純なRNNとは異なっている。ここでは、LSTMとかつてのRNNを比較してみようと思う。 かつてのRNN(以下、単にRNNと呼ぶことにする)は、次のような形をしていた。 両者の比較を図示すれば、次のようになる。 RNNでは、横の繋がり(展開形で)は、h層の一本だけだったのだが、LSTMでは、もう一本多く横のつながりを持つ。このc層は、LSTMで新たに付け加えられたものだ。あとで見るように、LSTMでは、この層が独自のとても大事な働きをすることになる。 この図では、入力は水色、出力は緑色で表されているのだが、RNNは、二つの入力 \(h_{t-1}\) 、\( x_t \) を持ち、二つの出力 \( h_t\) 、\( o_t \) を持つ。それに対して、LSTMは、三つの入力 \(h_{t-1}\) 、\( c_{t-1} \)、\( x_t \) を持ち、三つの出力 \( h_t\) 、\(c_t \)、\( o_t \) を持つ。 LSTMの内部を、簡単に見てみよう。(詳細な説明は、後にする。)基本的には、左の図に対応して、LSTMは、\( h_t \) を生成する層と、\( c_t \) を生成する層の二つからできている。 ここでは、次の二つのことに注意しよう。 第一に、LSTMの出力 \( o_t \)は、\( h_t \) と同じものである。先ほど、三つの出力があると書いたが、三つのうち二つは、同じ \( h_t \)である(右の図で、上方向と横方向の出力の \( h_t \) )。右と左の図を比べて、c層の位置とh層の位置が、上下反対のように見えるのは、h層が出力を行う層だからである。また、右図の大きな回り道は、\( h_t \) が、二箇所で利用されているからである。 第二に、それでは、情報の流れは、右の図の大きなノード間の、c層からh層への流れであって、左の図にあるような h層からc層の流れは、存在しないのであろうか? そうではない。h層への入力である \(h_{t-1}\)  は、入力 \( x_t \) と合流して、それがc層に流れている。ここでは、二つの入力を合流させるのに、二つのベクトルを横に繋げて連結するという方

TensorFlow 1.0リリースと TF Dev Summit 2017 でのJeff Deanのキーノート

イメージ
2月15日、TensorFlow 1.0をリリースした、TensorFlow Developers Summit 2017 のキーノートの様子です。 冒頭のスピーチは、もちろん、Jeff Dean。タイトルは、「TensorFlow : ML for Everyone」 みんなのための機械学習ですね。 TeasorFlow登場以前の、「第一世代」の"DistBelief" の話から始まります。2012年の「Googleの猫」で有名なシステムですね。スケーラブルで実際に製品版として動いていたんだけど、GPUもCPUもハードは固定されていて柔軟ではなかったと。RNNや強化学習にも使えなかったと。 それと比べると、「第二世代」のTensorFlowは、多くのプラットフォームをサポートして(Rasberry Piの上だって動く)、その上、Googleのクラウド上でも動く(それにもたくさんの方法がある)。 そして、TensorFlowは、Pythonを始め、C++, Java, Go, Haskell, R と、多くの言語をサポートしている。(Haskellでも動くんだ、知らなかった。もっとも最近出た Fold は、関数型プログラミングそのものだからな。) TensorFlowの大きな特徴は、TensorBoardのような、Visualizationの優れたツールを、一緒に提供していること。 TensorFlowは、また、Google自身の内部でも、検索、Gmail、翻訳、地図、Android、写真、スピーチ、YouTube ... 様々な分野で、急速に利用が進んでいる。 オープンソースのTensorFlowの開発は、GitHubの機械学習の分野では、ナンバーワンのレポジトリーの数を占めている。 機械学習の様々なフレームワークの中でも、TensorFlowが、圧倒的に利用されている。 GitHubでのStarの数は、 TensorFlow   44508 scikit-lean     16191 Caffe            15690 CNTK             9383 MXNet           7896 Torch

Cloud Spannerについて

イメージ
Googleが、これまで自社内部で利用してきたSpannerをクラウド・サービスとして公開した。 "Introducing Cloud Spanner: a global database service for mission-critical applications" 2012年のOSDIで論文が公開されたSpannerは、key-valueをベースにした拡張性と、RDBのACIDなトランザクション処理能力を併せ持つ強力な分散データベースである。タイムスタンプ・ベースのトランザクション処理に必要な正確な時間を得る為に、GPSや原子時計を利用。その上に、時間の不確実性を組み込んでいる。 当時、次のSpanner論文を日本語に翻訳した。(当時、残念ながら、Google翻訳はなかった。) "Spanner: Google’s Globally-Distributed Database"  丸山による翻訳は、次の リンク からダウンロードできる。利用されたい。 その頃のGoogleの大規模分散システムの動向については、Spannerを含めて、2013年のマルレクで取り上げている。「 大規模分散システムの現在 --- GFS, MapReduce, BigTableは、どう進化したか 」合わせて参照されたい。

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

Convolution パラパラ漫画

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