『Python機械学習プログラミング』のKerasで引っかかる
『Python機械学習プログラミング』をおすすめした人から、Kerasのところでつまづいたとのこと。
エラー文を見せてもらうと、
from keras.utils import np_utils Using TensorFlow backend. Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/***/.pyenv/versions/anaconda3-4.1.0/envs/anaconda3/lib/python3.5/site-packages/keras/__init__.py", line 2, in <module> from . import backend File "/home/***/.pyenv/versions/anaconda3-4.1.0/envs/anaconda3/lib/python3.5/site-packages/keras/backend/__init__.py", line 67, in <module> from .tensorflow_backend import * File "/home/***/.pyenv/versions/anaconda3-4.1.0/envs/anaconda3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 1, in <module> import tensorflow as tf ImportError: No module named 'tensorflow'
ファッ!?
なぜtensorflow?
と思ったら、KerasのデフォルトのバックエンドがTensorFlowになってる〜!
確かにこれはTheanoしか入れてなきゃ動かないわ。
はーなるほど。KerasがTensorFlowに統合されつつあるのね。
Kerasがいつかの段階でバックエンドにTheanoだけでなくTensorFlowを選べるようになっていて、しかもデフォルトがTensorFlowになっているので『Python機械学習プログラミング』のとおりにやってもコケると。
TensorFlowを入れてもいいんですが今回はバックエンドの変更で済ませました。
『Python機械学習プログラミング』は2016年7月発売の本なんですけどねぇ。時代はもうこんなに変わっているのか……。
プログラマから見たソフトマックス関数
機械学習において、ソフトマックス関数はロジスティック回帰の一般化としてとして現れます。ロジスティック関数のあとで説明されるのが通例です。
式はこちら。
ソフトマックス関数 - 機械学習の「朱鷺の杜Wiki」
多クラス分類問題に用いられます。
以前から、「なぜこの関数を一般化ロジスティック関数と呼ばずにソフトマックス関数と呼ぶのか?」と思っていました。
理由は「高校数学の美しい物語」で分かりました。
mathtrain.jp
こちらの「ソフトマックス関数の性質」の項で、
例えば,x=(10,2,1) とすると,y=(0.9995⋯,0.0003⋯,0.0001⋯) となります。マックス関数(一番大きい成分を 1 にして,それ以外のものは 0 にする関数をこう呼ぶことにする)をソフトにしたという感じです。
と解説されています。
これで腑に落ちました。
プログラミングをしている人ならMAX関数と言えばすぐに理解できると思います。このMAX関数をソフトにしたものがソフトマックス関数であり、
・MAX関数と違ってベクトルで返す。
・大きな成分が過大に(1に近く)評価され、小さな成分が過少に(0に近く)評価される。
関数だということが分かります。
プログラマからすると、ソフトマックス関数はロジスティック関数から説明されるよりMAX関数から説明してもらったほうが分かりやすいですし、下手をするとソフトマックス関数の説明をしてもらってからその特別な場合としてロジスティック関数の説明をしてもらったほうが理解しやすいかもしれません。
目標値を{-1,1}にする理由
問題によって、目標値を{0,1}ではなく{-1,1}にするときがあります。
こうすることによって、が1になります。式中からを吹き飛ばすことができるわけです。
微分を行う場合、計算が楽になるように係数に1/2を入れておくのと同じようなテクニックですね。
機械学習(カーネル法)におけるグラム行列
数学的(線形代数学的)にはグラム行列とは正方行列Aが与えられたときに、その随伴行列A*とAを掛け合わせたA*A(この*は掛け算ではなく随伴行列記号)のことをAのグラム行列と言います。
随伴行列とは複素数を成分にとる m×n 行列 A に対して、
1) 転置して
2) その成分の複素共軛(実部はそのままで虚部の符号を反転する)をとった
n×m 行列 A* のことです。
ただし、グラム行列の場合はAが正方行列(n×n 行列)という制限がかかりますので、随伴行列もn×n 行列になります。
これに対し、機械学習の分野でグラム行列とは単に
・のカーネル値 を n,m 成分とする行列のこと
であり、「を要素に持つグラム行列」と表現されることもあります。
イメージ的には「カーネル関数を行列で表したもの」と思えばいいでしょう。
具体的には「n個のデータに対する全相互カーネル値の一覧」です。
こう言われると、
「ああ、いかにもカーネル法のいろんなところで出てきそうな行列だなあ」
「n(データ数)が増えたら計算が大変だろうなあ」
ということが一発で分かると思います。
グラム行列を使うと何がうれしいかと言うと、元の空間の次元が高くても(無限次元でも)計算量があまり増えないということです。逆にデータ数が多いほど計算に時間がかかります。
となると、今度は効率化として
・近似
・データ量を減らす
などが出てくるわけです。
グラム行列計算の効率化についてはこれまた巨大な分野なので今回はここまで。
北野坂備忘録の人気記事
ブログを開始して一年ほど経過しましたので、人気のある記事を見ていきたいと思います。
2位
素人向け・機械学習初心者向けに書いているせいか、「言語処理100本ノック 2015年版」の解説記事はありがたいことによく閲覧されているのですが、一番閲覧が多いのはこちら。
72番までの問題と比べ、いきなり難易度が向上しているからだと思います。
「素性」について解説している72番の記事もよく読まれていました。