細野微分幾何

有志でやっている微分幾何勉強会のメモである。 教科書は、細野さんのやつ。

微分幾何 (応用数学基礎講座)

微分幾何 (応用数学基礎講座)

例題1.2 フレネー・セレの公式あたりから捩率あたりまで進んだ。

例題1.2では平面曲線上\Gamma のフレネー機構 について成り立つ公式を示す。

平面曲線上\Gamma において局所座標系\mathrm{e_1}, \mathrm{e_2}の時間発展方程式みたいなものか。 この局所座標系(正規直交基底)をフレネー標構とよぶ。 これらが連立微分方程式となっている。 フレネー・セレの公式を示し、曲率半径を導入する。

曲率は\Gamma 上の局所座標に定義される。半径の逆数で定義されることを示す。 半径の逆数であるから、物理でいうところの中心力ポテンシャルのアナロジーで解釈すると面白い。 すなわち、半径が小さいところでの曲率(中心力ポテンシャル)は大きいみたいなノリ。

例題1.3は楕円上のフレネー機構(\mathrm{e_1}, \mathrm{e_2})と曲率\kappaを求める。 基本的な方針は、ds/dtを計算し、\mathrm{e_1}(s)d \mathrm{e_1}(s)/dsをひたすら計算する。

ここまで、曲線\Gamma は2次元上の曲線だった。(平面曲線)

次に、3次元上の曲線\Gamma を考える。平面曲線に対して空間曲線という。

