スキップしてメイン コンテンツに移動

ヘッセ行列

Introduction


今日は、ヘッセ行列を用いたテイラー展開について書こうと思います。
これは最適化を勉強するにあたって、とても大事になってくるので自分でまとめて残しておくことにしました。とくに、機械学習では最適化を必ず行うため、このブログのタイトルにもマッチした内容だと思います。
.

概要

  • ヘッセ行列の定義
  • ベクトルを用いたテイラー展開
  • 関数の最適性

ヘッセ行列の定義

仮定

f は次のような条件を満たす関数です。.
  • f はn次元ベクトルから実数値を出力します。
    このベクトルは次のように表せます。
    \[x = [x_1,x_2,,,,x_n]\]
  • \(\forall x_i , i \in {1,2,,,n}\), f は二回偏微分可能です。

定義

ヘッセ行列は \(\frac{\partial^2}{\partial x_i \partial x_j}を (i,j)要素に持ちます。\)
よってヘッセ行列は次のように表せます。
\[ H(f) = \left( \begin{array}{cccc} \frac{\partial^ 2}{\partial x_1^2} & \frac{\partial^2 f}{\partial x_1 \partial x_2} & &\ldots \frac{\partial^2 f}{\partial x_1 \partial x_n} \\ \frac{\partial^ 2 f}{\partial x_1 \partial x_2} & \frac{\partial^ 2 f}{\partial x_2^ 2} & \ldots & \frac{\partial^2 f}{\partial x_2 \partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^ 2 f}{\partial x_n \partial x_2} & \frac{\partial^ 2 f}{\partial x_n \partial x_2} & \ldots & \frac{\partial^2 f}{\partial x_n^2} \\ \end{array} \right) \]

ベクトルを用いたテイラー展開

テイラー展開を二次の項まで行った式を与えます。
\[f(a+h) = f(a) + \nabla f(a) h + \frac{1}{2} h^T \nabla f(a) h + R_3\]
ただし、 \(H=\nabla ^2 f\) はヘッセ行列です。
大事なのは二次の項までで止めていることです。理由は最適化できるようにです。

関数の最適性

定置性

  • \(n \times n\)行列A が 正定置
    \(\forall x \in\)n次元ベクトル空間、\(z^T A z > 0\)
  • \(n \times n\)行列A が 負定置
    \(\forall x \in\)n次元ベクトル空間、\(z^T A z < 0\)
  • \(n \times n\)行列A が 半正定置
    \(\forall x \in\)n次元ベクトル空間、\(z^T A z => 0\)
  • \(n \times n\)行列A が 半不定値
    \(\forall x \in\)n次元ベクトル空間、\(z^T A z <= 0\)
\(z^T A z\) は二次形式と呼ばれています。

最適性

もちろん上記で書いた二次の項までのテイラー展開の式は二次形式を含みます。
よって関数の最適性は次のように考えられます。
  • H(a)(ヘッセ行列) が正定置\(\implies\)f(a) は極小値.
  • H(a)(ヘッセ行列) が負定置\(\implies\) f(a) は極大値

Reference

https://ja.wikipedia.org/wiki/%E3%83%98%E3%83%83%E3%82%BB%E8%A1%8C%E5%88%97
http://www2.kaiyodai.ac.jp/~takenawa/optimization/resume10-1.pdf
http://www.dais.is.tohoku.ac.jp/~shioura/teaching/mp04/mp04-8.pdf
http://tau.doshisha.ac.jp/lectures/2008.calculus-II/html.dir/node43.html

コメント

このブログの人気の投稿

Implement linear SVM

Introduction 日本語 ver Today, I implement liner SVM (support vector machine). SVM is one of the most strong algorithm of machine learning before becoming popular Deep learning. I will write detail of Logic of liner SVM in other posts. # I finished writing theorem of SVM. Theorem of SVM part1 My computer is windows. OS is windows. Program is written by Python3. This program is used Interrior point method in Oputimization. Dataset I used two dataset. First, I used data separated by hyper plane. Second, I used data mixed \(C_1\) and \(C_2\). First data is distributed such as the following. I can write separate line of distribution. Second data is distributed such as the following. I can not write separate line of distribution. I will try liner SVM about these data. Implementation data1 This line is hyper plane. It is written like copperplate. data2 I tried to estimate hyper plane by variable C. C value cause this line. The smoller C value is the ea...

大学院試験 -外部への道しるべ-

始めに この度、 京都大学大学院情報学研究科システム科学専攻 に合格することができました!!! 僕は現在、立命館大学という関西の私立大学に通っているので、外部受験をしたことになります。 さらに、学部は数学専攻で、大学院からは情報学(の中でも機械学習)専攻になるので、専門も変えることになります。 この記事では、外部の大学院、もしくは専攻替えを考えている人向けに書こうと思っているので、目次で気になった項目があれば、ぜひ、読んでいってくださいませ。( *´艸`) ちなみに、予測点数は線形微積6~7割、専門科目満点、英語かなり低いので内緒です。(笑) 得点開示を要求するので、得点がわかったら、また追記します。 目次 外部受験を目指すまで、目指したきっかけ 外部受検の大変さ 専攻替えの大変さ 合格するために 英語が苦手な人へ 数学科の学部から情報学(機械学習)の大学院を目指す人へ 応援 外部受検を目指すまで、目指したきっかけ ここでは、自分の大学生活がどんなだったかを書いてるだけなので、興味のない人は飛ばしましょう。(笑) 僕が学部二回生頃に、当時数理科には機械学習の研究をされている先生が一人だけ所属されていました。その先生に、直接弟子入りさせていただき、僕の機械学習への道は始まりました。。。(メインは遺伝統計学の研究でした。) 弟子入りした直後は、タイピングもなめくじのように遅かったですし、gitもpullする前にpushしたこともありました。。。 しかし、その先生は、目的に最先端で届く道のりを用意してくださいました。 プログラミングを初めて一か月ほどで、t-SNEの実装をしたり(遺伝統計学の研究で必要だった)、四か月ほどで、カーネルc-SVMの実装をしたり(やってみなとゆわれて(笑))することができました。その後も、学部二回生、三回生ながら、論文を読んで実装してきました。 学部二回生冬には、遺伝統計学の研究を 株式会社パーソルキャリア さん主催のハッチングフェスというデータサイエンティストのためのイベントで、発表しました。 このイベントでは、企業の方もたくさん来られて、知り合えるチャンスがかなりあります!! (名刺を作っておくと、「えっ、学生なのに名刺持ってるの?!」ってなるので、覚えてもらえます。...

隣接行列の実装

Introduction sorry, this page is Japanese only.   ここでは隣接行列の実装を行っていきます。Python3を使っています。OSはwindows10です。隣接行列の説明は以下の記事の下の方をご覧ください。 グラフ理論の基礎 実装例 扱うグラフ コマンドでの結果 Code defファイル import numpy as np class directed_Gragh(): def __init__(self,E,V,gragh_map): self.edge = E; self.vertex = V; self.map = gragh_map; def Adjacency_matrix(self): adjacency_matrix = np.zeros((self.vertex.shape[0],self.vertex.shape[0])) for ed in self.edge: P_ = self.map(ed) start = P_[0] end = P_[1] row = np.where(self.vertex == start) column = np.where(self.vertex == end) adjacency_matrix[row,column] = 1 adjacency_matrix[column,row] = 1 return adjacency_matrix mainファイル import numpy as np from Gragh_def import directed_Gragh def main(): vertex = np.array(['house','station','school','hospital']) edge = np.array([1,2,3,4...