Not your computer? Use a private browsing window to sign in. Learn more about using Guest mode
Not your computer? Use a private browsing window to sign in. Learn more about using Guest mode
移転しました http://please-sleep.cou929.nu/20091208.html
自作の(非)線形分類器のオンライン学習器に, Distributed Training Strategies for the Structured Perceptron (NAACL 2010) で提案されている分散オンライン学習法 (Iterative Parameter Mixing) を実装してみた. 機械学習 × MapReduce - ny23の日記 で調べたのがもう2年以上前のことだから今更感はんぱない.と言っても,自作の分類器に実装したのは線形学習の分散化で,多項式カーネルを使った非線形学習の分散化はパラメタを効率的に分配するのが難しく,まだ実装できていない.というか,線形学習の分散化も平均化を行う場合はパラメタの管理が面倒で,効率的な実装になかなか辿りつけなかった. マルチコア CPU 向けの分散オンライン学習は C++11 で新たに導入された thread と lambd
google-glogは非常に有名なロギングライブラリであり、その名前からわかる通りgoogleの人々によって開発されている。使い方は簡単で、 LOG(INFO) << "this is not a drill"; みたいな感じで、LOG()が返すオブジェクトoperator<<で記録したいオブジェクトをつなげていくだけで使える。とても便利である。実は、この便利さの裏には、実はいくつかのトリックが隠れている。適当に見た目を真似して作るだけでは、glogと同じような便利さは実現できないのである。今日は、その便利さを実現しているトリックを紹介したい。 なぜLOG()はマクロなのか まず、このLOG(INFO)というのは一見、関数もしくはクラスのコンストラクタかなにかに見える。しかしその実体は実はマクロで、以下のように展開される。 LogMessage(INFO).stream() LOGという
以前,トライと STL コンテナの比較をした際,std::map, std::tr1::unordered_map についてはメモリ使用量をちゃんと測っていなかったが,都合により,コンテナ本体のメモリ使用量を見積もる必要が出てきたので gcc 4.7 の実装を眺めてみた. 結論から言うと,gcc では std::map <_Key, _Tp> のメモリ使用量は, template<typename _Val> struct _Rb_tree_node { _Rb_tree_color; // ノードの色 (enum; int) _Base_ptr; // 親ノードへのポインタ _Base_ptr; // 左ノードへのポインタ _Base_ptr; // 右ノードへのポインタ _Val; // value_type (std::pair <const _Key, _Tp>) }; -> si
海野です。 自然言語処理などで機械学習を行おうとすると、非常に疎なベクトル表現を使いたくなります。疎、というのはほとんどの要素が0である、という意味です。前々から疎ベクトルライブラリのパフォーマンスに関して気になっていたので、幾つか調べてみました。 Jubatus Workshopでも話したとおり、機械学習を適用しようとすると、普通は対象のデータをベクトル表現に落とします。特に言語データの場合は、それぞれの単語や文字などを特徴次元とするため、非常に疎なベクトルとなってしまいます。純粋な配列(C++で言えばstd::vector)を使ってしまうと、大量にメモリを食ってしまうため疎ベクトル専用の表現を使うのが普通です。 今日は様々な疎ベクトルライブラリのパフォーマンス比較を行おうと思います。比較したライブラリは以下のとおり。真の意味で、疎ベクトルのライブラリは、Eigenとublasだけで、残
2010-12-12 Javaの復習 JavaとC++ JavaのFrame Javaの復習(2) 2010-11-29 メールの保存 Hirofumi Fujii Start Page 2010-11-19 C++のiostream C++のiostream感想-その3- 2010-11-18 C++のiostream感想-その2- 2010-05-30 標準入出力のバイナリモード 2010-05-26 MinGWについて 2010-05-21 C++入門第一回(2) C++入門第一回 画像添付 2010-01-13 gnuplot の iostream 化 C++ iostream 実装例 その 7 C++ iostream 実装例 その 6 C++ iostream 実装例 その 3 2010-01-07 乱数の例題(3) 乱数の例題(2) 藤井のスタートページ 有用リンク http
clangというのはllvm向けのC/C++/Obj-Cのためのフロントエンドで、最近はGoogle ChromeとかFirefoxもコンパイルできるレベルにまで成熟してきているらしい。 いくつかのブログで紹介されているのを見ても、ふーん、ぐらいにしか思っていなかったのだが、あんな大規模なソフトウェアがコンパイルできるというのは、考えてみるとすごいことである。大事なことなので強調しておくが、すごいことである。十分に実用的なレベルに到達していることだ。ビルドも早いし生成されたコードもg++と同程度には速いというし、試してみる必要がある。 という訳で、いくつか実際にソフトウェアをビルドしてみた。試してみた限りでは、 libstdc++のtr1/unordered_mapがビルドできない C++のコーナーケースで、clangが許容しないものが多い といった問題があったが、割とどれもすんなりとコン
多クラス分類器をカーネル化してみたら,訓練速度が劇的に低下してガックリしたので,手持ちの二値分類器に多クラス分類器を追加実装してみた(というより,もともとそのつもりで多クラス分類器を実装していた,という方が正しいかも).その際,コードの肥大化を抑えるため,可能な限り二値分類器(素性の重みは double)とコードを共有しようと,素性の重みに演算子がオーバーロードされている std::valarray (std::valarray ) を使ったら,多値分類器用のコードをほとんど書かなくて済んで非常に楽だった.std::valarray 便利過ぎる.今までその存在自体は知ってはいたものの, std::vector で充分という場面がほとんどで使うことがなかったが,今回の用途には完璧に嵌った. と,std::valarray の便利さに感心する一方で,あっちこっちで std::valarray
Get it The latest stable release is Eigen 3.4.0. Get it here: tar.bz2, tar.gz, zip. Changelog. The latest 3.3 release is Eigen 3.3.9. Get it here: tar.bz2, tar.gz, zip. Changelog. The latest 3.2 release is Eigen 3.2.10. Get it here: tar.bz2, tar.gz, zip. Changelog. The unstable source code from the master is there: tar.bz2, tar.gz, zip. To check out the Eigen repository using Git, do: git clone ht
前にやったfloatとdoubleの演算速度比較エントリの訂正エントリになります。 たまたま見つけたC++プログラミング日記様のこのエントリ 「double型はfloat型より高速」といった説をたま見かけますが実際のところは同じ命令で処理されているため計算速度に違いはありません。ただし浮動小数点モデル/fp:preciseを使用した場合は単精度を精密に再現するため著しくパフォーマンスが低下します。 この/fp:preciseがVSではデフォルトで選択されるので、floatが遅くなっている、ということだそうです。 早速私も試してみた。 環境: Core2Duo E6600(2.2GHz) / WinXP Home / VC++2010EE 単純ループ(10,000 * 10,000)で測定 前回との違いはVC++2008EE→VC++2010EEになっただけ。 浮動小数点モデル/fp:pre
floatは最適化前と後で変化ないのに、doubleは最適化すると凄く速くなる。なんだこれ。 floatのほうが速いって主張する人は最適化しない場合のを見ていて、doubleのほうが速い派は最適化後の値をみて主張してる訳か? floatが遅いというより、最適化するとdoubleが速くなるって感じだね。 どこかで「浮動小数演算用レジスタがdoubleだから、floatだと一旦キャストしたりしてコストが掛かるから遅い」みたいなことが書かれてたりするけど、この結果だけ見ると「doubleは浮動小数演算用レジスタが有効に使われるようになる」って言った方がしっくり来る。実際どうだか分かんないけどね。 ディスアセンブルすればもう少し解るかもしれないけど、そこまでする元気は無い。 float派も一応間違いではないけども、実際にリリースする時は最適化したものを出すわけなので、とりあえずfloatよりdou
k-means を実装していて,疎ベクトルと密ベクトルのトレードオフ(距離計算の速度差)が気になったので軽く実験してみた.具体的に知りたかったのは,どれぐらい疎なら疎ベクトルを使った方が距離計算が速くなるか,という問に対する答え.空間使用率の改善については sparse vector における index と value の型のサイズ比でほぼ自明に分かるが,速度に関してはコンパイラの最適化の加減もあるので良く分からない.以下がテストコード(ややずぼらな実装). [追記] 折角なので,Eigen 3.0-beta2 とも比べてみた. #include <sys/time.h> #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <tr1/random> #include <eig
テキストファイルでランダムに行をシャッフルしたい場合,sort -R やその改良 (以下,sort -n) は標準入力を読めたり,メモリ周りを気にしなくて良かったりと使い勝手は非常に良いのだけど,Vapnik の原理が頭にあると sort が O(n log n) なのが少し気になるので,O(n) な Fisher-Yates shuffle (Durstenfeld's version) ベースの std::random_shuffle と std::tr1::mt19937 (または random ())を使って行をシャッフルしてみた. Mersenne Twister でランダムに行をシャッフル (2) - ny23の日記 に sort -R|-n の代替になりうる実用版あり. 注意: MAX_MEM_SIZE=0 にすると,Random Write を行数回行うことになるので SS
プログラムを公開するので,c++ のスタイルについても少し考えてみる.C++ Coding Standard は英語で長く読む気が起きないので,Google C++ Style の日本語訳を眺める.気になったのは以下 (注: 括弧内は自分のコメント). 前方宣言で十分なときには、#include を使ってはいけない. インクルードの順序は Cライブラリ、C++ライブラリ、その他のライブラリの.h、プロジェクトの.h (c, c++ はごっちゃになってる直さねば) struct はデータを運ぶ受動的なオブジェクトのみ,その他は class (大体そういう感じにしてる). 簡潔な関数を書く (40行程度が望ましいそうだ.Emacs のデフォルトで1画面に収まる程度を目安にしている.読み易さより,全体の行数の短さを重視するので,二度以上呼ばれる手続きだけ関数にしてる.しかし200行とかある関数は
# 環境依存な内容な上,無駄に細かい話なので,「そういうこともあるかもねー」くらいに流しちゃってください. (追記 2011-01-11)新しい規格では std::string の Copy on Write(CoW: 書き込み時に複製)が実質禁止になるとのことです.後,gcc 4.5 の時点で CoW はやめてしまうみたいですし,「そんな時代もあった」くらいに軽く流しちゃってください.id:gintenlabo さん,コメントありがとうございます. (追記の続き)個人的には,std::string の CoW 動作は挙動が分かりにくくなるので止める方に賛成です.でも,std::vector なんかを拡張するときはどうするのかな…?コピーしてしまうのか,swap() を使うようにするのか…. (さらに追記 2011-01-11)おおっと,ムーブコンストラクタにムーブ代入演算子なんてものが…
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く