2015年12月27日日曜日

SVN(Support Vector Machine)を調べたときに役立ったサイトメモ

Support Vector Machineの原理を調べてるときに役立ったサイトを張っておく。

一昔前に一世を風靡した手法だが、まじめにロジックを追うと数学的な知見が結構使用されていた。

どれか一個を見れば、完璧!見たいのは残念ながらなかったが私の場合は下記のサイトをいったりきたりしながら読み込んでいったら大体理解できた。

もちろん、これ以外のサイトも多数見たが、よくわからなかったり、明らかに間違ってたりといった質的にいまいちなサイトも多くあったことを記しておく。


名古屋大学の人が書いた説明
短くまとめられているので、全体像を把握するのに役立った。
付録として掲載されているKKT法の例も有益。

静岡理工大の人が書いた資料
一般的なSVNでは多次元を前提として説明されているので、数式が若干追いづらい。
このサイトでは、入力が2次元であることを前提に説明しているので、論理展開がわかりやすい。
数学的厳密性は気にしてなかったので非常に重宝した。

個人的には、2次元で説明しているために、マージンの距離の求め方が、単に点と直線の距離の距離の公式を使って求めているに過ぎないことがわかり、これのおかげでつまづきが解消された。マージンの距離については、必ずしもそういう説明をしてくれないサイトも多かったんだよね。

産業技術総合研究所の人が書いた資料
一番教科書的に使える資料。ただし、式の展開などはわかっていることが前提でさっくり飛ばしているので、初学には向かない。俗に言うインデックスとして資料するのにお薦めな資料。

海洋大学の人の書いた資料
KKT方について調べるのに役立った。

2015年12月23日水曜日

Deep Learning用のモデルを簡単に作成できるLabellioを使ってみた

本記事は Deep Learning Advent Calendar 2015 22日目の記事です。
AlpacaがリリースしているDeep LeaningのWebサービスにLabellioというのがあります。これを使うと、画像データを与えるだけで、自動的にDeep Learningで学習を行いモデルを作成することができます。モデルはもちろんエクスポート可能であり、著名なDeep LearningフレームワークのひとつであるCaffeに対応した形式でエクスポートすることができます。

学習はすべてLabellioの用意するリソース上で行われるので、自前で用意するのは訓練用の画像データとそのラベルだけでよいという優れものです。
訓練データは自前で用意したものをUploadすることもできますし、とりあえず試したいのであればLabellioが提供するAPIを利用してFlickr/Bingから訓練データを自動的に取得させることもできます。

今回は、Flickrから取得したデータを使ってみました。例としてフルーツの画像分類器を作成してみます。

まずモデル名として"Fruits"と指定します。
そして訓練データをFlickr上から取得するように指定します。

SourceとしてFlickrを指定。
LabelにOrange, Apple, Bananaを入力する。



ラベルの入力が終わったらAddを押す。





ここでNextを押すと学習用の処理がLabellioにenqueueされる。



後はTrainingが終わるのを待つ。
今回の場合は150個程度の訓練データしか使ってないようなので、数分程度で学習が終了した。


学習が終わった後、適当にGoogleで見つけたバナナの画像をこの分類器に与えてみる。




結果が出るまで少し待つ




それ程時間がかからずに結果が出る。
バナナな確率0.6。思ってたより数値が良くないのは訓練データが少ないせいだろうか。
そういえば訓練結果のAccuracyも0.57だった。

もう少しいろいろデータを用意して試してみたいところだ。

使ってみた感触


もはや画像データを渡せばいいだけなので、Deep Learningが何なのかといった知識がまったく不要である。また学習のリソースごと提供してくれているのが非常にポイントが高い。フレームワークはオープンソースで無料なのがいくつも存在するが、学習用のリソースはそうはいかない。

営利目的でしっかりとしたものを作るのならともかく、単に学習を目的としていたり、趣味でちょこっと作りたいときなど、学習リソースの調達はネックになることが多いであろう。

そのなかで学習環境もセットで提供されているLabellioは非常に存在価値が高いといえる。


2015年12月20日日曜日

Courseraの講義資料をダウンロードする方法

Couseraで人気のAndrew Ng氏によるMachine Learningの講義資料をダウンロードする方法のメモ。

