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とか..あとは行列の積や和とかなのだけど、それが行列や、リカーシブだと順番(時間)が出てくるので異様にわかりにくくなる..


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



 

2016年9月27日火曜日

TensorFlowサイトのチュートリアル「Sequence-to-Sequence Models」を翻訳してみた

TensorFlowもいれたので、そろそろ応用してみたいなあ..
とおもい
TensorFlowサイトのチュートリアルにある

Sequence-to-Sequence Models
https://www.tensorflow.org/versions/r0.10/tutorials/seq2seq/index.html

を翻訳してみた。

拙い英語力なので参照される場合は、At your own risk でお願いします。

-----

Sequence-to-Sequence モデル


既に RNNチュートリアル (もし迄読んでいない場合は、このチュートリアルを始める前にこちらへ進んでください)で論じられているように、言語のモデル化を学習することができます。ここには興味深い問題があがっています:いくらかのインプットを条件にして、意味のあるレスポンスを生成することができますか?たとえば、ニューラルネットワークを英語からフランス語への翻訳を訓練することができますか?答えはyesであることがわかります。


このチュートリアルでは、いかにしてそのようなシステムをエンドtoエンドでビルドおよび訓練するかについて紹介します。TensorFlow git リポジトリにクローンのルートにあるpipパッケージを通じて既にインストールされている前提とします。

翻訳プログラムは次のコマンドで開始できます:

cd tensorflow/models/rnn/translate
python translate.py --data_dir [データディレクトリパス]
訓練の準備および訓練のために WMT'15ウェブサイト から英語-フランス語翻訳データをダウンロードします。ディスク容量約20GBが必要となりますので、ダウンロードして準備します(詳細は 後述 )。このチュートリアルを読んでいる間、開始することができます。

このチュートリアルのリファレンスはmodels/rnnにあります。

ファイル内容
seq2seq.pysequence-to-sequence モデルを構築するためのライブラリ
translate/seq2seq_model.pyニューラル翻訳 sequence-to-sequence モデル
translate/data_utils.py翻訳データ準備のためのヘルパー関数
translate/translate.py翻訳モデルの訓練および実行用バイナリ


訳者注:上記ファイルは、tensorflowをインストールした環境には入っています。Dockerコンテナを使っている場合は/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/にあります。

Sequence-to-Sequence の基礎

Cho氏が2014年に寄稿した論文PDF )に記載されている、基本的なsequence-to-sequenceモデルは、インプットデータを処理するエンコーダとアウトプットを生成するデコーダの2つのRNNで構成されています。基礎的なアーキテクチャは次の図の通りです。



上図の四角はRNNセルを表しています。またこれらの四角は、最も一般的にはGPUセルもしくはLSTMセル(説明は RNNチュートリアル を参照のこと)を表しています。エンコーダおよびデコーダは重みを共有するかもしくは、より一般的には、異なるパラメータセットを使用します。多層セルが sequence-to-sequence モデルにおいてもうまく使われています。例: 翻訳向け Sutskeverほか 2014年 ( PDF )

ここで表されている基本的なモデルにおいて、あらゆるインプットは、デコーダに引き継がれる唯一のものである、固定サイズのベクトルにエンコード されなければなりません。インプットへの直接アクセスをデコーダに与えるために、注意メカニズム(attention mechanism)は、 Bahdanauほか、2014 ( PDF )にて導入されました。注意メカニズム(attention mechanism)の詳細については記述しませんが(論文を参照のこと)、デコーダに対しあらゆるデコーデング手順におけるインプットを覗くことを許す ために、詳細について十分理解しておいてください。LTSMセルや注意メカニズム(attention mechanism)による多層 sequence-to-sequence ネットワークは、次の図のように表すことができます。


TensorFlow seq2seq ライブラリ


上図において、多数の異なる sequence-to-sequence モデルで構成されています。各モデルはそれぞれ異なるRNNのセルで構成されていますが、それら全てエンコーダインプットとデコーダインプットを受け取り ます。これはTensorFlow seq2seqライブラリ( models/rnn/seq2seq.py )のインターフェイスに動機づけします。基本的な RNN encoder-decoder sequence-to-sequence モデルは、次のようにして動かします。

outputs, states = basic_rnn_seq2seq(encoder_inputs, decoder_inputs, cell)
 
上記の呼び出しにおいて、 encoder_input は、エンコーダへのインプット(最初に登場した絵の ABC )をあらわすtensorflowのリストです。同様に、 decoder_input は、エンコーダへのインプット(最初に登場した絵の WXYZ )をあらわすテンソルです。
セル引数は、どのセルがモデル内部で使用されるかを示す models.rnn.rnn_cell.RNNCell クラスのインスタンスです。 GRUCellLSTMCell のような既存のセルもしくは独自に記述したものを使用することができます。さらに、 rnn_cell は多層セルの構築や、セルインプットもしくはアウトプットへのドロップアウト、もしくはその他の翻訳実行のためのラッパーを提供します。例は RNN チュートリアル を参照してください。

basic_rnn_seq2seq へのセルは二つの変数( outputsstates )を返します。両方の変数は decode_inputs と同じ長さのテンソルのリストです。当然のことながら、 outputs は、タイムステップごとのデコーダのアウトプットと一致します。そして、 outputs は、最初の絵の WXYZEOS と一致します。返却値 states は、それぞれのタイムステップにおけるデコーダの内部の状態をあらわします。
たくさんのsequence-to-sequence モデルのアプリケーションでは、時刻 tのデコーダのアウトプットは、フィードバックされ時刻 t+1 のデコーダのインプットとなります。テストの際にsequenceをデコーディングする場合、これはシーケンス構築方法となります。訓練中、他方では、た とえデコーダが前に間違えていたとしても、タイムステップごとに正しいインプットをデコーダへ提供することは一般的です。 seq2seq.py 内の関数は両方のモデルでの変数 feed_previous 使用をサポートしています。例として、次のような埋め込みRNNモデルの使用で分析してみましょう。

