Translate

2016年10月18日火曜日

TensorFlow の tf.nn.embedding_lookup() を調べる

word2vec_basic.py を相変わらず読んでいるが..

さっぱりわからん..

ようやく、generate_batch()が何やってるかわかったのだけど、肝心の計算グラフがよくわからん..

特に tf.nn.embedding_lookup() 。

なのでTensorFlowサイトの該当するリファレンスっぽい箇所を翻訳してみた。


今回は、いつも以上に翻訳結果がよくわからない..
一応載せますが、載せてる本人まったく正しいかどうか自信なし。

参照する方は、at your own risk でお願いします。
--------

tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None, validate_indices=True)




埋め込みテンソルのリストからidsをlookupする。

この関数はparams 内のテンソルのリスト上を並列lookup処理を実行するために使用されます。paramsが大きな埋め込みテンソルの分割として解釈される場合、この関数はtf.gather()の生成となります。
 

もし len(params) >1 であれば、idsの各要素は partition_strategy に従って params の要素を分割します。すべての戦略において、もしid空間がパーティションを均等な数に分けられない場合、最初の (max_id + 1) % len(params) 個の各パーティションは、もう一つのidを割り当てられます。

もし partition_strategy "mod" であれば、パーティション pp = id % len(params) となるよう各idを割り当てます。例えば、13個のidは次のような5つのパーティションに分割されます:[[0, 5, 10], [1, 6, 11], [2, 7, 12], [3, 8], [4, 9]]

もし partition_strategy"div" であれば、隣接法でidをパーティションに割り当てます。この場合、13個のidは次のような5つのパーティションに分割されます:[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10], [11, 12]]

lookupの結果は密度テンソルへ連結されます。返却されたテンソルは shape(ids) + shape(params)[1:] 形式です。


-----

lookupは検索とか索引とかの意味だけど、ここは何なんだろう..

tf.gater()も調べないとダメかな..

ということで、コッチも翻訳してみた。
以下、at your own risk で参照してください。

-----

tf.gather(params, indices, validate_indices=None, name=None)


indices (インデックスの複数形) に従って params からスライスを集約します。

indices は、(一般的には0次元もしくは1次元の)整数テンソルであるべきです。 indices.shape + params.shape[1:] 形式のアウトプットテンソルを作成します:


# スカラ indices
output[:, ..., :] = params[indices, :, ... :]

# ベクトル indices
output[i, :, ..., :] = params[indices[i], :, ... :]

# 高階 indices
output[i, ..., j, :, ... :] = params[indices[i, ..., j], :, ..., :]

もし indices が配列で len(indices) == params.shape[0] であるならば、indicesに従ってこの操作はparamsを置換します。


 

引数:


  • params:テンソル
  • indices:テンソル。int32もしくはint64形式でなければならない
  • validate_indices:オプションの真偽値。デフォルトは真
  • name:オペレーションの名前(オプション)

戻り値:

テンソル。paramsと同じタイプ。
-----

ためにに実行してみないと、さっぱりわからんなあ..

ちなみに、以下のかんじで実行して試すことができます。



いりいろやってみた。





..なるほどね、実際にイロイロ入れてみたほうがわかりやすいかもね..

Excelのうんちゃらlookupをイメージした方がいいのか..

2016年10月5日水曜日

RNNのブログ記事「Understanding LSTM networks」を翻訳してみた

いまだTensorFlowのテキスト系のチュートリアルを読み続けてます。

ようやく Word Embeddings を読み終え、RNNへ進もうとしたら最初の1行でいきなりRNNの概要が外のサイトのEssayへのリンクになっとる..


ということでリンク先の記事を翻訳してみました。
以下その翻訳文ですが、参照の際は At your own riskでお願いします。

あとこの記事を日本語に翻訳した人が2名ほどおられました。
2/3くらいまで訳したあとで気づき、失敗したっと思ったのですが最後までとりあえず
やってしまおうとおもい全部訳しました。

が、読む方は読みやすい翻訳のほうが良いでしょうから先にリンクを紹介しておきます。


