博士以前

人間です

トピックモデル

最近トピックモデル、特に Latent Dirichlet Allocation (LDA) について勉強したので教科書や参考になったサイト等をまとめておきたいと思います。

トピックモデルとは

トピックモデルというのは自然言語処理の分野で使われる、文書に潜在するトピックを推定するために用いられるモデルのことです。 例えばニュース記事にはスポーツや芸能、政治や経済といったトピックが含まれています。このようなトピックを文書だけから推測することができるでしょうか?もちろん我々人間は単語の「意味」を知っているので文書を読んで意味を理解することで、その記事のトピックを言い当てることができます。しかしコンピュータには同じことはできません。

この問題をコンピュータで扱うために注目するのが単語どうしの共起です。例えばニュース記事では、「サッカー」や「野球」という単語は主にスポーツ記事に集中して現れるでしょうし、逆に政治・経済の記事で出てくるのは稀でしょう。同じトピックに属する単語は一緒に現れやすいはずです。

この単語どうしの共起を数学的にモデル化したものがトピックモデルです。その中でも2003年に提唱された Latent Dirichlet Allocation (LDA) が基本的で重要なモデルだと考えられています。 このモデルは

  • 文書中の単語の出現順は無視する

  • 各文書の各単語一つ一つが潜在トピックを持っている

  • 実際に観測された単語はそれぞれのトピックが持つ単語分布に応じて確率的に選ばれた

と考え、ベイズ推論の枠組みでトピックの推定を行います。

参考になった書籍等

トピックモデル (機械学習プロフェッショナルシリーズ)

トピックモデル (機械学習プロフェッショナルシリーズ)

この本はトピックモデルの基本的な説明や実装する際のアルゴリズムが簡潔にまとめられており最初に読む本としては良いと思います。 式変形も比較的丁寧で、補助情報付きのモデルや階層が入ったモデルなどの拡張についても簡潔にまとまっています。 ただ、簡潔であるがゆえに踏み込んだ説明が少ないです。例えば Dirichlet 分布のパラメーター推定に関してはどのパラメータを対称にとってどのパラメータを非対称に取るかなどは、初学者にとっても重要だと思いますが、詳しく書かれてはいません。

この本はトピックモデルに限らずベイズ推論一般に関する入門書です。多分この緑のシリーズの特徴なのでしょうが、言葉による説明が丁寧でどのような気持ちで理論が組み立てられているか理解するには良いと思います。僕はつい先日までトピックモデルどころかベイズ推論に関しても完全に無知だったのですが、この辺りを読んで何をやりたいのかわかるようになりました。あくまで入門書なので、進んだアルゴリズムを学ぶような本ではないです。

トピックモデルに関しては現在日本語では一番良い教科書なのではないでしょうか。あまりちゃんと読んでいないのですが、上の青い本で書かれていないことが詳しく書いてあり有用そうです。

参考になった WEB ページ

Vol.27 No.3 (2012/05) Latent Topic Model (潜在的トピックモデル) – 人工知能学会 (The Japanese Society for Artificial Intelligence)

