読者です 読者をやめる 読者になる 読者になる

pip install deeplearning

情報系大学院生の深層学習入門

報告

こんにちは。最後に記事を投稿してから、約3ヶ月がたちました。
本記事は、今までこれからについてです。

今まで

2月はリクルートでデータ解析インターンに参加していました。
recruit-jinji.jp
3月、4月は就職活動でした。データ分析や機械学習周りのお仕事がしたいです。

これから

今後は論文と実装を中心に記事を書きたいと思います。
また研究室単位でブログを立ち上げる動きもあるので、
そちらに注力するかもしれません。

macでmkl&numpyを構築した

前回記事の投稿から数時間後, きちんとmkl&numpyの構築に成功した.
pip-install-deeplearning.hatenadiary.jp

兆候

前回記事 'ここに辿り着くまで' で記載したエラーの対処方法を調べていると 'dynamic link' がどうたらこうたら, という話をたくさん見かけました.

ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/multiarray.so, 2): Library not loaded: libmkl_rt.dylib
  Referenced from: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/multiarray.so
  Reason: image not found

そこではDYLD_LIBRARY_PATHを設定することも示唆されていたので, 改めて調べ直すと有力な記事を発見.
github.com

構築

記事ではnumpy-1.8.1, python3.4ですが, numpy-1.10.4, python2.7でも構築できました.

/numpy-1.10.4/site.cfg  または ~/.numpy-site.cfg を以下の内容で用意

[mkl]
library_dirs = /opt/intel/mkl/lib
include_dirs = /opt/intel/include:/opt/intel/mkl/include
mkl_libs = mkl_rt
lapack_libs =

~/.bash_profile を設定

export CC=clang
export CXX=clang++
export FFLAGS=-ff2c
export PYLINK="import sys; import os; print('-L' + os.path.abspath(os.__file__ + '/../..') + ' -lpython2.' + str(sys.version_info[1]))"
export DYLD_LIBRARY_PATH="/opt/intel/lib/intel64:/opt/intel/lib:/opt/intel/mkl/lib:$DYLD_LIBRARY_PATH"

/numpy-1.10.4/setup.py を実行

python setup.py config --compiler=intelem
python setup.py build --compiler=intelem
python setup.py install

検証

インストールが終わったところで各種検証をしていきます.

python -c'import numpy; numpy.show_config()'

lapack_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/include', '/opt/intel/mkl/include']
blas_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/include', '/opt/intel/mkl/include']
openblas_lapack_info:
  NOT AVAILABLE
lapack_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/include', '/opt/intel/mkl/include']
blas_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/include', '/opt/intel/mkl/include']
mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/include', '/opt/intel/mkl/include']

速度比較すると一目瞭然. 早くなっています(anacondaで構築したmklよりも早い).
f:id:mutomasahiro1111:20160130005956p:plain

chainer

またchainer_mnistのエラーもちゃんと解消されています.
pip-install-deeplearning.hatenadiary.jp

