« エンコーダ回路 | トップページ | LLVM »

2017年3月26日 (日)

Pythonと深層学習と

まったくもって今更ですが、世の中の流行から無視できなくなってきた深層学習を少し勉強して見ようと環境構築中です。

深層学習のおかげで、GPUはFP16の復活などこちらを意識したアーキテクチャの変化が起こりつつ、FPGAへの適用も各所で見かけるようになって来ました。Caffeなどのツール郡もいろいろと進化を遂げているようです。

実は、年初に体調を崩してしまい、人生初のプチ入院を経験したのですが、そのとき読んでいた本が

  ・深層学習-Deep-Learning-監修-人工知能学会

なのですが、恥ずかしながらさっぱり理解が追いつかず、ちゃんと基礎からやっておきたいなと。

やはり自分でプログラム書きながら理解を進める必要がありそうです。

で、郷に入れば郷に従え、ということで、素直にこの分野で一番使われている Python の勉強から始めてみました。
なるべく中身を解説してくれているサイトを探して、目標はとりあえず下記を理解することに。

http://qiita.com/kiminaka/items/9ae195739093277490fe

で、始めて早速嵌りました、Pythonでの環境作成に(笑)。

Pythonはプログラミング入門にも適しているので、その手の入門書も多いのですが、既にC++とかJavaとかの、オブジェクト指向プログラミングは知っていて、MATLABとかOpenCVとかそれ系のライブラリも使い慣れていて、とりあえず Python + Numpy で似たようなことがしたい、と言うだけだと、割と「環境づくり」が一番の罠だったように思います。

Python一日目でWindows な私としては、 easy_install とか pip とか wheel とか、その辺で「何それ???」状態で、どんどん時間を削られていってしまい、「いつになったらプログラミングはじめらるんだぁ~」となってしまうわけです(苦笑)。

  で、結論から言うととりあえず Anaconda 入れとく、というのが素人がとりあえず使うだけなら一番楽そうですね(賛否ありそうな雰囲気ですが)。
  もっとも OpenCV とかもコンパイルできる状態にするまでの罠が多いですので、やっぱり環境つくりは大切ですね。

  Pythonのバージョンは 2系と3系で、少し大きな変化があるようですが、とりあえずは言語的に難しいことはしない予定なのと、print が制御文から関数に変わった程度を知っていれば何とかなりそうなので、あまり気にしないで最新バージョンの3を入れてしまいました。

   Anaconda で 一緒にインストールされる、SpyderなるIDE環境を使うなり、Jupyter notebook なりを使うのが環境的に楽なようです。

  で、次にPython の文法のお勉強。
  こちらのサイトさんが個人的にはコンパクトに良くまとまってました。
  http://tohoho-web.com/python/index.html

  シンプルでよくまとまった言語ですね。他のプログラミング言語に知識があれば、文法自体は短時間で概略つかめますね。

  で、早速、Webのサンプルを打ち込んでみるわけですが、Python界の常識をいろいろ知らないのでまたもや嵌るわけです。

  Webにあるサンプルコードを打ち込んでもエラーしかでない。 Numpy という、いわゆる MATLAB的なライブラリを使う場合

  import numpy as np

  のような定義をしておくのが暗黙の了解のようです(フムフム)。

  他にも

from sklearn import datasets, linear_model

  とかも最初「???」 でしたが

   モジュール:ファイル
   パッケージ:ディレクトリ

  な理解と共に、雰囲気が掴めて来ました。

import matplotlib

  すれば、グラフが書けるのか、フムフム。
  でも
Jupyter notebook で、グラフが出ない、

  なるほど


%matplotlib inline

  が必要なのか(フムフム)。

なんとなく、こんな感じで格闘中です。


で、まあサンプルどおり動き始めましたが、どう理解したものか。

興味深いのが
隠れ層を1にした場合の下記の結果

Dl_hidden1


よく考えて見ると、

z1 = xW1 + b1

の計算って、n次元空間の平面の式に他ならないわけで(この例の場合は2次元なので直線の式ですが)、平面の法線方向に、活性化関数で尤度の割付をしている以上でも以下でも無いわけですよね(多分)。
隠れ層が1個のみの場合は、一次関数で勾配降下法で解いてるだけなので、最小二乗法的な解に落ち着くのは、まあ当然なわけです。

これを複数組み合わせていく以上でも以下でも無い中で、いろんな認識が出来てしまうというのはなんとも不思議な世界です。

ただ、身も蓋も無いことを言ってしまえば、ニューロン1個は NANDゲートの上位互換なので、「NANDゲートだけでどんな回路も作れる」ってのはまあそのとおりなのですが、問題はどう繋げば、目的の回路になるかだったりするわけです。
  そこのところは従来なら人間こその設計だったところに、自動的な最適化手法が出来上がりつつあるというのはなんとも奥深い世界ですね。

  うーん、ちゃんと理解できる日が来るのだろうか....

« エンコーダ回路 | トップページ | LLVM »

プログラミング」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/560384/65068220

この記事へのトラックバック一覧です: Pythonと深層学習と:

« エンコーダ回路 | トップページ | LLVM »