Loftal Engineer's Blog

Loftalの開発者ブログです。

教師あり学習の問題設定とそれを解く手順

機械学習の主要なテーマの一つとして「教師あり学習」があります。これは、データと正解のペアからパターンを学習し、新たなデータの正解を当てることを目標とする研究テーマです。実際の応用例としては幅広く、例えば以下のようなものが挙げられます。

  • 画像認識
    • 顔認識、物体認識、手書き文字認識
  • 音声認識
    • 音声からテキストへの変換、話者の判別
  • 迷惑メール判定

これらの技術の基礎は共通しています。つまり、背景にある理論を理解することで様々な分野に応用することが可能となります。

そこで本記事では、様々なモデル・手法を体系的に整理することを見据えて、教師あり学習について書いてみたいと思います。一見遠回りに見えますが、体系的に整理することで今話題の「ニューラルネットワーク」や「ディープラーニング」についても理解が深まります。

教師あり学習の問題設定

まずは教師あり学習の問題設定をできるだけ一般的な形で表します。問題設定自体は至ってシンプルです。

ノーテーション
 \mathcal{X}:観測データが取りうる値の集合
 \mathcal{Y}:ラベルデータが取りうる値の集合
 N \in \mathbb{N}:訓練データ数
 \boldsymbol{x}_n (\in \mathcal{X}) n個目の観測データ (n=1,2,\ldots , N)
 y_n (\in \mathcal{Y}) n個目のラベルデータ (n=1,2,\ldots , N)

上記ノーテーションを用いて、既知データと未知データは以下のように書くことができます。

既知データ
 \mathcal{D} = \{ (\boldsymbol{x}_1, y_1), (\boldsymbol{x}_2, y_2), \ldots , (\boldsymbol{x}_N, y_N) \}:訓練データの集合
 \boldsymbol{x}^* (\in \mathcal{X}):新たな観測データ

未知データ
 y^* (\in \mathcal{Y}) \boldsymbol{x}^*のラベルデータ

教師あり学習の目的は、既知データから未知データを予測することです。

教師あり学習の問題設定はこれだけです。この時点では、確率もパラメータも出てこないことに注意しておきましょう。

具体例1(身長と体重)

身長から体重を予測する問題を考えたい場合、
 \mathcal{X} = \mathbb{R}:身長が取りうる値の集合
 \mathcal{Y} = \mathbb{R}:体重が取りうる値の集合
とすればOKです。

このように \mathcal{Y}が連続である場合を、回帰と呼びます。

具体例2(手書き数字認識)

28×28ピクセルの画像(256階調グレースケール)からどの数字か(0〜9)を予測する問題を考えたい場合は以下のようにします。
 \mathcal{X} = \{0, 1, \ldots , 255\}^{784}
 \mathcal{Y} = \{ 0, 1, \ldots , 9\}

このように \mathcal{Y}が離散である場合を、分類と呼びます。

問題を解く手順

以上で教師あり学習の問題設定を表すことができました。それではこの問題をどのように解けば良いでしょうか?問題を解く手順は以下の3ステップに分けることができます。

  1. モデル化
  2. 学習
  3. 推論

ここでも各ステップをできるだけ一般的な形で表してみます。

モデル化

モデル化とは、 \boldsymbol{x} yの関係を数式で表現することです。ここでは特にパラメータ \boldsymbol{\theta}で特徴づけられる確率分布 Pを仮定することにし、これを確率モデルと呼ぶことにします。以降モデル化として確率モデルのみを考えます。

確率モデルによるモデル化は以下の2つに分けることができます。

  • 識別モデル
  • 生成モデル

識別モデル

識別モデルは以下のように表されます。
 P(y | \boldsymbol{x}, \boldsymbol{\theta})
つまり、観測データが与えられたもとでのラベルデータの確率分布をモデル化したものが識別モデルです。

生成モデル

生成モデルは以下のように表されます。
 P(\boldsymbol{x} | y, \boldsymbol{\theta})
つまり、ラベルデータが与えられたもとでの観測データの確率分布をモデル化したものが生成モデルです。

学習

モデル化ができたら、次は学習です。学習とは、訓練データからモデルのパラメータ \boldsymbol{\theta}を計算することです。学習は以下の3つに分けることができます。