python train_mnist.py 
n_units 1000
load MNIST dataset
epoch 1
graph generated
train mean loss=0.190347706894, accuracy=0.942616669834
test  mean loss=0.106343430469, accuracy=0.966100007296
epoch 2
train mean loss=0.0741488920168, accuracy=0.976766676207
test  mean loss=0.086192065514, accuracy=0.974100006819
epoch 3
train mean loss=0.048918632143, accuracy=0.984400010208
test  mean loss=0.0637195110742, accuracy=0.980100007057
epoch 4
train mean loss=0.0352272967775, accuracy=0.988666675289
test  mean loss=0.0778577751776, accuracy=0.97710000515
epoch 5
train mean loss=0.0289251541828, accuracy=0.990183341404
test  mean loss=0.0699444887941, accuracy=0.981000007987
epoch 6
train mean loss=0.0223340781424, accuracy=0.992733340065
test  mean loss=0.0735415374582, accuracy=0.981900007725
epoch 7
train mean loss=0.023896622029, accuracy=0.99221667399
test  mean loss=0.0738069448388, accuracy=0.98120000422
epoch 8
train mean loss=0.0157400782724, accuracy=0.994600005051
test  mean loss=0.0902125522017, accuracy=0.979400005341
epoch 9
train mean loss=0.0156944541644, accuracy=0.994666671356
test  mean loss=0.0669454357358, accuracy=0.983200008273
epoch 10
train mean loss=0.0164206012773, accuracy=0.994833338062
test  mean loss=0.0776587059804, accuracy=0.981800007224
epoch 11
train mean loss=0.0131828821437, accuracy=0.995750004053
test  mean loss=0.0715873185383, accuracy=0.984500007033
epoch 12
train mean loss=0.012000972836, accuracy=0.996083337069
test  mean loss=0.0895336843703, accuracy=0.982900007963
epoch 13
train mean loss=0.0143335766766, accuracy=0.995516670843
test  mean loss=0.0933588848546, accuracy=0.981100007892
epoch 14
train mean loss=0.0109565397249, accuracy=0.99610000362
test  mean loss=0.10498684463, accuracy=0.97990000546
epoch 15
train mean loss=0.0104289456925, accuracy=0.997233335972
test  mean loss=0.0856612050419, accuracy=0.983500004411
epoch 16
train mean loss=0.00717544781743, accuracy=0.997816668749
test  mean loss=0.108521250341, accuracy=0.982600008845
epoch 17
train mean loss=0.00981602142994, accuracy=0.997100002766
test  mean loss=0.0990101728047, accuracy=0.982200005651
epoch 18
train mean loss=0.0136716291517, accuracy=0.996433336735
test  mean loss=0.109974410593, accuracy=0.981400005817
epoch 19
train mean loss=0.00630845916929, accuracy=0.998033335209
test  mean loss=0.124410866243, accuracy=0.977700008154
epoch 20
train mean loss=0.0124550565974, accuracy=0.996566669941
test  mean loss=0.106592905503, accuracy=0.981600005627
save the model
save the optimizer

さいごに

自分自身にお疲れ様でしたと言いたいです.

macでmkl&numpyを構築したかった

numpyの計算を裏でサポートしてくれるmklを導入してみました. ネット上にmacでの導入例が少なく, 調べたり試行錯誤にかなり時間を費やしたので, 報告. mkl&numpyの構築には2つの方法があり, 片方はとても怪しい方法です. そして結論を言ってしまうと構築できていません.

構築できました(追記: 1/30)
pip-install-deeplearning.hatenadiary.jp

numpyを重ねる

pipでnumpyをインストールをした状態で, numpyソースコードのsetup.pyを動かす怪しい荒技です. numpyが重なっている?共存している状態になります. なぜこんなことをするのかも後ほど.

まずIntel MKLを入手します. 以下のサイトから'click here now to register and download'から必要事項を入力してダウンロード, インストールをします.
No Cost Options for Intel Math Kernel Library (MKL), Support Yourself, Royalty-Free | Intel® Developer Zone

次にnumpyのソースコードを入手します(執筆時はv1.10.4). 次のどちらかのサイトからダウンロードできます.
Numerical Python - Browse Files at SourceForge.net
Release v1.10.4 · numpy/numpy · GitHub

ではまずは初期状態を確認します. numpyをインストールしてどのライブラリを使っているか確認します.

pip install numpy
python -c'import numpy; numpy.show_config()'

lapack_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3']
    define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
openblas_lapack_info:
  NOT AVAILABLE
atlas_3_10_blas_threads_info:
  NOT AVAILABLE
atlas_threads_info:
  NOT AVAILABLE
atlas_3_10_threads_info:
  NOT AVAILABLE
atlas_blas_info:
  NOT AVAILABLE
atlas_3_10_blas_info:
  NOT AVAILABLE
atlas_blas_threads_info:
  NOT AVAILABLE
openblas_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
blas_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
    define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
atlas_info:
  NOT AVAILABLE
atlas_3_10_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE

次にダウンロードしたnumpyのソースコード内から上書きインストールをします. まずはソースコードの内にsite.cfgというファイルを作ります(ファイルの中身は以下). これでインストールしたmklの場所を指定してあげます.

[mkl]
library_dirs = /opt/intel/mkl/lib/
include_dirs = /opt/intel/mkl/include
mkl_libs = mkl_rt
lapack_libs =

configオプションで, ちゃんとmklを認識できているか確認します.

