2009.10.07
SQLite3のINSERT文を高速化
こちらのFAQを参照.小ネタですが,以前に1回調べて,また忘れていたので,メモ.
Blog presented by Naoaki Okazaki
2009.09.27
Classiasという分類のための機械学習アルゴリズムの実装を公開しました.今のところ,L1/L2正則化ロジスティック回帰(最大エントロピー法),L1/L2正則化L1損失線形カーネルサポートベクトルマシン(SVM),平均化パーセプトロンをサポートしています.学習アルゴリズムとしては,平均化パーセプトロン,L-BFGS法,OWL-QN法,Pegasos,Truncated Gradient(L1-FOLOS)を実装してあります.カーネルは使えませんが,線形識別モデルを高速に学習できるようになっています.二値分類,多クラス分類,候補選択(明示的に与えられた候補の中からスコア最大のものを選ぶタスク)をサポートしています(SVMは今のところ二値分類のみ).
このツールはもともと,最大エントロピー法を自分で使うために実装したもので,作り始めてからもう2年くらい経過しています.去年のColingやEMNLPの論文の機械学習の箇所は,このツールで実験しています.文字列による素性,自動分割交叉検定など,自然言語処理の実験に便利な機能に重点を置いて作ったつもりです.詳しくは,使い方を参照してください.
ソースコードも,インスタンスのデータ構造,損失関数,学習アルゴリズムなどのコンポーネントを,C++テンプレートクラスとして実装するという設計になっています.L-BFGS法を実装しているlibLBFGSを除けば,ヘッダファイルをインクルードするだけでClassiasを利用したプログラムが書けるようになっています.クラスリファレンスやサンプルコードはドキュメントを参照してください.新しい学習アルゴリズムも,簡単に追加できるようになっているのですが,ドキュメントをもう少し充実させていかなければなりません・・・.
LIBLINEARやLIBSVMと一緒にrcv1.binaryでパフォーマンスを測ってみました.まず,分類精度に関してはロジスティック回帰とL1損失SVMに大差がなく,平均化パーセプトロンはちょっと悪いという予想通りの結果で,Classias,LIBLINEAR,LIBSVMのどれも同程度の分類精度を出しています.
学習速度に関しては,LIBLINEAR速すぎです.L1正則化のロジスティック回帰ではそれほどスピードの差はありませんが,L2正則化のロジスティック回帰では,LIBLINEARの方が4倍くらい速くなっています.アルゴリズム的には,L-BFGS法と信頼空間ニュートン法の戦いで,後者はヘッシアンを使っているので,速くなるのも頷けます.ただ,収束の判定条件が違うと思うので,後できちんと検証してみようと考えています.
SVMに関しては,LIBLINEARの圧勝(LIBLINEARの方が10~20倍高速)でした.ClassiasのPegasosも健闘していますが,学習率や収束判定の調整で10~20倍の速度差を埋められるかは疑問です.Dual coordinate descentはやっぱり強いですね.こちらも後で実装して遊んでみたいです.
実装するといろいろ分かることがあるので,これからも実験しながら育てていきたいと考えています.
2009.09.25
Basement Jaxxを初めて知ったのは,イギリスのテレビで流れていた”Oh My Gosh”のPV.すごく面白いPVだったのが印象的だったけど,特に深追いもせず.最近になって,”Where’s Your Head At”や”Red Alert”も同じアーティストだったことを知り,YouTubeを漁って一通りPVを見てから,DVD購入を決意.YouTubeにリンクを貼ると後が面倒かもしれないので,YouTubeで検索して観て気に入ったらDVDを買って下さい(amazon.co.ukでGBP9.63).
#1の”Red Alert”は,隕石が落ちてきて,みんなが踊るゾンビと化す内容.曲もPVもすごすぎ.1999年に日本でもラジオチャートで1位になっていたらしい.当時はぜんぜん知らなかったなぁ・・・.#2の”Rendez-Vu”は,じゃんけんでケリをつけて,最後は犬の夢だったというオチ.#3の”Jump N’ Shout”は,最初は英語ではないと思っていたら,所々英単語のようなものが聞こえるので歌詞を調べて見たら,ほとんど英語だった・・・.歌詞を見てもスラングが多くて全然意味が分からない.#4の”Bingo Bango”は,ラテン系のノリのよい曲.PVは東京の風景や人々を撮したもので,撮影時期は,サンバDEアミーゴが映るので1999年以降のはず.自分が東京に来てすぐの頃って,こんなに古くさかったっけって驚きます.#6の”Romeo”は,インドの踊りを取り入れたPV.
#8の”Where’s Your Head At”は,絶対に一度は観るべきPV.ポップ音楽の最先端を見せると言って呼ばれて来た場所は,ミュージシャンの脳を猿に転送するという実験室だったというストーリー.曲もイイと思うのだが,意外と売れていなくてUKでは9位,USのダンスチャートでも3位止まりだったらしい.#10の”Good Luck”のPVも全般的にインパクトがあるが,ボーカルの姿と声が特に印象に残る.#11の”Plug It In”のPVは,最後にブタのお面をかぶるところがすごい.#12の”Cish Cash”のPVはすごく綺麗でカッコイイ.#13の”Oh My Gosh”はBasement Jaxxを知るきっかけになったPV.歌詞と老人ホームの風景のマッチが面白い.
と,どれもこれも観ても聴いても楽しいビデオクリップ集になっています.このDVDにPVとしては収録されなかったけど,”Do Your Things”という曲のPVも面白いのでオススメです.
2009.09.24
このCDはシンガポールに学会に行っていたときに,ショッピング街のHMVで思い立ったように購入(いくらだったか忘れました).その時,シンガポールのHMVのアジア部門1位は,平井堅のアルバムでした.
Travisの曲はたまに耳にすることがあったけど,まとめて聴いたことが無かったのと,新型レガシィのCMで流れていた”Walking In The Sun”にknocking downされて,ベスト盤の購入を決意.曲作りがどことなくスピッツと似ているし,日本でもっと注目されてよいアーティストだと思います.
#1の”Sing”は殿堂入りの名曲.PVはなぜか料理を投げ合うというもの.#6の”Walking In The Sun”のギター・アルペジオは覚えてみたい! オススメの一枚です.
CD WOW! というどこの国の会社なのかよく分からないネットショップで試しに1,850円で購入.amazon.co.uk よりも出荷に時間がかかったけど,無事に到着.なぜか発送元はオーストラリア.
恒例の知っていた率はDisc 1で86.4%,Disc 2で77.2%とかなり上昇.
Disc 1の好きな曲は,2, 4, 5, 6, 9, 15, 16.最初の曲はLady GagaのPoker Face.Lady Gagaという名前は,容易に想像がつくようにRadio Gagaからとったらしいが,Lady Gagaの曲はあんまり好みではない.今年最もブレークしたアーティストであることは間違いない.#2の”Evacuate the dancefloor”は,いかにもな歌詞.#4はお気に入りのCalvin Harrisの新曲.PVはアブナイので,イギリスでは放送禁止になったらしい.#5は,80年代のエレクトロポップっぽいのに斬新なLa Rouxの”In For The Kill”.#15を歌うAgnesはスウェーデンのアイドルオーディション番組の2005年優勝者で,インターナショナルなヒット曲はこの”Release Me”が初らしい.#16はFreemasons feat. Sophie Ellis-Bextorの”Heartbreak”.Sophie Ellis-Bextorというと,”Groovejet (If This Ain’t Love)”がとにかく名曲(あと,美人です).
Disc 2の好きな曲は,7, 8, 14, 15, 16, 18, 20.#5は,The Black Eyed Peasの久々の新曲”Boom Boom Pow”.音楽という感じはしないが,なぜかインパクトに残る曲.イギリスでは5/17に1位になって,その後2週間連続で2位になるものの,6/7にまた1位に返り咲くというロングヒット.The Black Eyed Peasの1位は,あの有名な”Where Is The Love?”に続いて2つ目らしく,意外と1位をとってなくてビックリ.#9は,Elton Johnの”Tiny Dancer”のリミックス.このくらい変えてくれると聴いていて楽しい.#10のPitbullの”I Know You Want Me”も,今年を代表する曲になりそう.#18は,いつもいい曲を聴かせてくれるJames Morrisonの曲.去年の9月にリリースしたアルバム「Songs for You, Truths for Me」からのシングルカット.このアルバムを買ってしまいそうです.
CRFsuite 0.9をリリースしました.libLBFGS 1.8と組み合わせてビルドすることが出来なくなっていたので,その問題の修正のみです.また,試験的にLinuxバイナリの配布を始めてみました.libLBFGSと静的にリンクしてあるので,このバイナリを落として実行するだけで動くはずです.
いろいろやっていたら,もう2ヶ月も経っていた・・・.
2009.07.14
CDB++のバージョン1.1をリリースしました.こちらも,libLBFGSで大変お世話になっている今道様からパッチを頂きました.
一つ目はgotoを使っていたためのコンパイルエラーの修正です.よく「gotoは読みづらくなるから使うな」という主張を見かけますが,私はエラー時の終了処理など,用途がはっきりしている場合は積極的に使うべきだと考えています.error_exitみたいなラベルを付ければ,エラー時の処理内容が分かりやすくなりますし,何重にもネストしたループから脱出する場合も,gotoを使わないとロジックが分かりづらくなります.
ただ,C++では変数の宣言が関数内の何処にでも書けるという仕様から,gotoの使い方が難しくなります.具体的には,次のようなコードの場合です.
// Processing #1...
if (error_condition_1) {
goto error_exit;
}
// Processing #2...
if (error_condition_2) {
goto error_exit;
}
// Continue the procedure...
int variable = foo(...);
return true;
error_exit:
// Error handling...
return false;
このコードでは,error_exitにジャンプしたときに,variableの値が不定になるので,たとえerror_exit以降の処理でvariableを参照しなくても,gccのバージョンによってはコンパイルエラーになります.このミスは今までも何回かやっていたのですが,ついつい忘れてしまうんですよね.C++ではやっぱりgotoは慎重に使うスタンスが安全なのかもしれません.
また,ハッシュ関数をSuperFastHashからMurmurHashに置き換えました.私はこのハッシュ関数を知らず,これも今道さまに教えて頂きました.MurmurHashはSuperFastHashよりも2倍くらい高速だと謳われていて,コードもすごくシンプルです.「むらむらハッシュ」ってすごい名前だなぁと思っていたら,「multiply + rotate」が語源のようです.ハッシュ関数が変わってしまったので,CDB++の1.0と1.1のデータベース間に互換性はありません.
サンプルコードでは,成功したときに何も表示されない素っ気ない仕様だったので,「OK」を表示するようにしました.また,データベースの構築と,読み込みの手順を,別々の関数に分離し,コードを読みやすくしてみました.
2009.07.13
libLBFGSのバージョン1.8をリリースしました.今回のリリースでは,backtracking法による線形探索でステップ長を選ぶときに,Armijo (sufficient decrease) 条件,regular Wolfe (sufficient decrease + curvature)条件,strong Wolfe条件の3つの基準を選べるようにしました.これらの基準の詳細に関しては,libLBFGSのドキュメンテーションもしくは『Numerical optimization』の本を参照してください.
今回のアップデートでは,いつもお世話になっている今道様から頂いたパッチをそのまま採用させて頂きました.
2009.07.09
CDB++という,静的ハッシュデータベースライブラリをリリースしました.ライセンスは修正BSDです.
静的ハッシュデータベースなので,いったんデータベースを構築したら,要素の追加や削除は行えません.その代わり,コンパクトなデータベース,高速な構築,高速な検索ができるようになっています.データ構造は,Constant Databaseを採用しています.Constant Databaseの実装はいくつかありますが,クロスプラットフォームでお手軽に使えるものがなかったので,作ってみました.また,このライブラリはcdbpp.hというインクルードファイルのみで構成されているので,このファイルをインクルードするだけでアプリケーションに組み込めます.
ハッシュデータベースには,Oracle DBやTokyo Cabinetなど,優れた実装がたくさんあります.しかし,単にキーと値のペアをファイルに書き出し,後で簡単な検索を行うだけであれば,CDB++でも十分だと思います.
2009.06.23
とあるプログラムで,C++からregexを使いたい状況が発生.boostにあるのは知っているけど,出来るだけboostを使わないコーディングをしているので,あれこれ調査していたら,tr1に盛り込まれる予定だったことを思い出す.
Visual Studio 2008 SP1では,tr1のサポートが追加され,すんなりregexが使えるようになっている.コードはこんな感じ.すごく便利.
#include < iostream>
#include < regex>
int main(int argc, char *argv[])
{
std::tr1::regex rx("abc");
std::cout
<< "search(\"abcabc\", \"abc\") == "
<< std::boolalpha << regex_search(std::string("abcabc"), rx)
<< std::endl;
return 0;
}
g++ではtr1のヘッダファイルはtr1というディレクトリに入っているので,<tr1/regex>をインクルードするようにプログラムを変更したら,コンパイルは通るものの,結果がおかしい.上のサンプルコードを動かしたみたら,見事にfalseを返してくれる.
libstdc++のドキュメントを調べて見たら,現状ではtr1のregexはlibstdc++でサポートされていないらしい.この地雷を踏んで余計な時間を使ってしまった.当面はboostと両刀使いで行くしか無いかないが,下手にコンパイルが通るだけに,configureで判別するのが面倒くさい.
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| « 10月 | ||||||
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | 31 | ||