最尤推定

最尤推定は、訓練データを生成する尤もらしいパラメータを推定値とします。推定値を \hat{\boldsymbol{\theta}}とすると、以下のように書くことができます。
 \displaystyle \hat{\boldsymbol{\theta}} = \arg \max \prod_{n=1}^{N} P(y_n | \boldsymbol{x}_n, \boldsymbol{\theta})

ここで、識別モデルの場合を書きましたが、生成モデルの場合は \boldsymbol{x} yを逆にするだけです。以降のMAP推定、ベイズ推定も同様に識別モデルの場合のみを書きます。

MAP推定

MAP推定では \boldsymbol{\theta}の事前分布 P(\boldsymbol{\theta})を仮定し、訓練データが与えられたもとでの事後確率 P(\boldsymbol{\theta} | \mathcal{D})が最大となるものを推定値とします。ベイズの定理を用いて、以下のように書くことができます。
 \displaystyle \hat{\boldsymbol{\theta}} = \arg \max \prod_{n=1}^{N} \frac{ P(y_n | \boldsymbol{x}_n, \boldsymbol{\theta}) P(\boldsymbol{\theta}) }{ \int P(y_n | \boldsymbol{x}_n, \boldsymbol{\theta}) P(\boldsymbol{\theta}) d\boldsymbol{\theta} }

最尤推定及びMAP推定は、一点の \boldsymbol{\theta}を推定するため、点推定と呼ばれます。

ベイズ推定

ベイズ推定では、点推定と異なり一点の \boldsymbol{\theta}を推定するのではなく、 \boldsymbol{\theta}を確率分布として推定します。ベイズの定理を用いて、以下のように書くことができます。
 \displaystyle P(\boldsymbol{\theta} | \mathcal{D}) = \prod_{n=1}^{N} \frac{ P(y_n | \boldsymbol{x}_n, \boldsymbol{\theta}) P(\boldsymbol{\theta}) }{ \int P(y_n | \boldsymbol{x}_n, \boldsymbol{\theta}) P(\boldsymbol{\theta}) d\boldsymbol{\theta} }

推論

最後に仮定したモデルと学習したパラメータを用いて新たな観測データのラベルデータを推論します。以下の場合に分けて考えます。

  • 識別モデルで点推定の場合
  • 識別モデルでベイズ推定の場合
  • 生成モデルで点推定の場合
  • 生成モデルでベイズ推定の場合

識別モデルで点推定の場合

識別モデルでは yの確率分布を直接計算できます。また点推定のため、求めたパラメータ \hat{\boldsymbol{\theta}}を用いれば良いので、とてもシンプルです。
 \hat{y^*} = \arg \max P(y | \boldsymbol{x}^*, \hat{\boldsymbol{\theta}})

識別モデルでベイズ推定の場合

一方ベイズ推定の場合は \boldsymbol{\theta}の確率分布を推定しています。そこで、その確率分布 P(\boldsymbol{\theta} | \mathcal{D})で期待値を取ったものの最大値を求めます。
 \displaystyle \hat{y^*} = \arg \max \int P(y | \boldsymbol{x}^*, \boldsymbol{\theta}) P(\boldsymbol{\theta} | \mathcal{D}) d\boldsymbol{\theta}

生成モデルで点推定の場合

生成モデルの場合、 yの確率分布は直接計算できないので、ベイズの定理を用いて事後確率を計算します。点推定で求めたパラメータはそのまま代入します。
 \displaystyle \hat{y^*} = \arg \max \frac{ P(\boldsymbol{x}^* | y, \hat{\boldsymbol{\theta}}) P(y) }{ \int P(\boldsymbol{x}^* | y, \hat{\boldsymbol{\theta}}) P(y) dy }

生成モデルでベイズ推定の場合

生成モデルでベイズ推定の場合は、 yの事後確率を更にベイズ推定で求めた確率分布で期待値を取ります。
 \displaystyle \hat{y^*} = \arg \max \int \frac{ P(\boldsymbol{x}^* | y, \boldsymbol{\theta}) P(y) }{ \int P(\boldsymbol{x}^* | y, \boldsymbol{\theta}) P(y) dy } P(\boldsymbol{\theta} | \mathcal{D}) d\boldsymbol{\theta}

まとめ

