テイラー展開
テイラー展開
最適化数学でテイラー展開がたくさん出てきたのでとりあえず実装してみることにしました. 今回はサインカーブを使おうと思います.
1. テイラー展開とは
関数のある一点での導関数の無限和で表されたものをテイラー級数と言います. その、テイラー級数を得るためにテイラー展開を行います. この時、ある一点をとすると、周りのテイラー展開と表現します. 要は、近傍における導関数の無限和をとることを意味します.
ちなみに、原点回りのテイラー展開のことをマクローリン展開といいます(ややこしい...). ここで、このテイラー展開やマクローリン展開について気軽に学べる良書として数学ガールを紹介しておきます. 私は、学部時代はテイラー展開の有難みが全く分かりませんでしたが、この数学ガールを読んでテイラー展開の使いどころを理解できるようになりました.
- 作者: 結城浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2007/06/27
- メディア: 単行本
- 購入: 58人 クリック: 1,055回
- この商品を含むブログ (967件) を見る
無限級数で近似していることになりますので、例えばで止めれば関数を5次関数で近似できることになります. が大きいほど元の関数に近づきます.
また、マクローリン展開は原点回りのテイラー展開のことだったので、上式のにを代入すれば良くて、
と表されます.
ここで、サインカーブに対してマクローリン展開してみたいと思います. は微分していくととなります. また、なのでサインの項が消えます. よってサインカーブのマクローリン展開は、
と規則性が見えてきます. (コサインカーブのマクローリン展開も同様に導くことができます.)
2. 実装例
今回は、サインカーブに限定して実装したので、導関数のところは事前にこちらで用意することにしました(4通りしかないので).
また、sympyというのを使えば、テイラー展開もn次導関数も求めることができますが、今回はnumpyだけを用いています.
かなり見づらいですが、元のサインカーブが青色で他は各次元で近似したものを図示しています.
例えば緑色は1次元で近似しているので、直線になっています. その後次元数を上げると元のサインカーブに近づいていき、11次元の時は大分サインカーブに近づいていることが分かります.
これなら分かる最適化数学ではn変数のテイラー展開について触れていましたが、それはまた別の機会で...
勾配法
「これなら分かる最適化数学」を読み始めたので、最適化についても紹介していこうと思います.
- 作者: 金谷健一
- 出版社/メーカー: 共立出版
- 発売日: 2005/09/01
- メディア: 単行本
- 購入: 29人 クリック: 424回
- この商品を含むブログ (42件) を見る
関数の最適化の代表の手法の「勾配法」を軽く説明し、実装例を示そうと思います.
1. 勾配法
1変数の場合と多変数の場合があるので今回は1変数の場合を説明します.
そもそも最適化とは、ある制約条件のもとで関数の値を最大(最小)にする変数の値を求めることを言います. 勾配法のアルゴリズムは単純であるが昔からよく使われる手法の一つです.
まず初期値を与えます. この初期値の与え方についても多くの研究がされているが今回は割愛します.
ならそこで最大(最小)値をとります. ある点での勾配が正、つまりのとき(下図の青)はその点から負の方向に、勾配が負のとき、つまり < 0のとき(下図の赤)はその点から正の方向に少し進むことで、目的地(最大、最小となる点)に近づいていきます. 簡単にまとめたアルゴリズムを以下に示します.
- xの初期値を与える
- もしのとき、そのときのが最大(最小)値をとる地点である
- に更新する (ただし、は学習率と呼ばれ1ステップでどれだけ更新するかを表すハイパーパラメータである)
- 収束するまで2, 3を繰り返す
計算機で実装する上でちょうどとなるxを求めるのは現実的ではないので、ある小さい値に対して、<になる点に到達した時に収束したとみなすことにします. また導関数はを用いて数値微分します.
2. 勾配法の実装例
以下にソースと結果を載せておきます.
初期値はで53回の繰り返しで収束しています. (オレンジの線が移動した経緯を示している.)
多変数の場合も基本的な流れは同じで各点での導関数を求め少しずつ動かしていけば良いですが今回は説明を省きます.
3. 勾配法の問題点
勾配法は単純で有効な手法であるが問題点もいくつかあります. 一つ目は初期値の与え方によって局所解に陥ってしまうことです.
二つ目は勾配を計算しなければならないが、微分できない関数であったり、できたとしても複雑すぎる場合があります.
また変数が数百、数千のときも勾配を求めるのが大変なことです.
なので色々な最適化の手法を知ることが必要であり、それぞれの関数に対して適切な手法を選ぶことが求められます.
パターン認識と機械学習 : ガウス分布と条件付きガウス分布
ガウス分布と条件付きガウス分布
今回は、ビショップ本の2章のメインとも言えるガウス分布についてです. ガウス分布については結構な量があるのでいくつかに分けてまとめていきたいと思います.
1. ガウス分布について
ガウス分布 (Gaussian distribution)は、正規分布 (normal distribution)とも呼ばれていて、連続変数の分布をモデル化する際によく使われます.
1次元のときのガウス分布は、
と表されます. ここでは平均、は分散です.
次元のときは、
と表され、はD次元の平均ベクトル、はの共分散行列です.
多変量ガウス分布と条件付き分布について
さて、多変量ガウス分布の重要な特性の一つに、2つの変数の同時分布がガウス分布に従うならば、それらの変数を用いた条件付き分布及び、周辺分布もガウス分布になるというのがあります.
今回は、その内の条件付き分布についてのお話です.
をに従うD次元ベクトルとし、これを互いに素な部分集合とに分割します.
つまり、
とし、これに対する平均ベクトルと共分散行列もそれぞれ、
で与えられます.
共分散行列が与えられたが、ビショップ本をはじめとし、共分散の逆行列を考えた方が便利になることが多いため、を考えています. これを精度行列と呼んでいます. 以降では精度行列をベースに話が進んでいきます.
制度行列は、
となるが、 が の逆行列となっていないことに注意しなくてはいけません. (このことについては最後に述べます.)
まず、一般のガウス分布の指数部は、 と変形できます.
右辺のの2次の項の係数行列が精度行列(共分散の逆行列)と等しく、の線形項の係数はと等しくなります. (ここから平均ベクトルを計算することができます.)
このことを利用して、条件付き分布の平均と共分散行列を求めますが、基本的な考えとしては分割した変数が従うガウス分布を、を固定した上でのの関数とみなします.
さて、分割した変数が従うガウス分布の指数部は、
となることはすぐ確認できると思います.
この中のの2次の項を全て取り出すと、
となるので、となります.
次に、について線形の項を全て取り出すと、が得られます.
この式のの係数がになることは説明しました.
これらより、となります.
今までの結果は精度行列を用いての表現方法でしたがもちろん共分散行列での表現も可能です.
分割された行列の逆行列に関する計算
分割された行列の逆行列に関する計算はビショップ本では公式のように取り上げられています. (演習問題にも取り上げられており、東京大学大学院試でも出題されていました笑)
となります.
ここでとなります.
このMの逆行列には部分行列Dに関するシューア補行列という名前がついているようです.
この公式と、
より、
が得られます.
これらから、
となります.
1次と2次のガウス分布の実装例
1次と2次の時のガウス分布を実装してみたので以下にソースコードと結果をあげておきます.
パターン認識と機械学習 : ベータ分布
ベータ分布
第2章の確率分布の一番最初に紹介されているベータ分布についての備忘録です.
ベータ分布を考える理由
ベルヌーイ分布と二項分布のパラメータを最尤推定で求めた結果はで、データ集合中でとなる観測値の割合になります. (はとなる観測値の数です.)
しかし、例えば3回の試行中3回とも表が出た場合にとなってしまい今後もずっと表が出るように予測することになります.
これは間違いなく過学習です.
そこで、この問題をベイズ主義的に扱うことを考える.
ベイズの定理は、 $$ p(x|y) = \frac{p(y|x)p(x)}{p(y)} $$ であり、を事前分布、を事後分布と呼びます.
したがって、ベイズ主義的立場でパラメータを推定するときには、パラメータの事前分布を考え、事後分布を最大にしたりすることをします.
そこで、今回はベルヌーイ分布や二項分布のパラメータの事前分布であるベータ分布についてまとめます.
ベータ分布について
まずベルヌーイ分布や二項分布の尤度はの形をしています.
したがって、事前分布をとのべき乗に比例するように選べば、事後分布は事前分布と同じ形になります.
なぜなら事後分布は尤度と事前分布に比例するからです. (この性質は共役性と呼ばれています.)
したがって、事前分布には事後分布と共役なものを選ぶと良いです.
このことから、ベルヌーイ分布や二項分布のパラメータの事前分布には次のベータ分布を選びます. $$ Beta(\mu|a,b) = \frac{\Gamma(a+b)}{\Gamma(a)\Gamma(b)}\mu^{a-1}(1-\mu)^{b-1} $$
ただし、はガンマ関数と呼ばれ、で定義されています.
また、はパラメータの分布を決めるためのパラメータで超パラメータ(hyperparameter)と呼ばれます.
に依存する部分だけを取り出すと事後分布は、 になるのは容易に確かめられます. (ただし、には注意が必要です.)
この式は事前分布の共役性によって事前分布と同じ形になっていることがわかります.
参考程度に、ベータ分布を実装したコードを以下に示します.
ベータ分布の実装例
#coding: utf-8 import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab from scipy.special import gamma N = 100 alpha = [0.1,1.0,2.0,8.0,10.0] beta = [0.1,1.0,3.0,4.0,10.0] p = np.linspace(0.0,1.0, N) print p for a,b in zip(alpha,beta): y = (gamma(a+b)/(gamma(a)*gamma(b))) * pow(p,a - 1) * pow(1-p,b - 1) plt.plot(p,y,label = "a = " + str(a) + " b = " + str(b)) plt.legend(loc = "upper right") plt.savefig("beta.png") plt.show()
また、超パラメータを色々な値に設定した時のベータ分布の図を以下に載せます.
パターン認識と機械学習 : ベルヌーイ分布
ベルヌーイ分布
第2章の確率分布の一番最初に紹介されているベルヌーイ分布についての備忘録です.
ベルヌーイ分布について
二値確率変数 (binary random variable, 以下二値 r.v.) が1つの場合について考えます.
例えば、で「表」、で「裏」を表現するとします.
これを使えばコイン投げの結果が二値 r.v.で表現できます.
今回は一般の話を扱うので「表」が出る確率は0.5ではなくパラメータで表すことにします.
つまり、
$$
p(x = 1 | \mu) = \mu
$$
となります.
確率なので を満たし、となります.
表が出る確率と裏が出る確率を一つの式で表したくなります. 表が出たときは、でとなり、裏が出たときはでとなります. したがってこのとを用いて一つの式で表すことを考えます.
その式が、 $$ Bern(x | \mu) = \mu ^{x} (1 - \mu)^{1-x} $$ となり、これがベルヌーイ分布です.
具体的に値を代入してみると、表が出る確率はであり、裏が出る確率はで表すことが出来ています.
また、ベルヌーイ分布の、平均、分散はそれぞれ、です.
ベルヌーイ分布の実装例
ベルヌーイ分布をpythonとmatplotlibを使って可視化したので参考程度に載せておこうと思います.
私が書いたソースは以下の通りです.
#coding: utf-8 import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab def bern(x,p): return pow(p,x) * pow(1-p,1-x) if __name__ == "__main__": dist = np.zeros(2) for i in range(1,10): plt.figure() p = 0.1 * i dist[0] = bern(0,p) dist[1] = bern(1,p) x = np.array([0,1]) label = ["x = 0","x = 1"] plt.ylim([0.0,1.0]) plt.title("bernoulli distribution (p = " + str(p) + ")") plt.bar(x,dist,tick_label = label,align = "center") plt.savefig("bernoulli_" + str(p) + ".png")
可視化した図のうちパラメータをそれぞれ0.1, 0.5, 0.8に設定したものを載せておきます.
次に、観測データ集合がベルヌーイ分布から独立に与えられたとします.
その時の尤度は
$$
\prod_{n=1}^{N}\mu^{x_{n}}(1-\mu)^{1-x_{n}}
$$
となり、この尤度を最大にするようにしてパラメータを推定するのが最尤推定です.
積の形では扱いにくいので尤度の対数をとって和の形にします.
この対数尤度をパラメータで微分して0とおき、方程式を解けば最尤推定量が求まり以下のように得られます.
$$
\mu_{ML} = \frac{1}{N} \sum_{n=1}^{N} x_{n}
$$
ここで表が出た回数、つまりとなった回数をとすると、
$$
\mu_{ML} = \frac{m}{N}
$$
となります.
例えば試行3回中3回とも表が出た場合に、最尤推定量は1となるので、今後もずっと表が出続けると予測していることになります.
これは過学習の極端な例ですが、3回の観測だけで、今後全く表が出ないと断定してしまうのはまずいことです.
今後はパラメータが従う事前分布を導入して、もっと常識的な結果を得る方法について考えていきます.
機械学習の入門におすすめの参考書
この記事の対象読者
「最近機械学習って流行ってるけど何からやればいいのか分からない...」
「純粋に機械学習って難しそう... 」
「機械学習勉強したいんだけど、本屋や図書室行っても機械学習関連の本がありすぎて困る...」
と言う方は多いのではないでしょうか.
少し機械学習の参考書について調べた方だと
「やはり有名どころのパターン認識と機械学習 (通称 : ビショップ本) やるべきか」
と思っている方も少なくはないかと思います.
ビショップ本は非常に有名な本で、機械学習を研究している人の中で知らない人はいない(はず)です.
しかし、ビショップ本は非常に数式が重たいので、機械学習を入門をする上では不向きです. (予測検索に良く難しいや挫折が出てくる...)
そこで、今回は私が、ビショップ本に入る前に機械学習の基礎を学ぶために用いた本の紹介をしようと思います.
以下で紹介する本で入門することで、これから機械学習を本気で勉強、研究していく上での土台を作ることができると思っています.
具体的に学んだ分野といたしましては
の4つです.
- 作者: C.M.ビショップ,元田浩,栗田多喜夫,樋口知之,松本裕治,村田昇
- 出版社/メーカー: 丸善出版
- 発売日: 2012/04/05
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 33回
- この商品を含むブログ (19件) を見る
- 作者: C.M.ビショップ,元田浩,栗田多喜夫,樋口知之,松本裕治,村田昇
- 出版社/メーカー: 丸善出版
- 発売日: 2012/02/29
- メディア: 単行本
- 購入: 6人 クリック: 14回
- この商品を含むブログを見る
1. プログラミングのための線形代数
線形代数は数多くのサイトで紹介されている「プログラミングのための線形代数」を使いました.
私自身、行列やベクトルの演算は不自由なく行えたのですが、逆行列の存在や固有値固有ベクトルについての知識が曖昧だったのでそこらへんを中心に埋めなおしました.
この本は線形代数を実際どのように使っているのかが分かりやすく書かれているので、学部の時に使った教科書のようによくわからずに式を追っかけていた頃より理解が深まったと思います.
2. 確率、統計学
これまた有名な本なので今更紹介することもないのですが...
機械学習と統計学の違いを説明することができない人がいるというぐらい、機械学習と統計学は密接な関係にあると思います.
なので、統計学の基本的事項は手を抜かずに勉強したいところです.
特に確率の基礎的部分(加法定理や乗法定理などなど)は今後機械学習をやる上で、必須事項ですので、「統計学入門」の最初の方は熟読すべきです.
ちなみに私は、統計学検定の2級ぐらいは受けようかなと思い勉強中です. (この本をやれば、2級レベルでは十分すぎる知識がつきます.)
- 作者: 東京大学教養学部統計学教室
- 出版社/メーカー: 東京大学出版会
- 発売日: 1991/07/09
- メディア: 単行本
- 購入: 158人 クリック: 3,604回
- この商品を含むブログ (83件) を見る
3. 機械学習 (基礎)
さて、本題の機械学習(基礎)についてです.
機械学習に関する本は、図書室や本屋に行けばわかりますが、溢れかえっていてどれを使えばいいか分からないものです.
どの本も非常に優れていて、機械学習を勉強する上で有益な情報を得ることができると思いますが、最初の一冊は間違えたくありませんよね.
そこで、私がオススメしたいのは、「言語処理のための機械学習入門」です.
「言語処理のための」と入っているので、「いや、俺は画像処理に機械学習使いたいんだけど...」とか、「機械学習で最強のゲームAIを作りたくて勉強しようと思っているので、違う本にしよう」と思うかもしれません.
しかし、機械学習を言語処理はもちろん、その他全ての分野に応用しようと考えている人全員にとって最高の入門書になると思います.
レベルとしては、基本的な数学的知識 (微分、行列、ベクトル演算ぐらい) があれば数式が追いかけられる程度で、機械学習に関する前提知識は一切いりません. また必要な数学的知識はその都度説明してくれているので、問題ありません.
私自身、機械学習はB4の頃も卒業研究の題材にしていて、ゼミでも輪講をしていたのですが、再度基礎を固めようと思い「言語処理のための機械学習入門」を読み直しました.
また演習問題も全部解きなおしました. (ここが大事で、演習問題は全て解くことをオススメします. 非常に簡単な問題で、各トピックに関する知識を確認、さらには深めることができます. これをやるのとやらないとでは大きく差が出ると思います.)
4. 最適化問題
機械学習の基礎を一通り学習し直せたので、次に最適化問題について復習を行いました.
最適化問題の復習は「数理計画入門」を使いました.
「機械学習とは最適化問題である」 と言われるぐらい外せない分野です. 上で紹介した「言語処理のための機械学習」にも最適化問題について扱われているセクションがありますがより深く学ぶ必要があると思い、1冊手に取って勉強しました.
この本は数学的説明を端折ることが多々あるので、厳密に証明をしていきたいという人には不向きかもしれません.
しかし、量的にもそんなに多くなく一通りの手法について学習できるので短期間で網羅したいという人にはオススメかもしれません.
最適化問題で有名なのは「これなら分かる最適化数学」だと思います.
私自身読んだことがないのでここではレビューはしませんが、後期に入ったら読もうと思っているのでその時にまたブログに書こうかなと思っています.
(これなら分かる最適化数学を読んだので、気になるトピックを備忘録として記事にしていきたいと思っています.)
以上が私がビショップ本に入る前に復習した内容です.
ビショップ本は数式を追いかけるのが非常に大変で、これらの本を学習したからと言ってスラスラ頭に入ってくるというものではありません.
ですが、「これから機械学習を学ぶ or 研究していく」上での土台作りは出来ていると思います.
是非、これを機に機械学習を勉強してみてはいかがでしょうか.
論文サーベイ part2
今回は「Face Recognition Face2vec Based on Deep Learning : Small Database Case」
出展 : Automatic Control and Computer Sciences 2017
- 概要:異なった状態の画像に対して訓練され、その各々のデータ数は少ない、認識率をあげるには約100万の画像が必要
- 新規性、差分:少ない訓練データ数で特徴ベクトル抽出が可能に
- 手法、アルゴリズムのキモ:出力層の線形分類層を取り除いて、特徴ベクトルを抽出し、ベクトルを正規化してから類似度を測る(多分。。。)
- 結果:精度良く学習できた(特に前を向いた画像のみを用いた場合に97.98%)
- 結論、議論;様々な物体、状態の画像に対して適用できる.小さいデータセットで訓練可能.データセットにない画像に対しても適用したい
- コメント、感想:word2vecみたいな演算はできないのかなあ、「〇〇と××を足して2で割った人」をベクトル演算で出すとか
論文サーベイ part1
サーベイした論文の内容が後からみてわかるように自分なりにまとめていこうと思います.
Abstract, Introduction, Conclusionはどの論文に対しても簡潔にまとめたものを公開し、興味があるものだけ中身を精読していこうと思います.
2017年のBigCompで発表されたものです.
- Abstract : Recurrent Neural Network(RNN) を用いて欠落データを含む健康診断データを用いて未来の健康診断の結果を推定する
(ここで言う欠落データとは、一年に一回の健康診断を受けられなかったりして、データがないことを言う) - Introduction : 病気の早期発見をすることで治療が難しいものも治療可能になることがある
特定の疾病を機械学習を用いて推定する研究は多くされているが広い領域に適用できていない
RNN、LSTMを用いる
欠落しているデータをRNNで推定し、それを新たな入力とする
比較手法には線形回帰を用いる - Simple Recurrent Network (SRN) : 健康診断データを推定するためにRNNを用いる
- Long Short-Term Memory : LSTMを使う
- Missing Data Compensation Using RNNs : 提案手法にあたる部分
グレーのノードが欠落している時t-1までのデータを使って推定したy(t)を次の入力につかってやろうっていう単純な話 - Experiment Result : 2002年から2012年の韓国人の健康診断データをで訓練し、2013年のデータを推定する(訓練は完全データで行い、推定の時に欠落データを含んでいるものも推定できるか実験する)
線形回帰に比べてRNN,LSTMのどちらをつかった場合でも精度良く推定できた
RNN,LSTMの間に差はあまり見られない
- Conclusion : 欠落データを含む健康診断データに対して既存研究に比べ高い精度で推定できた
感想:2017年とかなり新しいわりに発想はかなり単純
たかが10年のデータを使っていたからRNN、LSTMに差は見られなかったのだろう
実験のとこで、欠落データに対して提案手法と線形回帰以外に入力を置き換えない普通のRNNを用いてものでも比較したほうがよかったのでは?(ただRNNが強かっただけかもしれない)