なお、このスクリプトはCousera全般に対応しているので基本的にはどれも落とせる様子(未検証)

前提条件

講義資料への正しいアクセス権を持っていること。
つまり、普通にブラウザ経由で講義を見れている人が、オフラインで見たいなどのケースを想定。アカウント持ってないけど、資料を見たいという人は、無料なのでまずアカウントを作ってください。

準備

cousera-dlをインストール。
%> pip3 install coursera
詳細はcousera-dlを見てください。

ダウンロード

%> cousera-dl -u <username> -p <password>  ml-005

usernameとpasswordは、couseraにログインするときに使う、メールアドレスとパスワード。
ml-005はAndrew Ng氏のMachine Learningの識別子。

後はスクリプトが終わるまで待つ。
私の環境では10-20分程度は時間がかかった。

2015年11月17日火曜日

[Octave] broadcasting

Octaveにはbroadcastingという概念があるらしい。

これは例で言うと、下記のような演算ができるようになるもの

>A = [ 1 2 3; 4 5 6; 7 8 9]
>B = [1]
>C=  [ 10 20 30]
>bsxfun(@plus,A,B)
[2 3 4; 5 6 7; 8 9 10]
全部の要素に1が足されている 
 
>bsxfun(@plus,A,C)
[11 22 33; 14 25 26; 17 28 39]
一行目には10、二行目には20、三行目には30が足されている。

ちなみに、bsxfun関数を使わなくとも、A + BやA + Cをやっても同じ結果が返される。デフォルトで有効になっているということだろうか。(後で調べる)

OctaveやNumpyではbroadcastingと呼んでいるが、Matlabではbinary singleton expansion、Rではsingle instruction multiple dataとかreplicationと呼ばれたりするらしい。
A note on terminology: “broadcasting” is the term popularized by the Numpy numerical environment in the Python programming language. In other programming languages and environments, broadcasting may also be known as binary singleton expansion (BSX, in MATLAB, and the origin of the name of the bsxfun function), recycling (R programming language), single-instruction multiple data (SIMD), orreplication. 
 
GNU Octave 19.2 broadcasting
Mathworks bsxfun

単純に行列演算してる分にはとっつきやすい印象があったOctaveだが、ちょっと突っ込んで使い始めると意外にぱっと見わかりにくい機能が多い

2015年10月16日金曜日

[読書感想文]エンジニアとして世界の最前線で働く選択肢 ~渡米・面接・転職・キャリアアップ・レイオフ対策までの実践ガイド



本書のような自分のキャリアを振り返った本を読む場合、何よりも気になるのは著者の経歴である。中には職歴が2年程度しかないのに、FacebookやGoogleのような有名企業に入ったというだけで、本の出版に至ってしまうような人も昨今少なからず見受けられる。そのような本を購入した時のがっかり感はなんとも言えない。

著者の名前で軽く検索をかけてみると、そんなことはないようだ。
新卒として日本HPに入社し、駐在員としての米国勤務を経た後、AmazonやMicrosoftなどの企業を渡りあるいているようだ。

仕事以外でも、「シアトル界隈のIT関係者が集まって勉強会や講演会などを行う非営利団体シアトルITジャパニーズプロフェッショナルズ(SIJP)の副会長」として精力的に活動されているようであり、少なくとも充分に耳を傾けてみたい経験をお持ちのように見えた。

ちなみに下記のWebサイトが面白かった。購入を迷ってる人はぜひとも読んで欲しいし、読んでしまった人でもまた違うエピソードが紹介されてたりするのでまた違った楽しみを味わえる。


Story of My Life 竜 盛博さん

シリコンバレーで管理職になる道


さて、かなり期待感を膨らませて本を読み始めたが、期待は決して裏切られなかった。
副題の通り、採用、面接、レイオフについて、客観的な情報に、自身が経験した主観を匠に織り交ぜており、一気に読み進めてしまった。採用や面接の情報は筆者自身が採用の経験が豊富であることもあり、非常に高価値な情報が満載である。

いくつか心に残ったことをメモしておく。


  • キャリアは運に大きく左右される。