outputs, states = embedding_rnn_seq2seq(
    encoder_inputs, decoder_inputs, cell,
    num_encoder_symbols, num_decoder_symbols,
    output_projection=None, feed_previous=False)
embedding_rnn_seq2seq モデルにおいて、全てのインプット( encoder_inputs と 
decoder_inputs の両方 )は離散値をあらわす整数テンソルです。それらには密度表現が
埋め込まれています(埋め込みについての詳細は ベクトル表現チュートリアル を参照
のこと)が、これらの埋め込みを構築するために別々のシンボルの最大値、エンコーダ
側の num_encoder_symbols とデコーダ側の num_decoder_symbols を指定する必要があり
ます。

 
上記の起動により、 feed_previousFalse がセットされます。これは、デコーダが decoder_inputs テンソルが提供されてるものとして使用することを意味しています。もし feed_previousTrue がセットされているのであれば、デコーダは decoder_inputs の最初の要素のみ使用します。このリストのその他のテンソルはすべて無視され、前のエンコーダのアウトプットをかわりに使用します。これは翻訳モデルの翻訳デコーディングのために使用されますが、訓練中にも使用され、自身の間違いにより強力な Bengioほか,2015年 ( PDF )に類似したモデルを構築します。

上のリストで使用されているもう一つの重要な変数は、 output_projection です。もしこれが指定されていない場合は、埋め込みモデルのアウトプットは、生成されたシンボルごとの ロジット を表すので、 num_decoder_symbols によるバッチサイズ型をしたテンソルとなります。長いアウトプット語彙を使ったモデルの訓練時(たとえば num_decoder_symbols が長い場合)、これらの長いテンソルとしては実用的ではありません。その代わりよいこととして、より小さなアウトプットテンソルを返します。そして後で output_projection を使った長いアウトプットテンソルへ反映されます。これは、 Jeanほか 2014年 ( PDF )にて説明されている、sampled softmax 損失を seq2seq モデルにて使用することを許可します。

basic_rnn_seq2seq embedding_rnn_seq2seqに加えて、 seq2seq.py 内にはいくつかの sequence-to-sequence モデルが存在しますので、確認してみてください。それらは類似したインタフェースを持っているので、ここでは詳細を説明しません。ここでは翻訳モデルとして、 embedding_attention_seq2seq を、以下のように使います。


ニューラル翻訳モデル

sequence-to-sequence モデルのコアは models/rnn/seq2seq.py 内の関数によって構築され
ており、そこには models/rnn/translate/seq2seq_model.py 内の翻訳モデルが使用される
ことに言及する価値があるいくつかのトリックがまだ存在します。
 

sampled softmax と output projection


ひとつめ(samples softmax)は既に説明していますが、ここではsampled 
softmaxを長いアウトプット語彙を操作するために使用したいと考えています。
デコードするためには、output projection の結果を追う必要があります。
sampled softmax 損失 と output projection 両方とも、 seq2seq_model.py 内の
以下のコードによって構築されます。

 if num_samples > 0 and num_samples < self.target_vocab_size:
    w = tf.get_variable("proj_w", [size, self.target_vocab_size])
    w_t = tf.transpose(w)
    b = tf.get_variable("proj_b", [self.target_vocab_size])
    output_projection = (w, b)

    def sampled_loss(inputs, labels):
      labels = tf.reshape(labels, [-1, 1])
      return tf.nn.sampled_softmax_loss(w_t, b, inputs, labels, num_samples,
                                        self.target_vocab_size)
 
はじめに、もしサンプル数(デフォルトは512)がターゲット語彙サイズより小さいのであれば、sample softmax のみ構築します。語彙が512より小さい場合、標準softmax損失を使うことは良いアイディアであるかもしれません。
次に、output projection を構築します。それは重み行列とバイアスベクトルから構成されるペアです。使用する場合、rnn セルは target_vocab_size によるバッチサイズよりももしろ、sizeによるバッチサイズ型のベクトルを返却します。ロジットを回復するために、重み行列を掛け、バイアスを加える必要があります。そしてこれらは、seq2seq_model.py の124~126行目で実行されます。
 
if output_projection is not None:
  self.outputs[b] = [tf.matmul(output, output_projection[0]) +
                     output_projection[1] for ...]
 

バケッティングとパディング(埋め込み)

 
sampled softmax に加えて、翻訳モデルもまたバケッティングを利用しています。バケッティングは、異なる長さの文を効果的に操作するための手法のひとつです。まず最初に問 題をはっきりさせましょう。英語からフランス語へ翻訳する場合、インプット上の異なる長さ L1 の英文と、アウトプット上の異なる長さ L2 のフランス語文を持っています。英文は encoder_inputs に渡されると、フランス語文が decoder_inputs (GOシンボルが先頭文字につく)としてかえってきます。

こ のため原則英文とフランス語文の長さの各ペア( L1, L2 + 1)のための seq2seq モデルを作成しなくてはなりません。結果としてこれは類似する大量のサブグラフを含む巨大なグラフとなります。他方では、ちょうどそれぞれの文に特別な PADシンボルをつめることができます。そうすれば我々は、詰められた長さの、seq2seq モデルを1つだけ必要するだけです。ただし短文では、役に立たないたくさんのPADシンボルをデコードするため、能率が悪くなります。

