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

NIPS のヤバいプロモーションビデオ

www.youtube.com

音を出して観るべき。

Python の処理系


  • Pysco
  • Pyjion
  • Nuitka
  • Skulpt

Chainerを明示的にCUDA無しを指定してインストールする

python setup.py --cupy-no-cuda install

github.com

nvvp とか使いたさに中途半端に手元のマシンに CUDA を入れているとこういう指定が必要になる。

Deep Learning のデバッグ

ミニバッチ化時にミスることが多いので、以下のようなことをすると良いらしい。

  • データごとの計算を書いてみて、1 つずつ計算したものと照合する
  • ミニバッチサイズを 1 にして計算したものの和or平均とミニバッチで計算したものを比較する

numpy の行列乗算:matmul, dot, @

stackoverflow.com

dot と matmul

2 次元では完全に同一。3 次元以上では異なる挙動をする。

  • dot は a の最後の軸と b の最後から 2 番目の軸を掛け合わせる
  • matmul は行列の配列だとみなして行列積を計算する

@ 演算子

Python 3.5 以降では @ 演算子や @= 演算子が存在する。これは __matmul__ を呼ぶが、numpy では matmul に相当するっぽい。

t-SNE の実装はどれを使うべきなのか?

scikit-learn の問題点

scikit-learn 信者としてはとりあえず scikit-learn の実装を使いたくなるが、scikit-learn の実装はおすすめできないらしい。

  • -https://www.red dit.com/r/MachineLearning/comments/47kf7w/scikitlearn_tsne_implementation/ (はてなブログはred ditのURLを貼るとbad requestになり投稿できない謎仕様)

Besides being slower, sklearn's t-SNE implementation is fine once you realize the default learning rate is way too high for most applications. The definitive bh_tsne implementation by the author sets the learning rate to 200, and the original 2008 paper describes setting it to 100, while sklearn is set to 1000.

  • 遅い
  • デフォルト値の learning rate が大きすぎる

とのこと。それに加えて、自分の経験としては、Barnes Hut 木を指定してもメモリをもりもり確保して(即 Θ(n^2) のメモリを確保してる気がする)メモリ不足で死ぬ。だめ。

公式実装に基づくものたち

自分の結論

$ pip install bhtsne

からの

import sklearn.base
import bhtsne
import numpy as np


class BHTSNE(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin):

    def __init__(self, dimensions=2, perplexity=30.0, theta=0.5, rand_seed=-1):
        self.dimensions = dimensions
        self.perplexity = perplexity
        self.theta = theta
        self.rand_seed = rand_seed

    def fit_transform(self, x):
        return bhtsne.tsne(
            x.astype(np.float64), dimensions=self.dimensions, perplexity=self.perplexity, theta=self.theta,
            rand_seed=self.rand_seed)

バイナリ探偵をする時に使うコマンド

共有ライブラリ編

  • env | grep LD
  • md5sum
    • 一致してるものを調べる
  • ls -l
  • readelf -a hogehoge.so
    • readelf -a hogehoge.so | grep SONAME
    • SONAME を調べる
  • find build/ -name '*so' | xargs ldd | less
    • 依存関係を調べる
    • ldd `which hoge` とかも
  • LD_DEBUG=all <コマンドを実行>
    • 共有ライブラリの読み込みに関して大量のデバッグログが吐かれる
  • objdump -d hogehoge.so | less
    • アセンブラを読む
    • 特に、<関数名> で検索することが多い
  • man ld-linux.so
  • readeof -d hoge.so
  • nm -D hoge.so

Python のデータ並列な処理を早くするやつ

numexpr

github.com

CPU でいい感じと噂の NN フレームワーク

autograd(微分可能 numpy)

github.com

pyCNN

github.com

CNN とは convolutional neural network ではなく C++ neural network

NN フレームワークのベンチマーク

convnet benchmarks

github.com

convnet (CNN) の実行速度のベンチマーク比較表。

これを見ると意外と chainer はかなり良い位置につけている。cuDNN が速い。

DeepMark

github.com

iperfでネットワークの速度を測る

サーバ起動

$ iperf -s

クライアント

$ iperf -c <サーバ>

PyCharmを使いこなしたい

  • shift 2回押し:search everywhere
  • alt+enter:警告が出ているところで修復(自動import、initでself.hogeにコピー)
  • command+shift+A:ランチャー的なモノ起動
  • F1:quick documentation
  • Shift+F1:external documentation(ブラウザ)
  • Command+B:定義に飛ぶ
  • Ctrl+Shift+R:実行

https://www.jetbrains.com/help/pycharm/2016.1/keyboard-shortcuts-you-cannot-miss.html


その他

  • live templatew を見ておくとよいかもしれない
  • Python console でスタート時に先に実行するスクリプトをかいとける
  • extraction 便利そう
  • ディレクトリのとこで右クリックして find in path
  • ソースコードを右クリックして find usages

www.youtube.com

www.youtube.com

Python でのデータ処理パイプライン

統計的処理、特徴量抽出、機械学習の訓練・予測のパイプラインを上手く扱いたい。

  • scikit-learn:パイプラインがあるが、キャッシュしたりできない。
  • joblib:scikit learn と仲良し(バンドル)。キャッシュしたりする機能がある。
  • maf:求めているものに近いと思うけど、メンテされているのだろうか

並列・分散処理

  • Celery:古そうに見えたが今も使われているようだ
  • RQ http://python-rq.org/
  • Dask:EC2ともくっついていてよさそう。joblib フロントエンドがあるがこれは使い物になるのか。なったらとても便利かも。
  • mesos:期待していたが、Python のコードがパット見で触れたくない感じだった(Python2だしlowerCamelCaseだし)