タグ

ブックマーク / tkng.hatenablog.com (26)

  • 第2回DSIRNLP勉強会で発表してきました - 射撃しつつ前転 改

    佐藤さんに誘われてDSIRNLP勉強会で発表してきました。 最近社内で高村輪講をやっていて、自分自身改めて良い勉強になったこと、以前TokyoNLPでランク学習の話をした際にはもしかしたら聴衆の半分ぐらいを置き去りにしてしまっていたのではと最近気づいたことなどから、今回はSVMって案外怖くないよね、みたいなことを順を追って説明してみる話にしてみました。既に知ってる人にとっては明らかに退屈な話だったと思いますが、分かりやすかったで賞的なものをいただけたので、わかりやすく、というところはある程度うまくいったのかなと思います。 発表資料はspeakerdeckに上げました。→機械学習と最適化の基礎 以下自分の発表についての感想と反省。 他の人の発表の最中に資料を作ってるとどうしても話が半分ぐらいしか聞けないので事前に作ってくるべき。 ただ今回は風邪のせいもあり仕方がなかった。 nokunoさん

    第2回DSIRNLP勉強会で発表してきました - 射撃しつつ前転 改
  • google-glogに潜むトリックを解明する - 射撃しつつ前転 改

    google-glogは非常に有名なロギングライブラリであり、その名前からわかる通りgoogleの人々によって開発されている。使い方は簡単で、 LOG(INFO) << "this is not a drill"; みたいな感じで、LOG()が返すオブジェクトoperator<<で記録したいオブジェクトをつなげていくだけで使える。とても便利である。実は、この便利さの裏には、実はいくつかのトリックが隠れている。適当に見た目を真似して作るだけでは、glogと同じような便利さは実現できないのである。今日は、その便利さを実現しているトリックを紹介したい。 なぜLOG()はマクロなのか まず、このLOG(INFO)というのは一見、関数もしくはクラスのコンストラクタかなにかに見える。しかしその実体は実はマクロで、以下のように展開される。 LogMessage(INFO).stream() LOGという

    google-glogに潜むトリックを解明する - 射撃しつつ前転 改
  • sshを使いこなすための7つの設定 - 射撃しつつ前転 改

    五月病が抜け切らないIT系新入社員に贈るシリーズ第1段。 ~/.ssh/configにはいろいろな設定が書けるが、周囲を見渡した限り、あまり活用されているようには見受けられない。そこで、今回は便利な設定をいくつか集めてみた。 長いホスト名に短い名前をつける Host exp1 HostName verrrryyy.looooong.hostname.example.jp ssh verrrryyy.looooong.hostname.example.jpの代わりにssh exp1でログインできるようになる。 ちなみに、zshの場合、configファイルに登録されたホスト名はsshコマンドを打つときに補完されるので更に便利。 特定のホストへログインするときのユーザ名や鍵をカスタマイズする Host github.com User tkng IdentityFile ~/.ssh/id_rsa

    sshを使いこなすための7つの設定 - 射撃しつつ前転 改
  • clangでソフトウェアをビルドしC++を知る - 射撃しつつ前転 改

    clangというのはllvm向けのC/C++/Obj-Cのためのフロントエンドで、最近はGoogle ChromeとかFirefoxもコンパイルできるレベルにまで成熟してきているらしい。 いくつかのブログで紹介されているのを見ても、ふーん、ぐらいにしか思っていなかったのだが、あんな大規模なソフトウェアがコンパイルできるというのは、考えてみるとすごいことである。大事なことなので強調しておくが、すごいことである。十分に実用的なレベルに到達していることだ。ビルドも早いし生成されたコードもg++と同程度には速いというし、試してみる必要がある。 という訳で、いくつか実際にソフトウェアをビルドしてみた。試してみた限りでは、 libstdc++のtr1/unordered_mapがビルドできない C++のコーナーケースで、clangが許容しないものが多い といった問題があったが、割とどれもすんなりとコン

    clangでソフトウェアをビルドしC++を知る - 射撃しつつ前転 改
  • 文書アップロード&コメントサービスのcrocodocが便利過ぎる - 射撃しつつ前転 改

    crocodocというWebサービスを見つけたのだが、とても便利なのでおすすめしたい。 crocodocで出来ることは以下の二つだけである。 ワードやPDFなどの文書ファイルをアップロードする アップロードしたファイルにウェブ上でコメントをつける イメージとしては、学生が書いた論文をメールで先生に送って添削してもらう代わりにcrocodocにアップロードしてウェブインターフェースで添削してもらう、というような感じである。メールでやっても何も変わらなさそうに思えるが、crocodocを使うと、 複数人で同時にコメントをつけられる。誰かがコメントを付けると、数秒後には他のブラウザでも反映される。 docxやpdfなどの再現性がかなり高い。Microsoft OfficeとかAcrobatを持ってない人にも気軽にコメントを付けてもらえる。 というメリットがある。複数人で、というところは結構大きく

    文書アップロード&コメントサービスのcrocodocが便利過ぎる - 射撃しつつ前転 改
  • SVMの正則化項がマージン最大化のために必要な理由 - 射撃しつつ前転 改

    ラージマージンとマージン最大化について2回ほど書いてきた。 あの後もSVMとマージンパーセプトロンについてうだうだと考えていたのだが、もうちょっとシンプルな説明を思いついた。 SVMの特徴はヒンジロスを採用している点と、正則化項があるところである。 ヒンジロスはもう何度も出てきているが、max(0, 1-ywx)みたいな奴で、1-ywx<=0の時にだけ損失を0とするものである。 正則化は、wの各要素をできるだけ0に近づけようとする力で、要するに、この力に打ち勝つだけの価値を持つ素性だけが生き残れる。マージンパーセプトロンとSVMの大きな違いは、この正則化項のあるなしである。 前回は、ALMAの論文を持ち出してマージンパーセプトロンは近似的な最大マージンでしかない、と書いたが、そもそもSVMは最大マージンなのか。とりあえず、ヒンジロスだけで正則化項が存在しない場合(つまり、ほぼマージンパーセ

    SVMの正則化項がマージン最大化のために必要な理由 - 射撃しつつ前転 改
  • パーセプトロンはマージン最大化の夢を見るか? - 射撃しつつ前転 改

    前回の記事は長くなりすぎたので、長文を読みたくない人のために、まず三行であらすじをまとめる。 ソフトマージンSVMがマージン最大化してるって言うけど、ちゃんと理解するの結構難しくない? なんか自分の中で議論を進めると、正則化項つきパーセプトロンもマージン最大化に分類されるんだけど大丈夫? こうなったらもう、正則化項つきパーセプトロンを実装して、実験してみるしかない…次回に続く という話であった。 さて、前回の落ち穂ひろいから始めよう。前回「マージン最大化はSVMの特権ではなく、MIRAとかAveraged Perceptronとか、ラージマージン分類器と呼ばれる分類器はいくつもある」と書いたが、ここでは、「マージン最大化」という概念と、「ラージマージン」という、似たようだが違うかもしれない概念が混同して提示されている。どうも、この二つの用語は分けて考えた方が良さそうに思える。 その観点から

    パーセプトロンはマージン最大化の夢を見るか? - 射撃しつつ前転 改
  • SVMのマージン最大化についてしつこく考えてみる - 射撃しつつ前転 改

    SVMの説明というと、よく出てくるのはマージンの最大化である。しかし、実装を行う場合には、どちらかというと目的関数をどうやって最小化しようかな、というところの方が重要(注:主形式を勾配法で最適化する場合の話です)で、この間にある微妙なギャップを超えるのは微妙ながらも大変なような気がしている。このギャップをどうやったら埋められるのかというところを考えてみたい。考えながら書いてきちんと推敲しておりませんのでご注意ください。 SVMってなに、という説明でよくあるパターンは、線形識別器(というか、SVM)の学習というのはパラメーターをいじって分離(超)平面をいい感じに引くことですよ、というところから始まり、いい感じってなんだろうか、マージンが最大化されるように引くといいっぽいよね、けど分離不可能な場合はマージンの値が負になることがあるよね、そこでソフトマージンというものを定義して、マージンが負にな

    SVMのマージン最大化についてしつこく考えてみる - 射撃しつつ前転 改
  • TokyoNLPで発表したConfidence WeightedによるLearning to Rankの資料を公開しました - 射撃しつつ前転 改

    めんどうなのでずっと避けてたんですが、3ヶ月ぐらい前に勉強会で発表した資料を公開しました。埋めこむとページが重くなるので、リンクを貼るだけにしておきます。 → http://www.slideshare.net/tkng/confidence-weighted Learning to RankでPairwiseの学習にConfidence Weightedを使ったらいいんじゃね?みたいな感じで実験してみたら恐ろしいぐらいにダメな結果が出て、やっぱり試してみないとわからないものね、というような顛末を書いてあります。 日語でのLearning to Rankの初心者向け資料は見たことがないので、興味がある人はとりあえず読んでみたらどうでしょうか、と書こうと思いましたが、読み返してみると説明が不十分であまり初心者に優しい感じにはなれてなかった。以下の英語の資料を読んだほうが良いかもしれません。

    TokyoNLPで発表したConfidence WeightedによるLearning to Rankの資料を公開しました - 射撃しつつ前転 改
  • サルでも分かる多段ssh - 射撃しつつ前転 改

    仕事をしていると、お客さんの環境にログインするため、 踏み台マシンを経由する必要がある 踏み台マシンへのログインすら、特定範囲のIPアドレスからしか受け付けてくれない といった厳しい条件を満たさなければならない場合があり、多段にsshをしなければいけないことがある。しかし、単純な多段sshには、 毎回順繰りに多段ログインするのは結構めんどくさい scpでいちいち中継サーバーにコピーしていく必要があり、中間サーバーのディスク容量が足りない場合に大きなファイルがコピーできない といった問題がある。 実は、sshには設定ファイルがあり、設定を行うことで、間に何台のサーバーを挟んでいようとも、あたかも直接アクセスしているかのように接続することができるのであるが、世間的にはあまり知られていないようだ。知らないのは非常にもったいないので、簡単に説明しておく。 設定ファイルは~/.ssh/configに

    サルでも分かる多段ssh - 射撃しつつ前転 改
  • SVMにおける損失と正則化 - 射撃しつつ前転 改

    前に書いたSVMの記事で、「L1とかL2というのは間違えたときのペナルティをどう定義するかを意味しており」と書いていたが、L1とかL2って正則化項の話なんじゃないの、と疑問に思った。1ヶ月ほど時間をおいてのセルフツッコミである。確認しようとしてカーネル多変量解析を読むと、やはり正則化項についてはL1とL2の両方の説明が書いてあるが、損失に関しては普通のHinge Loss(=L1 Loss)しか書いてない。 と言う訳で、ああ、間違えちゃったなぁ、と暗澹たる気持ちで"A dual coordinate descent method for large-scale linear SVM"を読み直してみたところ、やっぱりL1-SVMというのは損失が普通のHinge Lossで、L2-SVMというのはHinge Lossの2乗を損失とすると書いてあった。両方とも正則化項についてはL2正則化を使って

    SVMにおける損失と正則化 - 射撃しつつ前転 改
  • 劣微分を使った最適化手法を紹介しました - 射撃しつつ前転 改

    新年明けましておめでとうございます、というのもはばかられるような時期になってしまいましたが、今年もこんな感じでのんびりとやっていきたいと思います。よろしくお願いします。 会社ブログの方で、劣微分を使った最適化手法として、FOBOSを紹介しました。線形識別器とは、というところから話を始めたら、実際の論文紹介にたどり着くまでに4回もかかってしまいましたが、何も知らないところからFOBOSでSVMが書けるというところまで、早足ですが一応一通り紹介したつもりなので、FOBOSに興味があるけどまだ論文読んでない、という人はぜひチェックしてもらえればと思います。使えるカーネルは線形カーネルか多項式カーネルぐらいに制限されてしまいますが、実用的なSVMが簡単に作れるというのは結構大きいですよ。ちなみに、FOBOSのところではSVMしか説明していませんが、第2回ではロジスティック回帰をSGDで最適化、とい

    劣微分を使った最適化手法を紹介しました - 射撃しつつ前転 改
  • 言語処理のための機械学習入門を読んだ - 射撃しつつ前転 改

    言語処理のための機械学習入門というが出版される、という話はtwitterで知っていたのだが、8月ぐらいに出るのだろうとばかり思っていたら、なんかもう発売されているらしい。Amazonでは早速売り切れていたので、某大学生協の書籍部まで行って購入してきた。おかげで、この週末は280円で過ごすハメになってしまった。 まだざっと眺めただけだが、 ラベルを人手でつけるのに隠れマルコフモデルと言うのは来はちょっとおかしいんだけどNLPの分野だとそう表現する事が多いよ 対数線形モデルと最大エントロピーモデルは同じものだよ 出力変数の間に依存関係がなければCRFではなく対数線形モデルとか最大エントロピーモデルと表現するべきだよ といった、これまでの教科書にはあまり載っていなかったような事が載っているのはとても良いと感じた。こういった情報は、これまではどこかの大学の研究室で学ぶか、もしくはウェブ上の資料

    言語処理のための機械学習入門を読んだ - 射撃しつつ前転 改
  • ディスクキャッシュを簡単にクリアする - 射撃しつつ前転 改

    3年前にディスクキャッシュをクリアするためにはunmountしてからmountしなおせば良いという事を知ったが、これは自由に取り外しができるパーティションがないと使えない。強制的にキャッシュをクリアする方法を知ったのでメモしておく。 sudo sysctl -w vm.drop_caches=3; sudo sysctl -w vm.drop_caches=0; 参考:ext3の dir_indexを試す 追記: sudo sysctl -w vm.drop_caches=3 だけでOKだとkosakiさんからコメントで教えてもらいました。

    ディスクキャッシュを簡単にクリアする - 射撃しつつ前転 改
  • Boostingの並列化 - 射撃しつつ前転 改

    パターン認識と学習の統計学のp.153に「バギングは並列化が可能であるので、並列計算機を用いることによって計算時間を大幅に短縮できるが、ブースティングは逐次的にしか計算できないので、計算時間は生成する弱仮説の数に比例して長くなることになる」と書いてあったので、ブースティングって並列化できないんだなぁ、と思っていたんだけれど、こないだAdaBoostをちょっと真面目に考えてみたら、弱学習器を選べば並列化が可能な場合もあるという事に気づいた。 そもそも、よく読んでみると、パターン認識と学習の統計学には「ブースティングは並列化できない」とは一言も書いていない。これは実は意図的だったりするんじゃないかと思う。「生成する弱仮説の数に比例して計算時間が長くなる」というのはまったくその通りで、データの重み付けを逐次的に変更しながら学習を繰り返すというAdaBoostの仕様上、これはどうしようもない。ただ

    Boostingの並列化 - 射撃しつつ前転 改
  • Confidence Weighted Linear Classificationを読んだ - 射撃しつつ前転 改

    ICML2008で発表されたDredzeらのConfidence Weighted Linear Classificationを読んだ。これは線形分類器を学習する新しいオンライン学習型アルゴリズムの提案である。すぐに使える実装としてはOLLというオープンソースのライブラリがあり、実際に良い実験結果が出ているようだ。 Confidence Weightedのアイデアは、よく出てくる素性に関しては一回の更新における数値の変更量を減らしてやり、あまり出てこない素性に関しては、一回の更新でぐっと値を変更してやろう、というものである。 こういった新しい更新方法を考案した動機を明らかにするために、Perceptronを使って、単語を素性として評判分類の学習を行うような問題を考えてみる。肯定的な評価のサンプルとして"I liked this author."というものがあったとすると、このサンプルの分類

    Confidence Weighted Linear Classificationを読んだ - 射撃しつつ前転 改
  • CRFとSVM-Structの性能比較 - 射撃しつつ前転 改

    以前に系列ラベリングの各種アルゴリズムの比較でCRFが予想外に性能が悪かったと報告している論文の話を見たのだが、今日検索をしていて、"CRF versus SVM-Struct for Sequence Labeling" (S. Keerthi, S. Sundararaja, 2007, pdf) というテクニカルレポートを見つけた。これによると、"Comparisons of Sequence Labeling Algorithms and Extensions" (Nam Nguyen and Yunsong Guo, ICML 2007) でのCRFとSVM-Structの性能の違いは素性関数の違いに起因するもので、素性関数として同じ物を使えば、CRFもSVM-Structもだいたい同じくらいの性能を発揮するそうだ。 2007年のレポートなので、今更という感じではあるが、一応紹介

    CRFとSVM-Structの性能比較 - 射撃しつつ前転 改
  • /usr/bin/mailでメールを送る - 射撃しつつ前転 改

    何回もハマるのでメモしておく。status=bounced とか Insufficient Address:hoge (in reply to MAIL FROM command) とかログに出たときは注意。 /usr/bin/mail -s "ここにsubjectを書く" $to_address -- -f $from_address << BODYEND ここに文を書く BODYEND -- -f $from_address、特に--を忘れないように注意すること!

    /usr/bin/mailでメールを送る - 射撃しつつ前転 改
  • Large Scale Learning to Rankを読んだ - 射撃しつつ前転 改

    当は三が日中にまともなエントリを1ぐらいは書く予定だったのだが、ちょっと無理だった。というわけで、実質的に新年一目のエントリです。Large Scale Learning to Rank (D. Sculley, NIPS Workshop on Advances in Ranking, 2009) (pdf) を読んだので、1目のエントリとしてこの論文を紹介したい。 では早速題に入ろう。順位学習において、Pairwise Learningを単純に行うと、n^2の学習コストがかかる。これは計算時間としては厳しい部類に入る。そもそも順位学習ってなに、という人は、WWW2009のチュートリアル(pdf)とかを参照してください。 Bottouらは、SGDの一般化能力はデータセットのサイズに依らず、どれだけのstochastic stepを実行したかで決まると言う事を示した。そこで、Sc

    Large Scale Learning to Rankを読んだ - 射撃しつつ前転 改
  • ディレクトリの中にある大量の小さなファイルを高速に読み込む方法 - 射撃しつつ前転 改

    ディレクトリの中にある大量のファイルを高速に読み込む方法が知りたかったので、実験してみた。想定しているシチュエーションは、一つ一つのファイルは数KB程度だが数が多い、という場合である。適当な順番でアクセスすると、ランダムアクセスになってしまいとても時間がかかる。個々のファイルを読み込む順番はどうでも良く、すべてのファイルを処理することさえできればいいので、原理的にはシーケンシャルアクセスで処理できてしかるべきである。 まず、ファイルシステムについて。HDDやSSDなどのハードウェアにアクセスする際には、ファイル名などという概念はもちろん存在しない。ファイル名と実際のディスク上の対応を管理するのがファイルシステムの主な役割である。ファイルシステムは、ファイル名からそのファイルに対応するブロック番号(メモリアドレスみたいなもんだな)を調べて、そのブロック番号を指定してHDDやSSDにアクセスす

    ディレクトリの中にある大量の小さなファイルを高速に読み込む方法 - 射撃しつつ前転 改