記事・メモ一覧

default eye-catch image.

FileMakerServer16/17に非公式SSL/TLS証明書をインストールする

はじめに オンプレミスでFileMakerServerを配置するのではなく、AWS,Azure,さくらクラウドなどに配置することが増えているためか、FileMakerServerにSSL/TLS証明書をインストールしたいという要望が増えていそうです。 FileMaker社はFMS15,16用に利用可能なSSL/TLS証明書を公開していますが[1]、どれもアメリカ本国の業者であるだけでなく、いわゆる格安証明書がリストされておらず、たかだかイントラ用のアプリのために高額なお布施を積まないといけない状況にあります。 FileMaker社はFMS17用に利用可能なSSL/TLS証明書に関する記述を改めましたが[2]、いずれにせよ、適合するか否かは実験してみる必要があります。 適合しない証明書をインストールすると、「通信は暗号化されているか証明書を検証できない」というおかしな状況が出来上がります[3]。もともとClosedな傾向が強いFileMakerですが、この状況がどういう理由で発生しているのか確認する術がなく、発生してしまった場合に解決が非常に困難です。 日本の格安SSL/TLS証明書をFMS15,16,17にインストールすることができましたので、 本記事ではその事実を紹介します。 まず結論 以下の証明書をFMS15,16,17にインストールできました。 「鍵マーク」は緑色となります。 さくらインターネットのRapidSSL(DV証明書) 1,620円/年 中間CA証明書必須 クロスルート証明書必須 AWS EC2上 WindowsServer2012 R2 (JPN) または Azure上のWindowsServer2012 R2(JPN) IISでファイル認証 OS、プラットフォーム、Webサーバはオプションです。他でもOKなはずです。 格安証明書で有名なSSLストアはRapidSSLのファイル認証をやめてしまったので、 RapidSSLをファイル認証で取得できるのはここだけかもしれません。 SSLストアのFujiSSL、ComodoSSL(PositiveSSL)はいずれも入りませんでした。 中間CA証明書、クロスルート証明書がないと、証明書自体のインストールは出来ますが、鍵が「オレンジ色」になります。FMSは中間CA証明書、クロスルート証明書を見ています。 なお、FMSには中間証明書を指定するUIが一つしかありませんので、FileMaker社が指定する方法で中間CA証明書、クロスルート証明書を結合する必要があります。 以下の通り結合し1つのファイルとしておきます。 -----BEGIN CERTIFICATE----- Root certificate -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- Intermediate certificate 2 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- Intermediate certificate 1 -----END CERTIFICATE-----

default eye-catch image.

統計検定

前からだったかもしれないけども、気づいたら統計検定がCBTになっていた。 正確には2級までがCBT。 2級の出題範囲表を眺めてみる。出題範囲は以下の通り。 出題範囲 大学1年か2年でやる一般教養の「統計」1年分+αくらいと言われているけども、 さっぱり覚えてないな。情報理論であったりアルゴリズム論だと、割と基礎的な概念を言えたりするのもあるんだが、 「覚えてない」という認識なので、たぶん単位とるために丸暗記したんだろう。。 ただ、ここ数年人工知能バブルに片足突っ込んだことで断片的にわかるものがある。 2級は一般教養ということで、これを知って何かが出来るか、ということはなくて、 その先、自力でデータを活用するための「基礎」でしかない。 過去何百年もの間体系化されてきた学問の上に世間の関心が広がっているという事実は、 ある意味幸運なことなんだろうと思う。 ということで2級取得を目指してみようと思う。

default eye-catch image.

非マルチサイトでユーザ情報を共有する