それぞれの長さのペアのためのグラフ構築と単一の長さに詰めることの妥協策として、大量のバケットを使って各文をバケットの長さに詰めます。 translate.py 内の以下の箇所でデフォルトのバケットを使っています。

buckets = [(5, 10), (10, 15), (20, 25), (40, 50)]
これは、3トークンの英文でこのアウトプットが6トークンのフランス語文であったとすると、最初のバケットに格納して、エンコーダインプットのため に長さ5になるまで、デコーダインプットのために長さ10になるまで詰めることを意味しています。もし英文が8トークンでフランス語文が18トークンとな る場合、例えば英文を20まで、フランス文を25までつめるとするなら、(10, 15) のバケットには適合せず、(20, 25)のバケットが使用されます。

デコーダインプットを作成する際にインプットデータにGOシンボルを前につめることを思い出してください。これは seq2seq_model.py内の get_batch() 関数で処理されます、そしてこの関数でインプット英文もまた反転します。インプットの反転は、 Sutskeverほか、2014年 ( PDF )のニューラル翻訳モデルにおけいて結果が改善されることが示されました。これは一旦置いて、ここでは"I go."という文で想像します。トークン化して[ "I", "go", "." ] をインプットとし、アウトプットの文"Je vais."をトークン化すると [ "Je", "vais", "." ] となります。これを (5, 10) のバケットに格納し、インプットは [ PAD PAD "." "go", "I" ] となり、デコーダインプットは [ GO "Je" "vais" "." EOS PAD PAD PAD PAD PAD ]となります。
 
 

動かしてみよう


これまで説明していたモデルを訓練するために、長い英語-フランス語コーパスが必要に
なります。 WMT15 Website から 10^9-Fench-English コーパスを訓練のために使い、
同じサイトから 2013 new test を開発セットとして使います。以下のコマンドを実行する
と、両方のデータセットは data_dirにダウンロードされ、訓練が始まり、チェックポイント
train_dir に保存されます。

python translate.py
  --data_dir [your_data_directory] --train_dir [checkpoints_directory]
  --en_vocab_size=40000 --fr_vocab_size=40000
約18GBの空き容量を消費し、訓練コーパス準備に数時間かかります。解凍され、語彙ファイルが data_dir 内に作成され、そしてコーパスがトークン化され整数idに変換されます。語彙サイズを定義するパラメータに注意してください。上の実行例では、40Kの最も一般的な用語を除く単語はすべて未知の単語を意味する UNK トークンに変換されます。そして、もし語彙サイズを変更したいのであれば、バイナリは再度コーパスをid型にリマップします。

データが準備できたら、訓練が始まります。翻訳のデフォルトパラメータは極めて長い値がセットされています。長いモデルが良い結果を与えるまで長 い時間かかります。長くかかりすぎるか、もしくはGPUを使ってとても多くのメモリを消費するかになります。以下の例では、小さなモデルを訓練することを 指示できます。

python translate.py
  --data_dir [your_data_directory] --train_dir [checkpoints_directory]
  --size=256 --num_layers=2 --steps_per_checkpoint=50
 
上記コマンドは、各レイヤが256個のユニット(デフォルトは1024個)の2層のモデル(デフォルトは3層)を訓練し、そして50ステップ(デ フォルトは200ステップ)ごとにチェックポイントとしてセーブします。あなたのGPUのメモリがどのくらいの大きさのモデルが適合することができるかを 発見するためにこれらのパラメータを操作することができます。

訓練中、それぞれの steps_per_checkpoints ステップでこれまでのステップの統計結果を表示します。デフォルトパラメータ(サイズが1024で3層)で、最初のメッセージはこのように表示されます。

global step 200 learning rate 0.5000 step-time 1.39 perplexity 1720.62
  eval: bucket 0 perplexity 184.97
  eval: bucket 1 perplexity 248.81
  eval: bucket 2 perplexity 341.64
  eval: bucket 3 perplexity 469.04
global step 400 learning rate 0.5000 step-time 1.38 perplexity 379.89
  eval: bucket 0 perplexity 151.32
  eval: bucket 1 perplexity 190.36
  eval: bucket 2 perplexity 227.46
  eval: bucket 3 perplexity 238.66
 
各ステップが1.4秒未満で、それぞれのバケットに訓練セットの予測性能と開発セットの
予測性能を確認することができます。30Kステップ後、短文(バケット0と1)の予測性能が
一桁になっていることが確認できます。訓練コーパスが~22Mの文を含んでおり、
1 epoch(訓練データを1回通す)は64バッチサイズで約340Kステップかかっています。
この時点で、モデルが--decodeオプションで英語をフランス語に翻訳されていることが
わかります。


python translate.py --decode --data_dir [your_data_directory] --train_dir [checkpoints_directory] Reading model parameters from /tmp/translate.ckpt-340000 > Who is the president of the United States? Qui est le président des États-Unis ?
 
 

次は何?

 
ここまでで、どうやって独自のEnglish-to-French翻訳機を隅から隅まで構築するかを紹介しました。実行してどのようにモデルが振る 舞うのかを自分自身で確認しました。合理的な品質をもつほど、デフォルトパラメータではベストな翻訳モデルを提供しませんでした。ここにあたなが改善する ことがのこっています。

まず第一に、とても原始的なトークナイザである data_utils 内の basic_tokenizer を使いました。より良いトークナイザは、 WMT'15 ウェブサイト で見つけることができました。そのトークナイザと多くの語彙を使って、翻訳を発展させるべきです。

また、翻訳モデルのデフォルトパラメータは未調整です。モデルの学習率、劣化、もしくは重みの初期値うぃ異なった方法で変更してみることが可能です。また seq2seq_model.py内のデフォルト GradientDescentOptimizer を、 AdagradOptimizer のようなより先進的なものに変更することも可能です。これらを試して、結果の向上方法を確認してみましよう!