以上で教師あり学習の問題設定とそれを解く手順の整理ができました。本記事で整理した枠組みから捉えると、教師あり学習の各種手法が何をしているのか見通しが良くなります。次回はこの枠組みを用いて「ニューラルネットワーク」について書いてみたいと思います。

web制作会社の決め方

皆様、こんにちは。

いきなりですが、webやシステム制作を依頼したい時、
制作会社はどのような点で決めますか?
値段でしょうか?納期でしょうか?

おそらく上記の点が一番初めに考慮される点かと思います。
もちろん、値段・納期は大事です。
では他に考慮する点があるとしたら何があるでしょうか。
・過去の実績の多さ
・実績のサイトのUI・UX(デザインや動き)

通常の静的なwebページ制作の依頼であれば、基本的にこの辺りを見れば、
なんとなく制作会社を選べそうな気がします。

システムが絡む場合は?

では、システムが大きく絡んでくるweb制作を行いたい時に、
どのような会社を選ぶと良いでしょうか?
システムが大きく絡んでくるサービスとは、
・ブログ
SNS
ECサイト
・ユーザーに会員登録を行ってもらい、個別のサービスを提供するサイト
・別のサイト・APIから株価や商品情報等を取得して、一定のアルゴリズムで処理するシステム
・アクセスが大量にあるサイト
等です。(他にも色々ありますが。

このようなサービスを依頼したい時に、上記に上げた点だけで選ぶと、失敗してしまう事があります。
なぜなら、ECサイトSNSは、今やあまり知識が無くてもワードプレスやECCUBE等のオープンソースをインストールすると
すぐに使える状態になるため、それほど技術力の無い制作会社でも比較的簡単に作れてしまいます。(オープンソースを利用することは全く問題ありませんが。)

技術力の重要性

「作れるんならそれでいいじゃん」
と思うかもしれませんが、技術力がない会社の場合、後々色々と問題が発生する可能性があります。

ではどのような問題でしょうか。
オープンソースに組み込まれていない仕様には対応出来ない
・セキュリティ対策が万全でない可能性がある
・サイトの速度が遅いなどの問題に対処出来ない
・修正・改善対応に時間がかかる、もしくは出来ない
・修正・改善対応に時間がかかるため、大したことのない修正でも価格が高くなる

ざっと挙げるだけでも、上記のような問題があるかと思います。
これらは技術力・知識が無いために生じる問題です。
また、そのシステム制作会社を後々見限って、別の会社にシステムの保守・運用を任せたとしても、
技術力の無い会社の制作物は、無駄なプラグインの導入やwebからのプログラムのコピペなどのつぎはぎで出来ていることが多く、
保守・運用費が高額になるか、作りなおしたほうが良いなどの場合になる事が多々あります。

技術力の測り方

では、どのように技術力を測ればよいでしょうか?
これはなかなか難しいですが、仕様策定の段階で、
【技術的に少し難しい仕様】が実現出来るか、またいくらかかるかを聞いてみると良いと思います。
たとえば、ブログであれば、
「ブログ執筆時に、執筆内容とよく似たブログ・動画を自動で収集したい」
であったり、ECサイトであれば、
「ユーザーが過去に買った商品から、おすすめの商品を表示したい」
他には、
「大量の文章を所持しているのですが、これらから高速に検索したい」
「ピーク時に、1日100万アクセスがあるが対応できるか」
等でしょうか。
この【技術的に少し難しい仕様】を考えるのもなかなか技術者でないと難しいですね。
また、その機能が実現できるプラグインもあるかと思いますので、もう少しひねりが必要かも知れません。

おわりに

作りたいサービスに合った、この【技術的に少し難しい仕様】を考えるお手伝いくらいであれば無料で行いますので、お気軽にご相談下さい。

もちろん、システム開発自体も承っております。
高度な案件も問題なく可能です。(各種APIクラウド、サーバー分散技術、機械学習自然言語処理スクレイピング等)
セキュリティ国家資格保持者、データベース国家資格保持者もおり、安全で高速なシステムを組むことが可能です。

お気軽にメールやHP上からお問い合わせ下さいませ。
http://loftal.jp
contact@loftal.jp

最後は宣伝となってしまいましたが、参考になりましたでしょうか。
ではでは。