これは私もしみじみと実感していることである。私も海外赴任に手を上げて、どう選ばれるかも不明なプロセスを何年も待ち続けたことがある。成果を出せばいいという簡単なものでもなく、その時の募集状況やプロジェクトの予算など自分の努力ではどうしようもない要因に悩まされた。


  • レイオフは避けられないので、されてもすぐ転職できるように日頃から準備するしかない。

私はまだレイオフを経験したことがない。しかしこれは真理なのだろう。心に止めておかないと行けない


  • 35歳プログラマ定年説のないアメリカでも、50歳を超えると転職は難しい

50歳になって米国で職が見つからない場合、日本での求職はもっと絶望的だろう。米国で働き続けるのならば、これが最大のリスクといえるかもしれない。


本書は、「はじめに」に筆者がいうように、米国でソフトウェアエンジニアで働くことの美点しか強調されない昨今の風潮に違和感を感じメリットとともにデメリットも知ってほしいという思いで書かれている。一貫して中立した立場で書かれており、非常に読んでて安心できる。どうするべきかなど安易な結論を書いたりせず、また、筆者自身もまだ悩み続けている様子が描写されており、同じく米国で働く身として大きな親近感を抱いた。



米国で働きたいと考える人には必読といえる一冊である。




2015年10月9日金曜日

Define-by-RunとDefine-and-Run

Neural Networkの設計思想を表す用語のようだ。

The "Design-by-Run" scheme is also an important design decision to neuron that has both pros and cons. Most existing neural network library today follows "Design-and-Run" scheme or a declarative approach that first compile a pre-determined network structure and then train against a dataset. In such way, one can pre-allocate any necessary cache space to ensure that there are minimal memory reallocations in training, thus minimize the memory footprint whenever possible and have substantially optimized performance. Meanwhile, such a declarative approach also makes the underlying neural network static during the lifetime of training. The "Design-by-Run" scheme instead treats the neural networks morphologically, i.e. they are composed and (can) deform on-the-fly. At a cost, it will ask for onsite memory allocation whenever needed
簡単に日本語でまとめると

Neural Networkの設計にはDesign-and-RunとDesign-by-Runという二つの設計思想がある。


Design-and-run


  • 今日の一般的なスキーマで宣言的なアプローチに分類される
  • 宣言的なアプローチとは事前に決定されたネットワーク構造を利用し、トレーニングを行うもの。
  • キャッシュスペースが事前に割り当てられるので、メモリの使用を最小化し、性能を最適化することができる。しかしトレーニングの間にネットワーク構造を変更できないという欠点がある。


Design-by-run


  • ニューラルネットワークを形態学的に(morphologically)扱うことができる。
  • ネットワークの構造変更が容易にできるが、メモリの割り当てなどは最適化できない。




https://github.com/bobye/neuron/wiki/Basics#design-rationale


2015年9月18日金曜日

MNISTの解凍済みデータ

ディープラーニングとかで話題のニューラルネットワーク。
このニューラルネットワークの代表的な応用例として、手書き文字の認識というのがあります。

これはその名のとおり、お絵かきツールなどでフリーハンドで書いた数字が、0から9のどれにあたるのかを判定するものです。


ニューラルネットの練習としてこの手書き文字(数字)認識を実装してみようとすると、訓練データが必要となります。この訓練データはまじめに用意しようとすると大変なんですが、幸いなことにMNISTにデータが公開されています。

ただし、このデータはIDX file formatというフォーマットで圧縮されているために、そのままでは利用できません。

その場合は、下記のような方法でデータを利用することができます。

Nodejs

mnistというnodejsのアプリを使うと、json形式の訓練データとテストデータを取得することができます。取得自体にはnodejsが必要ですが、テキスト形式で取得できるので、その後どんな言語にでも利用することができます。jsonで取得できるのはうれしいですが、nodejsの環境が手元にないと使えないところが少々不便。

Python

deeplearning.netにPickle形式のデータが公開されています。pythonでサンプルを書こうと思ってる方はこちらのほうが手っ取り早いでしょう。


しかし、IDXフォーマットとか非常に面倒ですね。データ圧縮率とか優れているのかも知れませんが、普通にzipとかにしてもいまどき大して困らなかった気がするんですが。理論上の性能を追い求めるあまり、利便性を犠牲にしている気がします。