カーネル関数とは何か??をわかりやすく説明できる方法を見つけたかもしれない

02/18/2022

A8バナー広告

カーネル法(カーネル関数とも呼ばれる)とは何でしょうか?
定義を見せるのは簡単なことです。しかし、カーネルを知らない人にイメージを伝えるのはかなり難しいと思います。
かなりイケてる説明を見つけたので、紹介します。

この説明が通じそうな対象者

  • プログラムの概念を理解している人。特に関数の概念。
  • データベースの概念を理解している人。

数年の経験を積んだプログラマ相手ならば、だいたい通じそうですね。

だいたい想定者はこんな人です。

なんか、SVMってやつを習ってさ。カーネルってやつを知ったんだよね。よくわかんないから、カーネルってやつのことをざっくり知りたいんだよ。1分で理解できるくらいで!!

カーネルとは何か?どうやって説明する?

先に結論だけ書いちゃいます。

カーネルとは関数。データの類似度を計算するための関数。

ただし、時にはデータベースみたいな働きをすることがある。
引数とデータベース内部のレコード類似度を計算する。戻り値として、データ類似度を返す。

どうでしょうか?この説明で「関数であること」、「類似度を計算すること」、「データベースのレコード [1] サポートベクトルと呼びます があるっぽいこと」、を説明できていると思います。まずはこれだけの要素を説明できれば、カーネル関数の挙動をイメージできると思います。

すごくざっくりと説明してみます。[2] 専門家の人へ。嘘かいてたら、冷笑してソッ閉じしてください。優しい人はコメントを残してくれると嬉しいです。

k(x, y) と書いてあるときは、「類似度関数」としての機能です。xとyの類似度を返します。

k(x), k(x,  \cdot)と書いてあるときは、「データベースを呼び出してる関数」です。サポートベクトル(データベースのレコード)との類似度を返します。 \sum_{i=1}^{n} k(x, x_i) という書き方もあります。このときはx_iがサポートベクトルです。なぜなら「インデックス番号を持たない変数=入力待ちの変数」と理解するからです。

ちなみに「データベースみたいなもの」とは、ぼくのオリジナルではありません。次のビデオから拝借しました。

このビデオでは次のような説明をしてます。データベースの図が見えますね。[3] きっと、このビデオはペンタブを使って収録したんだろうなぁ。ぼくもペンタブをほしいなぁ

表記法をもうちょい説明してくれや!という人へ

論文でよく見るカーネル関数の表記方法をできるだけ説明してみます。

とりあえずガウスカーネルを例にあげます。 [4] ぼくのsupervisorによると「なんか、みんなとりあえず使ってる風潮ある。他にも選択肢あるのになぁ」とのこと

ガウスカーネルはこのような式です。

k(x, y) = exp(- \frac{|| x - y ||^2}{2 \gamma^2})

カーネル式を定義するときはかならずx, yの2つの引数を明記します。 [5] と、思っている。少なくともぼくが論文を読んでる限りでは

このような書き方をしている時、たいていはx, yの形状を言及しません。つまり、x, yはベクトルかもしれないし、行列かもしれないし、3階以上のテンソルかもしれません。データ形状についての言及は、提案手法セクションで説明されてたり、実験セクションで定義されてたり、といくつかのパターンがあります。

データベース的なカーネル関数のときには、次のような表記をされることが多いです。

k(x) = (k(x, s_1), ..., k(x, s_n))^\top ただしs_nはサポートベクトル

「表記が多い」というだけで、表記方法に統一性はないと思います。論文によっては 「k(x)はサポートベクトルを持つカーネル」とだけ文で説明してお終いのことがあります。

いずれの場合でも、「カーネル関数の実体」はかならず論文のどこかで明記しています。 [6] 式を書かない論文分野も多い。例えばGaussian Process系の論文は「ガウスカーネルを使った」と説明しているだけのことがよくある。


グラム行列も抑えておきましょう。グラム行列とは、k(x, y)の行列です。k(x, y)は類似関数ですので、グラム行列は類似行列とも言えます。[7] グラム行列は「カーネル行列」と呼ばれることもあります。

K_{xx} と書いてあったら、k(x,x)の類似行列を意味します。 K_{xy} と書いてあったら、k(x, y)の類似行列を意味します。

グラム行列は n * mのサイズになります。nはxのデータ個数, mはyのデータ個数です。

数学的に表記すると \{ x_1,...,x_n \}, \{ y_1,..., y_m \} となっています。 この時、グラム行列は \mathbb{R}^{n*m} です。そして、グラム行列のi, j要素はk(x_i, y_j) です。

他にどんな説明があるのか?

まずはWikipediaを見てみましょう。

カーネルとは、確率密度関数や確率質量関数の、ドメイン内のいかなる変数の関数でもないすべての因子が省略されるような形式である[要出典]

(中略)