最後に、ここで紹介されたモデルを、翻訳のためでなくほかの sequnece-to-sequence 作業に使うことが可能です。たとえあなたがsequenceをtreeにかえたとしても、 Vinyals、Kaiserほか 2014年 ( PDF )にて試行されたように、分析木の生成において同じモデルが最新技術の結果をあたることができます。独自の翻訳機をビルドするだけでなく、構文解析、チャットボット、もしくはあなたが考えるどんなプログラムをビルドすることができます。実験してみてください!
-------- 


やっぱりサンプルは、最新の翻訳モデルではないのか..

基礎的なモデルだけチュートリアルやサンプルコードで紹介して、
Google翻訳につかっているモデルは..
 
..そりゃ、当然教えてはくれないわなあ..


ただ、日本語は単語間に隙間がないから、
このモデルをそのまま使うわけには行かないよな..

書籍「はじめてのディープラーニング」にかいてあった
バイドゥのBi-Directed RNNモデルか..


というか、RNNもきちっと理解してないしな..

RNN、調べるか..

2016年9月21日水曜日

書籍「初めてのディープラーニング」を読んでディープラーニングに関する基礎的な用語集をつくってみる

TensorFlowのドキュメントを読むにしても
ディープラーニングの基礎単語をそもそも理解していないと
どうにもならない..

ということで日本語書籍の力を借りることにした。

買ったのはこれ。



何故この本をえらんだのかというと、

数式が可能な限り書いていない初心者本

ということ。

ディープラーニングの定義はほんの中盤くらいまででてこないが、順番建てて説明してくれていてよくわかった。

以下、上記書籍から引用して用語集を作ってみた。



機械学習訓練データを学習器に投入して学習モデルを作成し、その学習モデルを利用して処理を行う仕組み
学習器データから規則性やパターンを抽出する仕組み
訓練データ規則性やパターンを見つけ出すためのもとになるデータ
学習モデル学習器が訓練データから抽出した規則性やパターン
学習処理訓練データの投入から学習モデル作成までの一連のコンピュータ処理
教師あり機械学習訓練データに教師データがあること、入力データと教師データを組みにして学習器へ投入し機械学習を行う
教師なし機械学習訓練データに教師データがないこと。精度は学習器の設計にかかっている
教師データ入力データがどのような種類であるかを示す正解データのこと
回帰データを入力すると、出力として数値を返す。機械学習における代表的な用途のひとつ
分類データを入力すると、出力としてそのデータの属性または種類を返す手法。機械学習における代表的な用途のひとつ
クラスタリングデータを入力すると、そのデータのグルーピング結果を返す手法。機械学習における代表的な用途のひとつ
ニューラルネットワーク生物の脳の神経ネットワークをモデルとしたコンピュータ処理の仕組み。ニューラルネットワークには入力層、隠れ層、出力層と呼ばれる層がある。隠れ層は複数となることもある
ノードニューラルネットワークの各層はノードを持ち、各ノードは値を持つ。人体におけるニューロンに相当する
エッジある層と次の層の間のノードを結ぶ。人体における神経細胞の樹状突起・軸索に相当する
重み各エッジは重みと呼ばれる数値を持つ
活性化関数各層は活性化関数と呼ばれる関数を持つ。あるノードの値は、そのノードとエッジで接続されている前の層のノードの値にもとづいて計算する。人体におけるシナプスに相当する。htan、シグモイド、ReLUが主に使用される
ReLU関数0より小さい値では勾配が0になる関数
weakly ReLU0より小さい値では勾配が0に近い値になる関数
確率ベクトルベクトル(v1, v2,..,vn)の各値が0から1.0の間の数値であり、合計すると1となるようなベクトル
CNNConvolution Neural Networkの略。ニューラルネットワークのノードのつながり方パターンのひとつ。隠れ層として1つ以上の畳み込み層とプーリング層で構成される
畳み込み層前の層の中で近くにあるノード同士の集合が、次の層のノードと接続するような構造を持つ層。局所的な部分の特徴を浮き立たせる役割をはたす
プーリング層前の層のノードの局所的な部分をまとめあげる処理をになう。まとめ上げる処理方法の一つとして最大値をとる場合、最大プーリングと呼ばれる。画像分析に使用する場合、位置変更への感度をさげる役割をはたす。前の層の中で近くにあるノード同士の集合が、次の層のノードと接続するような構造を持つという点は畳み込み層と同じ
AutoEncoder入力層と出力層が同一サイズのノードを持つニューラルネットワークを利用したアルゴリズムのこと。一般的に隠れ層は、入力層や出力層よりも小さいサイズにする。一般的に学習に使用される
Stacked AutoEncoder隠れ層が2層以上あるAutoEncoder
RNNRecurrent Neural Network(回帰結合ニューラルネットワーク)とRecursive Neural Network(再帰ニューラルネットワーク)のいずれもRNNと略される。再帰ニューラルネットワークは隠れ層において再帰的なノード接続があるニューラルネットワーク。このため可変長データをあつかうことができる。回帰結合ニューラルネットワークは回帰結合入力を持つネットワークで、系列データのモデル化に有効
GPUGraphical Processor Unit。描画計算を専用に行うためのハードウェア。CPUよりも10倍以上高速な浮動小数点演算能力を持つ。単純で並列性の高い処理に強い
GPGPU一般の計算にもGPUを利用すること
CUDANVIDIA社が提供するGPGPU開発のためのフレームワーク
隠れマルコフモデルディープラーニングが流行するまで音声認識で使用されていた機械学習アルゴリズムの一つ
Bi-Direction Recurrent Newral Networkバイドゥ社が音声認識で採用しているRNN拡張。手前の層だけでなく直後の層からも入力されるネットワーク構造を持つ。双方向から入力があるためBi-がつく
LeCun画像認識(MNIST)におけるCNN活用モデルのひとつ。層数8、総ノード数9118
SuperVison画像認識(ILSVRC2012)におけるCNN活用モデルのひとつ。LeCunより後に登場。隠れ層が上下2つにわかれており、それぞれの隠れ層ごとにGPUを割り当てる。層数13、総ノード数831304
GoogLeNet画像認識(ILSVRC2012)におけるCNN活用モデルのひとつ。ILSVRC2015優勝。層数22
ノイズ除去画像の中の雑音部分(ノイズ)を取り除く処理
インペインティング処理画像の中から不要な部分を除去する処理。取り除いた後どう自然に埋めるかが課題
超解像処理解像度の低い画像から解像度の高い画像を作成する処理。スパースコーディングという方法を用いることが多い
輝度値きどち。各ピクセルの明るさを0から255の整数で表した値
RGB値各ピクセルの色について、赤・緑・青の割合をそれぞれ0から255の整数で表した値
画像特徴点隣り合う画素同士の間で、輝度値の差が大きい箇所を指す
画像特徴量画像特異点をベクトル値で表した値
Bag-of-featureディープラーニングを用いた画像認識手法が登場する以前に使われていた手法。同じ種類の物体が映っている画像同士は、似たような部分をたくさん持っているという考え方を元にしている。
Visual Word特徴を表す画像により作成されたグループの中の代表となるひとつの画像
正規化長さの値が1になるようにすること
ディープラーニング画像認識処理につよいニューラルネットワークを用いた手法。Bag-of-featureでは特徴量抽出の方法として、画像特徴量を利用するという約束を人が決めていたが、ディープラーニングでは自動で決めている。テストデータが少ないと姓のが出ないこと、識別結果のチューニングがむずかしいという欠点がある
バイアスノードディープラーニングにおけるニューラルネットワークの入力層および隠れ層はバイアスノードという特別なノードを持つ
全結合層ディープラーニングにおけるニューラルネットワークで利用される層のひとつ。前のノードと自分のノードが、すべてエッジで結ばれている(ただし自分のバイアスノードは除く)。隠れ層の後半や出力層に利用される
勾配法数値計算で関数の最小値を算出するときによく利用される方法の一つ。「ある値の勾配をもとめその勾配の方向に動かす」を繰り返す
学習量勾配法における「ある値の勾配をもとめその勾配の方向に動かす」際の動かす値を学習率という
確率的勾配法訓練データからひとつづつ適当に選んで更新処理を行う方法
ミニバッチ法訓練データから少数のデータを適当に選んで更新処理を行う方法
バッチ法すべてのデータを利用して更新処理を行う方法
順伝播ニューラルネットワークを用いて計算を行うときには、入力層から順番に隠れそうのノードの値が決まり、最後に出力層の値がきまる。この順番で計算されることを順伝播という
逆伝播順伝播の逆で、出力層から最後の隠れ層、その前の隠れ層..と逆に進み最後に入力層のノードの値が決まることをいう
誤差逆伝播法正しい値と評価結果の誤差を逆伝播することを誤差逆伝播法という。逆誤差電波法により、ニューラルネットワークの学習に勾配法を使うことができるようになる
Dropoutある更新で層の中のノードのうちいくつかを無効にして学習を行い、次の更新では別のノードを無効にして学習を行うことを繰り返す
Drop Connectエッジをランダムに無効化するDropout
Adaptive Dropoutランダムにノードを無効化するのではなく、適応的に無効化を行うDropout

