普段、論文は紙に印刷して読むのですが、家でも会社でも印刷物が溢れていたり、同じのを何回も印刷してよろしくない。 かねてよりKindleをプリンター代わりに使えないかと思っていたのですが、実はプログラミングなしでそれができることを知ったので、備忘録的に紹介します。
2018年1月28日日曜日
2015年10月23日金曜日
Chainerのtype_check
だいぶ前ですが、Chainerのver. 1.1.0から、型のチェック機構が入りました。 この機能は、各Functionが呼ばれた時に、動作条件を満たしているか確認するものです。 Pythonだから型のチェックがなくて大変だと思われがちですが、実際には行列サイズに対する制約の方が多く、典型的な静的型付け言語の型システムだけでこれらを弾くのは難しいです。
最初に設計しているときから、この機能が必須だろうと思っていて、メインで作っていたのでその話を書きます。
2015年4月9日木曜日
オンライン学習の本が出版されました
2015/4/8に、会社のメンバー4人で執筆したオンライン学習の本、「オンライン機械学習」が講談社より発売されました。 自分自身が機械学習の専門家であるという自負は微塵もないのですが、長らくJubatusの開発をしていましたので実装的な視点や実応用的な視点で書くことがあるだろうと思って少しだけ執筆に参加しました。 本当は、自然言語処理の応用を大量に書いたり、実装のツラミみたいなコラムを最初ガッツリ書いたのですが、いくつかのトピックがなくなったり応用多すぎと突っ込まれて消えていってしまいました。
オンライン機械学習 (機械学習プロフェッショナルシリーズ) | |
海野 裕也 岡野原 大輔 得居 誠也 徳永 拓之 講談社 2015-04-08 売り上げランキング : 260 Amazonで詳しく見る by G-Tools |
2014年12月23日火曜日
C++からyamlで設定を書くためのライブラリを作りました
未だに、わりとC++で書いてます。 以前から設定ファイル周りのライブラリをちゃんと作りたいと思っていました。 Jubatus含めて今までJSONベースでやっていましたが、コメントが書けなかったり、キーが文字列だったりというのがあって、YAMLにしたいなぁと。 いい加減どうにかしようと思って、エイヤでlibyamlのthin wrapperと、pficommonスタイルのcastを実装した、yamlcastというライブラリを作りました。 pficommonのjsoncastの代用です。 MITライセンスです。
yamlcastread-the-docsを知ったり、SphinxのC++ドメインを使ってみたかったりで、ひと通りread-the-docsにドキュメントも書いてみました。 世の中便利ですね。
2014年11月7日金曜日
インクルードガードをemacs lispで自動生成する
Goに移るかとおもいきや、普段はC++を書くこと多いです。 C++を書いていると、しょっちゅうインクルードガードを書くことになります。 今日はインクルードガードを簡単にするemacs lispを紹介。
2014年8月6日水曜日
AdaGradが12倍速くなる魔法
AdaGradは学習率を自動調整してくれる勾配法の亜種で、いろんな人が絶賛しています。 勾配を足し込む時に、各次元ごとに今までの勾配の2乗和をとっておいて、その平方根で割ってあげるだけと、恐ろしくシンプルです。
Adaptive Subgradient Methods for Online Learning and Stochastic OptimizationJohn Duchi, Elad Hazan, Yoram Singer. JMLR 2011.
丁度、 @echizen_tm さんがブログを書いてました。
AdaGrad+RDAを実装しました。通常のSGDなどは学習率をだんだん減衰させながら勾配を足していくわけですが、どの様に減衰させるかという問題にいつも頭を悩ませます。 AdaGradでは最初の学習率こそ外から与えますが、減衰のさせ方や減衰率といったハイパーパラメータから開放されます。 今日の話は、そんなAdaGradがちょっとの工夫で12倍速になった話です。
2014年2月15日土曜日
absの罠
こないだ、@kumagiさんがJubatusのクラスタリングのテスト書いたらNaNになるというので、デバッグしてたらabsにハマってたという恐ろしいバグを発見したので書いておきます。
C++で絶対値を求める関数は3つあります。
- ::abs Cの関数でintを引数に取る
- ::fabs Cの関数でdoubleを引数に取る
- std::abs C++の関数でint引数とdouble引数でオーバーロードされている
さて、大事なのは std::abs はオーバーロードされているので、doubleを渡すと::fabs相当の処理をしてくれる、ところが::absはCの関数なのでdoubleを渡してdoubleで結果を受け取ろうとすると、intにキャストして絶対値を計算してからdoubleに戻す、という恐ろしい挙動を示すことです。さて、std::absを呼んでるつもりで、absと書くとどうなるか。usingしていればもちろんstd::absになりますが、そうでない場合には::absになる可能性があります。すると、渡されたdobule値はintにキャストされて、華麗にオーバーフローして、もう残りは目も当てられません。 素直にfabsを使うか、absを使うときは必ずstd::absと面倒でも明示的に書くのがいいようです。不正確なabsという書き方はほんとうに怖いので、grep "[^:f]abs(" で簡単にチェックできるので、活用するのをおすすめします。
サンプルコード2011年11月25日金曜日
re2のxxxNの使い方
2011年10月29日土曜日
pficommonをちょっとだけ紹介
さて、同時に公開されたのがpficommonです。これは、弊社内で使われていた便利ライブラリで、あまりの便利さにこれがないと開発できないため、Jubatusでも使われています(もちろんSedueでも)。そして、Jubatus公開に伴い公開となりました。pficommonは明日からでも使うべきなライブラリなので、先にこちらを紹介します。
2011年6月12日日曜日
動的型情報で仮想関数呼び出しを速くできるか
結論から言うと、一応速くなりました。でも、インライン展開を抑制しなければいけないほどの効果が出るのは、かなり限定的のようです。
2010年7月29日木曜日
高速な復元抽出の直感的な説明
解説はこのあたりのブログを参照.
さて,私は理解力が足りなくてこのあたりの説明を読んでもなんでこれでいいのかさっぱりわからなかったので,絵に描いて理解しました.確率{pi}で復元抽出するためには,piに比例した面積の図形を壁に貼ってダーツをすればいいのです.{0.1, 0.05, 0.3, 0.1, 0.45}だったとします.するとこんなの.
まさか毎回ダーツ投げさせる訳にもいかないので,randを呼びます.でも,これでは何がうれしいのかわかりません.四角形にしてみましょう.
ちょっとうれしさがわかってきました.rand.nextDouble()の値が,たとえば0.2から0.4の間なら橙にすればよいのです.このおおざっぱな0.2ずつの区間のことをここではブロックとでも読んでおきましょう.ところが,0から0.2の間ならどうでしょう.3色もあります.もっと詰まっていたら.やっぱり2分探索が必要な気がします.そこで,一つのブロックの中に高々2種類しかないような区切り方はできないでしょうか.できます.これができれば1回比較すればよいだけです.ブロックをnこ(ここでは5個)用意すれば可能です.こんな感じ.
ちょっとあまりに見事な方法だったので記事にしてみました.