自分のための備忘録的なブログです。

Ubuntu14.04LTS を使って、ディープラーニングの勉強をしています。
記載されているコードは、他の OS には互換性がない可能性があります。


DNN:
マシン性能別 学習速度の比較, TFチュートリアルをmodifyする

python3:
オブジェクト指向プログラミングとは, モジュールとインポート、パスを通す, システムコマンド(os), ファイル・フォルダ名取得, 画像の前処理,

Ubuntu14 の初期設定:
Ubuntu14初期設定, 初期設定-2, cudaなども, 初期設定-3

読了:ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作る Deep Learning: Amazon.co.jp 

 

 TensorFlow など Deep learning のライブラリを使わず、Python3 (numpyなど使いますが)のみで Deep Neural Network, (DNN) を実装する、という本です。

 Deep Learning ライブラリや、General-Purpose computing on GPU, (GPGPU) ライブラリの使い方は書いていないです。従って、 TensorFlow/CAFFE/TEANO などのライブラリや、CUDA/CuDNN/OpenCV などの GPGPU は自分で勉強する必要あります。

  本書では CNN やRNN は実装しません。恐らく実際に Neural Network で何かやるには、CNN や RNN でないとキビシイ。そのため、この本だけの知識では、 Deep Learning で新しい何かをやるのは難しそうです。

(余談ですが、Google 社の DL ライブラリ、TensorFlow のチュートリアルには CNN や RNN の例もあったと思います。TF は GPU の有無にかかわらず、同じようにスクリプトを書けるそうですので、初心者にはお勧めなのだろうと思います)

 

 Neural network の各要素に、詳細な説明と実装がされているのが良い点。

 パーセプトロン、AND/OR/NAND/XORgate などから、様々な activation function 、学習を効率化する仕組みや、過学習を防ぐ方法 など、様々な要素を紹介しています。

 

 DNN を全く知らなかったので、色々勉強になりました。

 Neural Network のそれぞれの層で、

  情報 * 重み + バイアス

 という計算が、

  ベクトルの内積

 として一発で計算できるということですとか(これには感動しました)。

 

 他に、 back-propagation も多分、革命的な手法だったのだろうと思います。

 

 因みにですが、

  甘利俊一先生の「脳・心・人工知能

脳・心・人工知能 数理で脳を解き明かす (ブルーバックス) | 甘利俊一 | コンピュータサイエンス | Kindleストア | Amazon

という本に、

「back-propagation」などと最近では言われているが、これを「確率降下法」として最初に発見したのは私である。

 ということが書いてありました。

 「アカデミアとはこういうもの」という感じで、プログラミングとの違いが大変興味深いところ。

 

 Wikipedia を見ると、この手法が多くの研究者によって「再発見」されてきたことが分かります。バックプロパゲーション - Wikipedia 

 

 話は変わるが、研究というのは特許と違い、「発見に利益を求めない」ところが大変素晴らしいとは思います。

 けれど、こういう第一発見者=第一主義みたいのが、息苦しい。

 

 自分は今、プログラミングに興味があり、

 プログラミングの世界では、先人のコードを使うことはむしろ推奨され、それを無料で世界に公開した「github」なんてサイトもあります。

 

 「第一作成者は誰か」とか、「コードのインパクトファクター」「コードの被引用数」なんて、私の知る限りでは存在せず、

 

 「私が発見」とか「私の業績」とか血眼にならなくて良いので、プログラミングはいいな、と思います(もちろん、「できるプログラマ」が正当に評価されないことにつながり、問題もあります)。

 

 

 この本では、CNN や RNN など含め、比較的最近の研究まで紹介されています。一通りの知識を得ることができます。

 

 第一章の、 Python の簡単な説明も素晴らしいです。Python 入門書が一冊かけて説明するのを一章に凝縮してるので、網羅はできていません。しかし、本書を理解するには十分な内容です。

 

 昨年たくさん買い込んだ Python 入門書のある一冊で、

>>> 1+ 1

2

 を実行して

おめでとうございます!

あなたは今、Python プログラミングの世界に足を踏み入れました!!

みたいのがありましたが、

「1 + 1 を実行するために、Python 始めたんじゃないよ!」

 

 それと比べ、本書は明確な目的があります。Python を学ぶにも、「Deep Learningのため」と範囲を限定しているため、頭に入りやすかったです。

 

 さて、一周目は理解しないまま、「なんとなく」読み進めました。現在は二周目に入り、著者のコードを確認、「O'Reilly 入門 Python 3」 も並行しながら、本格的に読み進めています。

www.amazon.co.jp

 

 二周目でも理解できなかった所もあります。

  例:class の使い方。

>>> class TEST():

>>>    def __init__(self, name):

>>>        self.name = name

 

__init__  初期化とは???

self って何??? 

 

>>> t = TEST('example')

 なぜ

>>> TEST('example')

ではダメで、

>>> t = .....

で t に代入しなければ?

 とか

>>> sys.path.append(os.pardir)

頭では理解できてるけど、まだ細かな挙動が分からず

とか。

 

  一方で、「へー、こんなことできるんだー」

と理解できたコードもあり、

 

>>> if __main__ == '__name__': 

#スクリプトとして実行されたかどうかを判断する

  

 大変勉強になっています。

 

 ただ、最初に この本のスクリプトを試してみる時、どうしても

github から著者のコードを落としてくる

のと

コマンドラインでカレントディレクトリーを移動

の必要があります。

 

 ここで挫折する人がいると思いました。

 コマンドプロンプトとターミナルの使い方について記載があると、更に良かったと思います。

 

 また、

著者のスクリプトコマンドラインで実行する

と走るけれど、

自分で対話式に打ち込んでみる

とエラーが出ることもありました。

 

 対話式でも実行できるようコードを書き直すか、対話式で走らないコードは明記していただくと、良かったと思います。

 

 

因みに どこでエラーが出るかというと、 

例:p65

>>> def init_network():

(中略)

>>>     network['b3'] = np.array([0.1, 0.2])

>>> # 空行

>>>     return network

 

対話式の環境では、上記の

>>> # 空行

で関数定義が終了したと解釈され、

>>>     return network

でエラーとなる。

 

 本書で唯一、残念なところは、

本書を読んでも、DNN を作れるようにはならないこと

 です。

 「ゼロから作る」という題名ではありますが、最終的に、本書では、

著者が作成したコードを実行するだけ

 となってしまいます。たしかに著者は「ゼロから作った」のかもしれません。しかし、私のような Python 初心者は、コードを見ても、難解で理解不可能。著者のコードをただ実行するだけ となってしまいます。

 知識の乏しい読者のことを考え、著者が自分で実装してしたのだと思いますが、本書の題名には反すると思いました。

 

 つまり、このブログ記事の表現を借りると

blog.tinect.jp

 「Deep Learning を『分かった気になれる』本」、ということですね。 *1

 

 以上まとめますと、Deep Learning をやってみたい人、Python 3 を学んでみたい人におすすめな本です。

*1:「この本を読んでも、"Deep Learning" を理解できない」と言っているわけではありません。この本に書かれたことは、 Deep Learning の「基本」的なことだと思います。ただし本書だけでは不十分ということです