以下、私の訳です。
----------

LSTMネットワークを理解する

 2015年8月27日投稿

 Recurrent Neural Networks


人間というものは、どの瞬間でもまったくのゼロから思考を開始しません。このエッセイを読んでいるときも、前の単語の理解を元にしてそれぞれの単語を理解します。なにもかもすべてを捨てゼロから思考を開始したりしません。思考には永続性が有ります。

伝統的なニューラルネットワークはこのような動作ができません、これは主な欠点の一つです。たとえば、映画の中のあらゆる時点で発生している事象の分類をすることを想像してください。伝統的なニューラルネットワークはフィルムの直前のイベントを後続の推理に使う事が可能かどうかは不明確です。

Recurrent Neural Networks(RNNs) はこの問題に対処します。RNNs はループを持ち、情報を永続化できます。


上図において、ニューラルネットワークのチャンクA は、幾つかのインプット をもとに、値 をアウトプットします。ループにより、ネットワークのあるステップから次のステップへ情報が渡されます。

これらのループが Recurrent Neural Networks を少し不可解に見せているかもしれません。しかし、もう少し考えると、通常のニューラルネットワークとそれほど違うわけではないことがわかります。Recurrent Neural Networks は、同一のネットワークの複数のコピーのようにみなすことができ、各々が後続にメッセージを渡していることができます。ループを展開して、何が起こっているかを考察してください:



このチェーンのような性質は、 Recurrent Neural Networks がシーケンスやリストと密接な関係があることを明白にします。そのようなデータを使うニューラルネットワークの自然なアーキテクチャです。

そしてそれらは確かに使用されます!過去2~3年では、RNNsの適用により様々な問題に対して驚くべき精巧を収めています:音声認識(speech recognition)、言語モデリング(language modeling)、翻訳(translation)、イメージから説明文抽出(image captioning).. リストは続きます。Andrej Karpathyの完璧なブログ投稿( The Unreasonable Effectiveness of Recurrent Neural Networks )を発展させることができる驚くべき偉業の議論がのこっていますが、それらはとても驚異的です。

これらの成功の本質は "LSTMs" の使用にあります、標準バージョンより非常に非常によく、多くのタスクが、動作する大変特別なRecurrent Neural Networksの一種です。Recurrent Neural Networksをベースとしたほとんど多くの結果は、 LSTMs により向上しました。このLSTMsについて、このエッセイで説明します。

Long-Term Dependenciesの問題


現在のビデオフレームの理解に前のフレーム情報を使うなど、現在のタスクに前の情報を接続することができるかもしれないというアイディアがRNNsのアピールのひとつです。もしRNNsでこれが可能であれば、非常に便利です。でも出来るでしょうか?それは、依存します。

時々、現在のタスクを処理するために過去の情報のみを見る必要があります。例として、前の単語群をベースとして次の単語を予測しようとする言語モデルを考えるなどです。もし "the clouds are in the sky" の最後の単語を予測しようとしているならば、この後の文脈は必要ありません-次の単語がskyになることは明白です。そのようなケースでは、関連情報と必要とする小さな部分の間のギャップのように、RNNs は過去の情報を使うことができます。



しかし、もっと文脈が必要なケースもあります。"I grew up in France ... I speak fluent French." の次の単語を予測しようとすることを考えてください。過去の情報は次の単語がおそらく言語の名前であると推奨しますが、もしどの言語か絞りたい場合、前に戻って、"France" の文脈を必要とします。関連情報ととても大きくなったそれがどこかという情報との間のギャップでは十分にありえます。

不幸にも、ギャップが育てば、RNNs は情報を連結する訓練ができなくなります。



理論的には、RNNs は "Long-Term Depencency" のようにあつかうことにたいして極めて有能です。このフォームのおもちゃ問題を解くために、人間は慎重にパラメータを選択することができます。悲しいことに、特にRNNsは、それらを訓練することができません。Hochreither (1991) [ドイツ] や Bengioほか により深く調査され、何故それが難しいか極めて基本的な理由を見つけ出しました。

