shuto_log.aep

自分がやったことなどを備忘録的な感じで残していこうと思います。

Tensorflow Playgroundを翻訳してみた

はじめに

本記事はNCC Advent Calendar 2016の7日目の記事で、Tensorflow Playgroundの日本語訳と補足になります。 playground.tensorflow.org

↑Tensorflow Playgroundはニューラルネットの学習の様子を可視化して見れるサイトで、初学者の理解の助けになります。

ちなみに、TensorflowとはGoogleが開発したオープンソース機械学習ライブラリです。C、C++Pythonなどで書けるそうです。

www.wikiwand.com

注意事項

私は機械学習を専攻しているわけではなく、研究で扱う必要があって勉強している一学生です。 最後に「個人的メモ」として自分の解釈(補足)を載せています。翻訳に関しては大きな問題はないかと思いますが、もし誤りなどあればコメントなどでご指摘お願いします。

また、機械学習?なにそれ美味しいの?と言う人は以前学内の勉強会で作成したこちらのスライドを読むと雰囲気が伝わるかもしれません。

www.slideshare.net

翻訳内容

ニューラルネットワークとは

ニューラルネットワークとは、人間の脳の働きを大雑把に真似た、データから学んでコンピュータプログラムを作り上げるテクニックです。まず、"ニューロン"という単位機能の集合体が定義され、それぞれが互いにメッセージをやり取りできるように結合されます。次に、その集合体(ネットワーク)に繰り返し問題を与え、解かせますが、その度に正解を導いた結合間の強さを強め、誤答を導いた結合間の強さを弱めます。より詳細なニューラルネットワークの導入はMichael NielsenのNeural Networks and Deep Learningを参考にすると良いでしょう。また、より詳細な技術的な概要は、Ian Goodfellow、Yoshua Bengio、Aaron CourvilleによるDeep Learningを見てください。

Playgroundの再利用について

自由に使えます。我々はニューラルネットワークの学習の簡易化に少しでも貢献出来ることを願って、PlaygroundをGitHubにてオープンソース化しています。そのため、Apache Licenseに従ってさえいればどんな方法でも無料で利用できます。また、もし追加や改善などの提案があれば、是非我々に連絡を下さい
Playgroundをカスタマイズできるいくつかの制御を以下に提供しています。表示・非表示を下記のチェックボックスで決めたら、このリンクを保存するか、ページを更新してください。 f:id:shutosg:20161206145802p:plain

可視化における色付けについて

オレンジと青はネットワークの可視化において、ほとんどの場合、それぞれ負値(オレンジ)と正値(青)を表します。
小さな丸で表される学習データ群は、初めにオレンジか青の色をしていて、それぞれは正負のどちらかに一致しています。
隠れ層において、各層間の線は重みによって色づけられています。青い線による結合は正の重みを表し、その結合はネットワークへの入力に対する出力に使われています。オレンジの結合は負の重みに相当します。
出力層において、各点は元の値に応じてオレンジか青に色付けされ、背景の色はネットワークによって導き出される結果を表します。色の濃さは結果の信頼度を表します。

使用ライブラリ

我々はこの学習用の可視化の需要に応える小さなニューラルネットワークライブラリを書きました。現実世界でのアプリケーションのためには、TensFlowライブラリを考えてみてください。

クレジット

本ソフトはDaniel SmilkovとShan Carterによって作られました。また、本ソフトはとりわけAndrej Karpathyによるconvnet.jsのデモ、Chris Olahによるニューラルネットワークについての記事など、過去に渡る多くの人々による努力の延長上にあります。そして、オリジナルのアイディアの助けとなったD. Sculley、多くのフィードバックと指導を頂いたFernanda Viégas、Martin Wattenberg、そしてその他のthe Big PictureGoogle Brain teamsにもこの場を借りて御礼申し上げます。

翻訳ここまで

個人的メモ(補足)

大前提の確認

このサイトでは、2次元の値(座標)を入力値として与えると1次元の値(オレンジなのか青なのか)を出力するニューラルネットワークを可視化している。各パーセプトロン間の線の色は各結合重みを表し、色は青色が正の値/重みを表し、オレンジは負の値/重みを表す。

ネットワーク(ニューラルネットワーク全体)の定義

 
入力値(2次元) 各点の座標(X1, X2)(ただし、-6 < X1,X2 < +6)
出力値(1次元) -1 or 0 or +1 = オレンジ or 白 or 青

学習について

教師データは、「座標とその点の色(オレンジ(-1) or 青(+1))」のセット。

  1. ネットワークに「座標(2次元)」を入力する。
  2. 出力された色と、教師データの色と比べる。
  3. 合っていたら各パーセプトロンの結合を強め(係数を増やす)、間違っていたら結合を弱める(係数を減らす)。
  4. 1〜3を繰り返す。

パーセプトロン(各層を構成する1ユニット)の定義

   
入力値(多次元) 前層の出力値 * 結合の重み = -1〜+1
出力値(1次元) -1 or 0 or +1

座標値を元に、出力(-1 or +1)が決まり、その出力に結合重み(-1〜+1)が乗算されて次の層へ渡される。また、各パーセプトロンの平面は、「ネットワークへの入力(2次元値)に対するそのパーセプトロンの出力(1次元値)」を表してる。

入力層

このサイトでは7種類の入力値が用意されている。この値は本来floatなど(機械学習フレームワークなどによって当然変わる)で入力する任意の数値である。例えば手書きの数字(0〜9)が書かれた32px四方の白黒画像を学習させたい時は、32x32=1024個の値を入れたりする。 これらの複数の入力値が次の層の入力の1つになる。

隠れ層

どのようなアルゴリズムで更新されているのかは分からないが、更新ごとに修正を繰り返すことで最終的にそれぞれのパーセプトロンは今までの更新の流れでは最適な解(?)に収束する。(ただしその収束結果が最適とは限らない?)

出力層

入力値に対する最終的な出力値。平面が色ごとに領域分けされており、平面のとある点(座標)を入力とすると、その点の背景色が出力値を表してる。