python setup.py config

Running from numpy source directory.
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'test_suite'
  warnings.warn(msg)
blas_opt_info:
blas_mkl_info:
/Users/mutoumasahiro/Downloads/numpy-1.10.4/numpy/distutils/system_info.py:635: UserWarning: Specified path  is invalid.
  warnings.warn('Specified path %s is invalid.' % d)
  FOUND:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/mkl/include']

  FOUND:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/mkl/include']

non-existing path in 'numpy/distutils': 'site.cfg'
F2PY Version 2
lapack_opt_info:
openblas_lapack_info:
  libraries openblas not found in ['/Library/Frameworks/Python.framework/Versions/2.7/lib', '/usr/local/lib', '/usr/lib']
  NOT AVAILABLE

lapack_mkl_info:
mkl_info:
  FOUND:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/mkl/include']

  FOUND:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/mkl/include']

  FOUND:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/mkl/include']

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'define_macros'
  warnings.warn(msg)
running config

いろいろWarningが出ているのですが, よくわかりません. ここらへんを解決できるといいのですが... とりあえずmklを認識できているのを確認したら, インストールします. その後LD_LIBRARY_PATHを通して, show_config()できちんとmklがライブラリとして認識されているのをチェックします.

python setup.py install
export LD_LIBRARY_PATH="/opt/intel/mkl/lib:$LD_LIBRARY_PATH"

cd #エラーが起きるのでnumpyのディレクトリから離れる
python -c'import numpy; numpy.show_config()'

lapack_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/mkl/include']
blas_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/mkl/include']
openblas_lapack_info:
  NOT AVAILABLE
lapack_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/mkl/include']
blas_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/mkl/include']
mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/mkl/include']

これで一応成功です. ちなみにpip uninstall numpyが2回できるので, 本当に重なっている?ことがわかります.

ここに辿り着くまで

Numpy/Scipy with Intel® MKL and Intel® Compilers | Intel® Developer Zoneにはmkl&numpyの構築方法が乗っているんですが, Linux仕様のせいか同じことをやってもうまくいきませんでした. 同じようにやって引っかかったのはこちら.

python -c'import numpy; numpy.show_config()'

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/__init__.py", line 180, in <module>
    from . import add_newdocs
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/add_newdocs.py", line 13, in <module>
    from numpy.lib import add_newdoc
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/__init__.py", line 8, in <module>
    from .type_check import *
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/type_check.py", line 11, in <module>
    import numpy.core.numeric as _nx
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/__init__.py", line 14, in <module>
    from . import multiarray
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/multiarray.so, 2): Library not loaded: libmkl_rt.dylib
  Referenced from: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/multiarray.so
  Reason: image not found

これの解決法を調べるのが難しくて, もしかして共存させればいいんじゃないかなとふと思いついた次第. とても悪手ですが, 長時間の試行錯誤でだいぶ心が折れていたので動けばいいやと...

Anacondaから入れる

Anacondaがmkl, numpy, scipyなどをまとめて構築してくれます. 先の方法と比べてとても簡単で感覚的にも正攻法です. numpy.show_config()で確認します.