よし、これで整理できたな..

2016年9月16日金曜日

Azure Machine Learning Studio 環境上でTensorFlowが動くか試してみた、が..だめだった..

#本記事には、一部翻訳がのっていますが
#つたない英語力で日本語化しているので
#参照される方は at your own risk でお願いします。

Azure Machine Learning Studioでは(Rや)Pythonが使えるとのこと。
実際にExecute Python Scriptというノードが有り、これを使うとAnaconda環境を使うことができるらしい。
ノードプロパティには、Anaconda2.7/Pythoin2.7.7Anaconda4.0/Python2.7.11Anaconda4.0/Python3.5のいずれかが動作するらしい。

プロパティ内には、以下のPythonスクリプトが編集可能な状態になっていた。


# The script MUST contain a function named azureml_main
# which is the entry point for this module.
# スクリプトには、このモジュールのエントリポイントになっている
# 関数うazureml_main()を必ず含めておかなくてはならない。

# imports up here can be used to
# インポートする場合はココに書けます

import pandas as pd

# The entry point function can contain up to two input arguments:
#   Param: a pandas.DataFrame
#   Param: a pandas.DataFrame
# エントリポイント関数は最大で2つの引数を指定できる:
#   Param: pandas.DataFrame値
#   Param: pandas.DataFrame値
def azureml_main(dataframe1 = None, dataframe2 = None):

    # Execution logic goes here
    # ココからロジックが実行される
    print('Input pandas.DataFrame #1:\r\n\r\n{0}'.format(dataframe1))

    # If a zip file is connected to the third input port is connected,
    # it is unzipped under ".\Script Bundle". This directory is added
    # to sys.path. Therefore, if your zip file contains a Python file
    # mymodule.py you can import it using:
    # import mymodule
    # もしZipファイルを3番めの入力ポートに接続した場合、
    # ".\Script Bundle"フォルダ下に解凍される。このフォルダは
    # sys.pathに追加される。このため、もしZipファイルにPython
    # ファイル mymodule.pyが含まれていたなら、それをimportに使用する
    # ことができます。


    # Return value must be of a sequence of pandas.DataFrame
    # pandafs.DataFrameシーケンスを必ず返却すること
    return dataframe1,