ありがたいことに、LSTMsにはこの問題がありません!

LSTM ネットワーク


Long Short Term Memory networks -一般的には"LSTMsとよばれる-は、Long-Term Dependencies を訓練可能な、特殊なRNNの一種です。LSTMs は、”Hochreiter および Schmindhuber により紹介され、後続の多くの人による業績により洗練され大衆化されました。

オリジナルの著者に加え、多くの人々がモダンLSTMに貢献してきました。非包括的なリストは次の通り:Felix Gers、Fred Cummins、Santiago Fernandez、Justin Bayer、Daan Wierstra、Julian Togelius、Faustian Gomez、Matteo Gagliolo、 Alex Graves

彼らは多種多様な問題に取り組み、現在では広く活用されています。

LSTMsは明らかに Long-Term Dependency 問題を避けるように設計されています。情報の長期間記憶は、ほとんどデフォルトの振る舞いであり、訓練のために苦労する何かではありません!

すべての Recurrent Neural Networks はネットワークの繰り返しモジュールのチェーンの構造を持っています。標準のRNNsでは、この繰り返しモジュールは、まるでひとつの tanh レイヤのように、極めて単純な構造となっています。


単一のレイヤで構成された標準的なRNNにおける繰り返しモジュール

LSTMsもまた構造のようなこのチェーンを持っています、しかし繰り返しモジュールは異なる構造をを持っています。単一のニューラルネットワークレイヤを持つ代わりに、4つの、とても特別な方法で相互接続するレイヤを持っています。

4つの相互接続レイヤを含むLSTMの繰り返しモジュール

何が起きているのか詳細については気にしないでください。あとでLSTMダイヤグラムをステップごとに学習します。今は、使っている表記法に不安がないようにしておきましょう。

汎例


上の図において、それぞれの線は、一方のノードのアウトプットから他方のノードのインプットへ、ベクトル全体を移動します。ピンクの丸は、ベクトルの加算のような、点別の操作を、黄色い箱は訓練されたニューラルネットワークレイヤをそれぞれあらわします。線が結合してるものは連結をあらわし、線が分岐しているものはベクトルをコピーしそれぞれのコピーがそれぞれことなる場所へ移動します。

LSTMs の裏にある核となるアイディア


LSTMsの鍵は、それぞれのセルが水平な線で一番上の部分を貫いている状態であるところです。

セル状態はコンベアベルトの一種のようなもので、いくつかの小さな線の相互接続のみをもつ、チェーン全体を真っすぐ走っています。情報が変わらずに沿って流れることはとても簡単です。

訳者注
セル状態(cell state)は、実装されるとオンメモリ上のセル上で扱う変数群を格納する共有参照可能領域のようなものとなる。LSTMの実装で異なるがChainerのサンプルでは、セル状態を、時刻tにおけるメモリ状態(時刻 t における隠れ層の l-1 番目のアウトプット
と 時刻 t-1 における隠れ層の l 番目のアウトプット
)を格納する領域として定義している。ここでは、「状態」をメモリ上に記憶する領域として、ざっくりとした理解でよい。

LSTMはセル状態に情報を削除もしくは追加する能力を保持しており、ゲートと呼ばれる構造で慎重に制御されています。

ゲートは任意で情報を通す手法のひとつです。ゲートはシグモイドニューラルネットワークレイヤの出口とポイントごとの乗算で構成されます。

訳者注
σが書かれた黄色い箱がシグモイドレイヤで、そのアウトプットを赤丸の×(乗算)につながっている。

シグモイドレイヤは 0 から 1 の間の数字群を出力し、どのようにして多くのそれぞれのコンポーネントが通すべきかを説明しています。値 0 は「何も通さない」ことを意味しており、値 1 は「なんでも通す!」ことを意味しています。

ひとつのLSTMには、セル状態を守りそして操作するための、3つのゲートがあります。

ステップバイステップ LSTM ウォークスルー