conda install mkl
python -c'import numpy; numpy.show_config()'
lapack_opt_info:
    libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['//anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['//anaconda/include']
blas_opt_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['//anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['//anaconda/include']
openblas_lapack_info:
  NOT AVAILABLE
lapack_mkl_info:
    libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['//anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['//anaconda/include']
blas_mkl_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['//anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['//anaconda/include']
mkl_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['//anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['//anaconda/include']

詳しくはMKL Optimizations — Continuum documentation
Anacondaを入れていない人はこちらからWhy Anaconda? | Continuum

検証

ここからはテストコードを用いて速度比較及び動作検証を行います. テストコードはこちら
テストのうち'Matrix Multiplication (double precision)'の結果を比較します. これはmn行列とnk行列の内積を計算していて,
m=10000, n=6000
k=[64, 80, 96, 104, 112, 120, 128, 144, 160, 176, 192, 200, 208, 224, 240, 256, 384]
となっています. 結果を見る限りそんなに早くなっていないと思います(後述のubuntuの結果を見ると一目瞭然).
f:id:mutomasahiro1111:20160130010502p:plain

chainerのエラー解消

以前, ブログに書いたchainer/examples/mnist/train_mnist.pyがバグるというお話. これの原因がnumpyを裏で計算しているパッケージによるものという可能性が示唆されていました. そこでanaconda構築したmkl環境で確認したところ, エラーが解消されていました. ということでこの問題の関係方法として'他のライブラリを導入する'が挙げられます.
pip-install-deeplearning.hatenadiary.jp

さいごに

最初のnumpyを重ねた方法でのmklでは, chainer_mnistのエラーが残っていたのでおそらくちゃんとmklライブラリを使っていないと思います. それに対してanacondaはエラーがなくなっているので一応mklライブラリを使っているようです(もちろん他よりは高速化しているのも根拠). またMacBookPro環境ではmklを使ったところでCPUが1枚なので高速化されないのかも知れないです.

そもそも大規模な計算をするならGPU環境でやるので, macbookpro上で高速化するメリットも特に無いです. 今回はmac上でmklを構築した例があまりネット上に出回っていなかったので挑戦してみました. だけどうまくいかないので, これ以上はあがきません. 誰かがこれを見て, 引き継いでくれることを祈ります. 何かあったら教えて下さい.

おまけ

Linux(Ubuntu)上でmkl, numpy構築しました. 参考記事の通りにやるだけでとても簡単. 簡単すぎてmacの恐ろしさを改めて感じました. 明らかに早くなっています.Python - mkl numpyのインストール方法 - Qiita
f:id:mutomasahiro1111:20160129202745p:plain

DCGAN

Deeplearningを使って画像を生成するDCGANを紹介します.
論文と合わせて, chainerで実装した例を読むと理解しやすいです.
Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks
(Alec Radfold, Luke Mets, Soumith Chintala, http://arxiv.org/pdf/1511.06434v2.pdf)
Chainerを使ってコンピュータにイラストを描かせる - Qiita
Chainerで顔イラストの自動生成 - Qiita

はじめに

こんにちは。大したことを書いていないのに, 毎日アクセスされていてびっくりです. アクセスされている間は, ちゃんと記事を書こうと思い, 年末に読んでいたDCGANを紹介します.
これはニューラルネットワークを使って画像生成するアルゴリズムで, デモを見る限り, うまく生成しているし, Word2vecのように画像の意味をベクトル化できているようです.
そもそもGANすら読んでいないので「'Adversarial'ってなんだ?」というところから始まり, Qiita上の実装コードやデモ, いろんな人の説明を読むまでを通して理解しました.

※注意

去年の4月からDeepLearningの勉強をし始めたので, わからないところ, 間違っている可能性があります.(もしよければ指摘してください)
その上, 英語も堪能ではないので, 誤解している可能性があります.
(もしよければ指摘してください)

Generative Adverasarial Networks

DCGANの説明に入る前に, 元となる手法であるGANを紹介します.GANは下図のように生成モデルGと識別モデルDが交互に学習をします. 例えて言うなら, 偽造犯Gと鑑定士Dのイタチごっこです. 変数や式を説明は以下のとおり.

  • G():生成モデル. zからG(z)=x の画像を生成.
  • D():識別モデル. xD(x)=yとして判定.xG()から生成されたと判定した時, y=1.
  • z: n次元の一様分布に従う変数.
  1. 鑑定士Dは本物の絵画xを見て, D(x)=y=0(正解)になるように学習.
  2. 鑑定士Dは偽物の絵画xを見て, D(x)=y=1(正解)になるように学習.
  3. 偽造犯Gは材料zから偽物の絵画G(z)=xを描き, D(x)=y=0(不正解)になるように学習.

以上を繰り返すことで, 偽造犯の腕がどんどん磨かれて, より本物っぽい絵画をかけるようになります.

https://qiita-image-store.s3.amazonaws.com/0/51673/0a8d13de-20c9-1e80-a74c-21d0b7fc2d61.png
(画像はこちらから拝借: Chainerで顔イラストの自動生成 - Qiita)
(GANの論文はこちら: http://arxiv.org/pdf/1406.2661v1.pdf)

DCGANができたこと

それっぽい画像の生成

これはベッドルームの画像を生成した例です.
ぱっと見ると, 本当のベッドルームみたい.
f:id:mutomasahiro1111:20160121154941p:plain
(論文中,図3)

Word2vecのようなベクトル演算

'メガネベクトル'や'笑顔ベクトル'など意味演算ができていました.
これがどこまでいけるのかを今度試します.
f:id:mutomasahiro1111:20160121154952p:plain:w500
f:id:mutomasahiro1111:20160121154959p:plain:w500

なんでこのようなベクトル演算ができたのかというと, 生成される画像はn次元空間のzのパラメータで決まるところに注目するとわかります. このn次元空間上で異なる2つの画像を作る点, またはそれらの画像の平均z1, z2の差がベクトルになるわけです.
f:id:mutomasahiro1111:20160121232014p:plain:w200f:id:mutomasahiro1111:20160121231938p:plain:w200

その他

特定のフィルターと物体

生成モデルの特定のフィルターが特定の物体を描画している.

教師なし学習での特徴量抽出器

識別モデルのフィルターが画像分類の特徴量抽出機と教師なし学習

などなどがありますが, また時間があるときに書きます. それにしてもすごい.

ぜひアニメ画像のデモを御覧ください.
qiita.com
qiita.com

Chainerと読む「深層学習」-vol.2

深層学習 (機械学習プロフェッショナルシリーズ) 」をChainerのコードと交えて読み進めようという趣旨。

こんにちは。Chainerがバージョンアップして
サンプルコードのネットワークの定義方法が変わりました。
pythonのclassの使い方を少し理解した気がします。

今回は第2章の順伝播型ネットワーク(FFNN)です。

Chapter2 順伝播型ネットワーク

2.1 ユニットの出力

順伝播型ネットワーク(以降:FFNN)の出力は線形結合となっていて
 u = w_1x_1 + w_2x_2 + ... + w_nx_n + b
上の式のように入力xに重みwをかけて、バイアスbを足す。
これをchainerではchainer.linksのLinear関数で表す。

import chainer.links as L

u1 = L.Linear(4, 1) # (2.1a)
u2 = L.Linear(4, 1) # (2.1b)
u3 = L.Linear(4, 1) # (2.1c)

u = L.Linear(4, 3) # (2.3a)

Linear関数を詳しく説明すると、

class chainer.links.Linear(in_size, out_size, wscale=1, bias=0, nobias=False, initialW=None, initial_bias=None)

Linear(入力素子数, 出力素子数, 重みの標準偏差, バイアスの初期値, バイアスの有無, 重みの指定, バイアスの指定)
といった引数ががあり、重みやバイアスの初期値が渡されていない場合は、重みは正規分布、バイアスは0となる。

2.2 活性化関数

活性化関数はシナプスの役割をしていて、特定の値で発火する。単調または非線形関数が主に使われている。
これをchainerではchainer.functionsに用意されている。

import chainer.functions as F
z = F.sigmoid(u) # ロジスティックシグモイド関数
z = F.tanh(u) # 双曲線正接関数
z = F.relu(u) # 正規化線形関数

他にも様々な活性化関数が用意されている。

2.3 多層ネットワーク

図2.4(a)をchainerで表してみよう。
入力をx, 出力をyとすると

# まずは各層を定義する。
u2 = L.Linear(4, 3)
u3 = L.Linear(3, 2)
# 次に繋げる
x = [x1, x2, x3, x4]
z2 = relu(u2(x))
z3 = sigmoid(u3(z2))
y = z3

という感じになる。

2.4 出力層の設計と誤差関数

正解ラベルの型

chainerでは問題の種別によって、
正解ラベル(本書だと望ましい出力d)の型を整える必要があります。
回帰の場合、正解ラベルをnumpy.float32型
分類の場合、正解ラベルをnumpy.int32型
にする必要がある。変換方法はdという配列に対して

d = d.astype(numpy.float32) # 回帰
d = d.astype(numpy.int32) # 分類
誤差関数

誤差関数は活性化関数と同様にchainer.functionsに用意されていて、
yをネットワークの出力、dを望ましい出力にすると

loss = F.mean_squared_error(y, d) 
loss = F.softmax_cross_entropy(y, d)

と表すことができる。


次回は確率的勾配法です。
github.com

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

chainerのエラー

OS X El Captain上でChainer(ver1.5.1)のMnistサンプルを動かしたら、
学習が進まないエラーを見つけた話

numpyが裏で使っている計算ライブラリを変更することで解決できました.
ついでに計算速度も良くなるので是非, Intel MKLを導入しましょう. (追記: 1/30)
pip-install-deeplearning.hatenadiary.jp

学習が進まない

新年あけましておめでとうございます。
今年1年間このブログを続けるようにがんばります。

前回、Macを新調した話をしましたが、
あのあとChainerの動作チェックしたら
おそらくMac環境依存のエラーに出くわしました。

GithubにあるChainerのソースコードには様々なサンプルコードがあって
examples/mnist/train_mnist.py でmnistをニューラルネットワークで解けます。
github.com


通常だとこのように学習が進むのですが、
(こちらから拝借しました)
Python - 【機械学習】ディープラーニング フレームワークChainerを試しながら解説してみる。 - Qiita

epoch 1
train mean loss=0.278375425202, accuracy=0.914966667456
test  mean loss=0.11533634907, accuracy=0.964300005436
epoch 2
train mean loss=0.137060894324, accuracy=0.958216670454
test  mean loss=0.0765812527167, accuracy=0.976100009084
epoch 3
train mean loss=0.107826075749, accuracy=0.966816672881
test  mean loss=0.0749603212342, accuracy=0.97770000577
epoch 4
train mean loss=0.0939164237926, accuracy=0.970616674324
test  mean loss=0.0672153823725, accuracy=0.980000005364
epoch 5
train mean loss=0.0831089563683, accuracy=0.973950009048
test  mean loss=0.0705943618687, accuracy=0.980100004673


僕のやったところ...
学習エラーが大きすぎるし、学習が進んでいない?事態に。

epoch 1
graph generated
train mean loss=103.601352873, accuracy=0.455199998431
test  mean loss=248.828919678, accuracy=0.364100000262
epoch 2
train mean loss=477.577273048, accuracy=0.449366665569
test  mean loss=570.153792725, accuracy=0.587700000107
epoch 3
train mean loss=910.396587283, accuracy=0.505549998085
test  mean loss=735.400798035, accuracy=0.496799997687
epoch 4
train mean loss=1791.45682208, accuracy=0.513516665933
test  mean loss=1289.56998779, accuracy=0.512299997807
epoch 5
train mean loss=2166.74419698, accuracy=0.55141666539
test  mean loss=2102.33599121, accuracy=0.617300002873

詳しく調査

何がおかしいのかいろいろ調べると中間層の値(n_units)が
1000付近だと異常を起こすことを特定。(簡単のため、epoch=1)
n_units = 900, 910, ... , 1090にしたときのtrain loss(青)
f:id:mutomasahiro1111:20160105140722p:plain

n_units = 990, 991, ... , 1009にしたときのtrain loss(青)
f:id:mutomasahiro1111:20160105140727p:plain

環境

一応、僕の環境はこんな感じ。

OS X El Captian v10.11.2
MacBook Pro (Retina 13-inch、Early 2015)
プロセッサ 3.1 GHz Intel Core i7
メモリ 16 GB 1867 MHz DDR3

Chainer公式に報告

自分では原因を特定できないので、Chainer公式に報告しました。
Chainer (@ChainerOfficial) | Twitter
にリプライを送ると、こちらに似たような問題を抱えた人を発見。
groups.google.com
予想通り、Mac環境に依存したエラーのようですね。

このままだと研究してる時にこのPCから出た数値を信用できなくなるので
次のアップデートぐらいで改善されてると嬉しいです。

0から始めるMacのDeepLearning環境構築

MacBook Pro (Retina 13-inch、Early 2015)の出荷時状態からChainerをimportするまで。

MBPを新調しました

こんにちは、2週間ほど前に以前使っていたMacBookProが故障してしまいました。
半年前にもメモリが故障してしまったんですが、今回はHDDを読み取る部分で修理できず。
2011年の春学期に購入したので既に4年目なので、そろそろ需要かなと思い、
新調する運びになりました。


ちなみにブログの更新ができなかったのも↑が原因です。

スペック

MacBook Pro (Retina 13-inch、Early 2015)
CPU 3.1 GHz Intel Core i7
メモリ 16 GB 1867 MHz DDR3
OS X El captain

Permission denied 問題

PCを買い換えたので早速、Chrome, Google 日本語入力, Sublime Text2, etc...
をインストール。一通り揃えたところで、いざPython及びDeepLearningの環境構築です。

環境構築でよく出会う問題がPermission denied
慣れている人は「sudoすればいいんでしょ?」と思うでしょう。
けれども、それはあまりスマートじゃないし、
将来的にoperation not permittedという違う問題も引き起こしてしまいます。

今回は「ある手順を踏みながら環境構築をすると、これらの問題に対処できるよ。」
という内容の記事です。

環境構築

Homebrew

まず導入するのはHomebrew
OS X用のパッケージマネージャーで以下のコマンドで様々なパッケージをインストールできます。

brew install #package_name

Homebrew自身の導入は下記のスクリプトを実行するだけです。

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

実行ログを見ると、途中でパスワード入力を求められています。
おそらく、ここで特定のファイルのpermissionを変更していると思います。
この動作によって以下、pipやその他のパッケージをインストールする際に
Permissionに関わる諸問題が発生しなくなります。

mutoumasahiro-no-MacBook-Pro:~ mutoumasahiro$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/Library/...
/usr/local/share/man/man1/brew.1
==> The following directories will be made group writable:
/usr/local/.
/usr/local/bin
==> The following directories will have their owner set to mutoumasahiro:
/usr/local/.
/usr/local/bin
==> The following directories will have their group set to admin:
/usr/local/.
/usr/local/bin

Press RETURN to continue or any other key to abort
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/. /usr/local/bin

WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.

To proceed, enter your password, or type Ctrl-C to abort.

Password:
==> /usr/bin/sudo /usr/sbin/chown mutoumasahiro /usr/local/. /usr/local/bin
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/. /usr/local/bin
==> /usr/bin/sudo /bin/mkdir /Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Library/Caches/Homebrew
==> /usr/bin/sudo /usr/sbin/chown mutoumasahiro /Library/Caches/Homebrew
==> Downloading and installing Homebrew...
remote: Counting objects: 3914, done.
remote: Compressing objects: 100% (3758/3758), done.
remote: Total 3914 (delta 30), reused 2324 (delta 19), pack-reused 0
Receiving objects: 100% (3914/3914), 3.41 MiB | 2.00 MiB/s, done.
Resolving deltas: 100% (30/30), done.
From https://github.com/Homebrew/homebrew
 * [new branch]      master     -> origin/master
HEAD is now at 6ccecbd xapian: update 1.2.21 bottle.
==> Installation successful!
==> Next steps
Run `brew help` to get started
<||

** PyPI
次に導入するのはPythonista御用達の[https://pip.pypa.io/en/latest/installing/:title=PyPI](通称:pip)です。
Python周りのパッケージを以下のコマンドで簡単に導入できます。
>||
pip install #package_name

そんなpip自身の導入は以下のスクリプトを実行するだけです。

curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python

または、公式サイトからget-pip.pyをダウンロードして実行。

python get-pip.py

先にHomebrewを導入していれば、ここでsudoをすることはありません。
sudoを使ってpip自身をインストールすると、今後のパッケージ導入でもsudoすることになります。
というか、sudoしてもoperation not permittedになって行き詰まってしまいます...。

なのでHomebrewを先にインストールして、pipをsudoなしでインストールできれば安心です。

Chainer

最後にDeepLearningをするためにChainerをインストールします。
最新のChainer(v1.5.1)ではインストール時に様々な問題が報告されていて、
それを回避するためにChainerで必要とされているパッケージを予め導入または最新版にします。

どれも先に導入したpipがあれば簡単にインストールできます。

pip install cython
pip install -U setuptools
pip install -U numpy
pip install chainer

さいごに

最後にターミナルで以下を確認できたら環境構築は完了です。

import chainer

追記(2016/2/4)

numpyの計算ライブラリをmklにすると, 高速化できます.
pip-install-deeplearning.hatenadiary.jp