グラフィカルモデルを綺麗に書く(未完成)

あらまし

「グラフィカルモデルを綺麗に描きたい」
という欲求は誰にでも存在する [要出展]

毎度のごとく、ペイントソフトやパワーポイントを使ってグラフィカルモデルを描くのはなんとももどかしい。

そんな悩みを吐露したら、綺麗に書けるライブラリを教えていただいた。

それがdaftと呼ばれるpythonで使えるライブラリで、日本語ではこちらで紹介されている。

nzw0301.github.io

各関数の定義などはこちらのブログの方が詳しいので割愛させていただく。

やったこと(やりたいこと)

以下を用意した時に自動的にグラフィカルモデルを描いて欲しいと思ったので、 それが行えるようなクラスを作った。

(自分的には以下の要素が最低限構築に必要な要素かな?と思っている。)

  • ノードに付するラベル(αとかwとか)
  • ノードの位置関係
  • 各エッジの始点ノード、終点ノードの関係
  • 各プレートで囲むノードの集合  

現状出来ていないのはプレートを囲むノードの集合からうまく落とし込むところ、 というのも単純なモデルならなんとかなるが、複雑な図を描こうとするとちょっと面倒臭くなる。

プレートは大きく分けて二つに分けられて、

  • 他のプレートと独立しているもの(LDAの場合、Kに相当)
  • 他のプレートと関係があるもの(LDAの場合、DやNに相当)

となるので今回は明示的にこれを定義してしまっている。  

コードはこれ

コードの説明

LDAを例にとって軽く説明を付します。

上記の定義をどうしたか

  • ノードに付するラベル(αとかwとか)

辞書で定義、tex記法(と呼んでいいのかしら?)で文字は書けるので、各種文字や下付き上付きなどが表現できる。良い。

node_list = {"alpha":r"$\alpha$",
             "theta": r"$\theta$",
             "z":r"$z$",
             "w":r"$w_i$",
             "phi": r"$\phi$",
             "beta": r"$\beta$"}
  • ノードの位置関係

二次元arrayで定義した、上で定義した辞書のkeyを位置と対応させて配置する。 この表現でいいのかは疑問だけど、とりあえずこれで。

node_pos = np.array([["alpha","" ],
                     ["theta",""],
                     ["z",    ""],
                     ["w",    ""],
                     ["phi"   ,""],
                     ["",     "beta"]])
  • 各エッジの始点ノード、終点ノードの関係

(始点,終点)といった形で表現されたエッジをリストで保持

edge_list = [("alpha", "theta"),
            ("theta", "z"),
            ("z", "w"),
            ("beta", "phi"),
            ("phi", "w")]
  • 各プレートで囲む変数の集合

これまたこの表現でいいのかわからない。。。 上で述べたようにプレートは大きく二つに大分されるので、 それぞれを"人手"で判断して定義する(ここをどうにかしたい)

plate_list = {"depend":[[r"$D$",["theta","z","w"]],[r"$N$",["z","w"]]],
              "independ":[[r"$K$",["phi"]]]}

To Do

  • プレートの包含関係とかを(半)自動的に識別する。
  • プレートの配置を""いい感じ""にする。(どうするのか?)

まとめ

気が向いたら、改良しようかなと思ってるけど、図の描画は一回限りのことが多かったりもするので、 そこまで使用頻度は結局のところ高くないのかもしれない。。。

こんなことはもう◯◯で既に出来る!みたいなご指摘があったら是非教えていただきたいです。

