だれかのメモ帖

テクノロジー全般のメモ

「百度、シリコンヴァレーに人工知能研究所を開設」を読んで

百度がシリコンバレーにdeep learningの研究所をオープン

Googleの論文で紹介されてから、deep learningが急激に話題にのぼっているみたいですね。

deep learningは深い階層のニューラルネットを用いることで、複雑な特徴検出を行うことができる方法です。(他にも色々使えるみたいですが)
動画像などの「非構造化データ」に対して、既存の手法の中では最も優れた結果を残しており、今後メインストリームになる感じもあります。

最近、こういうことに関して中国、韓国、台湾の企業は素早い決定をくだすなあというのが今回の記事の感想です。

日本でも、個人的に興味がある人はいっぱい居そうですけどね。。
日本企業はdeep learning周りは研究しているところあるのでしょうか。。。

修士論文・発表終わりました

修士論文を書き終え、発表も乗り切りました。

これから、自分が書いたプログラムをリファクタリングして後輩に残しておく作業に入ります。


全く関係ないですが、最近Gitを導入してみました。
大学4年生の時から使っていればいったい何回の悲劇を回避できたのだろう、と思ってます。

NetBIOS over TCP/IP に関するメモ

家のLAN内の Windows Vista で共有フォルダが見えないというトラブルで躓いたのでメモ。

  • NetBIOS over TCP/IP (NBT) はWindows同士のPCで名前解決をしてくれる機能
  • ここでの名前とはDNSとかhostsファイルで用いている「ホスト名」ではなく「NetBIOS名」というWindows独自のもの
  • コンピュータ名として入力する名前がこのNetBIOS名となる

名前解決には以下のように行う

  • ブロードキャストで参照する (各PCは通知されてきた名前が自分と同じだったらIPを返す)
  • WINSサーバを参照する
  • LMHOSTSを参照する

上記はWindowsのサービスとして提供される。


で今回、

NBTサービスの「TCP/IP NetBIOS Helper」はちゃんと起動していたのだが、
ネットワーク接続の設定の方でNBTが無効になっていた。

固定IPとかの設定をするTCP/IPのプロパティの画面から、さらに「詳細設定」に進み、「WINS」タブをクリックすると、NetBIOSの設定項目が出てくる。
ここで、既定値かNetBIOS over TCP/IPを有効にするを選んでおけば大丈夫みたい。

多分昔に自分で無効にしたのだと思うが完全に忘れていた。 (そもそもなんで無効にしたのだろう。。。)

kmeans++

論文を先生に提出したら、「kmeans法の初期クラスタ中心をどうしてるのかちゃんと書きなさい」と返って来ました。先生、ごめんなさい。

だがしかし!kmeans clusteringの部分はOpenCVに全て任せている!
もう一度OpenCVのリファレンスを調べ直したところ、
「Arthur および Vassilvitskiiによる kmeans++ の中心初期化手法が利用されます.」
とのこと。

なんじゃそりゃ?ということで調べたことをメモしておこうと思います。

最初に行き当たったのが
k-means法の様々な初期値設定によるクラスタリング結果の実験的比較
という文献。

まず、kmeans++の前研究として、「KKZ」という初期クラスタ中心生成手法があるらしいです。
このアルゴリズムは非常に単純で

  1. データ同士で最も離れた二点を初期クラスタ中心{c_1, c_2}とする
  2. 全データ点{x_j}に対して、すでに決定されているクラスタ中心との最短距離 {D(x_j)}を求める。
  3. 全てのデータ点の中で最大となる{D(x'_j)}のデータ{x'_j}を次のクラスタ中心にする
  4. あとは繰り返し

というものでした。

一見これで初期化問題は万事解決に思えたのですが、文献によると外れ値がある場合に良くないらしい。そこで提案されたのがkmeans++というわけですが、手法の流れの記述で躓いたのでこの記事を書いている次第です。

結論から言うとkmeans++では次のクラスタ中心を確率的に選びます。
すでにあるクラスタ中心との最短距離が大きいデータが次のクラスタ中心により選ばれやすくなるようにするのですが、確率的に選ぶことで必ずしも最大のものが選ばれなくなります。すると、外れ値問題にも対応できるというわけです。

つまり

\phi(x_j')=\frac{D(x'_j)}{\sum_k D(x_k)}

