ラベル プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング の投稿を表示しています。 すべての投稿を表示

2018年1月28日日曜日

Automatorを使ってMacでKindleをプリンター代わりに使う

普段、論文は紙に印刷して読むのですが、家でも会社でも印刷物が溢れていたり、同じのを何回も印刷してよろしくない。 かねてよりKindleをプリンター代わりに使えないかと思っていたのですが、実はプログラミングなしでそれができることを知ったので、備忘録的に紹介します。

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ライセンスです。

yamlcast

read-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 Optimization
John 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の使い方

re2はGoogleが公開しているC++用の正規表現ライブラリです。速度も速い(らしい)し、ちゃんと日本語一文字も"."でマッチしてくれるので、社内でも好んで使われています。

たくさん機能があるようなんですが、Web上であまり情報がなかったり、詳細はheaderファイル見てね!みたいなことが書かれていて、なかなかマスターするのが難しいライブラリです。特に、マッチ箇所(いわゆるgroup)が複数あるときにどうすればいいのかすぐにわかりません。私も以前ここではまって、色々調べてどうにか動いたことがありました。ちょうど@chezouさんが困っていたようなので、メモのつもりで晒してみましょう。

2011年10月29日土曜日

pficommonをちょっとだけ紹介

報道機関の発表の通り、10/27日に分散オンライン機械学習基盤Jubatusを発表しました。これに関しても書きたいことは山ほどあるのですが、来週Jubatus Workshopがあるので、それまでは秘密です(ウソです、聞かれたら答えます)。

さて、同時に公開されたのがpficommonです。これは、弊社内で使われていた便利ライブラリで、あまりの便利さにこれがないと開発できないため、Jubatusでも使われています(もちろんSedueでも)。そして、Jubatus公開に伴い公開となりました。pficommonは明日からでも使うべきなライブラリなので、先にこちらを紹介します。


2011年6月12日日曜日

動的型情報で仮想関数呼び出しを速くできるか

C++は抽象化と高いパフォーマンスを両立させるにはtemplateを使うのがセオリーでした。そのため、標準ライブラリはtemplateを使っています。一方のJavaは、積極的に仮想関数を使っています。しかし、Javaは動的型情報を使った実行時インライン展開ができるため、C++と違って疎結合のまま高いパフォーマンスを出すことが出来ました。しかし、よく考えれば、C++でも実装クラスが限定されるなら、Javaと同様なことをハードコードすることでC++の仮想関数を高速ができるのではと思って試してみました。

結論から言うと、一応速くなりました。でも、インライン展開を抑制しなければいけないほどの効果が出るのは、かなり限定的のようです。


2010年7月29日木曜日

高速な復元抽出の直感的な説明

先日@niamさんと@tsubosakaさんのつぶやきを見てて,確率{pi}で復元抽出するWalker's alias methodというものを知りました.たまたま,今日,復元抽出する用事があったので,思い出して調べた次第.私も昔同じことをやろうとして,O(log n)でいけるからまぁいいやと思っていたのですが,このアルゴリズムだとO(1)でいけます.

解説はこのあたりのブログを参照.
さて,私は理解力が足りなくてこのあたりの説明を読んでもなんでこれでいいのかさっぱりわからなかったので,絵に描いて理解しました.確率{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個)用意すれば可能です.こんな感じ.
randが0から0.2なら,つまり5倍してintにキャスとして0だったら,もう一度0.1以上か否かチェックして,以下なら青,以上なら橙を返せばOK.このブロックを作ってるのがWalker's alias algorithmです.まず,piをn倍したものをqiとします.qi < 1のものに一つずつブロックを割り当てます.図だと,青赤緑.次に,残った qi > 1のものはqi < 1が消費したブロックのあまりにとりあえず詰めていき,1以下になったら新しいブロックに割り当てます.橙は青と赤のあまりに詰めたところで1以下になったので,新しいブロックをもらいました.灰は残りに割り当てて完了.割り当て数はn個,上記の方法なら各ブロックごとに新しいブロックを一つずつしか消費しないので,最大でもn個ブロックがあれば十分なことがわかります.保存すべき情報は,各ブロックごとに境界となっている位置,2種類の色です.片方の色はインデックスと一致させておけばよいので,境界ともう一方の色だけ覚えればよいのでした.

ちょっとあまりに見事な方法だったので記事にしてみました.