賭けと機械学習

コインを投げて表が出るか裏が出るか賭けをするとします。表裏が出る確率が同じときには、表に賭けても裏に賭けてもアタリハズレは半々です。では、表と裏で出る確率が異なる場合(仮に表が出る確率を p とします)はどうでしょうか?

最適な賭け方

正解は「確率の高い方に賭ける」です。数式で書くと p > 1/2 のときは「表」、p < 1/2 のときは「裏」に賭けるのが最適な戦略になります。ここまでは直感的にもあきらかだと思います。 では、次に賭ける方も確率的に決めてよい、つまり「確率 q で表に賭け、確率 1 - q で裏に賭ける」という賭け方が許される場合、最適な賭け方はどうなるでしょうか?

実はこの場合も先程と同様「p > 1/2 のときは表、p < 1/2 のときは裏に賭ける」が最適な戦略になります。つまり、確率的に賭け方を決めてよい場合でも(表裏の出る確率に応じて)決め打ちで賭けるのが正しい戦略です。人によっては当たり前に感じるかもしれませんが、それほど自明なことではないと思うので、少し詳しく説明します。

まず、実際にコインの表裏が出る2通りと表裏に賭ける2通りで、計4通りの場合が起こる確率を表にしてみます。

表が出る 裏が出る
表に賭ける pq (1 - p)q
裏に賭ける p(1-q) (1 - p)(1 - q)

アタリになる場合は「表が出て、表に賭ける」ときと「裏が出て、裏に賭ける」ときの2通りなので、当たる確率は pq + (1-p)(1-q) です。これが最大になる q を求めるために当たる確率を変形します。

pq + (1 - p)(1 - q) = (2p - 1) q + (1 - p)

すると、(2p - 1) > 0 すなわち p > 1/2 のときは q をできる限り大きくすなわち q = 1 とすればよく、逆に (2p - 1) < 0 すなわち p < 1/2 のときはできる限り小さくすなわち q = 0 とすればよいことが分かります。q = 1(あるいは 0)というのは常に表(裏)に賭けるということなので、先ほど述べたように確率的な戦略を取れる場合でも、確定的に表(あるいは裏)に賭ける方法が最適だということが示されました。

ここで2点注意しておきます。まず、ここまでの話はコインの表が出る確率(同じことですが裏の出る確率)が分かっていると仮定しています。次に、最適な賭け方をしても一定の確率で外れます。これは表裏が出るかは確率的に決まる以上仕方のないことです。重要なのは一定の確率で外れるけれどもこれが最適、つまり、これ以上当てる確率をあげることはできない、ということです。

最適予測とベイズエラー

話を機械学習に移します。大雑把に言って機械学習では何かしらの入力 x が与えられたときに、そこから帰結する出力 y を予測することが目的となります。出力には様々なものがありえますが、ここでは最も基本的な Yes/No の二値分類を考えます。(ちょっと抽象的でわかりにくく感じる人は、例としては、画像を入力としてそこに猫が写っているかいないか判定するという問題を想定して下さい。)

いま仮に入力(画像)が与えられたときの出力(猫がいるかいないか)の確率が P(y | x) と分かっているとします。すると x が与えられたときに y (Yes/No) を予測する最適な戦略は先ほどのコインの賭けとまったく同じ話で「P(y = Yes|x) > 1/2 のときは Yes、 P(y=Yes|x) < 1/2 のときは No」になります。

先ほどのコインの話の最後に強調したことは、この場合にも同様に当てはまります。つまり、最適な予測をしても一定の確率で予測は外れます。外れますが、これ以上予測精度をあげることはできません。この「最適な予測をしたときに外れる確率」をベイズエラーといいます。

ベイズエラーは予測精度の限界値を与えるもので理論上大変重要な概念です。もう一度繰り返しますが、何をどうやっても、深層学習を使おうが、最先端のなんとか学習を使おうが、量子計算しようが、シンギュラリティが来ようが、予測は必ずベイズエラーより大きい確率で間違いは起こります。

かんじんなことは、計算できないんだよ

それほど重要なベイズエラーですが機械学習の教科書で説明されないことも多いようです。(記事の最後で、そこら辺も説明してあるおすすめの教科書を紹介します。)その原因は、ベイズエラーを実際に計算できることは現実の問題でまずない、という点にあります。

ベイズエラーを計算するためには P(y|x) の真の値を知る必要があります。しかし、そもそもそれが分かっているならば、わざわざ機械学習することもなく、先ほど説明した方法で最適な予測をすることができます。つまり、機械学習の予測精度の限界を知るためにベイズエラーを計算する、というのは論点先取の誤謬をおかしているわけです。

とはいえ、ベイズエラーの概念を理解しておくことは機械学習システムの研究開発をする際に大いに役に立ちます。たとえば、学習結果を評価した結果、期待するほど予測精度が高くなかった場合、モデルや訓練方法に問題があるのではなく、そもそもベイズエラーが大きいデータなのではないかと疑ってみることは重要です。

広く使われているベンチマークテストでは、そういった問題は既によく知られている(はず)なので、あまり気にしなくて良いかもしれませんが、自分で作った新しいデータではベイズエラーの高さを疑ってみることは重要です。ベイズエラーが大きいデータの場合、いくらモデルや訓練方法を工夫してもある程度以上は予測精度が向上することはなく、素性の取り方やラベルの種類などを見直さないと根本的な解決にはなりません。