これつかえば、TensorFlowで書いたコードをかんたんにWebサービス化できるんちゃうの?

で、import tensorflow as tfazureml_main()の中に簡単なTensorFlowコードを入力してみた。


..が、動かなかった。

その時出たエラーは以下の通り。

Error 0085: The following error occurred during script evaluation, please view the output log for more information:
---------- Start of error message from Python interpreter ----------
Caught exception while executing function: Traceback (most recent call last):
  File "C:\server\invokepy.py", line 189, in batch
    mod = import_module(moduleName)
  File "C:\pyhome\lib\importlib\__init__.py", line 37, in import_module
    __import__(name)
  File "C:\temp\2aaf8e0ab30244b2880f412042c39f62.py", line 20, in
    import tensorflow as tf
ImportError: No module named tensorflow
Process returned with non-zero exit code 1

---------- End of error message from Python  interpreter  ----------
Start time: UTC 09/16/2016 05:06:38
End time: UTC 09/16/2016 05:06:57

そもそもTensorFlowがAnaconda上にインストールされていない。

自由にpip/condaできればいいのだけど、Studioからはいまのところ操作できないようだ。
そうか、プロパティでPythonバージョン指定のところがcondaコマンド代替なんだ..
 condaする前にTensorFlowをpipしてほしいのだけど..

Azureのヘルプを調べると、フォーラムに以下の質問がのっていた。



Tensorflow in AzureML

Question

I've seen a  blog post that says tensorflow can be used using docker in Azure.

Is there any way to use tensorflow as a python package inside AzureML,so that finally I can use it to build model and call it using web service.

Tuesday, September 06, 2016 2:25 PM TanayC



質問

私は、Azure上のdockerを使ってTensorFlowがつかえるというブログ記事を読みました。
最終的に私はモデルをビルドしてWebサービスとして呼び出せるようにするために、AzureML内部でpythonパッケージとしてtensorflowを使う方法がありますか?
2016年9月6日(火) PM2:25 TanayC


良い質問だ..で答えは..


Answer

TensorFlow is not supported on Windows OS right now. Hence we can't run it in Azure ML yet.

Marked as answer by Hai NingMicrosoft employee, Moderator Wednesday, September 07, 2016 1:12 PM Hai Ning (MSFT,Partner)


回答

現時点では、TensorFlowはWindowsOS上ではサポートされていません。このため、Azure ML上ではTensorFlowは動作しません。
2016年9月7日(水) MS社員 Hai Ning(MSFT, パートナ)

スクリプトにZipファイルにのくだりのコメントがデフォルトのスクリプトにあるので、てっきりZipファイルをAzure Blob Storageとかに置いておけば使えるのかと思っていたのに..

ひょっとしたら質問のほうにかいてあったようなDockerコンテナを使った実装になっていないからじゃないからかな..

..がっかり..
 

2016年9月15日木曜日

書籍「さわってわかる機械学習 Azure Macine Learning 実践ガイド」を読む


Watson APIはREST APIさえ知ってれば、
機械学習の知識ゼロでも始められる
ド素人向け開発だ。
こんなのお客様に出したらすぐバレる。

とはいえ、イチからごりがきするTensorFlowは難しい..



ユーザであるお客様にも機械学習全く知りませんよってことがバレないで、
もっと薄くうすーく機械学習をなめ、
いかにもやった感じになるような開発はできないものか..

ということで見つけたのが
MicrosoftのAzure Machine Learning Studio。

Microsoft Azure Machine Learning Studio
https://studio.azureml.net/

Node-REDのようにWeb UIでフローを組み立てて
(TensorFlowのdockerコンテナで動くjupyterのように)手動実行の統合開発環境と、
さらに機械学習を使った REST APIをつくってしまおうという
夢のサービスだ。

Free版もあるのだが、登録には
メールアドレスと携帯電話によるショートメッセージ認証だけでなく
Azureサブスクリプションを要求される。

男気ある人は有料サブスクリプションをここで即購入できるが
私はもちろん無料枠のサブスクリプションを使った。

それでもクレジットカード情報を要求してくるのは
何故だろう..

この辺りの手順が怖いという超ビビリの方は表題の書籍のAppendixに一挙手一投足の手順が書かれているので、こちらで確認のこと。



つくったアカウントでサインインして、Studioにログインして、

Machine Learning のチュートリアル: Azure Machine Learning Studio で初めてのデータ サイエンス実験を作成する
https://azure.microsoft.com/ja-jp/documentation/articles/machine-learning-create-experiment/

に従ってチュートリアルを実行してみた。

ところどころノード(?)のありかがちがうのと
"Project Columns"というノードが現在のAzure ML Studioにはみあたらず
"Select Columns in Dataset"を代わりに使ったくらいで
すんなり終わる。

非常にわかりやすいし、関数名ではなくツリー上になったリストからノードを貼りつけてフローを組み立てるので視覚的にもわかりやすい。

これならゴリゴリの人工知能屋でなくても
お客様にいかにも人工知能知ってますよ的な顔して開発できそうだ..


アマゾンで検索すると以下の日本語書籍も出版されていたので
購入して読んでみた。





にしても、もう本が出てるとは..さすがマイクロソフト、商売上手だ..

 1章は概要なのでななめ読みで読み飛ばす。

2章は、TwitterAPIをVisual Studioで使ってデータを集めようというもの。
Visual Studio Community版は無料だからこの章の内容をやれるけど、
実はこの章の内容は他の章では使用しないので無視。