余談

  • コードを見てもらうとお分かりかもしれないが、Plateの位置調節の値は経験的に決めているのでdependの方のplate数が増えるとうまく行かないです
  • 先輩や同輩には、keynoteinkscapeの方が綺麗と言われたorz...。
  • グラフの描画としてigraph(http://igraph.org/python/)に触れた時は力学モデル?を用いてノードを配置する(レイアウトって呼ばれてた)。 みたいなのがあったけどグラフィカルモデルの場合は出来なさそうだなぁと思ったりなどした。

 

YANS2017に参加してきました。

2017年9月3日〜9月5日に沖縄で開催されたNLP若手の会(通称YANS)に初めて参加および発表をしてきたので、その感想について軽くまとめます。

参加に至る経緯

 僕が所属している専攻および研究室は(おそらく)どこへも研究発表をしないでも卒業ができてしまう環境にあるが、僕はどこへも発表しないで、また言語処理の人の意見を聞かずにそのまま卒業して行くことに危機感を持っていたし、今年の言語処理学会には何も出せなくてより一層危機感が強まっているなか、適当に調べていたらYANSの存在を知ったので参加を決めた。

 僕自身、こういった対外的な発表は初めてな上に普段は言語処理をしている人が周りにいないので言語処理をしている人への研究の話も初めての経験だったのですこぶる緊張したが思い切って参加して良かったと思う。

全体的な所感

  • 有名な研究室関係の人が多い

東北大乾研・NAIST松本研・首都大小町研・東大鶴岡研・東大喜連川研・東工大奥村研・京大黒橋研etc...といったようなNLPの研究をしている学生なら聞いたことある研究室の方々が多く参加されていた。これは、学生や教員というだけでなく企業の方でも上記の研究室出身の方が多かったように感じた。

  • 若い方が多い

僕自身M2なので、お前が若いとか言うなと言われるかもしれないけれど、M1にB4さらにはB2の方までいてさらには発表までしていたりして、自分がB4だったりB2だったりした時を思い出すととてもすごいことだと感じた。

  • 年齢とか所属を気にせず会話できる

研究に関する話をするときにあまり上下関係を気にしすぎても話が滞るというのが僕の持論なので、そういった意味ではすごくお話させてもらいやすい環境でした。これは発表や懇親会、二次会などあらゆるところでそうだったので良かったです。

  • 名刺

企業の方だけでなく学生の方も名刺を持っていて交換していたりしてすごいなぁと思った、一方的に名刺をもらったので少し申し訳なかったり思う。 

  • 部屋のランダム性

合宿形式であり、ほとんどの方が同じ宿に泊まるわけだが、部屋割りはランダムらしく僕の部屋は僕以外社会人の方の部屋だったので普段とは違った新鮮な体験だった。

 

あまり真面目ではない話

切符を買うということを最近あまりしなくなったが、沖縄ではSuicaが使えないっぽいので切符を購入。改札を通ろうと切符の差し込み口を探すも見つからない。ゆいレールの切符はQRコードをかざすということを駅員の説明で理解。

(使い終わった切符の回収箱があったりしてなんとも言えなかった)

初日の交流会でビーチ行くやつに参加しようとしたけど雨が降っていると聞いたので突如現れたボドゲ組に参加した。「コードネーム」*1と「ピタンゴ」*2というゲームをやった。

ざっくり言うと前者は二つのチーム戦でチームリーダーが自分のチームのカードに書かれた名詞の共通項で味方にどれが自分のチームのカードかを当てるゲーム

後者はしりとりの亜種みたいな感じでカードに書かれた「◯◯な」といったものに続けて単語を発してそれをしりとりの一塊として続けて行くゲーム

僕はボキャ貧なので後者のゲームの方が苦手だった。

  • 沖縄の締めはステーキ

オープンニングの際に委員長の中澤さんが

「沖縄では締めにラーメンではなくステーキを食べるそうですよ」(意訳)

と言ったことをおっしゃっていたが、嘘だと思ってたし、食べに行くつもりもあまりなかったが、二日目の夜にステーキを食べに行く流れに見事に乗ってしまった。

ホテルの近くの有名店らしいステーキ屋*3に行ったら23時くらいだったのにめちゃくちゃ混んでるので本当に締めはステーキなのかもと思ってしまった。(実際ステーキはやわらかくて美味しかった)

自分の発表について

上記の通り、僕にとっては初めての対外発表かつポスター発表かつ初日ということでかなり緊張した。

普段、周りに自然言語処理について相談できる相手がいないので、根本的なところで勘違いをしているのではないか?そもそもこういったモデルで本当にいいのか?みたいなところを悩んでいたし、そもそもこういった研究発表をして他人に興味を持ってもらえるか?と不安だった。口頭発表みたいな感じのものであれば卒論の審査などで類似したものは行われるので、一応聞いてはもらえるが、ポスター発表は興味があるものを人が聞いて回るといったものだと思うので人が来なかったどうしようとも考えていた。

結果としては、色々な人に聞きにきてもらえて、素朴な疑問から鋭い質問までぶつけてくださって感謝です。特に企業の方々からの指摘は実問題に置き換えた話をしてくださるので身につまされました。以下ざっくりとした質問への所感。 

・ポスターに表示されているものの意味について

何も考えずにポスターにグラフィカルモデルを載せたのだが、それぞれのノードの意味とかを何も書いていなかったので、それぞれが何を表すのかが伝わりづらかったので反省。グラフィカルモデルで生成過程を示すくらいなら生成過程のイラストを作った方がわかりやすかったのかなと感じた。

・モデルの妥当性

各種パラメーターの決め方について、無意識下の拘束をしていたりしたことに気付かされたので少しはっとさせられた。 

 発表中の反省点としては以下二つ

  • ポスター発表の時にメモをとる習慣をつけたほうがいいことを学んだ。(メモ取らなかったせいで頭が少しパンクしてしまった)
  • ペットボトルの飲料を持ったほうがいいことを学んだ。(口がパサパサになる)

 ポスター発表はyoutubeで配信されていたらしいが、配信を見ていた弊研の人曰く僕の背中しか写っていなかったと言われたので僕の発表が配信されていたのかは定かではない......。

 

 他の方々の発表

自分の発表時の他の人の発表が聞けなかったのでどこかしらにポスターなりがあがってくれると嬉しいなと思ったり...。

個々の発表については取り上げないけれど、全体的に対話の話が多かった気がする。

僕が興味を持ったのは対話と意味表現的な話題が含まれているものが多かった。

僕の中で意外だったのはコーパスづくりといったことを学生の方が取り組んでいることでした。(僕自身研究でデータを自分で集めたりはするけれどそれとは規模感が違うなぁというニュアンスです)

最後に

昨年のうちに言語処理のコミニュティの人と交流をしていれば良かったなぁと思ったりしたのでとりあえず昨年の自分に会えたらとりあえずどこでもいいから外の人と交流してみろと言ってあげたい。

来年度以降も言語処理はやっているはずだし是非参加したいけれど参加できるかは今のところ未定。

(沖縄の観光を殆どできなかったので前泊か後泊をすれば良かった。)