一つ注意したいのは、予測したいことによっては、本質的に出力が入力に一意に定まらない場合があることです。たとえば、「食べ物の写真」を入力として「食べた人が美味しいと思ったかどうか」を 予測しようとする場合を考えます。美味しいかどうかは食べてみないとわからないですし、味の好みは人それぞれです。なので、いくら入力の写真を解析しても、いくら沢山のデータを集めても、写真だけから当てることは極めて難しく、ベイズエラーはそれほど小さくないことが予想できます。このような場合、何をどう頑張っても予測精度には限界があります。(主観的な判断が必要とされる問題は、このようなことが起こることが多い気がします。)

ベイズエラーを(粗く)近似する

現実の問題でベイズエラーが正確に計算できることはまずありません。しかし、その感触をつかむためにいくつか試せることがあります。

まず、P(y|x) を入力全体で平均(周辺化)してしまうことです。

\int P(y|x) P(x) dx = P(y)

P(y|x) を正確に推定することは難しいですが、入力に関係なくラベルの出現頻度だけを数えれば P(y) はかなり正確に推定ができます。もちろんこれは近似としては相当粗いものですが、ラベルの出現頻度が極端に偏っている可能性がある場合(たとえば、99%が Yes)はまず最初に計算しておくべき量です。なぜならば、そのような場合 P(y|x) は大部分の入力について P(y) に近い値をとるからです。(さもないと平均である P(y) がそんな極端な値を取ることができません。)

入力変数が多次元の場合(ほとんどの機械学習の問題はそうです)、P(y|x) をある次元だけ残して周辺化してしまうのも別の近似の仕方です。(多次元入力 xx = (x_1, x_2, ..., x_n) と表記します。)

\int P(y|x_1, x_2, ..., x_n) P(x_2, ..., x_n) dx_2 ... dx_n = P(y | x_1)

この場合、残す次元 x_1 は「いかにも予測に効きそう」なものを選ぶとよいと思います。また x_1 が連続量の場合は適当に離散化するとよいでしょう。

先ほどの場合と同様、x_1 の値ごとにラベルの出現頻度を集計することで P(y | x_1) はある程度正確に推定できます。P(y|x) よりは手間がかかりますが、その分真の確率 P(y|x) の近似としては精度が(少し)上がっています。このとき注意するべきなのは P(y)P(y|x_1) の差がどれくらいあるかです。いま x_1 が実際に予測に効く次元だとしたら P(y|x_1) の分布は P(y) から変化しているはずです。もし変化が見られない場合は、そもそも予測に効かない次元を選んでしまった(=問題の性質をよく理解できていない)か、あるいは予測に(単独で)効くような次元はない(=予測が難しい問題)、という可能性が出てきます。いずれにせよ慎重になるべきでしょう。

適切なベースラインを使おう

機械学習の結果を報告するときは、単に提案した手法の結果だけでなく、比較対象となるベースライン手法を用意してその結果も報告することが通例です。広く使われているベンチマークデータを使う場合には既存手法も沢山あるので、その中から適当なものを選んでくることが多いですが、新しいデータの場合そうもいかないことがあります。その場合でも、適当なベースライン手法を用意することは問題の難しさや提案手法のインパクトを説明するうえで重要です。

ベースライン手法を自分で作るのはなかなか難しいことです。いい加減な方法をとってしまうと、提案手法がよく見えるようにわざと弱いベースラインを使ったのではないか、と疑われてしまいます。かといってヘンに凝ったことをやって、そもそもそれが問題を解くのに適切な手法なのか、と疑問に思われても本末転倒です。理解しやすくかつ妥当な精度を出す(と合理的に期待される)手法を選ばないといけません。

ひとつの手は、上で説明した近似ベイズエラーから決定則をつくり、それをベースラインとして用いることです。具体的には P(y) あるいは P(y|x_1) が最大となる y を予測値として、その精度を測ったものをベースラインとして報告します。これはベースラインとして低すぎるように感じるかもしれませんが、出力ラベルの分布が偏っている場合には侮りがたい精度になります。またデータの性質によっては特定の次元がとてもよく予測に効くため、P(y|x_1) を使ったベースラインだけでかなりの精度を達成することもあります

(余談ですが、文書要約の基礎技術として記事の中から要約に含むべき文を選ぶ「文選択」というタスクがあります。とある文選択のベンチマークテストでは「記事の先頭に近い文から選ぶ」というベースラインを越えるのは簡単ではないことが知られています。)

学会などで、とても凝った手法を散々試しているわりに、このような簡単に構成できるベースラインの評価をしていない機械学習研究を時折見かけます。自分のアイデアをいろいろ試したくなる気持ちはよくわかりますが、まずはデータの基本的な性質をきちんと理解するところから始めるべきだと思います。

おまけ:おすすめの機械学習の教科書

わかりやすいパターン認識」という20年近く前に出た本で、深層学習どころかサポートベクトルマシンも載っていませんが、機械学習の基礎固めをするのにおすすめの一冊です。使われている数学は基本的なものでルベーグ積分も変分法も必要ありませんが、じっくり噛み締めながら勉強するのに適した本です。

賭けと機械学習” への1件のフィードバック

  1. 人生なんてベイズエラーが相当大きくて、翻って考えると、回帰によって予測できる事態があり、法則が見つけられるのはキセキのように感じる。
    なんてことを思いました。

    いいね

コメントを残す