mots quotidiens.
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp by hns, version 2.10-pl1.

先月 2009年10月 来月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

2009年10月05日(月) [n年日記]

#1 CRP

そういえば, 信学会のベイズ解説特集が全然音沙汰がないですが, どうしたんだろう。

Chinese Restaurant Process をあえて日本語で書く時に, 「中華」料理店過程と 書くのが前から気になっていた。自分でもそう書いたことがある気がしますが, 何となくセンスが悪いというのと, "中華料理"は日本風のもので, 「中国料理店過程」 の方が正しいのではないかと思っていました。 *1 簡単に言うと, じゃんがらラーメンは中華料理店かも知れないけれども中国料理店では ないし, 料理を共有する丸テーブルとかなくね?ということ。

実際に, 中国語では「中国餐館過程」 (GB:中国餐馆过程)と呼ぶことを知りました。
例えば, 2009年のこの辺の論文「中国餐館過程中的最大餐卓」。
http://www.scichina.com:8081/sciA/CN/article/downloadArticleFile.do?attachType=PDF&id=413664
もちろん, 上の論文は北京大学と復旦大学の数学科の人の話なので, そういう人が 書いているというだけだと思いますが..。
どうでもいい話かも知れませんが, 本を書くときに大事になりそうかなあ, ということで書いてみました。


*1: 探したら, Wikipediaの解説: 「中華料理」 にもそういう記述がありました。

2009年10月09日(金) [n年日記]

#1 Luganda+

メモ代わり。
ちょっとした相談を受けたので少し調べていたら, ウガンダ語 (Luganda。 Wikipedia )の聖書を発見。うぉー何だこれはー。 http://www.lutheransonline.com/servlet/lo_ProcServ/dbpage=page&GID=01211001361002498027487858&PG=00027000001073059075147237
全く見たこともない言語を見て, 驚きでした。 どこから行ったかというと, AfLaT (African Language Technology)というサイトからでした。 論文を見ていると, やはりtokenizationとpos taggingが重要な問題(とされている) ように見えます。
このへん に Helsinki corpus of Swahili もあるようです。


2009年10月14日(水) [n年日記]

#1 NTT厚木基礎研

研究の打ち合わせで, 初めて厚木のNTT基礎研に行ってきました。 NTT厚木研究開発センタ にはCS研の半分, 物性研, 先端総研(上部組織)などがあって, CS研の場合はグループによって場所が分かれています。
厚木は京阪奈よりは何となく都会なのかと思っていたら, 実はヤビツ峠まですぐそこ, というような山の中で驚きました。


大きな地図で見る

向かいには 富士通研究所 , 隣には日産先進技術開発センター [日経の記事] があるようです。坂を上がって行くところで, NAISTのようでした。

厚木では音声処理/信号処理のグループで Gaussian Process のTalkをしました。 基本的にはSVM2009で話した内容で, 特に企業秘密的なものはないので, スライドを若干直して 公開 しておきます。

内容はGPのイントロ, GPLVM, GPDM, GPDS という感じです。産総研の赤穂先生の カーネル本の影響もあって, Gaussian Process の関心が高まっている感じがする のと, GPの応用を書いた日本語の資料はあまりないと思うので, 興味のある方は どうぞ。
自然言語処理にはガウス分布は(直接は)効かないので, 僕は Gaussian Process は 基本的には素人ですが, GPML本の説明はちょっとわかりにくく, PRMLの説明を読んだ方 がいい気がします。それと実際には, MacKayの論文が非常にわかりやすい説明だと思いました。 (上のPDFの中に文献案内が書いてあります。)


2009年10月22日(木) [n年日記]

#1 IBIS 2009

IBIS 2009 が終わって, 博多の九大医学部から京都に帰ってきました。 今年は各所への色々なアナウンスのせいか, 去年の160人 をさらにしのぐ215人の参加者があったそうで, 東京並みだそうです。
渡部さん と二人で企画した二日目のセッション 『音声・音響処理と機械学習』 も無事に終わり, 内容の濃い話が続いて, 個人的にはかなり面白いセッションになった のではないかと思いました(多分)。 上のページから講演者の方の発表スライドがすべて見られますのでどうぞ。