概要 ネットワーク機能経由のマルチサイトでなく、サブディレクトリ型マルチサイトでもなく、 単純にサブディレクトリに複数のWordPressインスタンスを並列するケースで、 複数のWordPressインスタンスから一つのユーザ情報を共有する方法について書く。 wp_users,wp_usermetaの共有 このあたりを参照すると書いてある。要は、インスタンスの数だけ作られるwp_users、wp_usermetaを使わず、一つを共有すれば良い。そのためにはwp-config.phpを修正すれば良い。ただしWordPressの互換性的な都合を理解しておく必要がある。 カスタム User テーブルとカスタム Usermeta テーブル CUSTOM_USER_TABLE および CUSTOM_USER_META_TABLE を使用すると、通常 WordPress が利用する user および usermeta テーブルを使用せず、代わりに指定されたテーブル名を使用してユーザー情報を格納します。 define( \'CUSTOM_USER_TABLE\', $table_prefix.\'my_users\' ); define( \'CUSTOM_USER_META_TABLE\', $table_prefix.\'my_usermeta\' ); WordPressは互換性確保のためwp_usersの拡張を推奨しておらず、wp_usermetaに拡張情報を持たせることになっている。拡張情報をwp_usersのカラムとして持たないことで、拡張が必要になったときに初めてwp_usermetaにレコードが作られる。つまり、wp_usermetaはインスタンス毎の拡張情報であるということ。 そのため、CUSTOM_USER_TABLE、CUSTOM_USER_META_TABLEを指定したとしても、共有しようとしたwp_users、wp_usermetaとは別にインスタンス毎にwp_users,wp_usermetaテーブルが作られる。 インスタンスのインストール時にID=1番のレコードが作られる。インスタンスの最初の管理者はこのレコードである。wp_usersのID=1はSuperAdmin的な特別なアカウントで、各インスタンスのwp_users,wp_usermetaが使われる。 共有しようとするwp_usersには、インストールしたインスタンス用のwp_usermetaが無いので「権限なし」となる。そこで、まず、各インスタンスに作られてしまったID=1でログインし、次に共有するwp_usersテーブルのアカウントにインスタンス毎の権限を付与することで解決する。 面倒だけど、確かにアカウントの互換性は保たれるな。

default eye-catch image.

コサイン類似度 Cosine Simirality

[mathjax] BoW化した文章同士の類似度を求める一番メジャーなやり方。 内積の定義を式変形しただけ。 $$ begin{eqnarray} cos(vec{q},vec{d}) &=& frac{vec{q}cdot vec{d}}{|vec{q}| cdot |vec{d}|} \\ &=& frac{vec{q}}{|vec{q}|} cdot frac{vec{d}}{|vec{d}|} \\ &=& frac{sum_{i=1}^{|V|}q_i d_i}{sqrt{sum_{i=1}^{|V|}q_i^2} cdot sqrt{sum_{i=1}^{|V|}d_i^2}} end{eqnarray} $$ BoWが正規化された単位ベクトルの場合は分母が1になるから、 $$ cos(vec{q},vec{d}) = vec{q} cdot vec{d} = sum_{i=1}^{|V|} q_i d_i $$ 次元が3以下の場合はベクトルがどれだけ同じ向きを向いているか、という説明で十分だけど、4以上の場合は結局「類似」のような言葉になってしまう。 範囲 シュワルツの不等式というのがあって、 $$ sum_{i=1}^{n} p_i^2 cdot sum_{i=1}^{n} d_i^2 geq sum_{i=1}^{n} p_i d_i $$ コサイン類似度の分子は分母以下であることが決まる。 シュワルツの不等式の等号が成り立つとき、 コサイン類似度の分子と分母が同じとなり1となる。 pi, di のいずれかが 0のとき、qidiは0となる。 全部0となるとき、コサイン類似度の分子は0となる。 だから、定義の上ではコサイン類似度は0以上1以下だと思うんだ。 類似度? BoW化してタームの頻度を要素とした時点で、ベクトルは意味を持たないことになるから、ベクトル同士のコサイン類似度を取ったところでベクトル同士が似た意味を持つとは言えない。単にタームの出現頻度が似ているというだけ。 BoWではなく、特徴量を要素とするベクトル同士のコサイン類似度をとったのであればベクトル同士の特徴量が似ていることを表す。 文章をなんとか直交する特徴量からなるベクトルで表現することができれば、意味の類似度を求めることができる。 tf-idfに触れずに書くとこんな感じ。 文章が短いと 文章が短いと、文章がだいぶ異なるのに出現頻度は近い、という状況が起きやすくなり、あてにならなくなる。

default eye-catch image.

ロジスティック回帰とROC曲線

[mathjax] ロジスティック回帰 2値の特徴量tを持つトレーニングデータ(x,y,t)を正解/不正解に分類する問題を考えたとき、最尤推定によりモデルf(x,y)を決めるのがロジスティック回帰。モデルf(x,y)がトレーニングデータ(x,y,t)を正解と分類する確率P(x,y)を立てて、P(x,y)の最大化問題を解くことでf(x,y)のパラメタを決定する。その際、P(x,y)はロジスティック関数を使って以下の通り表される。 $$ begin{eqnarray} z_n &=& sigma(w^Tphi_n) \\ P(x,y) &=& z_n (1-z_n) end{eqnarray} $$ P(x,y)において、トレーニングデータを定数とすることでP(x,y)をパラメタwに関する関数とした。P(x,y)を最大化するwを求めたいのだが、P(x,y)を解析的に最大化することはできず、パラメタwを数値計算(反復再重み付最小二乗法、ニュートンラフソン法)することによりf(x,y)のパラメタwを更新していく。wが一定値に収束した場合、f(x,y)=0はトレーニングデータ内の正解データ(t=1)を1/2の確率で正解(t=1)として分類できることを示す。 正解分類確率の制御 トレーニングデータ(x,y,t)に対して、f(x,y)t>0の場合は「正解」、f(x,y)t0の方向あるt=0のデータ、f(x,y)0の方向に距離α分平行移動していくと、f(x,y)>0のときは正解であったもののf(x,y)>αのときは不正解となるデータが発生する。 逆にf(x,y)<0の方向に距離β分平行移動していくと、f(x,y)<0のときは正解であったもののf(x,y)0方向にα移動することで、トレーニングデータを「正解」として分類する確率を50%から75%に変更する等の操作にあたる。 ロジスティック回帰とROC曲線 分類問題を整理すると、分類対象とするトレーニングデータの特徴量tを2値のいずれであるか識別することであり、分類とその結果の組み合わせとして以下の組み合わせが考えられる。それぞれ統計の分野で名前が付いている。 t=1であるデータを1として分類する TP, True Positive t=1であるデータを0として分類する FN, False Negative t=0であるデータを0として分類する TN, True Negative t=0であるデータを1として分類する FP, False Positive かなり混乱するので図を張り付けておく。観測データが1なのか0なのかは\"Positive\"/\"Negative\"、それを1と分類したのか0と分類したのかは\"True\"/\"False\"。t=1/0は符号に過ぎないので\"Positive\"/\"Negative\"はその時次第。True/Falseは分類結果が特徴量と一致するかどうかを表す。 ロジスティック関数P(x,y)=σ(w0+w1x+w2y)は、トレーニングデータ(x,y)を1として分類する確率を返す関数である。 最尤推定によりwを求めたのだから、f(x,y)=w0+w1x+w2yは、確率的に最もトレーニングデータを正しく分類する多項式となっている。 \"確率的に最も\"の度合いを定量的に表すのがROC曲線とAUC。 全トレーニングデータ(x,y)に対してP(x,y)を計算し降順ソートすると、P(x,y)が高ければ(つまり上位であれば)t=1のデータが多いはずで、P(x,y)が低ければ(つまり下位であれば)t=0のデータが多いはずだ。P(x,y)に相当するTP,FPが期待される。実際には上位にt=0のデータ、下位にt=1のデータが観察されることがあり、単純にP(x,y)からTP,FPが決まるものではない。 TPがP(x,y)よりも相対的に高く、(1-P(x,y))よりも相対的に低ければ、多項式の性能が良いということになる。 定数c=P(x,y)を定めたときP(x,y)<c<1の範囲でt=1のものは True Positive, P(x,y)<c<1の範囲でt=0のものは False Positive。0<c<P(x,y)の範囲でt=0のものは False Negative, t=1のものは False Positive。cを1から0に下げていくと True Positive, False Positiveの数がそれぞれ独立に増加していく。各々のcを真陽性率、偽陽性率という。 横軸に偽陽性率FP、縦軸に真陽性率TPをとり、トレーニングデータ(x,y)をプロットした図がROC(Receiver Operating Characteristic)曲線。 P(x,y)を1から0に減らしていったときTP/FPそれぞれ増加するが、ROC曲線によりTPが大きくFPが小さいプロットが性能の良い分類であることを視覚的に表現できる。 ROC曲線の左下と右上を結ぶ直線は、0<P(x,y)<1の全域に渡りFP=TPであったことを示し、ランダムにTrueかFalseかを答えたときの視覚的表現にあたる。 左上に凸となっているROC曲線が性能の良さを表し、ROC曲線の下の面積AUC(Area Under the Curve)が分類器の性能を表す数値。

default eye-catch image.

ロジスティック回帰 教師有り確率的分類モデル

[mathjax] 2種類の値tを持つトレーニングデータ{(xn,yn,tn)}を正解/不正解に分類するパラメトリックモデルを立てて、パラメトリックモデルと不正解に分類されるトレーニングデータの距離E(w)が最小になるwを決定しモデルを作成するのがパーセプトロンであった。 E(w)においてトレーニングデータ(xn,tt)を定数として使用することでE(w)をwから決まる関数とし、wの決定をE(w)の最小化問題に帰着させる考え方は最小二乗法と同様であった。パーセプトロンは最小二乗法と異なり、E(w)の最小化問題を解析的に解けないため、数値計算によりE(w)を小さくする方向にwを更新する手順を取った。 最小二乗法はトレーニングデータから決定した多項式が未知のサンプルデータにおいても二乗誤差が最小になることを期待していたのと同様に、パーセプトロンも誤分類する未知のサンプルとの距離が最小になることを期待した分類モデルであることを意味する。最小二乗法もパーセプトロンも、サンプルデータのバラツキを考慮していない。 サンプルデータがモデルからσのバラつきをもって存在することを加味することで、パラメタwとバラつきσから決まる尤度関数を導入し、wの決定を尤度関数の最大化問題に帰着する最尤推定法に拡張した。最尤推定法により、パラメトリックモデルが変数とσの関数となり、確率的な回帰を検討できるようになった。 サンプルデータがモデルにより正解であると分類される確率を考慮することで、回帰モデルとして未来を予測する要素を増やすことができる。そこで、本エントリにおいてその手法(ロジスティック回帰)をまとめる。 ITエンジニアのための機械学習理論入門posted with amazlet at 17.03.10中井 悦司 技術評論社 売り上げランキング: 8,130Amazon.co.jpで詳細を見る ロジスティック回帰 モデルf(x,y)を仮定したとき、トレーニングデータ(x,y)について|f(x,y)|はモデルとの距離を表す。また、f(x,y)>0の方向にt=1のデータ、f(x,y)<0の方向にt=-1のデータが存在するモデルであることを示す。 f(xn,yn)tn > 0 であれば分類は正解であるから、f(x,y)が大きくなるにつれてt=1であるデータの発生確率が上がり、f(x,y)が小さくなるにつれてt=1であるデータの発生確率が下がることになる。逆に、f(x,y)が大きくなるにつれてt=-1であるデータの発生確率が下がり、小さくなるにつれてt=-1であるデータの発生確率が上がる。 横軸にf(x,y)、縦軸にt=1であるトレーニングデータがf(x,y)から得られる確率を取ると以下のような曲線が得られる。一般にロジスティック曲線と呼ばれる。 ロジスティック関数は以下のように表現される。 $$ sigma(a)=frac{1}{1+e^{-a}} $$ トレーニングデータ(x,y)で得られたデータの特徴量tが1である確率は以下の式で表される。 $$ P(x,y) = sigma(w_0 + w_1 x + w_2y) $$ また、t=1の場合とt=-1の場合で確率が逆になるため $$ begin{eqnarray} t_n=1の場合 &:& P(x_n,y_n) \\ P_n &=& P(x_n,y_n)^1{1-P(x_n,y_n)}^0 \\ &=& P(x_n,y_n) \\ t_n=-1の場合 &:& 1-P(x_n,y_n) \\ P_n &=& P(x_n,y_n)^0{1-P(x_n,y_n)}^1 \\ &=& 1-P(x_n,y_n) \\ end{eqnarray} $$ まとめて書くと以下となるが、これは全てのトレーニングデータがモデルから得られる確率であり尤度関数である。 $$ P_n = P(x_n,y_n)^{t_n}{ 1-P(x_n,y_n)}^{1-t_n} $$ ここで、 $$ P_n = sigma(w_0+w_1x+w_2y) $$ だから、 $$ P_n = sigma(w_0+w_1x_n+w_2y_n)^t{t_n}{1-sigma(w_0+w_1x_n+w_2y_n)}^{1-t_n} $$ 多項式のベクトル表現をロジスティック関数に入れた結果をznとする。 $$ begin{eqnarray} w &=& left ( begin{array}{c} w_0 \\ w_1 \\ w_2 end{array} right ) \\ phi_n &=& left ( begin{array}{c} 1 \\ x_n \\ y_n end{array} right ) \\ z_n &=& sigma (w^Tphi_n) end{eqnarray} $$ 尤度関数Pnをznを使って表すと以下となる。 $$ P_n = z_n^{t_n}(1-z_n)^{1-t_n} $$ 尤度関数を最大とするwを決定する最尤推定法によりwを決定する方法をロジスティック回帰という。 ロジスティック回帰における尤度関数の最大化 パーセプトロンにおいて数値計算(確率的勾配降下法)によりwの修正値を求めwを更新していったのと同様に、ロジスティック回帰の尤度関数最大化問題も解析的に解くことができず、数値計算によりwを修正していく。ニュートンラフソン法を使った反復再重み付最小二乗法により修正値を求めていく。導出方法は別途記述。wの修正式は以下の通りである。 $$ w_{new} = w_{old}-(Phi^TRPhi)^{-1}Phi^T(z-t) $$ なお、各行列は以下の通りである。Rはzn(1-zn)を対角成分とする対角行列。 $$ begin{eqnarray} t &=& left ( begin{array}{c} t_1 \\ t_2 \\ vdots \\ t_n end{array} right ) \\ Phi &=& left ( begin{array}{c c c} 1 & x_1 & y_1 \\ 1 & x_2 & y_2 \\ vdots & vdots & vdots \\ 1 & x_n & y_n \\ end{array} right ) \\ z_n &=& left ( begin{array}{c} z_1 \\ z_2 \\ vdots \\ z_n \\ end{array} right) \\ end{eqnarray} $$ 収束条件は以下の通り。ニュートン法の収束条件ぽい。 $$ frac{||w_{new}-w{old}||^2}{||w_{old}||^2} < 0.001 $$ なお、wの更新が進み、ロジスティック関数znが0または1に近づくか、0または1そのものになる場合がある。 $$ z_n = sigma (w^T phi_n) $$ zn=0または1となったとき、Rの対角成分zn(1-zn)が0となる。すると $$ Phi^TRPhi $$ の逆行列が存在しなくなりwを更新できなくなる。数値計算上の精度の話でもあるし、もともと全てのトレーニングデータが正解/不正解に分類できるのであれば、f(x,y)を大きくしていったときにf(x,y)と誤分類データとの距離が0になる、すなわちモデルから正解データを100%の確率で取得できる時がくるので、収束停止条件として考慮すべき内容である。

default eye-catch image.

パーセプトロン

[mathjax] (x,y)平面上のサンプルデータ(xn,yn)が、(x,y)平面を分割する1次多項式f(x,y)=w0+w1x+w2y を基準に f(xn,yn)>0 であれば正解、f(xn,yn)<0であれば不正解 のいずれかに分類する問題を考える。 正解、不正解を表す変数tについて、正解の場合に+1、不正解の場合に-1としたとき、トレーニングデータ(xn,yn,tn)を与えて多項式の係数wを求める分類アルゴリズムをパーセプトロンという。 ITエンジニアのための機械学習理論入門posted with amazlet at 17.03.10中井 悦司 技術評論社 売り上げランキング: 8,130Amazon.co.jpで詳細を見る パラメトリックモデルの決定 (x,y)平面を分割する1次多項式f(x,y)を以下の通り定義する。 $$ f(x,y)=w_0+w_1x+w_2y $$ トレーニングデータ(xn,yn)に対してパラメタtを以下の通り決定する。 $$ begin{eqnarray} f(x_n,y_n) > 0 Rightarrow t=+1 \\ f(x_n,y_n) < 0 Rightarrow t=-1 end{eqnarray} $$ tの符号とf(x,y)の符号の関係性から以下が言える。正解/不正解それぞれで場合分けして考えなくても良い。 f(xn,yn)>0なのにt=-1であるデータや、 0 Rightarrow 正解 \\ f(x_n,y_n)t < 0 Rightarrow 不正解 $$ モデルの評価式 トレーニングデータ(xn,yn,tn)を与えたとき、最良のパラメータw=(w0,w1,w2)を決めるため、多項式の評価式を決定する。正解、不正解を分類する問題であるから、全ての不正解データをf(x,y)に与えたときにその評価値が最小になるようにする。 これは、不正解データを無くすか、なるべく不正解データと距離が近いところを通るf(x,y)を見つけることに他ならない。ということで不正解データとの距離を定式化する。 $$ begin{eqnarray} E_n = | f(x_n,y_n) | \\ end{eqnarray} $$ 不正解データについてのみEnを加算する。ただし (xn,yn)は不正解データのみ $$ begin{eqnarray} E &=& sum_n E_n = sum_n |f(x_n,y_n)| \\ &=& -sum_n (w_0 + w_1x_n+w_2y_n)t_n end{eqnarray} $$ ここで、無理くりベクトル(行列))計算に持ち込む。 $$ begin{eqnarray} w &=& left ( begin{array}{c} w_0 \\ w_1 \\ w_2 end{array} right) \\ phi &=& left ( begin{array}{c} 1 \\ x_n \\ y_n end{array} right) \\ E &=& -sum_n t_nw^Tphi_n end{eqnarray} $$ モデルの評価式Eが決まった。Eはwにより決まるためE(w)とも書ける。トレーニングデータからE(w)を最小化するパラメタを求めていく。 確率的勾配降下法 E(w)をwについて偏微分するとE(w)の勾配ベクトルを求められる。(あぁ線形代数...。E(w)の勾配ベクトル∇E(w)とは、ベクトルwにおいてE(w)を最大化する向きと大きさを持つベクトルのことです...) $$ begin{eqnarray} nabla E(w) &=& left ( begin{array}{c} frac{partial E}{w_0} \\ frac{partial E}{w_1} \\ frac{partial E}{w_2} end{array} right ) \\ end{eqnarray} $$ 一方、上のベクトルを微分すると以下の式となる。 $$ nabla E(w) = - sum_{n}t_nphi_n $$ E(w)の最小化を考えると以下が成り立つはず。 $$ nabla E(w) = - sum_{n}t_nphi_n = 0 $$ ∇E(w)はtとxを含むがwを含まず、∇E(w)を式変形してwの式に展開することができない。wの式に展開できないと∇E(w)を0にするwを求める式を立てられない。 そこで∇E(w)の幾何学的な特徴を利用した数値計算によりE(w)を更新する。勾配ベクトル∇E(w)はwにおいてE(w)を最も大きくするベクトルだから、wと-∇E(w)を加算することでE(w)を小さくできる。 これを繰り返し実行することでE(w)を最小化できる。 実際のトレーニングデータ数Nは大きく、∇E(w)の行列計算は大変な作業となる。そこで、トレーニングデータから無作為にデータを1個取り出し、その1個分のデータについてのみwを更新する。N=1のとき∇E(w)は以下の通りとなる。 $$ - nabla E(w) = sum_n t_n phi_n = t_n phi_n $$ そのため、wの修正は以下の通りとなる。 $$ begin{eqnarray} w\' &=& w - ( -nabla E(w) ) \\ &=& w + nabla (Ew) \\ &=& w + t_n phi_n end{eqnarray} $$ E(w)が最小になるwが決まったとき、そのwを採用した多項式は、トレーニングデータについて誤りが少ない分類を行う式になっている。 トレーニングデータから無作為にサンプルを選んで勾配ベクトルの逆ベクトルを加算して降下していくから「確率的勾配降下法」という。へぇ。 パーセプトロンの収束速度 数値計算により値を更新していくアルゴリズムは、その収束速度が話題に上がる。パーセプトロンの確率的勾配降下法においてはトレーニングデータφのcにより調整する。 $$ begin{eqnarray} phi &=& left ( begin{array}{c} c \\ x_n \\ y_n end{array} right) end{eqnarray} $$ 確率的勾配降下法によりwを更新するときw0は1回の繰り返しで±cの範囲で増減する。cを大きくするとw0の増減範囲が大きくなり収束速度が速くなる。ではこのパラメータcはどのように決めるのか..はまた別のエントリで..。 $$ begin{eqnarray} w\' = w + t_n phi_n end{eqnarray} $$ 分類アルゴリズムとして、パラメトリックモデルが線形でない場合や、そもそも教師無しの場合など、他にもいろいろあるので、別エントリに書いていく。