4~6章は、先ほど紹介したチュートリアルをぱくった^H^H オマージュした内容となっており、日本人向けにデータも日本語化して、ノードの個々の説明や使っているプロパティ、画面の説明をことこまかくおしえてくれるないようになっている。

一部の価格欄が空欄になっている自動車情報を、線形回帰の学習モデルをつかって予測価格情報をもとめ、その制度を上げるため線形回帰のパラメータをかえたりベイズ線形回帰にかえたりして精度を上げたり、学習済みモデルを保存してそれを使い回したりする流れだ。

7章は、Classificationの例で、個人情報の年収を2つの分類に分ける(機械学習ではないが)操作を学習する。

8章は、クラスタリングの例で、アイリス(あやめ)の分類をK-Mean法を使った機械学習で分類する。

ここまでの章は、一挙手一投足で書かれていて、Project ColumnsをSelect Columns in Datasetに読み替えることだけわかっていれば、ド素人でもできるようになっている。

のに、9章のWeb APIは前の章とのつながりもないし、一挙手一投足でなくなっている..

たぶん8章で力尽きたんだろうなあ..ということでそうぞうしながらやってみた。

まず5-3章で学習済みモデルを使ってCSV出力するExprerienseを編集してAPI化することとして、該当Experienseを三角ビーカアイコンを選択して選ぶ。

 次に、Data Transaction>Manipulation>Select Columns in Dataserをドラッグしてノード「クルマ情報予想したいデータ.csv」と「Score Model」の間にはさんで接続し、Lunch column selectorボタンを押す。

 BY NAMEを選択し「価格」以外のすべての項目をSELECTED COLUMNSへ移動し、vアイコンを押す。
 Runを実行する。
 Runが完了したら、ノード「Convert to CSV」下部のポートを右クリックして「Download」を選択。
ダウンロードしたファイルをExcelではなく、UTF-8を表示できるエディタで開き、 価格欄の代わりにScored Labelsに予測自動車価格(車価)がでていることを確認する。

ノード「Convert to CSV」を削除して代わりに Data Transaction>Manipulation>Select Columns in Dataserをドラッグしてノード「クルマ情報予想したいデータ.csv」と「Score Model」の間にはさんで接続する。
 Lunch column selectorボタンを押し、「Scored Labels」のみSELECTED COLUMNSに移動し、vマークを選択する。
 Web Service>Inputをドラッグして、ノード「Web service input」をノード「Select Columns in Dataset」の横に配置して、ノード「Score Model」の右上ポートと接続する。Web Service>Outputをドラッグして、一番下のノード「Select Columns in Dataset」の更に下に配置し接続する。
 この状態でRunする。Runが終わったら、DEPLOY WEB SERVICEを選択する。

REQUEST/RESPONSE行のTestボタンを押す。

 パラメータに予測したいクルマの情報を入力し、vマークを選択。
 結果が画面下の方にJSON形式で先頭だけ表示される。ので、DETAILSを選択。
 JSON形式データが全部見えていることを確認する。


..超簡単だ..

これはナンチャッテ機械学習アプリ量産できそうだなあ..

最後の10章やろうとしたら、Azure Blob Storageが必要になり、Azureサブスクリプションが結局必要になるのだけど、実は10章やるまでに無料版が切れてしまい、試すことができませんでした..

10章は、9章でやらなかったBATCH EXCUTIONのところだったのになあ..

でも、このためだけに従量課金サブスクリプションを契約するのも癪だ..

別のMicrosoftアカウントとったけど、無料サブスクリプションを有効化しようとするとエラーになる..
同じクレジットカードだと作れないのか、同じ携帯電話番号だとだめなのか..

ということでココで諦めてしまいました。



でも、機械学習いっちょかみのカッコけたがりには、Azure Machine Learning Studioはいいサービスだと思うなあ..

2016年9月9日金曜日

書籍「TensorFlowはじめました」を3章まで読んでみる

TensorFlowをインストールして、
TensorFlowのチュートリアルをとりあえずなんとか勉強したら、
本くらい読めるようになっているかな..ということで
TensorFlowの本を読んでみた。

読んでみた本は、これ。
注意:以降の記事内容は本を持っている前提で書いてます。持ってない人が読んでもちんぷんかんぷんに終わると思います。


正直、夏と冬に2回しか店を開かないトコで入手したかのような
表紙かつ薄さ..

実はインストールする前にこの本を買ったのだけど、
この本インストール手順すら書かれてない
いきなりチュートリアルが始まる体だし、

実行するコード全体を表示していないので、
サンプルコードのダウンロードページから落としてこないと
全部のコードを入手できない。

なんとかよめんたのは2章の終わりp45まで。
ここまでで1週間かかりました..

GPUなしマシンのCoreOS上で

docker run -it p 8888:8888 - 6006:6006 gcr.io/tensorflow/tensorflow

でJupyter(PythonのWeb UI開発環境)があがるのでポート8888を
ブラウザで開いて、1章は難なく読み切る。

ちなみに8月中旬ごろ上記コマンドで実行したTensorFlowは0.9版のほうだった。

ちなみにTensor Boardは、

docker exec -it <コンテナID> /bin/bash

して、

tensorboard --logdir=/notebooks/

してからポート6006をブラウザで開くと見ることができる。

この本、電子版は治ってるのかもしれないが、オプションのハイフンが1個だけになっているが、pythonコードの引数指定ではハイフンは2個必要だ。以降も同じ。

で、2章。CIFAR10データセットを使って画像分類するチュートリアル。

ホームディレクトリ/notebooksdataディレクトリを切り、ダウンロードしたファイルを置く。

