北野坂備忘録の人気記事
ブログを開始して一年ほど経過しましたので、人気のある記事を見ていきたいと思います。
2位
素人向け・機械学習初心者向けに書いているせいか、「言語処理100本ノック 2015年版」の解説記事はありがたいことによく閲覧されているのですが、一番閲覧が多いのはこちら。
72番までの問題と比べ、いきなり難易度が向上しているからだと思います。
「素性」について解説している72番の記事もよく読まれていました。
日本のオープンデータは構造的に失敗する
今日はいつもと違ってオープンデータのお話です。
「オープンデータ」という言葉が言いだされてからかなりたちましたが、日本での成功例はあまりありません。
これは構造的なものです。
基本的に、アメリカ(オープンデータの本場はイギリスですが)でうまくいったものは時間をおいて日本でも成功します。
例を挙げると、 Windows や iPhone です。
ところが、ある種のものは成功しません。
それは何かと言うと、「社会構造が違うもの」です。
一番わかりやすい例を出すと、「デカい車」です。
一時期アメリカでデカい車が売れました。
時間をおいて日本で売れたのか?
売れません!
日本の社会構造はデカい車が走れるようになっていないのです。
ですから日本でデカい車は売れませんでした。
同じことがオープンデータでも起こっています。
オープンデータは「課題を発見するツール」です。
オープンデータにより課題は発見できます。
重要なのは、課題を発見することではなく、課題を解決することです。
日本では、だいたい「オープンデータで課題解決!」と言うと、何かのアプリを作って終わりです。ただ、数年前までは「課題発見」だけで「アプリの開発」にすら辿り着いていませんでしたから、その分は進歩しています。
アメリカやイギリスがオープンデータで成功しているのは、「市民が課題を解決する仕組み」がアプリ以外に存在するからです。
日本でいうところのNPOのようなものを市民が自分で立ち上げて解決していくわけです。
日本はそういう仕組み、風土がありません。
アプリを作るか、「この解決は自治体でやってください」でシャンシャンです。
「市民が自分たちで課題を解決する」という社会構造がないので、いくら市民にデータをオープンにしたところでいつまでたっても課題は解決されないのです。
積極的にオープンデータ活動に携わっていく中でこのあたりのジレンマに気付いてしまった人たちは、「日本のオープンデータには出口が無い」という表現をされることがあります。言い得て妙です。
(カーネル法における)カーネル関数とは何か
Wikipedia と しましま先生 の「カーネル」の項目を読んで、
「分からんわ-!」
と叫びながら壁に頭を打ちつけ続けたみなさん、こんにちは。
あなたは正常です。
いったい日本人のうちの何人があれを見て
「あっ、カーネル関数ってこういうことなんだー!」
と分かるのでしょうか。いることはいると思いますが。
はい、というわけで「カーネル関数」の説明です。ややこしいことに「カーネル関数」は「カーネル」とだけ書かれることもあります。あと、「核関数」と表現されることもあります。
まずはカーネル法の話をします。
カーネル法は2つの工程に分かれます。
1つ目は、
1. 線形分離不可能なデータ構造を
2. 高次元への写像関数を使って高次元空間へ写像することで
3. 線形分離可能な構造に変換すること。
です。つまり「高次元に写像して線形分離可能にする工程」です。
2つ目は「カーネルトリック」で、この「高次元に写像して線形分離可能にする方法」で発生する高コストな写像関数の計算を、
・「写像関数」を直接使わずに「カーネル関数」を使って間接的に高次元のデータについて低コストで計算処理を行う方法
のことです。「特徴空間での変数を陽に扱わない」という不思議な日本語で表されることも多いアレです。
ここまでは理解できている人も多いと思います。
で、「カーネル関数」と言うと「内積」「内積」と思われがちですが、別に内積計算するものだけがカーネル関数ではありません。
「カーネル関数」とは本来「2つのデータの間のある種の類似度を表す」関数のことです。
黄色本の上巻には「内積でないカーネル関数」の良い例(Parzen窓)が掲載されています。
しかしながら、カーネル法に使えるカーネル関数は限られています。カーネル関数ならなんでもいいわけではないのです。
カーネル関数k(x,x')がカーネル法で有効なカーネル関数である十分条件は、
・対称性を持つこと & 半正定値性を持つこと
=任意の{x_n}に対して、要素がk(x_n,x_m)で与えられるグラム行列Kが半正定値であること
グラム行列Kが半正定値であるカーネルを「半正定値カーネル」と言います。カーネル法の文脈では「半」が無視されて「正定値カーネル」と書かれることのほうが多いです。グラム行列はN×N対称行列なのでグラム行列と言った時点で対称性も満たされます。
というわけで、上記のカーネルトリックの定義を少し修正します。
・「写像関数」を使わずに「半正定値カーネル」を使って間接的に高次元のデータについて低コストで計算処理を行う方法
ただ、カーネル法の文脈で使われる「カーネル(関数)」とはたいてい「半正定値カーネル」のことを意味するので、前者のような表現が多くなるわけです。
「半正定値カーネル」の有利な点は、
・低次元な入力空間で内積計算を済ますことができるので、計算量とメモリを削減できる
ことです。
実を言うと「内積」を一般化したものが「半正定値カーネル」なのです。数学的な話をするとさらにここから「再生核ヒルベルト空間」に入っていくわけですが、しましま先生のところですら項目ができていないのでそちらに入り込んでいくのはやめておきましょう。
(後日訂正)
すいません。しましま先生のところに項目ありました。
kenichia.hatenablog.com
で、この「半正定値カーネル」というのもいっぱい種類があります。
しかも、これら「半正定値カーネル」は組み合わせることも可能です。半正定値カーネルの和、積、指数関数は再び半正定値カーネルになります。
といっても代表的な半正定値カーネルは以下の2つです。これは『はじめてのパターン認識』に載っていますので詳しくはそちらを参考にしてください。
1. 多項式カーネル
2. 動的基底カーネル(RBFカーネル)=ガウスカーネル(ガウシアンカーネル)
(ちなみに『はじめてのパターン認識』では半正定値カーネルは「内積カーネル」という表現になっています。)
他にも、
・フィッシャーカーネル
・木構造カーネル
・文字列カーネル
など、用途に応じて様々なカーネル関数が存在します。
【例外】
「半正定値カーネル」ではないカーネル関数も存在します。
・シグモイドカーネル
・シンプソンカーネル
これらのカーネル関数はグラム行列が「半正定値」ではないので「半正定値カーネル」ではないのですが、性能が良いので用いられています。
このようなカーネル関数は「不定値カーネル」と言います。
まとめましょう。
1. 本来のカーネル関数とは、「2つのデータの間のある種の類似度を表す」関数のこと。
2. ただしカーネル法で使えるカーネル関数は「半正定値カーネル」のみである。そしてカーネル法の文脈では「半正定値カーネル」ではなく「正定値カーネル」と表現されることが多い。
3. 「半正定値カーネル」は計算速度・メモリの観点から有利である。
4. 「半正定値カーネル」の中でも一般的に用いられるのは「多項式カーネル」と「ガウスカーネル(RBFカーネル)」である。
5. しかしながら「半正定値カーネル」はいくらでも組み合わせることが可能であり、用途に応じた様々なカーネル関数が開発されている。
6. 実用上では「半正定値カーネル」ではない「不定値カーネル」も用いられている。
以上です。
mecab-ipadic-neologd のアップデート失敗
mecab-ipadic-neologd のアップデートに失敗、その後成功しましたのでご報告を。
sudo /mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n (なんやかやあって) ../libexec/make-mecab-ipadic-neologd.sh: line 102: /usr/bin/mecab-config: そのようなファイルやディレクトリはありません
確かに
which mecab
すると
/usr/local/bin/mecab
になるので
/usr/bin/mecab-config
ではなくて
/usr/local/bin/mecab-config
になってほしい。
そこで、make-mecab-ipadic-neologd.shの101行目~102行目を見ると、
MECAB_PATH=`which mecab` MECAB_DIC_DIR=`${MECAB_PATH}-config --dicdir`
となっています。
ここでも which mecab を使っているわけです。
しかしながら
/usr/bin/mecab-config: そのようなファイルやディレクトリはありません
ということは、
./libexec/make-mecab-ipadic-neologd.sh
の中で行われている which mecab では
/usr/local/bin/mecab
ではなく、なぜか
/usr/bin/mecab
が返事となって返ってきているということになります。
らちが開かないので、make-mecab-ipadic-neologd.shの101行目を
#MECAB_PATH=`which mecab` MECAB_PATH=`/usr/local/bin/mecab`
と修正しました。
こうすると正常に終わりましたので、このエラーが出てアップデートがうまくいかない人はこのように MECAB_PATH がどうなっているか調べて直入力してみましょう。
Twitter API用のtoken入手時に求められる携帯番号入力時の認証が失敗する
Twitter API用のtoken入手時に、携帯電話番号の登録を要求されるようになっていました。
(前はなかったと思うんですが……)
電話番号を登録し、届いたTwitter認証コードを入力するんですが、
失敗しました。
と言われます。
何度繰り返してもダメだったので不思議に思い検索してみたところ……。
9-bb.com
この通りに携帯電話での認証を行うとうまくいかないケースがあります、それは携帯電話の認証を行う際にTwitterのアカウントの言語が日本語になっていると上手く来ません。携帯電話の認証画面の表示と、SMSの受信まではいけますが、SMSに書かれた内容を入れても認証出来ないバグがありますので。Twitterの言語を英語にしておく必要があります
このご時世に!
言語設定を英語(English)に変えないと正しく認証できませんだとぉ!?
そらこの技術力の無さでは身売りもするわ……。
※認証はこの記事のとおりにやって成功しました。
機械学習のための線形代数本
「『機械学習を理解するためには代数を勉強しろ』と言われたが、代数の教科書を読んでもどこが機械学習に役立つのか全く分からない」という話を聞いてその人が読んでいる本を見せてもらったところ、代数の教科書でも群論とか環論の本でした。
「勉強しろと言った人はたぶん『代数』ではなくて『線形代数』を勉強しろと言ったのでは……?」と思ったのですが、「人によって代数学の入り口が違うのかも?」と気づきました。
現代代数の基礎は「群」、「環」、「体」なので、代数学の入門書は群論から始まります。ただ、たいていの大学では先に線形代数を教えていると思います。ですから「代数を勉強しろ」というのは「当然線形代数から勉強しろ」という意味なのかな……とも思いました。
ともあれ、機械学習には群論や環論といった抽象代数学を勉強する必要はありません(少なくとも今のところは)。
必要なのは線形代数の知識です。
こういった「機械学習向きの線形代数」の勉強におすすめなのが、普通の線形代数の教科書ではなくて
プログラミングのための線形代数
です。
表紙が「古き良きアメリカンSFコミック風」なので「本当にこの本で大丈夫か?」と心配になりますが、中身は表紙と全く関係なくしっかりした本です。
この表紙で損してると思うなー。
線形代数を勉強させられる人は「なぜこんなことを勉強しないといけないのか良く分からない」ということが多いのですが、機械学習をやっている人ならこの本を読めば「『画像を変換する(写像)』『高次元空間の点(データ)を自在に取り扱う』のに線形代数が必須である」ことが分かって勉強しやすいと思います。
普通の「線形代数」の入門書と違って、
・数値計算を行う場合のテクニック
・数値計算でのハマりどころ
が書かれているところもポイントが高い。