default eye-catch image.

最尤推定 確率分布をもったトレーニングデータの学習

[mathjax] 前回までのエントリでトレーニングデータからパラメトリック曲線とそのパラメタの導出方法を書いた。 観測点(xn,tn)の背景にあるパラメトリック曲線を求める パラメタの評価式を決定する 評価式の値が最良になるようにパラメタを決定する 実際にはトレーニングデータはパラメトリック曲線から発生したデータではなく、パラメトリック曲線はあくまでトレーニングデータとの最小二乗誤差が最小になる曲線に過ぎない。 未知のサンプルデータの特徴をよりうまく含む方法を考える。 実際のサンプルデータが、トレーニングデータから導出したパラメトリック曲線から±σの誤差を持つデータであると仮定することで、サンプルデータの特徴を確率的に捉えることができる。これによりサンプルデータが「どれ位の範囲で当てはまるか」を推定できるようになる。 ITエンジニアのための機械学習理論入門posted with amazlet at 17.03.10中井 悦司 技術評論社 売り上げランキング: 8,130Amazon.co.jpで詳細を見る 正規分布の確率密度とパラメトリック曲線 統計・確率の基本中の基本、正規分布の確率密度。データxの発生頻度の平均がµ、分散がσ2である場合の確率密度は次の関数で与えられる。 $$ N(x|mu,sigma^2)=frac{1}{sqrt{2pisigma^2}}e^{-frac{1}{2sigma^2}(x-mu)^2} $$ で、今、M次多項式を考えている。 $$ begin{eqnarray} f(x) &=& w_0 + w_1x + cdots + w_Mx^M &=& sum_{m=0}^M w_mx^m end{eqnarray} $$ サンプルデータxnに対し観測値tがf(xm)を中心として±σ散らばることを考えると、tはfn,σ2から決まる式となる。 $$ begin{eqnarray} N(t|f(x_n),sigma^2)= frac{1}{sqrt{2pisigma^2}}e^{-frac{1}{2sigma^2}{(t-f(x_n))}^2} end{eqnarray} $$ トレーニングデータからパラメータを決定する 未知のサンプルデータ(xn,t)ではなく、トレーニングデータ(xn,tn)を代入すると、 $$ begin{eqnarray} N(t_n|f(x_n),sigma^2)= frac{1}{sqrt{2pisigma^2}}e^{-frac{1}{2sigma^2}{(t_n-f(x_n))}^2} end{eqnarray} $$ である。このモデルからトレーニングデータ(x0,t0)が得られる確率P0は以下の通り求まる。 $$ begin{eqnarray} P = frac{1}{sqrt{2pisigma^2}}e^{-frac{1}{2sigma^2}{t_0-f(x_0)}^2} end{eqnarray} $$ ここで、このモデルから全てのトレーニングデータ{(xn,tn)}n=1Nのデータが得られる確率Pは条件付き確率として以下の通り求まる。このPを尤度関数という。 $$ begin{eqnarray} P &=& N(t_1|f(x_1),sigma^2) N(t_2|f(x_2),sigma^2) cdots N(t_n|f(x_n),sigma^2) \\ &=& prod_{n=1}^N N(t_n|f(x_n),sigma^2) end{eqnarray} $$ f(xn)は係数行列wが未決定であり、分散σ2も未決定である。Pを最大化するようにf(xn)=wとσ2を決定する。積を分解して整理すると、 $$ begin{eqnarray} P &=& prod_{n=1}^N frac{1}{sqrt{2pisigma^2}}e^{-frac{1}{2sigma^2}{t_n-f(x_n)}^2} \\ &=& bigl(frac{1}{2pisigma^2}bigr)^{frac{2}{N}}expBigl[-frac{1}{2sigma^2}sum_{n=1}^N { t_n-f(x_n) }^2 Bigr] end{eqnarray} $$ ここで、尤度関数に二乗誤差EDが現れるので、EDで置き換える。 $$ begin{eqnarray} E_D &=& frac{1}{2} sum_{n=1}^N{f(x_n)-t_n}^2 P &=& Bigl( frac{1}{2pisigma^2} Bigr)^{frac{N}{n}} e^{-frac{1}{sigma^2}E_D} end{eqnarray} $$ 尤度関数がσとwから決まる2変数関数であることを明確にするため、σ^2の逆数をβとし、二乗誤差EDが係数wから決まることを明確とするためED=ED(w)とする。 $$ P(beta,w) = bigl( frac{beta}{2pi} bigr)^{frac{N}{2}} e^{-beta E_D(w)} $$ 両辺に自然対数を取る。Pが最大になることとPの自然対数が最大になることは同じ。 $$ begin{eqnarray} ln{P(beta,w)} &=& ln{bigl( frac{beta}{2pi} bigr)^{frac{N}{2}} e^{-beta E_D(w)}} \\ &=& frac{N}{2}ln{beta}-frac{N}{2}ln{2pi}-beta E_D(w) end{eqnarray} $$ 単調増加関数が最大になる条件は微分した値が0になること。2変数の単調増加関数が最大になる条件は、それぞれの変数で偏微分した値が0になること。つまり、 $$ begin{eqnarray} frac{partial (ln{P})}{partial w_m} &=& 0 \\ frac{partial (ln{P})}{partial beta} &=& 0 end{eqnarray} $$ まず、wの偏微分。EDw項以外は定数になるから、 $$ begin{eqnarray} frac{partial E_D}{partial w_m} = 0 \\ end{eqnarray} $$ パラメトリックモデルに確率密度関数の誤差を含まない最小二乗法における二乗誤差を最小にする条件と同じとなる。つまり、トレーニングデータ{xn}n=0N},{t1,...,tN}から求まる。 $$ begin{eqnarray} w = bigl(Phi^TPhibigr)^-1Phi^T t end{eqnarray} $$ 次に、βの偏微分。β項以外は定数になる。対数の微分は、(logx)\'=1/x だから、 $$ begin{eqnarray} frac{partial P(beta,w)}{partial beta} &=& 0 \\ frac{N}{2} frac{1}{beta} - E_D(w) &=& 0 \\ frac{1}{beta} &=& frac{2E_D}{N} end{eqnarray} $$ ここで、以下としてしたから、 $$ beta = frac{1}{sigma^2} $$ 式変形すると、なんとσと、最小二乗法でパラメトリックモデルの次数Mを評価したときの、モデルとサンプルとの差(平方根平均二乗誤差)ERMSと同じになる。 $$ sigma = sqrt{frac{1}{beta}} = sqrt{frac{2E_D}{N}} = E_{RMS} $$ つまり... 最初に戻ると、トレーニングデータ{xn}が与えられたとき、トレーニングデータがM次多項式f(x)から±σの範囲にバラついていると仮定した場合、モデルから{tn}が得られる確率は、2つのパラメタw,σの関数として以下のように決まる。 $$ begin{eqnarray} N(t_n|f(x_n),sigma^2)= frac{1}{sqrt{2pisigma^2}}e^{-frac{1}{2sigma^2}{(t_n-f(x_n))}^2} end{eqnarray} $$ 全てのトレーニングデータがこのモデルから得られる条件付き確率(尤度関数)は条件付き確率により定まり、尤度関数の最大化問題を解くことで2つのパラメタw,σを得られる。 wは、モデルに含まれる正規分布に従う誤差を含まないで作成したモデルの場合と同じ方法で求められる。また、σはそのモデルとの誤差評価値ERMSと同じである。 最尤推定法は最小二乗法を一般化した話だった、というか最小二乗法がサンプルデータの生起確率が正規分布を前提としていた、という話。 ともかく、トレーニングデータから確率変数付きパラメトリックモデルを立てて、パラメタを確率の最大化問題として解くことを最尤推定という。 サンプルデータの生起確率が正規分布に従う例がわかりやすい。より一般的に、観測した事象から確率的モデルを立てることは統計的なモデル化の王道らしく、そこから派生している機械学習アルゴリズムでも頻出であるようだ。

