More than 3 years have passed since last update.


記事について

普段は大学では全く異なった分野について研究活動をしています。ITに携わるものとして、近年話題の機械学習を知らないままではよくないと思い勉強を始めました。といってもライブラリを使うくらいならできます。。それでは面白くないので基礎の基礎から勉強を始めましたので復習も兼ねてログを書いていこうと思います。なお情報源はできるだけ信頼できそうな記事を使おうと思います。もし間違ったことを書いていたらご指摘をお願いいたします。研究の合間にゆっくり書いていきます。


パターン入力から出力までの流れ

機械学習の基礎の基礎は入力のパターンを分析して適切な出力を得ることである。簡単な例では紙に数をかいて(入力パターン)、その数字が1~9のどれかを当てる(出力)というもの。

入力に対して特徴量を抽出して、識別演算、辞書との照らし合わせをして出力を得る。この流れは複雑そうな処理でも変わらないみたい。ここでいう特徴量とは特徴ベクトルとも言える。


特徴ベクトル

ここからは捕捉だけどここでいう特徴量ベクトルとは最も重要な部分であると言える。例えば紙に書いた1~9までの数字を認識して当てる場合、これらを50 × 50の空間に分けて、もし色がついていたら1、色がなかったら(白い部分) 0を入力とする。つまり50 × 50 次元のベクトルが特徴ベクトルとなる(はず)。


識別演算

どのような入力がきたらどのような出力を返すのかは識別演算が担当する。簡単な例ではあらかじめどのような特徴ベクトルがきたらどのような出力をするのかを辞書として持っておけばいい。


NN法

これが入力から出力までの流れである。

ここで問題になるのが入力の特徴ベクトルのパターンの膨大さである。もし紙に書いた数字を認識する例だと人間ごとの筆跡の差や数字の許容範囲など様々なパターンが考えられてしまう。これを全て辞書型の一致で照らしあわせて出力を決定する方式だと対応ができなくなる。そこで特定の正解パターン(プロトタイプ)を辞書に登録し、入力ベクトルはこのどれに近いかで出力を決める。つまり1~9の数字の場合どのような特徴ベクトルになるのかを大雑把に入力しておいて、入力がどれに近いかを計算してそのあと出力をきめる。といっても一番近いものに...となると精度を落とすことになる。例えばアルファベットのTが1に近いと判断して1にするのは認識としては良いとは言えないと感覚的にわかる。

これを回避するために特徴ベクトル間に"距離"を定義し、ある程度の距離以上はふさわしくない入力として排除する必要がある(ユークリッド距離が使われることが多いらしい)。これが有名なk-NN法と呼ばれるものらしい。

プロトタイプは複数のクラスが存在し、各クラスごとにさらに複数のプロトタイプがある(複数のクラスとは上の例だと1~9の数字を分割することを表し、複数のプロトタイプは個人差のある数字の書き方への対応を表すとおもう)。これらのプロトタイプはクラスごとに区切る必要がある。区切りかたは各クラスの分布範囲の重心をもとめ、その重心間の垂直二等分線をとって境界線とする方式があるらしい。


感想

第一回目はパターンの認識の基礎について

次はいよいよ学習について...