Hatena::ブログ(Diary)

Mi manca qualche giovedi`? このページをアンテナに追加 RSSフィード

2015-10-26 SpeakerDeck 貼れなかったり、そろそろ はてダ卒業?

EMNLP 2015 読み会 #emnlpyomi

10/24 に開催された EMNLP 2015 読み会にのこのこ行ってきた。

主宰の @unnonouno さん、参加者&発表者の皆さん、会場提供してくださったリクルートテクノロジーズさん、おつかれさまでした&ありがとうございました。

Proceedings を見たら、まあ見事に word embeddings だらけ! ちゅうことは読み会は word embeddings 祭りやな! と思ってたら、みんなもそう読んで避けたのか、Proceedings の印象よりだいぶ word embeddings 率が低かった(定量的に確認はしてない)。


ただ、メインはまったく別のモデルでも、特徴量として word embeddings(というか word2vec)を組み込むというのはなんかデフォルトみたいになってきてる気がする。自分が読んだ Topic Model のやつもそうだったし。

休憩時間にもそこらへん話題になり、「使ってなかったら、なんで使ってないのか質疑で突っ込まれるから、使わないわけにいかない説」が出て、うなずけてしまうくらい。

tf-idf みたいな、定番の特徴量として定着するんだろうかなあ。


以下、発表の短い感想(あくまで感想)。読み会資料が公開されているものはそれも。


It’s All Fun and Games until Someone Annotates: Video Games with a Purpose for Linguistic Annotation (@tootles564 さん)

ゲーミフィケーションアノテーションする話。

スマホになって、かえってレトロやチープなゲームが受けてたりもするから、ありっちゃありと思うけど。

無理にゲーミフィケーションするから、アノテーションをゲームの文脈に組み込まないといけなくなって、結局ゲームもアノテーションも両方破綻しているような気がしないでもない。

reCAPTCHA のように「アノテーションの報酬としてゲームができる」(広告代わり)とか、スプラトゥーンのマッチング待ちの間に遊ぶミニゲーム(イカジャンプ)のように、ちょっとした合間に出てくるので暇つぶし感覚でついついアノテーションしてしまう、っていうのでいいんじゃあないかなあ。ゲームの文脈からも切り離せるし。


Learning Better Embeddings for Rare Words Using Distributional Representations (@Quasi_quant2010 さん)

Skip-Gram が流行ってるけど、レアワードの特徴を捉えるには CBOW の方がよくて、うまく混ぜるとよりいい感じになる話。

質疑でも懸念されてた「コーパスサイズによって閾値を変える必要があるんでないの?」あたりはあるとしても、理屈は納得感高い。


A Graph-based Readability Assessment Method using Word Coupling (@niam さん)

ラベル伝搬で文の難易度を当てるタスクを解く話。

Readablity は、ずいぶんまえだけど少し興味あって調べてたりしてた(といっても機械学習的な手法ではなく、この論文の baseline にも登場している Flesch-Kincaid などのルールなアプローチくらいまでしか手出してないけど)。

途中の行列積のところ、もうちょっと書き下せば意味がわかるようにできる気がしないでもないんだけどなあ。


Long Short-Term Memory Neural Networks for Chinese Word Segmentation (@MasakiRikitoku さん)

中国語の分かち書きがすげー難しそうな例文を正しく分かち書きするには、その文自身をトレーニングデータに含めるしか無さそうな気もするんだがどうだろう。

LSTN(RNN)と系列ラベリングを組み合わせる枠組みは、他の問題にも普通に適用できそうな雰囲気があるけど、すでにポピュラーなアプローチだったりするのかな。


Compact, Efficient and Unlimited Capacity: Language Modeling with Compressed Suffix Trees (@jnishi さん)

Compressed Suffix Tree を使って、∞グラムを高速かつ省スペースで構築する話。

道具立ては非常にシンプルなので、なんか初出なの? 感が。

Kneser-Ney でいくら頑張って interpolate しても、一般的なコーパスサイズでは 6 or 7-gram あたりで perplexity は頭打ち、という実感が裏付けられてよかった(小並感)。


Evaluation methods for unsupervised word embeddings (@nozawa0301 さん)

word embeddings いっぱいあるんで比べてみました話。

順位相関で評価したのと Amazon MTurk で評価したのが一致するってのはちょっと嬉しいかも。

最後の方の議論のところは、なにかおもしろそうなことを言っている予感はあるのだけど、ピンとこなかった。元論文読むか。


Effective Approaches to Attention-based Neural Machine Translation (@tkng さん)

エンコーダー/デコーダーモデル+Attention に、さらに local attention なるものを組み込む話。

パッと見、劇的な効果がある雰囲気はない。

エンコーダー/デコーダーモデルで固有名詞が入れ替わってしまうのを抑えられるので十分嬉しいということなのかな。


Humor Recognition and Humor Anchor Extraction (@yag_ays さん)

ユーモア文かそうでないか判定する話。

韻とかいろいろな特徴量を設計して頑張って分類器作るんだけど、baseline の word2vec がそこそこいい性能さくっと叩き出していて、そら word embeddings 流行るわー、という気分に。

そういえば、なぞかけ生成やってはる人いたなあ。


Efficient Methods for Incorporating Knowledge into Topic Models ( @shuyo )

大規模トピックでも効率よく学習するのが歌い文句の SparseLDA (Yao+ 2009, モデルとしては生 LDA と等価)に、事前知識を組み込む話。

いつも読み会に参加するときは、10本くらいの論文の中からある程度読み込んでから選ぶのだけど、今回は余裕なくてイントロとモデルを斜め読みしたくらいで選んだら、

  • アカデミックの論文はたかだか 1000トピックだが、最近の実用アプリケーションは 100万トピック! とイントロでぶちあげながら、提案手法は事前知識組み込みで遅くなっちゃって、500トピックで評価
  • 評価指標に使った Coherence は、事前知識を制約に入れた Dirichlet Forest-LDA などより生 LDA の方が良い数値。その状態で「 提案手法は LDA を上回っている(ただし僅差)」って言われても、その指標を評価に使うのが間違っているとしか思えない

というわけで、選ぶならせめて評価は読まないと、という教訓。

これがもし読み会トリだったら、ものすごいビミョウな空気で終わることになってしまってたので、そうじゃなくて本当に良かった。


A Neural Attention Model for Abstractive Sentence Summarization (@kiyukuta さん)

Attention で文要約する話。

Attention ってソフトなアライメントだよね、って言われて聞くと、なるほどいろんな応用先がありそうだなあという気にさせられる。

2011-01-31 ちゃんとした開発環境作っとくとなにかと楽だよね。

Mahout の開発環境を Maven+Eclipse で作る (1)

Mahout in Action 買ったんだけど、開発環境の作り方についてはほとんど何も書いてない。いや、それも大事なことだと思うぞ。

というわけで、Mahout 用の開発環境をちょっとまじめに作ってみた。

とりあえず今回は Mahout in Action のサンプルコードを Eclipse 上で動かすところまで。


いろいろインストール

必要なものをインストール。今回入れたのはこんな感じ。それぞれの入れ方は略。まあ JAVA_HOME を設定して、パスを通すぐらい。

OSWindows 2008 x64 なので、JavaEclipsex64 版を入れている。



Cygwin は Mahout が DOS 窓からでは満足に使えないため。まあ Hadoop が tar.gz 配布なので、それを展開するのにも使える(他はインストーラか zip がある)。

Hadoop は今回はまだ使わないけど、一応。


【追記】

JavaSDK は Program Files 以外のディレクトリにインストールすること。インストールディレクトリパスにスペースが入っていると、Hadoop 0.20 以降は動かない。

Hadoop は 0.20.2 推奨。Mahout 0.4 および 0.5-SNAPSHOT がそのバージョンに対応していることと、0.21 は他にもいろいろ問題があって、普通に使わない方がいいレベル。

【/追記】


Maven

正直、Maven は苦手。なんか必要以上に複雑な印象がが。

とりあえず今回必要な範囲は、"Maven Getting Started Guide" と "Guide to using Eclipse with Maven 2.x" を読んでおけばいい感じ。



ポイントは Maven 3 でも Maven 2 Repository ってところ。


ちなみに "Maven Getting Started Guide" は Maven の Document のインデックスページには "Getting Started in 30 Minutes" と書かれている。30分でわかる Maven …… 30分で読める分量ではないんだが(苦笑)。


Mahout

Eclipse から Mahout のソースを見ながら開発できるようにソース版を入れる。バイナリは多分次回。

まずは Mahout のダウンロードページまたはソースのリポジトリからソース一式を取ってくる。



現在の最新は 0.4 もしくは 0.5 SNAPSHOT。手元では 0.4 の方を入れた。

でもあとで出てくるように、実際に Mahout のインターフェースはどんどん変わっていっているようなので、0.5 を使った方がいいのかも?


ソースを展開する前に、Eclipse を起動してどこか適当な場所にワークスペースを作っておこう。とりあえず今回 C:\Users\shuyo\workspace に作ったとする。デフォルトかい! というツッコミは無し。

ワークスペースディレクトリで Mahout のソースを展開する。展開先は C:\Users\shuyo\workspace\mahout-distribution-0.4 とする。

別の場所でもいいはずなんだけど、あちこちばらばらにするよりこっちのほうがわかりやすいかな、と。


そして Dos 窓か Cygwin を開いて、C:\Users\shuyo\workspace\mahout-distribution-0.4 に移動し、Maven プロジェクトを Eclipse プロジェクトに変換する以下のコマンドを実行する。

初回の Maven 実行だと、プラグインを大量にダウンロードしまくるのでちょっと時間かかる。


$ mvn eclipse:eclipse

これによりローカルの Maven 2 Repository も作成されるので、これを Eclipseclasspath variable M2_REPO に設定する。Maven – Page Not Found やいろんな説明ブログ類には、以下のコマンドを叩くように書いてある。


$ mvn -Declipse.workspace=<path-to-eclipse-workspace> eclipse:add-maven-repo

が、Maven – Page Not Found には続けて "Issue: The command does not work." と書いてある。むー?

というわけで、コマンドを使わずに M2_REPO を設定する方法を書いておこう。

これは Eclipseワークスペースに対して行う設定なので、一回しておけばそのワークスペースではもう設定する必要はない。



http://giovedi.net/img/mahout/mahout1.png


この M2_REPO の登録を忘れて続く作業を行うと、以下のようなエラーが出る。


The project cannot be built until build path errors are resolved
Unbound classpath variable: 'M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar' in project '********'

M2_REPO の設定をすれば消えるので大丈夫。


あとは変換された Mahout の Eclipse プロジェクトをインポートすればいい。

C:\Users\shuyo\workspace\mahout-distribution-0.4\ に Eclipse 用の .project と .classpath が生成されていることを確認し、Eclipse のメニューから File > Import > General > Existing Projects into Workspace で C:\Users\shuyo\workspace\mahout-distribution-0.4\ をインポートする。


http://giovedi.net/img/mahout/mahout2.png


画像はすでにインポート済みなのでグレイアウトしているが、とりあえずこんな感じで7つのプロジェクトが選べるので、全部選んでインポートしよう。


ちなみに mvn eclipse:eclipseEclipse の m2eclipse プラグインをサポートしていないらしいので、そのプラグインを使いたい人は他の手法を使う必要があるかも。


Mahout in Action のサンプルコード

"Mahout in Action" は Manning 社の Mahout 解説本だけど、まだ発売されていない。今は Early Access Edition がダウンロード販売されている。2週間前くらいまでは $27.5 だったんだけど、今は $34.99 になってるな……



このページで2〜6章のサンプルコードも公開されているので、それをダウンロード。

展開するのはちょっと待って。


先にサンプルコード用の Maven/Eclipse プロジェクトを作る。

ワークスペースディレクトリで以下のコマンドを叩く。


mvn archetype:create -DgroupId=mia.recommender -DartifactId=recommender

これが Maven のプロジェクトを生成するコマンド。

archetype というのは Maven プロジェクトの雛形を指す名称。詳しくは Maven Archetype – About とか。

groupId とは、"Maven Getting Started Guide" には "the unique identifier of the organization or group that created the project" であり "one of the key identifiers of a project" である、という若干矛盾がちな説明が書かれている。どっちやねん。とりあえずルートパッケージ名を付けておくもんらしい。

artifact はプロジェクトの成果物で、生成する jar ファイルの名前などに使われる。


このコマンドを実行すると、Hello World なスケルトンコードを持つプロジェクト recommender が生成される。

という説明を書きながら mia-sample とかの方が良かったかな、と思ってしまった。まあ、いいか。


後は以下のように。


  • recommender/src/main/java/mia/recommender 以下に、先ほどダウンロードしたサンプルコードを展開して出来た ch02〜ch06 をコピーする。スケルトンコードの App.java は消しても良い
  • recommender に移動して、mvn eclipse:eclipse を叩き、Eclipse プロジェクトに変換
  • recommender を Eclipse にインポートする

これでサンプルコードを取り込んだ recommender プロジェクトが出来たが、まだ Mahout のライブラリが参照できていないのでソースが真っ赤っかである。


http://giovedi.net/img/mahout/mahout3.png


recommender プロジェクトを右クリックし、Properties > Java Build Path > Projects を選び、Add を押して次の3つのプロジェクトを選ぶ。


  • mahout-core
  • mahout-examples
  • mahout-taste-webapp

http://giovedi.net/img/mahout/mahout4.png


これで Mahout を参照するようになって、エラーのほとんどは解消される。が、まだ4つほど残る(2011/1 現在)。


http://giovedi.net/img/mahout/mahout5.png


これはおそらく Mahout のバージョンアップによりインターフェースが変わったが、サンプルコードがまだそれに追随していないためなので、コードを修正する必要がある。が、ここまでできていればマウスでクリックするだけで修正できる。

例えば mia.recommender.ch03.IREvaluatorBooleanPrefIntro2 なら、コードの赤くなっている場所にカーソルを持って行き、ctrl+1 を押すと次のように表示される。つまり、NearestNUserNeighborhood のコンストラクタが投げる TasteException を catch も宣言もしていないというエラーなので、2つ表示されている解決法の内お好みの方を選べばいい。"Add throws declaration" を選べば、その関数に throws TasteException 宣言が追加され、エラーが解消される。残りの3つも同様。


http://giovedi.net/img/mahout/mahout6.png


まあこの程度ならわざわざソースを取り込まなくてもライブラリを参照するだけでもできちゃうんだけど、Mahout はドキュメントがまだまだ未整備、今後も仕様がどんどん変わっていく、となるとソースを参照するケースが必然的に多くなるだろうから、Eclipse の中で F3 を押すだけでカーソル位置から呼び出している Mahout のソースが参照できるようにしておくのは非常に有益だろう。


あとはサンプルコードを実行してみるだけだ。

試しに mia.recommender.ch02.RecommenderIntro を選んで、メニューの Run > Run を選ぶ(ctrl+F11)。すると実行はされるが、ファイルが見つからないというエラーになる。

サンプルデータが mia/recommender/ch02 にあるのでこれを読み込ませてあげよう。今度はメニューの Run > Run Configurations を選ぶ。先ほど一度 Run させておいたおかげで、RecommenderIntro を実行するための configuration ができあがっているので、Arguments タブを選び、Working directory に mia/recommender/ch02 を設定してあげる。"Workspace..." ボタンを押せばダイアログが出るので、そこで選べばいい。


http://giovedi.net/img/mahout/mahout7.png


これで再度実行すれば、今度はちゃんと Mahout のリコメンドを呼び出したような結果が Eclipse の console に出力される。


自分で好きなコードを書きたいときは Maven のプロジェクトを作るところから繰り返せばOK。必要に応じて Mahout のプロジェクトを Properties > Java Build Path > Projects から追加さえすれば、すぐにでも Mahout のソースを参照しながらコードを書けるだろう。


次……はわかんないけど、書くとしたら多分 EclipseHadoop な Mahout をごにょごにょする環境構築、かな。


あ、そうそう。

Eclipse を英語のまま使っているのは、その方がわかんないことがあったときにググって情報見つけやすいから。決してめんどくさいからだけじゃあないからね!

2007-05-16 brainf*ckでFizzBuzz

brainf*ckでFizzBuzz

頭が痛くて長い時間ものが考えられない……ので気晴らしにbrainfuckで3言語目のFizzBuzz(ErlangとRubyは→ id:n_shuyo:20070511:fizzbuzz )。なんだかんだ言ってはまってる?

++++[->++++<]>+[<++++++>>++++>++++++>+++++++>>++++>+++++++<<<<<<-]<-->+++>++>+++>+++>+++++>-->--<<<<<<<[->-[>>>>>>>]>[<+++>.>.>..>>>>>>+<]<<<<-[>>>]>[<+++++>.>.<<<..>>>>>>+<]>>+<[[-]<]>[[-<+>>+<]>>++++++++++<[->->+<[>>]>[[-<+>]>>>+<]<<<<]>>>>>[-<+<+>>]++++++++[-<<++++++<++++++>>>]<[<.>[-]]<[-]<.[-]<[-]<<<[->+<]]++++++++++.[-]<<<<<<<<<<]

ん? わからん? そうですか。じゃあちょっとインデントして整形してみる。

++++[->++++<]>+
[<++++++>>++++>++++++>+++++++>>++++>+++++++<<<<<<-]
<-->+++>++>+++>+++>+++++>-->--<<<<<<<

[->
  -[>>>>>>>]>[<+++>.>.>..>>>>>>+<]<<<<
  -[>>>]>[<+++++>.>.<<<..>>>>>>+<]>>
  +<[[-]<]>[

    [-<+>>+<]>

      >++++++++++<
      [->->+<
        [>>]>[[-<+>]>>>+<]<<<<
      ]
      >>>>>[-<+<+>>]
      ++++++++[-<<++++++<++++++>>>]
      <[<.>[-]]<[-]<.[-]<[-]<

    <<[->+<]
  ]
  ++++++++++.[-]
  <<<<<<<<<<
]

これでとっても見通しよくわかりやすくなったね!

しかしはてなダイアリーのシンタックスハイライトに brainf*ck がないとは。それがあればきっともっともっとわかりやすくなったのに。おしい。


▼追記

おお、やた、1位取れた。

http://golf.shinh.org/p.rb?FizzBuzz#Brainfuck

++++++[->++++>>+>+>-<<<<<]>
[<++++>>+++>++++>>+++>+++++>+++++>>>>>>++>>++<<<<<<<<<<<<<<-]
<++++>+++>-->+++>->>--->++>>>+++++[->++>++<<]<<<<<<<<<<

[->
 -[>>>>>>>]>[<+++>.>.>>>>..>>>+<]<<<<<
 -[>>>>]>[<+++++>.>.>..>>>+<]>>>>

 +<-[<<<]<[
   [-<<+>>]>>>+>+<<<<<<[->>+>+>-<<<<]<
 ]>>

 [[-]<]>[
   >>>[>.<<.<<<]<[.<<<<]>
 ]

 >.<<<<<<<<<<<
]

数の出力方法がまるっと変わってたり(毎回10で除算→最初に仕込み&繰り上がり方式)、数バイトずつ削る細々とした努力の跡があちらこちらに見て取れて涙を誘われることであろう(うんうん)。

こんなことばかりしているわけにもいかないので、FizzBuzz で遊ぶのはこのへんで打ち止め。え? Lua