data_batch_?.bin という形式のファイルだが、bmpやpng形式ではない。
そのためpythonプログラムを書いてpngに変換してみようというのが最初の部分。

そして、ホームディレクトリに、reader.pyconvert_cifar10_png.pyを本にある通りそのまま打ち込む。外部エディタで作る場合はUTF-8に変換しないとjupytoerに配置できない。

python convert_cifar10_png.py --file ./data/data_batch_1.bin

を実行すると、/notebooks/data/data_batch_1.bin-??-?.png というファイルが16個でてきた。開いてみると、猫や、自動車、商用車、馬など10種類のちいさな画像を分類していくというものらしい。
それをCNN(畳み込みニューラネットワーク)をTensorFlowで実装するというのが、この後の流れ。

model.pyも本に全コードがのっているので、写しとった(先頭の方にあるリンクからコードをダウンロードしたほうがてっとりばやい)。

本の解説からconv1conv2pool1pool2fc3fc4の6層からなるニューラルネットワークモデルであり、conv1conv2が畳み込み層、pool1pool2がプーリング層、fc3fc4が全結合層(Full-Connectedの略でfc)。

このファイルmodel.pyはネットワークモデルを実行する関数inferrence()が定義されているだけなので、これを呼び出して、Cifar10データセットを食らわせるinferrence.pyを作る必要がある。

ホームディレクトリ上から

scrppt inferrence.py && python inferrence.py && exit

を実行すると、正解ラベルと予測確率配列(分類0である確率、分類1である確率..分類9である確率)が1行毎に表示される。

ただこの段階だと、一切学習していないので、正解も何も、賽の目降ったほうが合ってるんじゃってくらいにひどい..

この本では、それを実際に学習させ、そのあと実行したら正答率がこれだけになりましたよってシナリオになっている。

学習用の計算モデルとTensorflowセッション実行するファイルがtrain.py。

同様にして実行してじりじり正解していく様子を確認する。

pythonコマンドで実行したら、プロセスの終わりにヒープが消えすっかり馬鹿になるが、そのあたりは3章でわかってくるようになっている。
正解と予測確率配列がずらずらでるだけだとわかりずらいので、関数eval()を作成し、正答率がでるようにtrain.pyを改良、できあがったものがtrain_with_eval.py

本では、結構学習できてるように書かれていたが、私の結果はこうなった。



..0.1って10種類だからランダムで選んだのと同じじゃん..

ただ、コードをいじらず2度めやってみたらもっといい正答率をだすようになった。このあたりの曖昧さが、 機械学習のマネタイズしにくいところだ..


で、2章はここまで。ここまでのPythonコードに、1行1行コメントを入れて、実際に何をやっているかを勉強しなおし、復習。で、よむと結構考えられて設計されているのよ。ただ後続の章を読まないと理解できない。変数空間をなぜ切っているのかとかは3章にいかないとわからない。なのでなんでまわりくどいことを..とおもうところはそのままにしてコードを読んだほうが良い。


ここまでは、実行したら消えていた。3章でデータ保存についてとフィルタ(weights)の可視化について書かれている。

3章先頭でtrain.pyを書き直しているが、これはやめてダウンロードページからtrain_with_eval.pyを落としてそのまま使用した。
次のvisualize_weights.pyがダウンロードページにないので、似たファイルvisualize_filter.pyをコピペして本に書いてあるとおりに書き直す。

フィルタというのは畳み込み層で使用した5×5の小窓(3チャネル(色))で、CIFAR10データを畳み込む場合ステップ1で合計64枚必要になる。

機械学習の学習はウェイトWとバイアスbの値を調整していく作業なので、このWの値がどう学習で変化していくかを可視化するために、3章ではfloatを0~255のuint8に変換して、ビットマップの色データにかえ、これをタイル上にしたビットマップを作るという視覚化のやりかたを教えてくれているのだ。

実際にやってみた結果を順番にならべgifアニメにしてみたのがこれ(ビットマップはgifアニメ変換時に勝手に拡大されている)。



こんなかんじに学習していってるのね..

と、ここまでのコードにコメントをつけてまる7日..

この薄い本、1ページ1ページが重い..

先は長いなあ..


それより、勉強を初めてずーっと気になっていること。

「なんでニューラルネットワークモデルを構築して学習させていくと、分類やら予測やらができるの?」

実はよくわかってないらしい..

コラム:注意事項
本章で実施する工夫については、筆者はその原理を理解しているわけではありません
TensorFlowのチュートリアルを見たり、先行して効果があるとされているモデルを参考にして実施しています。もし原理に興味がある人は、専門書などを参考にしてください。
また、畳込みニューラルネットワーク(CNN)を勉強していると「なぜうまく行くのかよくわかっていない」ということがあります。層の数や組み合わせや設定する値のベストプラクティス、なぜそれが高い効果をもたらすのか理論的な裏付けなどを皆で探しているのが現状のようです。

※書籍「TensorFlowはじめてみました」第4章p46より引用


..一部はわかっているものもあるのだろうけど、
結果としてうまく行っているから使ってしまおう
ってことのようです。

それって...

ディープラーニングって丸山ワクチン村井ワクチンとおんなじじゃないの?!

村井のクスリはよく効く


からって..

自動車や飛行機を運転させたり、


病気診断させたり、



自動投資につかったり、


いいのかね、倫理的に..

Google Colab相当の環境をローカルPC上のDocker Composeで実現する

 Docker Composeの有料版に、お金を払いたくない ^H^Hが使えない ため古いゲーミングPC(GeForce3080)にDocker Composeを入れてその上のコンテナでGoogle Colab相当のノート操作ができないかためしてみた: コンテナイメージとして a...