これはググって見つけた人工知能学会のページで2012年と少し古いですが、分野の発展がリファレンスと共にまとまっていて有用でした。 特に実際に実装する際には、上の本で解説されているようなナイーブな方法だと遅いので、ここで紹介されている効率的なアルゴリズムを使うのが良いと思います。(https://mimno.infosci.cornell.edu/papers/fast-topic-model.pdf は僕も実装してみたので、いずれ解説したい…)

簡単な解説

LDAの詳しい解説は上記の教科書を読んでもらえば良いと思うのでしませんが、せっかく勉強したのでエッセンスだけメモしておきます。

LDAでやっているのは結局のところ行列分解です。 我々が持っているデータは「各文書にある単語がいくつ入っているか」というものです。 文書 dに入っている単語番号 vの単語数を N_{dv}と書きましょう。 学習に使う文書データは通常非常に多く、またそこに入っている単語の量も膨大です。 d=1,\dots,D,  v=1,\dots,Vとして、行列  N_{dv} D\times V という大きな次元を持っています。この行列を特異値分解して、特異値が大きい部分だけを見ることにすると、次のような近似的な分解が可能です

 N_{dv} \approx \sum_{k} A_{dk} B_{kv}

ここで k=1,\dots,Kで、 K D Vよりもはるかに小さい数に選ぶことができます。つまりもとの D\times Vの大きいデータを D\times K + V\times Kの小さい次元のデータで表現しようということです。  k潜在的なトピックを区別する番号と解釈すると、 A_{dk}は文書 dに入っているトピック kの量、  B_{kv}はトピック kに属する単語 vの量と思えそうな気がします。しかし、 A_{dk} B_{kv}は正であるとは限らないので、常にそのような解釈が可能であるわけではないですし、モデルを拡張するのも難しそうです。

LDAでは単語数のデータ N_{dv} を直接行列分解するのではなく、それを生成する確率分布を行列分解します。  p_{dv}を文書 dに単語 vが出現する確率とし、これを同様に

 p_{dv} \approx \sum_{k} \theta_{dk}\phi_{kv}

と分解します。これは先ほどの場合と違い、クリアーな意味付けを与えることができます。 文書 dに単語 vが出現する確率というのは、その文書にトピック kが割り当てられる確率 \theta_{dk}と、トピック kで単語 vが出現する確率 \phi_{kv}の積として表されるというわけです(ここでは \theta_{dk} \phi_{kv}が正しく確率となるような制限付きの行列分解を行うことにしています)。

LDAの目標はこの確率分布を使って、観測された文書データから逆に各単語のトピックを推測することで、上の教科書で説明されているような方法で実行することができるのです。

初めから持ってないのに胸が痛んだ

文章を書きたい。ツイッターの140文字ではない、もっとまとまった自分なりの考えを、自分のために残しておくようなものが書きたい。

でもいざPCの前に座ってキーボードを打とうとしても、書くべきことが見つからず手が宙を彷徨う。 自分の中には語るべきものなのなど何もないのではないか、空っぽの人間なのではないかという無力感に苛まれることになる。

自分の生活や研究のことについて、それなりに普段から考えているつもりだった。でもそれに具体的な形を与えようとすると、思考があっという間に霧散してしまう。 それは結局僕が真剣でなかったということなのだと思う。

とにかくそうやって霧散して行く思考をなんとかかき集めてみる。

ここ最近知っている人たちが研究を辞めた/辞めそうという話をよく耳にする。 それは残念だと思う一方、仕方がないなという気持ちにもなる。

僕の研究分野は、はっきり言って今暗黒時代だろう。 研究の質よりも量(~ productivity)が重視されているように見える。でもこれは仕方がないのだ。 なぜなら、実験や観測から新しい発見がないから。そういう状況では、じっくり物事を考えるより、たくさん論文を書いて研究所全体の活動を活発にしてくれるような人が好まれるのは当然だと思う。

こういう時代になっていることはもちろん大学院に入学する前にもある程度は知っていた。 しかしそれを覚悟で入ったかと言われると少し違う。 当時の僕はそもそもそんなことを真剣に気にするほど自分の人生をきちんとは考えていなかったし、なんだかんだで自分にできることは見つかるだろうと楽観していた。 そしてこの楽観はある程度期待通りに働いた。そもそも人と同じことをやりたくない性格なので、ちょっとひねくれたテーマを見つけてそこから論文を書くことができた (これはもちろん独力で研究を進められたという意味ではなく、僕がそうやってやりたいことをアピールすると、適当な研究者とパイプができて彼らにうまくネタをもらうことができたという意味である、念のため)。

大学院に入って今まで自分のやっていた勉強はただの散発的な趣味でしかなかったことがわかったし、趣味的な勉強では決して得られなかった深い理解に達することができたのは本当に良かったと思う。 自分がもう一回人生をやり直してもやっぱり同じ道に進むのではないだろうか。

しかしこの先どうするかというのはとても悩ましい。面白い問題はいくつかあるし、小さなテーマでもきちんとやって論文にすると満足感はあるものだ。 一方で、自分の人生をかけるほどの重要な(かつ僕が頑張れば解けるかもしれない)問題があるかと言われると、答えに詰まる。 そういうことに深く悩まず、自分の業界内でのステータスを上げるゲームだと思って研究を続けられる人もいると思う。 もしくは、とにかく自分の好きなことや面白いと思うことができていればそれで良いという人もいる。 でも僕はそういうタイプの人間ではない。

大学を卒業してもう何年も働いているような知り合いにこの手の話をすると、「せっかくここまできたのにもったいない」とか「そうはいっても仕事は一生のものだから」「わたしの仕事だってそういう小さいことの積み重ねだよ」という言葉をもらうことがある。 これは僕がうまく考えていることを伝えられていないのも悪いんだろうけど、正直彼らの言うことはちょっと違う。 学生の地位が低いこの国で五年間低い給料に喘いで、卒業したら何年も短い任期の職に応募しなければならないこと、その後日本に帰ってきて研究を続けられるのがほんの一握りだということは人の心を相当弱らせるということはなかなか実感できないのだろう。

まあ悩んでいても仕方がないので、GWが明けたら色々行動しようと思っている。 研究も、それなりにやることはあるし、国際会議に参加する予定もあるのでまだまだ気楽な学生生活は続いていく。

ネガティブなことを書いてしまったけど、大学院生というのは心を病みがちなので許してほしい。

新年度

こんなブログを読んだ。

物理屋が物理をやめる理由」

Why Physicists Leave Physics | 4 gravitons

このブログによると、学生やポスドクが物理(ここでは素粒子物理分野が主に念頭に置かれている)をやめる理由はいくつか分類できて

  • 数字の問題としては「博士号取得者数」>「大学教授などのfaculty position 数」のせいだが、個々人が業界を去ろうと決断する理由はもちろんそんな単純ではない。多くの人にとってそれは自分の夢を諦めることを意味するから。

  • 学生の間に自分が向いていない、思っていたほど物理に興味がないと気づいて別の道に進む場合。自分のキャリアを見つめ直すという意味でこれは比較的健全。

  • そうではなく、物理に幻滅 (disillusionment) してやめる場合。これは例えば自分のやってる研究の魅力がわからなくなったとか、アカデミックの政治に嫌気がさすというようなことを指す。物理を続けたいと思ってるけどできないという意味で、こちらはあまり幸福な去り方ではないだろう。

これは理論物理だけでなく、他の分野の人とか企業に勤めている人にとっても多かれ少なかれ当てはまるのだろうとは思う。 でも学問の厄介なところは、それに夢を託す人が多くかつ経済的にはなかなか恵まれないという点にある。

やはり働き方が合うかどうかは大きいなと思う。大学院を卒業してポスドクになれば、数年は任期付きの職を(主に海外で)転々とすることになる。 裁量労働だからかなり自由に働けるけど、その分平日と休日の区別がなくなっている場合も多い。 こういうのを良しとするかどうかは人によるし、20代中盤から後半という色々ある時期には考え方が変わる人も多いだろう。 たとえ優秀な人でも厳しいポスト争いに疲弊している様子を見ていると、結局は研究への愛を持ち続けられるかどうかかなという気がする。

で、今年のうちに進路をよく考えないとと一月に思って、何も決断せずに三ヶ月が経ってしまった。 さすがにそろそろ何らかの行動を起こさないといけないんだろうけど……

猫のゆりかご

『猫のゆりかご』(カート・ヴォネガット)を読んだ。

端的に言って傑作だと思う。軽妙で軽薄な語り口、個性的な登場人物、冒頭からつきまとう終末の予感。 全てが僕の感性のど真ん中だった。

物語は「世界が終末を迎えた日」という章から始まる。最高である。 カート・ヴォネガットは一応SF作家と言っていいと思うが、今作に出てくるSF的ギミックはただ一つ、「アイス・ナイン」と呼ばれる特殊な氷だけである。 「アイス・ナイン」は、少量が通常の水に触れただけで連鎖的に全ての水を凍らせて「アイス・ナイン」に変化させてしまう性質を持つ。 口に入れでもしたら、人体はたちまち凍りついて絶命してしまう。 序盤からしつこく存在を示唆されるこの「アイス・ナイン」は、もちろん「物語に銃が出てきたら、必ず発砲されなければならない」に従って世界を滅ぼすことになるのである。

多くを語る必要はないと思うので、気に入った文章を引用する。

「どうして人がでっち上げたゲームなんかしなけりゃならんのかね。世の中には本物がいくらでもあるじゃないか」

「真実は民衆の敵だ。真実ほど見るにたえぬものはないんだから」

「文学による慰めをうばわれたら、人はどんなふうに死ぬと思いますか?」「心臓が腐るか、神経系が萎縮するか、そのどちらかだろうね」

「こんな男には気をつけろ。何かを学ぼうとしてさんざん苦労し、学んだあとで、自分がすこしも利口になっていないと気づいた男。そういう男は、自分の愚かしさにたやすく気づいた人びとを殺したいほど憎んでいるものだ」

土曜日とEmacs

エディタはEmacsを使っている。特に宗教上の理由などはなく、雛鳥が最初に見たものをずっと親だと思うように、初めて使ったものがEmacsだったというだけだ。 Emacsの魅力の一つは拡張性の高さだろう。設定ファイルで自分好みに魔改造できるし、世界中のいろいろな人が色々と便利なパッケージを作っている。

僕の主な用途は数値計算用のコーディングとLaTeX原稿書きだ。 LaTeXというとTeXShopなどの統合環境を使っている人が周りには多いけど、それを見るといつもの逆張り精神が出てきてしまい結果LaTeXにもemacsを使っている。 EmacsにはAUCTeXという強力なパッケージがあって、コマンドの補完等が非常に便利であるし、preview-latexというパッケージと組み合わせると、エディタ内で数式のプレビューもできてすごい。

そういうふうにEmacsを愛用しているわけだけど、プログラミングで食べているわけでもないのでまあ使えればいいやという感じで使ってきた。 それで今日は暇だったので(本当か?)、もうちょっと使いやすくしようと思って色々弄っていた。

テーマを変えたい

デフォルトのテーマは味気ない。適当にググったところ

  • Spacemacs (spacemacsというEmacsの亜種(?)のテーマらしい)

  • Solarized (Macのターミナルのテーマとして紹介されているのをよく見る)

  • Tomorrow (よくわからないけどtomorrowって名前が良い)

あたりが良さそう。コード書きの時はダークなテーマのほうが良い気がするけど、LaTeX原稿書きの時はホワイトの方が読みやすいかなあという気もする。 とりあえずspacemacs-light をデフォルトにした。こんな感じになる。 f:id:predoc:20180120220319p:plain ちなみにpreview-latexを使うとこんな感じでエディタ内に数式を表示できるので、ちゃんと書けてるかどうかチェックするのに便利。

フレームサイズを画面のちょうど半分にできると嬉しいんだけど…

画面の左半分にTeXのソースファイル、右半分にコンパイルしたPDFを表示したいということはよくある。 だから、起動時に自動的にEmacsのフレームが画面のちょうど左半分のサイズになってくれると嬉しい。 特に、複数のPCで同じ設定ファイルを共有しているので、マシンに応じて適切なサイズを自動で選んで欲しい。 もちろんこういうのはコンピュータの得意分野のはずだ。

"emacs サイズ 設定"みたいなキーワードでググると、固定値で横に何文字、縦に何行かを指定する方法は出てくるのだけど、ディスプレイに合わせて調節するやり方がなかなか見つからない。 サイズを取得して、それを固定値のところに入れればいいはずなので例えば次のように書いてみる

(setq half-width (/ (display-pixel-width) 2))
(setq default-frame-alist
    '((left   . 0)
      (top    . 0)                 
      (width  . (text-pixels . half-width)) 
      (height . (text-pixels . 600))))