再生核ヒルベルト空間(RKHS)のカーネルが、カーネル法として知られる一連の手法において、implicit spaceのデータに対し、クラス識別回帰分析クラスター分析などを実行するのに用いられる。

https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB_(%E7%B5%B1%E8%A8%88%E5%AD%A6)

。。。。初めてカーネル法を耳にする人がこの説明を見て、通じるでしょうか?ぼくは99%ありえないと信じます。

他にもブログ記事をいくつか調べてみました。おおむねの解説が「線形に切り分けにくいデータを、簡単に切り分けできる何か」でした。修士時代には、ぼくもこのレベルの理解で終わっています。たしかに、この説明があればSVMの動作原理をなんとか理解できなくもないです。

いくつか引用しながら紹介してみましょう。どの引用も文書の最初のあたりから引用するようにしています。 [8] 1分で理解したい現代人は、文書を最後まで読む能力がないんですよ。。それぼくのことや

カーネル法とは、データを変換して(データの次元を上げて)分析しやすくする手法です。 例えば、下の図のような直線的な赤と青のデータが有り、これを直線で分離させようとしてもできません。

https://nisshingeppo.com/ai/kernel-method/

カーネル法は生データに非線形写像を施してやって、それを新しいデータとみなして線形な手法を適用してやることで問題を解きます。つまり「生データをクネクネした空間にうまいこと並べ直してあげれば、その空間の中ではスパッと一直線になってるんじゃないの?」というのがカーネル法の発想です。

https://qiita.com/wsuzume/items/09a59036c8944fd563ff

いずれの解説も、なんとなくやってることはぼんやりイメージできます。[9] そして、カーネル法の説明なので、正しい。 しかし、このレベルの理解だと「あともう少しだけカーネル法のことを知りたい」と思ったときに、大きな壁にぶつかります。

以下は当時のぼくが思ってたことです。

そんなにうまくデータ構造をきれいに表現できるなら、データをはじめからぜんぶカーネルとかいうやつで変換すればええやん。
データ構造をきれいに表現するなら、PCAでもできるんやん。なんでカーネルせなあかんの??

おそらく、この誤解の発生理由は「カーネル法では関数を使うこと」、「データ類似度を関数内部で計算していること」、「サポートベクトルを関数内部に保持すること」を理解できてなかったことです。この点で、先のビデオの説明は優れていると思いました。

どうしてカーネル使うと、どうしてうまくいく?

自然な疑問だと思います。

簡単にいうと、「カーネル行列が新しい距離空間を表現しているから。つまり、カーネル関数の値はデータx, yの距離 in 新しい距離空間」という説明です。

すべてを説明するのはふかーく理論を説明しないといけないです。ぼく自身もまた完全に説明できません。なので、このふわっとした説明で勘弁を。

おわりに

カーネル法をしっかり説明してる本を紹介します。この本だけは日本から持ってきました。

Youtubeビデオで学べることも多い時代になりました。ぼくもYoutube学習法にお世話になってるので、いい方法と思います。ただ、専門的なことほど、書籍の方が体系的に学べる利点があるのも事実です。

表記を理解できなくて困ってた話

実のところ、最近まで誤解したままでした。特に「サポートベクトルを関数内部に保持している」という点を理解してませんでした。カーネル関数は、かならず引数を2つ取る。2つの引数の類似度を計算する。こう思っていたんですね。 [10] まぁ、この理解でOKなこともあるんですけど。

ただ、理論よりの機械学習論文を読んでると、こんな表記がよく出てきます。

k(x), k(x, ・)

当時のぼくはこう思ってました「は?ドットって何??引数に何が入るねん??」や「引数が1つだけってどないなってんねん。引数は2つもたなアカンやろ」。この誤解をひきずったまま、かなり苦労した記憶があります。


2022/2 このページのアクセス数が思ったよりも多いので、説明を追記しました。過去のぼくと同じく「カーネルわからへんがな」って人にわかりやすく伝わるといいなと思って。

Footnotes

Footnotes
1 サポートベクトルと呼びます
2 専門家の人へ。嘘かいてたら、冷笑してソッ閉じしてください。優しい人はコメントを残してくれると嬉しいです。
3 きっと、このビデオはペンタブを使って収録したんだろうなぁ。ぼくもペンタブをほしいなぁ
4 ぼくのsupervisorによると「なんか、みんなとりあえず使ってる風潮ある。他にも選択肢あるのになぁ」とのこと
5 と、思っている。少なくともぼくが論文を読んでる限りでは
6 式を書かない論文分野も多い。例えばGaussian Process系の論文は「ガウスカーネルを使った」と説明しているだけのことがよくある。
7 グラム行列は「カーネル行列」と呼ばれることもあります。
8 1分で理解したい現代人は、文書を最後まで読む能力がないんですよ。。それぼくのことや
9 そして、カーネル法の説明なので、正しい。
10 まぁ、この理解でOKなこともあるんですけど。