一日目のセッション『金融リスクと統計的学習』も勉強になりまくりでした。ただ, 普通半年で話す内容を30分で話す(極値統計学)という凄いことになっていた上, 午前中に休憩がなかったので, 集中力を維持するのが結構大変でした。 僕は極値統計学を予習していたので, 説明を超速で飛ばされても多少大丈夫でしたが, 普通は辛いかもという気が。それは音声セッションも同じで, 亀岡さんの 凄い話を最初に持ってきたのは正解だったな, と思ったわけですが(w, 来年は午前中 にも休憩を入れて, ゆっくり頭に入れて, 印象に残るようにする方がいいかも, というのが反省点でした。

ポスターセッションも, 赤穂さんも書かれています が, 実質査読がないのにどれも 非常にクオリティが高くて凄いなと。特に, いわゆるIBISコミュニティの中心的な 大学以外からも参加が結構あったのが素晴らしいと思いました。

一年間準備してきて思ったのは, 井手さんの采配の素晴らしさと, それからPCが 「全員」リーダーシップがあるというのがとにかく凄いなあと, 準備中から驚かされ 通しでした。普通, 日本の組織では一部が声を上げて他は黙って聞いているという 状況がよくありますが, それがなくて, 皆次々と行動を起こしていくという。
個人的には, 昼休みにIBISエライヒト会議みたいなもの(運営会議)に初めて参加して, 貴重な体験でした。まるで ゼーレ みたいだなあとか思いましたが, 普通に明るい部屋でした。(笑)

NLPの人には朗報?なことに, IBIS2009のプログラム委員奨励賞 は東大高木研の武井君の, PCFGの高速ベイズ学習でした。 自然言語処理の人向けに簡単に書くと, これは次のような話。

この論文だけ審査員の評価が全員一致したため, 二位を作らず単独受賞になりましたが, 他の論文も非常にレベルが高く, 技術的な質は勝るとも劣らない, という理解は共通 していたと思います。
予め査読をするのが結構大変だったので, 来年も同じようにするかはよくわからない のですが..。

来年のIBIS 2010は東京だそうなので, 新しい統数研かと思っていたら, ホールに IBISの参加者が全員入らないかも, とか色々事情があるそうです。

・ -

以下おまけ。

泊まったホテルの部屋から, 海沿いに上のような風景が見えていて, 「何これ??和製モン・サン・ミシェル修道院か?」と思っていましたが, 帰りに散歩のついでに行ってみると, マリゾン という高速船乗り場&結婚式場だったことを知りました。
その時は marine+liaison なのだろうと思いましたが, 多分 marine+marry+liaison 辺りなのだと思う。モンサンミシェルというのもあながち間違いではなかった模様。 *1 下のようにカフェでお昼を食べました。

手前のかなり長い影は, 福岡タワーです。
ここから地下鉄西新駅に帰る途中, かの有名な 修猷館高校 の前を通りました。(というか, 西新駅のすぐ近くにあるようです。) 何というか, あからさまにエリート校な感じで驚きました。 (こんな感じ。) すぐ隣の西南学院大学の 方が高校みたいで, 修猷館の方が大学のようでした。
修猷館の人はやたら母校に プライドを持っているという話を周囲から色々聞いていましたが, まぁなるほどなぁ というか..。 しかし, こんなニュータウンみたいな所にあるとは, 全然思っていませんでした。


*1: 今調べたら, 実際にそれがデザインコンセプトのようです。

2009年10月30日(金) [n年日記]

#1 C array/matrix with size

C言語では標準では matrix[7][20] のようにサイズが決まっている場合以外は 多次元配列は使えないが, 「1次元配列の配列」を作ると *1 matrix[i][j] のように使うことができるので, 配列の配列を確保する dmatrix.c というファイルを書いて便利に使っている。
これは
double **matrix = dmatrix(rows, cols);
for (i = 0; i < rows; i++)
        for (j = 0; j < cols; j++)
                if (matrix[i][j] > 0) ...
のように使う。ただし, 単なる配列の配列なので, 行列の大きさ(rowsとcols) は別に覚えておく必要がある。
C++を使ってよければ, STLで vector<double>->size() とすればよいが, C言語でも 配列や行列のサイズは別に持たず, 自分で覚えていてほしい, という場面は 非常に多いと思う。 実際, STLでも使っているのはほとんど size() メソッドばかりな気がします。

一番簡単な解決策は, ベクトルの場合は

typedef struct {
        double *content;
        int length;
} dvector;
のような構造体を定義しておいて
for (i = 0; i < v->length; i++)
        if (v->content[i]) ...
のように使うことですが, これは v[i] のようにはアクセスできません (contentは構造体の先頭にあるが, lengthフィールドがあるため, 無理矢理 v[i] としてもオフセットが狂ってしまう)。

少し考えると, 後ろに length があるからいけないのであって, 前に持たせればよくね? ということで, 次のようなコードを書くと, C言語でも普通に配列に長さを持たせる ことができることに気付いた。

/* dvector2.c */
double *
dvector (int size)
{
        double *v;
        
        if ((v = (double *)calloc(size + 1, sizeof(double)))
            == NULL)
        {
                perror("dvector");
                return NULL;
        }
        /* record size */
        *((int *)v) = size;
        v += 1;
        
        return v;
}

void
free_dvector (double *v)
{
        free(v - 1);
}
ここで, dvector.h で
#define vsize(v)        *((int *)(v-1))
としておくと,
double *v = dvector(20);
double **m = dmatrix(n, k);

for (i = 0; i < vsize(v); i++)
        if (v[i] > 0) ...
for (i = 0; i < mrows(m); i++)
        for (j = 0; j < mcols(m); j++)
                if (m[i][j] > 0) ...
のように普通にMATLABのように使うことができ, 長さを覚えておく必要がない。 行列の場合にも同じことができ, 2つ分前に行数と列数を入れておいて, *((int *)) でアクセスすればok。下に dvector2.{c,h}, dmatrix2.{c,h} を置いておきます。

ポイントは, これは全く合法的なことをしているので, C言語なら必ず使えて, 外からは普通の double *, double ** と全く同じだということです。
これまで, 配列のサイズを変更する時は前の長さを与えないといけなかったり, 行列の場合は free() する場合もfree()するべき列の数を外から与えて やらないといけませんでしたが, これで勝手に長さを自分で取得して リサイズしたり, free() したりできるので, その点でも便利です。

唯一心配すべきなのは, double や double * にintが入らない場合ということですが, sizeof(int) > sizeof(double) だったり, int がポインタのサイズより大きいような 変態的な環境は普通はないと思うので, 心配しなくてよさそうです (thanks to 高林君)。 *2
これで, C言語の配列/行列もMATLABのように使えるようになりました。

・ おまけ:

これが必要になったのは, 僕が書いたのでないプログラムに手を入れて いて, そこで #define matrix_val(m,i,j) m->content[i]->content[j] とか matrix_val(mu, n, m) = matrix_val(nu, n + 1, matrix_val(c, i + n, j)); のような書き方がされていて, 個人的に非常に読みにくかったからでした。
上の dmatrix を使えばこれは mu[n][m] = nu[n+1][c[i+n][j]] と短く書くことができ ますが, 最初perlで文字列置換でやろうとしたところ, 再帰的に行うのが難しいことに気付きました。
少し考えて, cpp を使うことに。次のようなファイル replace.cpp
#define matrix_val(m,i,j)       m[i][j]
#define vector_len(v)           vsize(v)
..
を用意しておいて,
#!/bin/sh
#
#    indenter
#
if [ $# -lt 2 ]; then
        echo "usage: $0 replace.cpp source.c"
        exit 0
fi
sed 's/^#/_CPP_DIRECTIVE_/g' $2 | cat $1 - | cpp -C -P | \
sed 's/^_CPP_DIRECTIVE_/#/g' | indent -bl -bli0 -psl -kr
のようなスクリプトを書くことで, 綺麗に変換することができました。


*1: ちなみに, 中身をまとめて1次元の配列として確保しても, うまく操作すると matrix[i][j] でアクセスできるという話を 2004年の日記 に書きましたが, これは上の配列の配列より遅くなります。
実際には配列の操作では比較的近い場所を続けてアクセスすることが多いので, 細かく分かれていた方がページフォルトが起こりにくい, というような理由もありそう です。
*2: これはポインタの操作を簡単にしているためにこうしているだけで, 本質的な問題ではありません。sizeof(double) * len + sizeof(int) を確保するように すれば, どんな場合でも原理的にokです。

5 days displayed.
タイトル一覧
カテゴリ分類
 なかのひと
Powered by hns-2.10-pl1, HyperNikkiSystem Project