LSTMの第1ステップは、セル状態から何の情報を投げ捨てるかを決めることです。この決定は「ゲートレイヤの忘却」と呼ばれるシグモイドレイヤにより作成されます。それは、
 と
で、セル状態
のそれぞれの数値における 0 から 1 までの数をひとつ出力します。 1 は「完全に確保」することをあらわし、 0 は「完全に追い払う」ことを意味しています。

前のすべての単語群をもとに次の単語を予測しようとしている言語モデルのサンプルに戻りましょう。そのような問題では、セル状態は現時点の主語の性別も含んでいるので、正しい代名詞を使うことができます。新しい主語を発見すると、古い主語の性別を忘れようとします。



次のステップは、セル状態(cell state)に格納する新たな情報は何かを決めることです。これは2つのパートに分かれています。最初に、「ゲートレイヤのインプット」と呼ばれるシグモイドレイヤがどの値を更新するかを決めます( )。次に、 tanh レイヤが新しい候補値 を作成します。
が状態(state)へ追加されます。次のステップで、状態(state)への更新する値を作成するためにこれら2つの値を組み合わせます。

言語モデルのサンプルでは、新しい主語の性別をセル状態(cell state)へ追加し、忘れるために古いものと交換しようとしています。



この時点で、古いセル状態
、 から新しいセル状態
に更新されます。前のすtレップで既に何をするかが決まっていたので、実際に実行する必要があります。

古い状態 とf_t を乗算し、先に忘れると決めたものを忘れます。そして、
を加算します。これは新しい候補値で、いくらそれぞれの状態値の更新を決定したかによってスケーリングしています。

言語モデルの場合では、前のステップで決定したとおり、ここで古い主語の性別についての情報を実際にドロップして新たな情報を加えています。



最後に、何をアウトプットするかを決めます。このアウトプットはセル状態を元にしていますが、フィルタ化されたバージョンです。最初に、シグモイドレイヤを実行し、セル状態のどのパートをアウトプットするかを決めます。そして、( -1 から 1 までの間の値群をプッシュするために) tanh 演算し、シグモイドゲートのアウトプットで乗算して、セル状態に配置します。その結果、決定したパーツのみをアウトプットします。

訳者注
双曲線関数 tanh を通すことにより決定を明確にしてから、掛け算することで何を残すかを決めたもののみをアウトプットにしています。tanh (ハイポセシックタンジェント)は、原点ゼロを離れると値域が正値なら1へ負値なら-1へ収束する双曲線をえがく関数で、指数関数で表現可能なため、微分可能でかつ計算が記述しやすいため、ニューラルネットワークモデルの中で様々な用途で使用される。LSTMs派生モデルでは赤丸だけでなく黄色四角(活性化関数)などで登場する。

様々な Long Short Term Memory


個々まで説明してきたものは、極めて一般的な LSTM です。しかし、すべての LSTM が上記のとおりであるとは限りません。実際には、たいていは論文ごとに僅かに異なるバージョンの LSTMs を使っているようにみえます。違いは少しですが、一部言及しておく勝ちがあります。

Gers および Schmidhuber が紹介した、一つのポピュラーな LSTM バージョンは、「覗き穴接続(peephole connections)」を加えています。これは、ゲートレイヤにセル状態を確認させることを意味しています。



上図では、すべてのゲートにのぞき穴を追加していますが、多くの論文ではいくつかに覗き穴をその他には覗き穴なしにしています。

別のバージョンでは忘却ゲートとインプットゲートの組を使っています。何を忘れるか、何を新しい情報として追加するかを別々に決定する代わりに、それらを一緒に行います。いつその場所でなにかをインプットするかを忘れるだけです。何か古い情報を忘れたときに新たな値をインプットするだけです。



LSTM の僅かに劇的なバージョンが、Choほか によって紹介された、Gated Recurrent Unit(GRU)です。忘却ゲートとインプットゲートを組み合わせて、ひとつの「更新ゲート(update gate)」にします。セル状態(cell state)と隠れ状態(hidden state)も併合し、なにかほかの変更をくわえます。結果としてのモデルは標準の LSTM に似ており、ポピュラになりつつあります。



