投稿

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」  これからです。乞うご期待。