default eye-catch image.

最小二乗法 パラメトリックモデルのパラメタ決定と過学習

[mathjax] 一つ前のエントリ\"トレーニングデータからパラメトリックモデルを決定してみた\"では、トレーニングデータからM次多項式曲線を求めてみた。このエントリではMの候補の中から一つを見つけ出す方法を書いてみる。 Mを大きくすればするほどトレーニングデータを多く通過することになり、トレーニングデータの数Nを境に、ついにはトレーニングデータを再現する多項式曲線が出来上がる。Mを過剰に大きくすると未知のサンプルデータとの二乗誤差が大きくなる(悪化する)地点が発生する。これは過学習という名前が付いている現象で、パラメトリックモデルにおけるパラメタ決定時に考慮する内容となる。 ITエンジニアのための機械学習理論入門posted with amazlet at 17.03.10中井 悦司 技術評論社 売り上げランキング: 8,130Amazon.co.jpで詳細を見る パラメタの評価 M=0のときの二乗誤差、M=1のときの二乗誤差,...といったように、M次多項式とトレーニングデータの平均二乗誤差EDを記録していき、EDが最小になるMをパラメタとして採用する。平均二乗誤差EDは以下の通り。 $$ begin{eqnarray} E_D = frac{1}{2} sum_{n=1}^{N}bigl( sum_{m=1}^M w_m x_n^m-t_n bigr)^2 end{eqnarray} $$ 平均二乗誤差は、M次多項式とトレーニングデータの差の2乗の合計の1/2だが、評価尺度とするには2乗分と1/2分が無駄だから、それを打ち消すために2倍して平方根を取ったものを利用する。 $$ E_{RMS} = sqrt{frac{2E_D}{N}} $$ これまでトレーニングデータを使ってM次多項式を作ってきた。このM次多項式にトレーニングデータを入力すれば、それは\"モデルを確認している\"作業となる。トレーニングデータの数NとMが等しくなるところでERMSはゼロになる。対して、トレーニングデータと同じ背景を持つ別のサンプルデータを入力するとそのような結果にはならない。 未知のサンプルデータを入力してERMSを計算したときに、ERMSを最も小さくするMが本来採用すべき値である。ERMSがあるMを境に大きくなることはつまり、トレーニングデータにのみ現れる特徴を学習してしまったということであり、この現象を過学習と言う。また、未知のサンプルデータに対してERMSを小さく維持できる能力のことを汎化能力と言う。 んー。言葉はどうでも良いんだが、結局何かまとめが欲しかったのでこうなりました。Mが決まれば、M次多項式の全てのパラメタが決まり晴れて線形回帰モデルの説明ができます。 実際には サンプルデータの背後にあると考えたM次多項式は実在するわけではなく、実際のサンプルデータは誤差の範囲に散らばって存在するはず。最小二乗法で求めたM次多項式はその誤差の範囲の中心を貫く曲線を表しているに過ぎず、誤差を含めてモデル化できると良い。次のエントリでは、観測点xnにおける観測値tnがf(xn)を中心として±σの範囲に存在するものとして考える。

