Blog

2010.11.16

劣微分を用いた最適化手法について(1)

preferred

みなさん、こんにちは。もしくははじめまして。研究開発チームの徳永です。

とんかつ教室のロースおじさんぐらいにぶっとんだブログを書いていきたい、そういう情熱をもって僕はこのエントリを書きはじめました。しかし、現実は厳しく、そのようなエントリを公開してしまうと、2日後ぐらいには僕の机がオフィスからなくなっていそうな気配が濃厚になってきています。そこで今日はおとなしく、最適化と機械学習の関係について、みたいなところを書いていきたいと思います。なお、タイトルにもありますが、このシリーズでは最終的には劣微分を用いた最適化手法の論文をいくつか紹介したいと考えています。

情報科学における最適化問題というのはいろいろな種類があります。最適化問題っていろんなのがあるんやねー、みたいなところに興味がある人は、wikipediaとかで確認してください。最近、機械学習と呼ばれる技術がいろいろなところで使われるようになってきましたが、機械学習の問題の多くは、凸最適化問題と呼ばれる問題に帰着されます。有名なCRFやSVMなどのモデルも、この問題に帰着されます。

機械学習では、入力と出力の組がたくさん与えられて、そこから新しい入力データが来たときに、出力がどのような値になるかを予測します。(このような問題設定を教師あり学習といいます。)例えば、入力がメールの文章で、出力がそのメールがスパムかどうか(スパムであったら1, スパムでなければ-1、とか)みたいな感じです。ちなみに、このように入力と出力の組を与えられるようなデータの与えられ方を教師あり学習と言います。

今、出力は1,-1の2つとしましたが、このような問題設定を二値分類といいます。出力の数が3つ以上の場合は多値分類といい、両方あわせて(というか、多値分類は機能的に二値分類を含みますね)単に分類と呼ぶこともよくあります。また、明日の降水確率、みたいに数字を出力する場合もあり、その場合は回帰と呼びます。分類と回帰は機械学習における超メジャーな問題設定なので、覚えておいて損はないでしょう。

入力データをどういう風に処理するのかというのは、機械学習の大きなポイントが一つです。例えば、メールの文章が入力に来たときに、それを形態素解析して単語単位に区切ってからBag-of-wordsで扱うのか、それとも辞書マッチで重要そうなキーワードだけ取り出してくるのかなど、データにどんな処理を行うかは性能に対して非常に大きな影響を与えます。しかし、この部分は、解きたい問題の性質、その時扱っているデータの性質などによって全然違うところなので、一般論として話せることはあまり多くありません。そのため、今回はこの部分についての話はしません。

さて、予め学習用に与えられるデータのことを、訓練データといいます。これを\(({\bf x}, y)\)という組の形でたくさん与えられるものとしましょう。\({\bf x}\)が太字なのは、ベクトルであることを表しています。また、\(y\)はとりあえず1,-1の2通りとしておきます。これを解くために、入力に対して出力を予測する関数\(f\)を考えます。入力を\({\bf x}\)、出力を\( y\)として、これまでのデータにないような入力出力の予測値\(\hat{y} \)を、もし\(f(x) > 0\)ならば \(\hat{y} = 1\) として、そうでない場合は \(\hat{y} = -1 \)として予測することにしましょう。こういう設定を考えたときに、機械学習の目的は、できるだけ間違いの少ない\(f({\bf x})\)を学習することです。

もっとも、「間違いが少ない」というのもいくつか設定があって、既存のデータに対して間違いが少ない(経験損失の最小化)場合や、未知のデータに対して間違いが少ない(期待損失の最小化)のどっちを最小化するんだとか問題があるのですが、今回はそこのところは省略します。

さて、\(f({\bf x})\)というのは関数な訳ですが、関数を学習するってどういうことでしょうか。少し回り道して、関数を学習するということについて考えてみましょう。

テイラー展開のことを思い出してください。テイラー展開というのは、どんな形の関数でも、

\(f(x) = a_{0} x^{0} + a_{1} x^{1} + a_{2} x^{2} + \ldots \)

という形で近似できる、というお話でした。近似精度は\(x^n\)の\(n\)をどこまで大きくするかによりますし、近似しても、近似する点\(x\)から離れるとなんかちゃんと近似できてなかったりとかしますが、とにかく、\(f({\bf x})\)というのは、\({\bf x}\)を含む項の和で書けるのでした。関数は、その引数を含む項の和として書ける、というところを強調しておきます。

ここで話を関数の学習の方に戻してきます。関数というのは、その引数を含む項の和で書けるのでしたね。ですので、ここでは、以下のような形で関数を書く事にします。

\(f({\bf x}) = w_0 x_0 + w_1 x_1 + \ldots \)

先程のテイラー展開では関数を近似していたので\(x^2\)とか\(x^3\)とかが出てきていましたが、ここでやりたいのは、近似することではなくて入力に対して出力値を計算するというだけの事なので、とりあえずx^2とかはつけません。その代わり、入力値はベクトルなので、そのすべての要素を関数を構成するために使っています。\(x_i\)にはすべて\(w_i\)がかけられていますが、これはそれぞれの\(x_i\)がどれぐらい判断に重要なのかを表す重みです。実はこの\(w_i\)がパラメーターで、機械学習でやることは、このパラメーターをいい感じに調整することになります。

なお、\(f({\bf x})\)がこのような形になっている場合、線形分類器とか線形識別器と呼ばれます。

さて、前提知識を書くつもりが、意外と長くなってしまいました。次回は

  • モデルのたて方, 最適化問題
  • 確率的勾配降下法

の2つを説明しましょう。そしてさらにその次回で、劣微分を用いた最適化手法について説明したいと考えています。お楽しみに!

シリーズ別インデックス

  • Twitter
  • Facebook