目次
- 目次
- はじめに
- 特徴量(Feature Value)
- 学習(Learning)
- 教師あり / なし学習(Supervised / Unsupervised Learning)
- 最適化問題(Optimization Problem)
- 座標降下法(Coordinate Descent)
- 最急降下法(Gradient Descent)
- 確率勾配法(Stochastic Gradient Descent)
- 汎化性能(Generalization Ability)
- 新しい特徴量を作る(Creating New Feature Value)
- 多層ニューラルネットワーク(Maltilayer Neural Network)
- ランプ関数(Ramp Function)
- 鞍点(Saddle Point)
- ヘヴィサイド関数(Heaviside Function)
- 分離超平面(Separating Hyperplane)
- カーネル法(Kernel Method)
- 入力データを行列で表現する(Representation of Input data as Matrix)
- 原因を突き止める(Nailing down the Cause)
- スパースモデリング(Sparse Modeling)
- 非負値制約行列分解(Non-negative Matrix. Factorization)
- ボルツマン機械学習(Boltzmann Machine Learning)
- ボルツマン機械学習で利用される手法(Method of Boltzmann Machine Learning)
- 制限付きボルツマン機械(Restricted Boltzmann Machines)
- ディープボルツマン機械学習(Deep Boltzmann Machine Learning)
- 事前学習(Pre-Training)
はじめに
機械学習を学ぶにあたり、そもそも「機械学習?何それ?美味しいの?」みたいなレベルからのスタートだったので、まずは機械学習についてざっくり基礎的な事が学べる本を読んでみようと思い、下記の書籍を読んでみました。
これを読んだことで、まずは機械学習に関連する用語にいろいろ触れる事ができたので、今回はそれらを用語集として残しておこうと思います。また、各用語についての関連記事のリンクも付けてみました。
特徴量(Feature Value)
集めた各種データ項目を特徴量という。特徴量の数値をサンプル毎にまとめたのを特徴量ベクトルという。特徴量ベクトルを入力して、判別したい出力を得る関数を作り出す。適当な関数からスタートして、そのパラメータをデータの形に合わせて微調整していく。
学習(Learning)
入力とする特徴量ベクトルと出力との間にどんな関係がありそうか、という見当をつける。各特徴量が、それぞれどの程度効いてるのか、重みを付けて足し合わせる。この重みを学習する。モデルの出力とデータとの間にどれくらいの差があるかを調べる誤差関数を定義する。基本的なのは二乗和。これが最小になるようにパラメータを調整する。 ai-kenkyujo.com
教師あり / なし学習(Supervised / Unsupervised Learning)
教師あり学習は、得られているデータに合わせて、誤差関数を小さくしていき、入力と出力の関係を学ぶことである。教師なし学習は、データの構造や関係性を調べて、類似したもの同士でグループ分けすることである。分けられたグループの共通項が、求めたい出力に直結するかもしれない。先にある程度分けておいて、それを見て分かることがある。
products.sint.co.jp
最適化問題(Optimization Problem)
各特徴量に対する重みで、誤差関数が最小になるような重みを見つけること。小さくなる方向に少しずつ重みを変えていくことを勾配法という。少し動かして、どんな変化をするのか調べるのが微分。その結果を利用して、探り探り誤差を小さくしていく。その探り方として、効率の良いアルゴリズムを使う。 www.albert2005.co.jp
http://bin.t.u-tokyo.ac.jp/startup16/file/3-1.pdf
座標降下法(Coordinate Descent)
微分をする(ある重みをちょっと変えてみる)
↓
誤差関数が下がったか判定
↓
下がったらそのまま同じ方向に変える
Or
下がらなかったら逆方向に変える
↓
誤差関数の変化が小さくなりきるまで繰り返す
www.slideshare.net
最急降下法(Gradient Descent)
微分をする(全ての重みをちょっと変えてみる)
↓
誤差関数が下がったか判定
↓
下がったらそのまま同じ方向に変える
Or
下がらなかったら逆方向に変える
↓
誤差関数の変化が小さくなりきるまで繰り返す
一番下るのに効率が良い方向に行く。ただし、勾配法で到達できるのは極小であって、最小とは限らない。
確率勾配法(Stochastic Gradient Descent)
訓練データをいくつかの小さなグループに分ける。それらを順番に学習していく。次々に少し違うデータが来るので、汎化性能が上がる傾向がある。この時、入力するグループを確率的に選んだり、ランダムに選んだりして、変な意図がないようにする。 qiita.com
汎化性能(Generalization Ability)
取得データを訓練データとテストデータに分ける。訓練データは全体の一部に過ぎない。一部の事から全体の事を評価する性能を汎化性能という。この性能を良くするために工夫するのが機械学習のコツ。 tjo.hatenablog.com
新しい特徴量を作る(Creating New Feature Value)
関数を複雑にするよりも、組み合わせを複雑にする。重みをかけて足し合わせた結果をいくつも用意し、それらを新しい特徴量とする。そして、それらにさらに重みをかけて足し合わせることで複雑になっていく。ただし、かけ算と足し算を何度やっても一度きりのかけ算と足し算で表現できるから複雑にはならない(線形性)。
非線形関数を取り入れて複雑にする。それぞれの重みをかけて足し合わせた結果をその関数に入れる。非線形変換を施す関数を活性化関数という。
モデルを作るのはアバウトにして、最終的には最適化問題を解くのに任せる。
qiita.com
多層ニューラルネットワーク(Maltilayer Neural Network)
沢山の特徴量に重みを付けて足し合わせる。その結果を非線形変換することで、複雑な関数のパーツを作り、さらにそれらを組み合わせるという事を繰り返していく。
組み合わせが複雑になると、一つの特徴量に複数の特徴量が絡み合う事になり、重みを一つ変えても誤差関数がほとんど変化しなくなる。これを勾配消失問題という。
誤差関数の影響を、途中で絡み合っている紐を動かして最適化する方法を誤差逆伝播法という。重みを変えた影響が出来るだけ出力に伝わるようにする。非線形変換に使う関数の微分を見て、その値が小さい場合、重みの変化が影響しにくくなる。
www.sbbit.jp
ランプ関数(Ramp Function)
直線ではあるが、原点付近で曲がっているため非線形変換になる。また、微分した形はシグモイド関数よりも大きく、その範囲も広いので、重みの変化が出力に影響しやすくなる。 mathtrain.jp
鞍点(Saddle Point)
パラメータが沢山ある時に、ある方向に沿って動くと谷底のようだけど、別の方向に行くと更に誤差関数が低くなる場合がある。
鞍点 - Wikipedia
ヘヴィサイド関数(Heaviside Function)
0か1の2つに分ける関数。横軸Xが正だと1、負だと0になる。2値の状態に判別したい問題に向いている。ニューラルネットワークのような非線形変換を使う場合でも、最終的な出力にヘヴィサイド関数をつければ、2値の判別を出来るようになる。
math.keicode.com
分離超平面(Separating Hyperplane)
ちょうど0と1の境目になるところ。特徴量に重みをかけて足し合わせた値が0になるところ。パラメータを変えて分離超平面を動かして分けるためのモデルをパーセプトロンという。ただし、ギリギリ過ぎて汎化性能は高くない。分離超平面とその付近のデータとの間にマージンを持たせて、それを出来るだけ大きく取る方法をサポートベクターマシンという。
分離超平面定理 - Wikipedia
カーネル法(Kernel Method)
特徴量をそのまま使うのではなく、非線形変換で変形させる。サポートベクターマシンにおける、境界とデータとの距離のルールを変えて、それに合わせた非線形変換を行う。
enakai00.hatenablog.com
入力データを行列で表現する(Representation of Input data as Matrix)
横一列に並んだ入力データのベクトルを、縦方向に並べて、パターンが潜んでいないか考える。いくつかのパターンがあって、それが各行にどれだけ強く現れているか。パターンの強さを決める縦に並んだベクトル。
出てくるパターンと、どのパターンをどこに出すかという視点で別の表現が出来る。行列に潜むパターンの数がランクである。ランクが低ければ、抜けている部分を他の行を見て補完出来る。
パターンがこれくらいあって、その組み合わせで書けるはず、というモデルを組み立てる。見えている部分を手がかりにして、その裏側にある素性を調べる。うまく再現する。別の形を探す。教師なし学習。
techblog.nhn-techorus.com
原因を突き止める(Nailing down the Cause)
識別や回帰を完璧に出来たとして、それが何の役に立つのか考える。いくらそれが正確でも、何でそうなるかは分からないまま。データを並べた行列からパターンを抽出して、それが自分にはどれだけ当てはまるか?で考える。そこから、我々人間が何を学び取るのか。
スパースモデリング(Sparse Modeling)
回帰や識別に使った特徴量の中から、あまり重要でないものに掛かる重みをゼロにする。データを説明するために、ゼロにしていい特徴量を探していく。そして、ほとんどがゼロになっている状態をスパースという。そして、そうなるように仕向ける方法論をスパースモデリングという。
www.nttdata.com
非負値制約行列分解(Non-negative Matrix. Factorization)
数字を扱う時に負の値は使わない。足し算だけを許す。やり直しがきかないから、必要なパターンを少なくして、出来るだけ手数を減らそうとする。
qiita.com
ボルツマン機械学習(Boltzmann Machine Learning)
画像に対して、あるピクセルに何色が出やすいか、そのピクセルに肌色が来たら肌色が隣には出てくる傾向にある。
場合ごとの関係性を設定したモデルを学習する事をボルツマン機械学習という。
実際に持っているデータに対して、モデルから出てくる仮のデータがどれだけ尤もらしいかを探る。自分で仮のデータを作り出してみる事をサンプリングという。合わせるのは、画像そのものではなく、その画像の出てくる傾向。仮のデータを試しに打ち出してみないと合っているか分からない。だから時間も掛かる。
ピクセル同士の色情報からつじつまを合わせていく双方向型ニューラルネットワーク。
ボルツマン機械学習で利用される手法(Method of Boltzmann Machine Learning)
・マルコフ連鎖モンテカルロ法
ちゃんと隣同士の関係を1から全て考えていき、双方向型ニューラルネットワークの情報のやり取りを繰り返す。
MCMCについて整理してみた。 - Qiita
・平均場近似法
隣から一方的に情報を送るだけで話を済ませようとする。計算は速いが性能もそれなり。
隣からの情報に基づいて、自分はどうなるべきかを考える。
独立性の仮定と平均場近似の関係 - あらびき日記
・信念伝播法
隣同士だけは双方向で情報をやり取りする。
確率伝播法を組んでみる(Python) - Qiita
・疑似最尤法
隣の情報を、仮のデータからではなく、実際のデータから得られる結果をサンプリングの代わりにする。
http://library.jsce.or.jp/jsce/open/00039/200911_no40/pdf/99.pdf
制限付きボルツマン機械(Restricted Boltzmann Machines)
入力からデータとして得られるものを可視変数という。また、その裏には可視変数同士を結び付ける関係があると考える。隠れ変数という。可視変数同士や隠れ変数同士の関係があると複雑になるので、それぞれの変数同士では関係がないように制限して、可視変数と隠れ変数との関係だけに押し込める。
まずは、可視変数に実データを入れて、それから隠れ変数をサンプリングする。次にそれから可視変数をサンプリングし、仮データとする。コントラスティブ・ダイバージェンス法という。最適化問題を解く中で、何度も途中経過の状況でサンプリングを行い、データが見せる傾向とモデルが見せる傾向を比較することを繰り返す。
postd.cc
ディープボルツマン機械学習(Deep Boltzmann Machine Learning)
隠れ変数の裏には、また別の隠れ変数があり、それに対しても制限ありボルツマン機械を用意する。複雑な双方向型のニューラルネットワーク。隠れ変数は新しい特徴量になる。
qiita.com
事前学習(Pre-Training)
まずは、教師なし学習をして、あらゆる特徴を抽出して機械に教える。代表的な手法に自己符号化がある。
多層ニューラルネットワークそのうち、入力部分の1層を切り取る。反対側に、同じニューラルネットワークを逆さまに取り付ける。入力と同じものが出力されるようにして、入力情報の特徴を抽出する。重要な特徴量をあぶり出す。真ん中の中間層は、特徴量を非線形変換で組み合わせたもの。
vaaaaaanquish.hatenablog.com