default eye-catch image.

最小二乗法 トレーニングデータからパラメトリックモデルを決定してみた

[mathjax] トレーニングデータが与えらえたとき、与えられたトレーニングデータを最もうまく説明する構造を決めて、その構造から未来のサンプルを予測/説明するという試みがある。トレーニングデータを正解として扱うことになるから「教師あり学習」的な分類に入る。その試みの中には構造をパラメタを含む数式で表現できるものがあり、素性の良い数式であれば数値計算によらず解析的な手法でパラメタを決めることができる。 ITエンジニアのための機械学習理論入門posted with amazlet at 17.03.10中井 悦司 技術評論社 売り上げランキング: 8,130Amazon.co.jpで詳細を見る パラメトリックモデルとM次多項式曲線 M次多項式をモデルとして二乗誤差の最小化問題を解く最小二乗法は最も理解しやすいから良く解説に使われるようだ。自分でも理解できたし。。パラメトリックモデルのパラメタとはM次多項式の係数行列のことではなく次数Mのことだよ。最小二乗法によりM次多項式の係数行列を求めるのは情報系の一般教養的な感じだったと思うけど、どのMを採用すべきかは確かに奥が深そうだ。 トレーニングデータからパラメトリックモデルを決めるプロセスは以下のような感じになる。 現象を予測/説明するモデル(数式)を設定する。モデルにはパラメタが含まれるようにする パラメタの良し悪しを評価する基準を作る パラメタの評価基準を利用してモデルにおける最良の評価を与えるパラメタを決める さて、以下のようなトレーニングデータが与えられたとする。時刻xnにおける値がtnであるデータがN個あるという意味。 $${(x_n,t_n)}^{N}_n=1$$ tnの背景にM次多項式曲線f(x)があると仮決めする。 $$ begin{eqnarray} f(x) &=& w_0 + w_1x+w_2x^2+dots+w_Mx^M \\ &=& sum^M_{m=0} w_m x^m end{eqnarray} $$ サンプルデータtnとf(x)の距離を二乗和で表すと、 $$ begin{eqnarray} { f(x_1)-t_1 }+{ f(x_2)-t_2 }^2 + dots + { f(x_{N})-t_{N} }^2 end{eqnarray} $$ その半分の値を誤差Epとして定義する。{(xn,tn)}m=0mは既に与えられている定数(トレーニングデータ)であり、Epは単純に{wm}m=0Mを変数とする関数。 $$ begin{eqnarray} E_p &=& frac{1}{2}sum^N_{n=1}{f(x_n)-t_n}^2 \\ &=& frac{1}{2}sum^N_{n=1}Bigl(sum^M_{m=0}w_mx^m_n-t_nBigr)^2 end{eqnarray} $$ Epを最小にする係数{wm}m=0Mを求める問題に帰着する。素晴らしいことにwは行列計算で求まる。この求め方は別エントリに書くとして、 $$ begin{eqnarray} Phi &=& left( begin{array}{ccc} x_1^0 & x_1^1 & cdots & x_1^M \\ x_2^0 & x_2^1 & cdots & x_2^M \\ vdots & vdots & ddots & vdots \\ x_N^0 & x_N^2 & cdots & x_N^M \\ end{array} right) end{eqnarray} $$ とすると、係数ベクトルw、トレーニングデータt、観測点xの間に以下が成り立つ。つまり、N個のトレーニングデータとN個の観測点だけから背景として仮決めしたM次多項式曲線のパラメタwを決めることができる。変数として残るのはM次多項式曲線のMだけ! $$ begin{eqnarray} w &=& (w_0,cdots,w_M)^T \\ t &=& (t_1,cdots,t_N)^T \\ x &=& {x_n}^N_{n=1} \\ w &=& ( Phi^T Phi)^{-1}t end{eqnarray} $$ M次多項式曲線の係数行列が求まった。