これらはもっとも注目を集めている LSTM バリエーションのほんの少しです。Yaoほか による Depth Gated RNNs のような他のものはたくさん存在します。 Koutnikほか による Clockwork RNNsのような、tracking long-term dependencies へのいくつかの完全に異なるアプローチも存在します。

どれがベストなのでしょうか?違いは重要ですか? Greffほか は、ポピュラーなバリエーションの素晴らしい比較を実行しており、それら全てが同じであることがわかります。 Jozefowiczほか は10,000以上のRNNアーキテクチャをテストしました、そしてあるタスクにおいていくつかはLSTMsよりも良いことがわかっています。

おわりに


人々がRNNsを発展させ注目すべき結果を得たことを前述しました。これらは本質的にはすべてRNNsを使って発展させました。それらはほとんど大部分のタスクでたくさんのより良く働いています!

数式で書くと、LSTMsは極めて臆病にさせてくれます。望むなら、このエッセイのステップバイステップのウォークスルーが少しでも親しみやすくなることを願っています。

LSTMsは、RNNsで何かをなしとげるかのための大きな一歩になります。LSTMsに感嘆するのは自然です:ほかに大きな一歩となるものがありますか?研究者の間での一般的な意見は:「Yes!次のステップは存在します。それは Attention です!」アイディアとしては、 RNN の各ステップでいくつかの情報の集まりから参照する情報を取り出すというものです。たとえば、イメージを説明するキャプションを作成するためにRNNsを使う場合、出力するそれぞれの単語を確認するためにイメージの一部を取り出すかもしれません。実際に、 Xuほか ではたしかにこの方法を取っています-もしAttentionを調べてみたい場合は、興味を持つ出発点になるかもしれません!Attentionを使った本当に刺激的なたくさんの結果があります。そして、その隅々にはもっと多くのものがあるように思えます。

AttentionはRNN研究だけのの刺激的なスレッドではありません。たとえば、 Kalchbrennerほか による Grid LSTMs はとても有望です。生成モデルでRNNsを使った研究 - Gregorほか 、 Chungほか 、や BayerおよびOsendorfer - もまたとても興味深く見えます。ここ最近の数年は Recurrent Neural Networks にとって刺激的な時間となっており、今後もよりそうなることでしょう!

謝辞


LSTMsの理解を助けてくれた方、視覚化についてコメントしていただけた方、この記事にフィードバックを頂いた方など多くの方々に感謝いたします。

助けになるフィードバックをもらったGoogle社の私の同僚、特に Oriol Vinyals 、 Greg Corrado 、 Jon Shlens 、 Luke Vilnis 、そして Ilya Sutskever には大変感謝しております。また私を助けるために時間を取ってくれた他の沢山の友人や同僚にも感謝いたします。特に私の図にとても思慮深い対応をしてくれた Kyunghyun Cho に感謝いたします。

投稿前に、私がニューラルネットワークを教えた2つのセミナーシリーズの間に練習しました。忍耐深く参加してくれた皆さん、フィードバックを頂いた皆さん、ありがとうございました。

以上
----------

RNNのRがリカーシブなので、まあくりかえすのだろうというのはわかったが、それで可変長の自然文などのインプットやアウトプットに対応させようとしているわけか..

機械学習というかニューラルネットワークには比較的単純な関数σとかtanhとかReLUとか..あとは行列の積や和とかなのだけど、それが行列や、リカーシブだと順番(時間)が出てくるので異様にわかりにくくなる..


ただ方程式アレルギーはニホンジンだけでなく、海外にも居るんだなということはわかった
結局はシグマやら偏微分記号やらが一般のプログラマから避けられる温床になっているのね..



 

TensorFlow Serving 1.0 リリースのブログ記事を翻訳してみた

今朝、Twitterをみると、こんな記事がながれてきた。 With #TensorFlow Serving 1.0 you can apt-get install tensorflow-model-server Learn more here: https://...