これにあわせてもフレネー・セレ標構も拡張されて、空間曲線版のフレネー・セレの公式が与えれれる(例題1.4)。 ここで捩率なる概念が出てくる。これは平面曲線の曲率と本質的には同じ(だと思っている) (どういうことかというと、例題1.4の表式で言えばe_1e_3が交換可能ということを言いたい。

例題1.5では、\Gamma:\mathrm{x}(t)=(a\cos(t), b\sin(t),bt) 上のフレネー標構と曲率、捩率を求める(\Gammaは円筒状を動く曲線)。

方針は平面曲線と同じだが、ある基底に関して3次元なので法線ベクトルが独立に2つ存在する。 片方を主法線ベクトルを決めれば、従法線ベクトルはそれらの外積で定義される。

1.2平面および空間の曲線はここまで

LaTeX でCVつくったときのメモ

 \LaTeX でCVをつくるときの個人的なメモ

moderncv という テンプレートを使わせてもらった。 http://www.latextemplates.com/template/moderncv-cv-and-cover-letter

いまどきoverleafでもいいけど、githubで管理したかった(overleafだと無料範囲でできない)のでローカルでやる。

全部英語でつくろうと思ったが、日本語の論文タイトルはどうしようもないので、以下のようにjarticleを追加した。platexコンパイルする。

\documentclass[11pt,a4paper,sans,jarticle]{moderncv} 

エディタはvscodeをつかってみた。プレビューがくそ便利。

platexコンパイルしてdvipdfmxでpdfをつくるので、これ。 https://qiita.com/reishoku/items/c5ac57c1130e70bdc098

以上。

ガウス過程と機械学習を読む1

講談社の機械学習プロフェッショナルシリーズガウス過程と機械学習が追加される。 ガウス過程の専門家によるガウス過程に特化した日本語書籍ってこれが初なんじゃないだろうか。

現在(2018/12/02)、著者の一人である統数研の持橋さんによるサポートサイトにて、 原稿の一部(γ版)がPDFで無償公開されている。一部というか前半全部なのですごい。講談社太っ腹すぎないか。 出版にあわせて公開停止されるらしいので読みたい人は早めのダウンロードをおすすめする。

γ版とはいえ公開されている第3章まではほぼ完成しているように思える。公開範囲(3章まで)で線形回帰からガウス過程の基本までが学べる。 素晴らしすぎるしありがたすぎる。絶対買うわこんなん。 ちなみに発売予定は2019年3月とのこと。

サポートサイトにはPDF以外にも本書で使用する MatlabPython のコードとデータ、ライブラリ あと、ガウス過程に関する参考資料・動画、ライブラリ情報がまとまっている。

せっかく無償公開して頂いているので、一通り読んで感想を書いておくことにする。 理解に誤りがある場合はご指摘いただけると助かる。 あと、読みながらうだうだ書いていくので、内容と感想がごちゃまぜになってるのは許してください。ごめんなさい。 問題があれば修正します。

第0章

ガウス過程が5分でわかるらしいが読むのに5分以上かかった。 機械学習とはなにか、モデルを決定論的でなく確率的に推定するとはどういうことかという話が書かれている。 で、ガウス過程とは何かを一言で述べている。 曰く「関数 f(x) を確率変数と見たてた確率分布です」とのことである。 後ろの章でちゃんとやる話を簡単に書いているだけので、 これだけで全部理解できる人はこの本の対象読者ではないだろう。

0章の感想

ちょっとだけ冗長に感じたが、ガウス過程やガウス回帰がどういうものかの雰囲気を掴むことはできる。

第1章

線形回帰の復習である。PRML3章に対応する。 PRMLは6章でガウス過程が出てくるが、その基礎に当たる部分、モチベーションが線形回帰であるため、 まずは何でこんなモデルを考えるのかというところをきちんと抑えておくという意味でも 「センケイカイキなにそれ美味しいの」って人から「線形回帰完全に理解した」という人まで読んでおくと良いと思われ。 「線形回帰チョットダケワカル」って人は読み飛ばしてもよいと思う。

内容は至って普通の線形回帰の話である。 一行でまとめると、単回帰、重回帰、線形モデルの一般的表現と解、正則化(リッジ回帰)の話である。

ガウス過程は線形回帰の無限次元版であることが冒頭で述べられている。 回帰とはなにか、分類とはなにかというはなしから始まるので初学者も安心である。 (10月版では一部誤植があった((P.13 (2.1)式直後のN=8)も、11月28 日v1.1ではN=7に修正されているようだ)

単回帰で最小二乗法を例に取り、パラメータ微分から正規方程式を導出する。 計算がこれでもかというくらいに非常に丁寧である。

つぎに重回帰のはなしがきて計画行列でモデルを書き下し、 あとは本質的には単回帰と同様にパラメータ微分から重回帰の解を導出する。 ここでも具体的な数値で計算例が載っており親切丁寧である。

で、次にこれらの知識からPRML3章相当の話をする。 線形モデルを基底関数で一般的に表現して計画行列もこれにあわせて一般化する(X \rightarrow \Phi)。

最後に正則化のはなしである。 正規方程式に現れる\Phi^{T}\Phi が非正則あるいは非正則に近いときのはなし。統計でいうランク落ちの状況である。 実際的には\Phi^{T} \Phi逆行列をもたない、あるいは非常に大きい固有値をとってしまうときに正規方程式が解を持たないか不安定になる。 そのときにどうすればよいかという話である。ここではリッジ回帰を紹介している。 で、リッジ回帰のときも結局解析解はあって、 \Phi^{T} \Phi単位行列の定数倍だけシフトさせることに対応するということを紹介している。

1章の感想

一切の余計なことを排除しエッセンスだけが抽出されており非常に見通しが良いと感じた。 ガウス過程関係なく線形回帰だけを知りたい人もこの章を読めばよいと思う。

第2章

正規分布の復習である。 冒頭でも述べられているが、多変量正規分布を知っている人は飛ばしてもよいだろう。

P.39, 3行目に「正規分布は情報量最小 (=エントロピー最大) である」とあるが、情報量最大の誤植だろうか。

Box-Muller 法が紹介されている。 いまどき Python や R では一行で正規分布からのサンプリングができるので Box-Muller 法を聞いたことすらないという人も結構いそうである。

第1章で二乗誤差を最小にする戦略で最適解を求めたが、ここではそうではなく確率モデルとして焼き直す。 つまり、観測値には誤差がのっており、その誤差にガウシアンを仮定し尤度を最大化するとういう戦略をとる。 で、実はこれが第1章の二乗誤差最小化することと等価ですよということを示す。これも基本事項だろう。

2.2で事前分布がほとんど未定義であらわれる。一応0章ででてきているので、そこはOKとするべきなのか。

1章で出てきたリッジ回帰の正則化パラメータ\alphaに理解を与えるために事前分布の概念が必要なのである。 ベイズ推論の枠組みを少しでも理解していないと何を言っているかわからないのではないかと思った。 結論的には\alphaは事前分布のガウシアンの分散と観測ノイズの分散の比\alpha = \sigma ^{2}/ \lambda ^{2}として理解できる。

次に多変量のとき。分散共分散行列とか精度行列が紹介されている。 この辺は知ってる人はとばしてもよいだろう。

「精度行列の行列式が張る空間の大きさ」という表現は何を言ってるのかわからなかった。 行列式の説明なのか? 1次元のときの拡張といっているのでそうではなさそうである。 単に精度パラメータとガウス分布のピークの急峻さのことを言っているのかな?

あとは道具として多変量ガウス分布の基本的な性質知っておくべきことで、 その線形変換もまたガウス分布であるということが示されている。おそらくあとで使うのであろう。

多変量ガウス分布からのサンプリング方法も、自分でサンプリングする場合にコレスキー分解を使い1次元ガウス分布からサンプリングする方法が紹介されている。

最後に多変量ガウス分布について、その一部の変数で周辺化 or 条件づけたとき、 どういう表式になるかを具体的な計算付きで示している。 計算は相変わらず丁寧であり迷うことはなさそうである。途中でウッドベリーの公式を使う。

最後に一部を観測した(条件づけた)ときの新しい正規分布に関して、その平均(2.66)と分散(2.67)に関する意味を与えてくれている。 x2の平均の更新量は、観測量x1の分散が小さいほど大きくなり、分散が大きいほど小さくなる。 つまり、一部の観測量の精度が高ければ高いほどそれがもつ情報量は大きく残りの部分に強く影響を及ぼすと理解できる。 分散も同様に観測量x1の分散の大きさ(精度の小ささ)を得られた情報量と思えば定性的に理解できるのである。

第2章の感想

ガウス分布の基本的な内容である。 PRML2章を(おそらく)本書に必要なところだけ抜粋して超特急で解説した感じ。説明や計算は丁寧でわかりやすい。 最後に一部を観測したときのパラメータの挙動に定性的な理解を与えてくれているところもよかった(小並感)。

第3章

いよいよ本題のガウス過程に入る。

まずはモチベーションから。 ナイーブな線形モデルに関する次元の呪いがそれ。 基底関数をガウシアンで構成しようとすると、 学習パラメータwの次元が入力データxの次元について指数的に増大することを示す。 これも具体的に計算されていてイメージが付きやすく親切である。

でこれに対処する方法がガウス過程であるということを言う。

具体的にはパラメータwを積分消去するのである。 それが3.9式以降の展開である。 積分消去の意味は周辺化と同じ意味でありこれは前の章で説明済みである。 具体的には期待値をとる操作に対応する。期待値をとるのでwの確率分布が必要なのだが、ちゃんとこれも前の章で説明済みで、 パラメータwの事前分布として正規分布を考えるのである。 すると、前章で示した正規分布の線形変換もまた正規分布であるという事実をちゃんと使って、予測値の分布がガウス分布として得られるのである(3.14)。 ここで重要なのは、yを評価するのにwを直接評価しないところ。 これが意味するのは、入力次元が大きくなることによって重み空間の次元が指数的に増大し次元の呪いにトラップされることを防いでいる(というかそんな概念すらない、と言ったほうが正確かもしれない)。 つまり、これがガウス過程の本質的なところで定義3.1として与えられる。

最後に、本来ガウス過程は無限次元であり、観測データで周辺化し有限次元にしたのが(3.14)であるということが書かれている。 なるほど、と思った。

図の3.3のように分散共分散行列Kの要素は特徴ベクトル空間におけるデータxの内積に対応 特徴空間での入力xの類似度の大小が、ガウス分布の共分散の大小を通してyが近い値をとりやすいことに対応する

続く

gibo で .gitignore を生成

しらなかった。

GitHub - simonwhitaker/gibo: Easy access to gitignore boilerplates

インストール方法

$ brew install gibo

使い方

例えば、PythonMac だと

$ gibo dump python macOS >>.gitignore

みたいなかんじ。 ほとんど関係ないものなので、不要なものや除くものを確認する手間を考えると自分でテンプレートつくったほうが楽かもしれない。

使えるコマンドは $ gibo listで確認できる。

=== Languages ===

Actionscript        Go          Processing
Ada         Godot           PureScript
Agda            Gradle          Python
Android         Grails          Qooxdoo
AppceleratorTitanium    GWT         Qt
AppEngine       Haskell         R
ArchLinuxPackages   Idris           Rails
Autotools       IGORPro         RhodesRhomobile
C++         Java            ROS
C           Jboss           Ruby
CakePHP         Jekyll          Rust
CFWheels        Joomla          Sass
ChefCookbook        Julia           Scala
Clojure         KiCad           Scheme
CMake           Kohana          SCons
CodeIgniter     Kotlin          Scrivener
CommonLisp      LabVIEW         Sdcc
Composer        Laravel         SeamGen
Concrete5       Leiningen       SketchUp
Coq         LemonStand      Smalltalk
CraftCMS        Lilypond        Stella
CUDA            Lithium         SugarCRM
D           Lua         Swift
Dart            Magento         Symfony
Delphi          Maven           SymphonyCMS
DM          Mercury         Terraform
Drupal          MetaProgrammingSystem   TeX
Eagle           Nanoc           Textpattern
Elisp           Nim         TurboGears2
Elixir          Node            Typo3
Elm         Objective-C     Umbraco
EPiServer       OCaml           Unity
Erlang          Opa         UnrealEngine
ExpressionEngine    OpenCart        VisualStudio
ExtJs           OracleForms     VVVV
Fancy           Packer          Waf
Finale          Perl            WordPress
ForceDotCom     Perl6           Xojo
Fortran         Phalcon         Yeoman
FuelPHP         PlayFramework       Yii
Gcov            Plone           ZendFramework
GitBook         Prestashop      Zephir

=== Global ===

Anjuta          JDeveloper      PuTTY
Ansible         JEnv            Redcar
Archives        JetBrains       Redis
Backup          Kate            SBT
Bazaar          KDevelop4       SlickEdit
BricxCC         Lazarus         Stata
Calabash        LibreOffice     SublimeText
Cloud9          Linux           SVN
CodeKit         LyX         SynopsysVCS
CVS         macOS           Tags
DartEditor      Matlab          TextMate
Diff            Mercurial       TortoiseGit
Dreamweaver     MicrosoftOffice     Vagrant
Dropbox         ModelSim        Vim
Eclipse         Momentics       VirtualEnv
EiffelStudio        MonoDevelop     Virtuoso
Emacs           NetBeans        VisualStudioCode
Ensime          Ninja           WebMethods
Espresso        NotepadPP       Windows
FlexBuilder     Otto            Xcode
GPG         Patch           XilinxISE
Images          PSoCCreator

Tsallis 統計力学を勉強中

Tsallis 統計力学なるものがあるらしい。勉強中である。

複雑系のための基礎数理―べき乗則とツァリスエントロピーの数理 (数理情報科学シリーズ)

複雑系のための基礎数理―べき乗則とツァリスエントロピーの数理 (数理情報科学シリーズ)

非加法的な統計力学らしい。エントロピーに加法性が成り立たないような統計力学。q-統計ともいうらしい。 普通のボルツマン-ギブス統計(加法的)、シャノンエントロピーを内包する( q \rightarrow 1のとき)。

上記書籍の著者である須槍さんの資料(Tsallis 統計の基礎数理)が詳しい http://www.ne.jp/asahi/hiroki/suyari/suyari's_manuscript_mathphys2009_revised_v1.1.pdf

Tsallis エントロピーをいきなり持ち出す不自然さや、シャノンエントロピーのような情報理論的な意味付けも困難なため、議論の出発点として「べき関数」が「指数関数」の一般的な表現であることからはじまる。

これをよりどころにしてTsallis エントロピーの性質を探っていくようである。 で、 \frac{dy}{dx}=y^{q}, q>0の解からq指数関数、q対数関数なるものを定義し、q積なるものを定義する。

ふつうのBG統計においては、最尤推定が観測誤差がガウス分布であることに対応するわけであるが、 その拡張として、q-ガウス分布なるものをが出てくる。 このときもちろんq \rightarrow 1のときガウス分布に対応する。 ほかにもこのq-ガウス分布は、qの値によってよく知られたt-分布やCauchy 分布、半円分布に対応する。 ようするにいままでのBG統計の一般化なのである。

これからq積がTsallis エントロピーにおける独立性を表現することに対応するらしいのだが、 ここちゃんとわかってない。あとの展開(Tsallis エントロピーの導出)で超重要である。

すやり先生のPDFの最後に、BG統計とTsallis統計の対応関係が載っている。

ここまで導くのに不自然な仮定や解釈困難な前提はなく、 べき関数が指数関数の一般表現であるという自然な事実から出発しているという点が重要なのだ。

引き続き、勉強する。

  • 参考資料

http://www.ne.jp/asahi/hiroki/suyari/suyari's_manuscript_mathphys2009_revised_v1.1.pdf http://www.ne.jp/asahi/hiroki/suyari/suyari_jps08.pdf https://www.jstage.jst.go.jp/article/butsuri1946/54/4/54_4_287/_pdf/-char/ja https://en.wikipedia.org/wiki/Tsallis_entropy

Rényi Entropy and Free Energy

Rényi Entropy and Free Energy https://arxiv.org/pdf/1102.2098.pdf

Rényi Entropyの定義

 S _ { q } = \frac { 1 } { 1 - q } \ln \sum _ { i } p _ { i } ^ { q } \tag{1}

 0 \lt q \lt \infty ,q \neq 1

これはシャノンエントロピーを含む一般的な表現になっている(ユニークという意味ではない)。

 q \rightarrow 1の極限でS_{q}シャノンエントロピーに対応する。すなわち以下。

 \lim _ { q \rightarrow 1 } S _ { q } = - \sum _ { i } p _ { i } \ln p _ { i }

Rényi entropyの解釈

  • Shannon entropyは統計・熱力学的に解釈性があるのに対して、Rényi entropy はよくわからない。

  • Rényi entropy に自然な解釈を与えるには熱力学や統計力学の修正が必要なのか?

    • 必ずしもそうではなく、Rényi entropy は自由エネルギーに対応していることからなにかわかることがあるのではないか。
    • Rényi entropy のパラメータqは熱力学的温度の逆数に対応している

free energy

温度 T_0の熱平衡状態においてエネルギーE_iの状態数は

\exp{(-E_i/T_0)}

温度Tにおける割合は、これを全状態で規格化して、

 \frac{\exp{(-E_i/T)}}{Z}

このときの規格化定数Zは分配関数と呼ばれ、以下で全状態の和として与えられる。

 Z = \sum_i \exp{(-E_i/T)}

このとき、 free energy F は以下で定義される。

F=-T \ln Z \tag{2}

Rényi entropy と free energy の対応

Rényi entropy の パラメータq( 0 \lt q \lt \infty ,q \neq 1)をT_0/Tとおくと以下を得る。

S _ { T _ { 0 } / T } = \frac { 1 } { 1 - T _ { 0 } / T } \ln \sum _ { i } p _ { i } ^ { T _ { 0 } / T } = \frac { T } { T - T _ { 0 } } \ln \sum _ { i } e ^ { - E _ { i } / T } = - \frac { F } { T - T _ { 0 } }

最後の等式は(2)式をつかった。 これをFについて解くと、Rényi entropy と free energy Fの以下の関係が得られる。

F=-(T-T_0)S_{T_0/T} \tag{3}

  • qに対する仮定( 0 \lt q \lt \infty ,q \neq 1)より、(3)式はT\neq T_0のときのみ成立する。
  • ただし、 q \rightarrow 1 のときT \rightarrow T_0 なので、両辺はシャノンエントロピーS_1に収束する。

Rényi entropy と Tsallis entropy

q \rightarrow 1でイコール(シャノンエントロピーに収束)。


ところで情報理論においてはボルツマン定数k=1の単位系で話が進むがこれはなんか意味があるのかな。 単なる温度Tのスケーリング因子なので適当に1に規格化してしまえばよいのだろうが、判然としない。

続く。

numpy ndarray の行方向正規化

行列の行(列)方向の正規化は機械学習アルゴリズムでよく使う操作である。

実装方法はいろいろあると思うが、私が良く使うやり方は以下。以下は行方向について。

numpy だけでやる方法

import numpy as np

A = np.random.rand(N, N).astype('float64')

# 行列の行方向の L1 ノルムをとる。ord=2 とすると L2 ノルム。
row_norm = np.linalg.norm(A, ord=1, axis=1)

# の各行を除算して正規化する
A = A / row_norm[:, np.newaxis]

最後の除算は row_norm の shape(3,) に対して長さ1の次元を加えて (3,1) にしている。 これで行列Aに対してブロードキャストできるようになる。

scikit-learn を使う方法

こっちのほうが簡潔。

from sklearn.preprocessing import normalize

A = normalize(A, norm='l1', axis=1, copy=True)

キーワード引数 norm は、'l1' で L1 ノルム、l2 で L2ノルムとなる。 copy引数 は True で新たにメモリ確保する。デフォルト True なので必要なければ False にしたほうが速い。

APIリファレンス sklearn.preprocessing.normalize — scikit-learn 0.20.2 documentation

速度比較

numpy.linalg.norm と sklearn.preprocessing.normalize の copy 有り無しの3つで比較した。

行列サイズは、100 x 100 〜 5000 x 5000 を 100 刻みで5回ずつやった結果がこちら。 横軸が行列の一辺のサイズ、縦軸が実行時間。Python の timeit で計測した。行列 A のアロケートは実行時間に含んでいない。

予想どおり sklearn の copy=True (緑)が最も遅くて、中間表現がある numpy(赤)が次に遅くて、 最も速かったのは sklearn の copy=False(青)。 まぁそうですよねという感じ。

float64 で 4000x4000 のときに急激に悪化するのはどっかのキャッシュかなんかの最大値がこのへんにあたってるのだろうか…

ちなみにマシンスペックはMBP2017で、i7 (2.5 GHz), RAM 16GB, l1, l2, l3 キャッシュは 32KB, 256KB, 4MB。

あと、行列のサイズが小さいときのコピー有り sklearn の挙動が特徴的。

とりあえず、中間表現不要でとくにこだわりなければ sklearn の copy=False でやればよいということはわかった。

以上です。