が、これはうまくいかない。なぜ。Lisp雑魚つらい。 *1

さらにググってみたところ代替案としてautofit-frame というパッケージを使えばよいことがわかった。 オプション等々はこのページを参考にして設定する。 設定ファイル(init.el)には次のように書いた*2

(use-package autofit-frame
  :config
  (add-hook 'after-make-frame-functions 'fit-frame)
  (setq fit-frame-max-width-percent 50) ;最大でも画面の左半分を超えないようにする
  (setq fit-frame-min-width 65) ;ここは適当に65文字
  (setq fit-frame-min-height 70)) ;縦ははみ出ても問題ないはずなので多めの70行を指定

fit-frame-min-widthとfit-frame-min-heightでそれぞれ横と縦の最小値を設定する。単位は文字数(widthの場合)と行数(heightの場合)。 autofit-frame は開くファイルの内容に応じて自動的に横幅を決定してくれる。 横に長々書いてあるコードは横長に表示される。 それを (setq fit-frame-max-width-percent 50) によって長くても横幅が全体の50%を超えないように設定することで、一応望んでいたことはできた。

ベスト・プラクティス…

とにかくググって情報が古すぎず、良さそうに見えるものをコピペして使っているのが現状なので、絶対バッドノウハウが含まれているはずである。 助けて…