が大きい順に確率的に選ぼうということです。
ですが、私はこれを元の論文、
k-means++: The Advantages of Careful Seeding
を読んでやっと理解しました。

というのも、最初に読んだ上の文献では以下のように記述されています。

  1. 最初のクラスタ中心をランダムに選ぶ
  2. 次式を満たす実数値Lをランダムに決める。

{0 \leq  L \leq \sum_k D(x_k)^2}

  1. Lに従って、次式を満たす{x_l}を次のクラスタ中心にする

{\sum^{l-1}_i D(x_i)^2 \leq  L \leq \sum^l_i D(x_i)^2}


はずかしながら最初は、何を言ってるんだ?こいつは。 状態でしたw

しかし実際は、文献にはただルーレット選択でkmeans++を実装したときの流れが書いてあっただけでした。(おれのばか!)

ところで、kmeans++では得られる解と最適解とのコスト比の期待値に上限があるということが証明されています。
初期値をランダムに選ぶkmeansは解がいくらでも悪くなる可能性があったのに対すると解の質がある程度保証されているということなんですかね??

他の機械学習にも言えますが、実行結果の安定性を保証するというのは大変だと思います。
しかし、実応用する際にはそういう所が大事になってきますし、だからこそkmeans++のような研究が重要になりそうですねー

あけましておめでとうございます

あけましておめでとうございます。
だいぶ少し放置していました。

ことしはいろいろやってみたいと考えています。

英語ももっと読める書ける聞けるようになりたいですし、スマホアプリも作ってみたいですし、画像処理と機械学習の知識も深めたいです。

しかしやりたいことは沢山あるものの、直近の課題である修士論文を終わらせないことには何も始まらない。ということで、私の2013は修士論文が書き上がってから始まります。。。


そういえば、これ面白かったです。

超解像のことは詳しく知らないのですが、ニューラルネットで実現できるのですね。

Ruby勉強中

いまさらですが、Rubyを勉強中です。

私は、このサイト
http://www.minituku.net/?locale=ja
で勉強してますが、無料なのにとても充実していると思います。(ステマじゃないよ!)

いままで、なあなあでC/C++javaより簡単に記述できるプログラミング言語、程度の気持ちで使ってきたのですがブロックとかクラスの取り扱いなど、生産性が上がりそうな機能がたくさんあるのですね。。。

いまは、入門なのですが、その内Ruby On Railsにも手を出してみたいなあ・・・

Building High-level Features Using Large Scale Unsupervised Learning を読んだ

ちょっとまえですが、輪講でICML2012のBuilding High-level Features Using Large Scale Unsupervised Learning を読みました。

この論文はGoogleが発表しているもので、
http://itpro.nikkeibp.co.jp/article/NEWS/20120627/405501/

http://wired.jp/2012/07/06/google-recognizes-kittens/
でも取り上げられています。

ざっくりとした概要は上の記事にもある通り、非常に大規模なニューラルネットワークをdeep learning と呼ばれる手法で学習させることで、教師なしで人の顔や猫の顔などの「高いレベル」の特徴検出器を作るという内容です。

deep learning

近年、ニューラルネットワーク機械学習界(?)で再評価されてきているようです。それは、deep learning と呼ばれる深い階層のニューラルネットワークでも学習を可能にさせる手法が提案されたからです。

これまでのニューラルネットワーク誤差逆伝播法で学習する際に、深い階層の下のレイヤでは上手くパラメータが調整されないという問題がありました。そこで、autoencoderなど各レイヤのパラメータを一層ずつ学習する方法が提案されました。

これに加えて、中間層で次元を圧縮して元のデータを表現するための幾つかの基底を表現するsparse coding やL2-pooling(これは正直まだよくわからず)を利用することで、deep learning による検出器・分類器は、他の手法(SVMとか)に比べても高い精度になるようです。

このdeep learning についてはもっと調べたいと考えています。

続きはまた後日書きます!