機械学習
2016年04月03日
去る3月19日(土)に、札幌C++勉強会 #11 - connpassを開催しました。
現在、主に運営をしているメンバーが札幌にいない状況ではありますが(私と@ignis_fatuusさん)、二人が時折札幌に戻るときに実施しています。その前の第10回(2015年12月26日)も、二人が帰省するタイミングを狙って計画したものでした。
※なお、「札幌やその周辺に住んでいて、C++勉強会を計画したい!」という方がいましたら歓迎ですのでご一報ください。
私の発表
名古屋に移って研究の内容が大きく変わったわけなのですが、そこで行うようになったことをテーマに話しました。
「関数の最小化」は、中学や高校を含め、数学ではよく出る問題です。これはより一般には「最適化」と呼ばれる問題にあたり、機械学習の分野でもこれは非常に重要な考え方であるという話です。
最近「ビッグデータ」などと呼ばれるように、データがたくさん手に入るようになったことから、それを分析する手段の開発も重要となっています。人間は「事例を見て、行うべき判断などを知る」という「学習」を行いますが、コンピュータ上で手段は違えど「事例を見て、行うべき判断などを知る」ということを行わせる、というのが「機械学習」です。例えば迷惑メールフィルタを作ることを例に取ると、迷惑メールになる条件を人手で記述するのではなく、ユーザの迷惑メール報告をもとに構築するのが機械学習の考え方ということになります。
機械学習の実際の計算においては、手法によって違いはありますが、簡略化して書くと以下のような手順を踏むことになります。
- 結果(上記の例でいえば「迷惑メールであるか否か」)を表現する関数やデータ構造の形(例えば、「データを x, y としたとき、 p(x, y) = ax + by + c の形で書ける関数」)を決める。
- 関数 p(x, y) が、すでに持ち合わせているデータ(訓練データという。上記の例でいえば「すでに報告されている迷惑メール」)からどれだけ離れているかを表す関数 f(a, b, c) を作る。
- f(a, b, c) を最小化するような a, b, c を求め、p(x, y) に適用する。これが「訓練データをもっともよく反映した、結果を表現する関数」となる。
特に機械学習を行うという観点では、その関数 f(a, b, c) の最小化が実際に計算できないのでは、学習結果も得られないことになってしまうため、どんな関数であれば計算が容易なのか判断することは非常に大事です。詳細は資料中で解説していますが、この問題を考えるにあたって重要なキーワードとして、「極小値」や「凸関数」というものがあります。
C++のソースコードも用意しています(github: maraigue/sapporocpp-20160319)。簡単な実装ではありますが、機械学習の簡単な例である線形分類(「男性と女性」など2種類に分けられるデータ点を、2次元なら直線、3次元なら平面…で分ける最良のものを出力する)のサンプルも用意しています。