追記

こちらの記事を参考にしたところ、以下のようにしても画面半分のフレームサイズにできた

(when (window-system)
  (set-frame-size
   (selected-frame)
   (- (/ (/ (x-display-pixel-width) 2) (frame-char-width)) 1)
   (- (/ (x-display-pixel-height) (frame-char-height)) 1)))

autofit-frameは僕の環境と微妙にconflictして表示が崩れたり、ミニバッファのサイズがおかしくなったりしたのでこのやり方のほうが良さそう。 ただし、なぜか(tool-bar-mode 0)を書いてツールバーを消しておいて、更にこれより後方に上記の設定を入れないと上手くいかない。 内部でどういう手順で設定が反映されるかに依っているのだろうが今の僕には解明できなかった…

*1:というかどのプログラミング言語もまともに勉強したことがない。つらい

*2:通常の(?)require ではなくuse-package を使っている。こっちのほうがモダンらしい。

Firefoxでのプライベートブックマーク

FIrefoxでの複数アカウント

Firefox Quantum の評判が良いので使ってみたところ思った以上に快適でChrome から乗り換えました。 最近は一つアカウントを作れば自宅のPCでも研究室のPCでも一瞬で設定が同期されて便利です。 ただし、一つのブラウザを研究にもプライベートのネットサーフィンにも使うことにすると、他人に見られたくないページをうっかり人前で表示してしまうという危険があります。 発表のためにPCをプロジェクタに繋いだらポルノサイトが表示されてしまった、なんてことが起こらないとも限りません。 最悪社会的死が訪れます。

仕事とプライベートでブラウザやブラウザ用のアカウントを使い分ければ良いという話ではありますが、せっかくなのでFirefoxのアドオンを使ってスマートに解決したいところ。 SNS複数アカウントを使う、というような場合には「Multi-Account Containers」というアドオンが便利。

Firefox Multi-Account Containers – Firefox 向けアドオン

プライベートブラウジング用のブックマークが欲しい

大抵は上記のアドオンで済むのですが、万が一他人にPCを触られたり、履歴を見られたりしてもボロを出したくありません。 履歴を残したくなければプライベートブラウジング用のウインドウを開けば良いでしょう。 しかしプライベートモードでブックマークしたページは通常モードのブックマークに保存されてしまうのが不満です。

プライベート用のブックマークがあれば良いなと思って探したところいい感じのアドオンがありました。

Private Bookmarks – Add-ons for Firefox

パスワードを入力した時だけ出現する、秘密のブックマークが作れます。 基本的にはプライベートブラウジングをやめればオートロックされます。

アドオンの説明にある通り、クラウド上ではなくローカルに保存するため、複数マシンでプライベートブックマークを共有するということは出来ません。 共有しようと思ったらバックアップデータを作って受け渡すという一手間が要るようです。