めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

「プログラマのためのGoogle Cloud Platform入門」が発売されます。

プログラマのためのGoogle Cloud Platfrom入門 サービスの全体像からクラウドネイティブアプリケーション構築まで

プログラマのためのGoogle Cloud Platfrom入門 サービスの全体像からクラウドネイティブアプリケーション構築まで

翔泳社より、表題の書籍が出版されることになりました。共著者の阿佐さんを始めとして、執筆にご協力いただいた方々に改めてお礼を申し上げます。

2016年の中頃、Google Cloud Platform(GCP)に関わる仕事をはじめた当初より感じていた、「とにかく、わかりやすくて実践的な入門書を提供したい!」という想いをようやく形にすることができました。本書では、Google Compute Engine、Google Container Engine、Google App Engineを中心としたGCPの主要サービスを用いて、最適なアプリケーションアーキテクチャーを実現する方法を具体的なサンプルアプリケーションを使って説明しています。特に、GCPを利用する上で理解しておきたいインフラの基礎技術についても解説が加えられていますので、GCPを通してインフラ技術の基礎を習得したいという方にも最適な入門書となっています。

ちなみに、GCPには、アプリケーションを効率的に開発・提供するためのアプリケーションプラットフォームという側面に加えて、大量データを効率的に処理するためのデータ処理プラットフォームという側面があります。本書は、まずは、アプリケーションプラットフォームとしての特徴を理解して、使いこなしていただくことが大きな目標となっています。データ処理機能について、あまり触れることができなかった点が心残りですが、またいつの日か、データ処理プラットフォームとしてのGCPを解説した書籍が提供できるよう、GCPユーザーの皆さんの声援がいただけると幸いです。

最後に、共著者の阿佐さんに執筆していただいた「はじめに」の一部を参考として掲載させていただきます。

はじめに

 「レゴブロックのようにパーツを組み合わせるだけで簡単にシステムが構築できる」――パブリッククラウドについて、そんな宣伝文句を耳にしたことはありませんか? しかしながら、現実のシステム開発はそれほど甘くはありません。クラウド上で提供されるそれぞれのサービスやコンポーネントの特性をよく理解して、ビジネス要件に応じた、最適なシステム設計を実現する必要があります。そのような観点で見た場合、Google Cloud Platformにはどのような特徴があるのでしょうか?

 現在、Google社は、サーチエンジンをはじめとする世界規模のWebサービスを広く展開しています。同社が提供するこれらのサービスは、世界最先端のハードウェア/ソフトウェア技術を用いて実現した社内インフラ、現在で言うところのプライベートクラウドの上に構築されており、そこには、プログラマの創造性と生産性を支えるためのさまざまな仕組みが用意されています。Google Cloud Platformは、このようなGoogle独自の社内インフラをパブリッククラウドという形で、一般のユーザーにも開放したサービスと言えます。そこでは、伝統的な仮想マシン環境はもちろんのこと、マイクロサービス型のアプリケーションに適したコンテナインフラ、あるいは、開発/運用の効率化を徹底的に追求した独自のPaaS環境などが、使いやすく整備された形で提供されています。機械学習を活用したアプリケーション開発という点でも大きな強みがあります。

 つまり、既存技術の枠組みを脱して、新たな技術や方法論を取り入れた次世代システムへの変革に挑戦したいと願うユーザーにとって、Google Cloud Platformは、最適なクラウドサービスと言えるでしょう。そこには、「最先端の技術を活用して、時代に即した変化に強いシステムを開発したい!」と願うプログラマにとって、大きなチャンスが広がっているのです。そのような思いをもったプログラマの方々が、はじめの一歩を踏み出す手助けとなることを目指して、本書の執筆に取り組みました。世界規模でのスケーラビリティーや開発生産性の向上、先進技術を活用した新しいビジネスへの取り組みなど、コスト削減にとどまらない、Google Cloud Platformのメリットを実感するきっかけが提供できたとすれば幸いです。

〜中略〜

執筆者を代表して
阿佐 志保

データサイエンスに関する初心者向けの参考書

筆者が実際に読んだ(書いた)書籍の中で初心者向けのものを紹介しています。

※英語の書籍については、日本語版は読んでいないので、翻訳のクオリティなどは未確認です。

データサイエンスとは?

「そもそもデータサイエンスって何?」という事を理解するのに役立つ書籍です。

日本語版はこちらになります。

機械学習アルゴリズム

データサイエンスに必要なツールの1つに「機械学習」があります。上記の本にも機械学習アルゴリズムのふわっとした解説がありますが、もう少し、かっちりと理解したい方は下記をお勧めします。(手前味噌です。すいません。)

下記の本は、アルゴリズムに加えて、機械学習ライブラリ(scikit-learn)の使い方を学ぶことができます。

日本語版はこちらになります。

scikit-learnによる機械学習処理

scikit-learnを使って、具体的な機械学習処理を行う方法を学ぶには、こちらが最適です。

日本語版はこちらになります。

対話的分析ライブラリ

データサイエンスの手法である EDA(Exploratory Data Analysis)では、対話的にデータを分析していきます。下記は、EDA に必要となる Python のライブラリー(NumPy, pandas, matplotlib など)の使い方を学ぶ本です。

日本語版はこちらになります。

こちらも参考にしてください。

ディープラーニング

ディープラーニングに興味がある方は、こちらをどうぞ。

こちらは入門編です。

こちらはより本格的な解説書です。内容は高度ですが、前提知識のある方にはとても分かりやすくてお勧めです。

こちらは、後半部分でTensorFlowの基礎的な概念(グラフ、分散学習など)がきちんと説明されていて、DQN/RNNの実装例なども紹介されています。

Kerasの使い方が知りたい方は、こちらをどうぞ。

こちらは、自然言語処理に特化したニューラルネットワークの解説書です。RNNの構造なども詳しく解説されています。

強化学習

強化学習についてはこちらをどうぞ

「強化学習がなぜ上手くいくのか?」という理論的な基礎を根本から丁寧に解説しています。

より専門的な教科書です。

その他

決して初心者向けではありませんが、下記は一般的な機械学習の理論について網羅的に説明された書籍です。

日本語版はこちらになります。

Riemann幾何学ユーザーのための「双対平坦な多様体」入門

play.google.com

※ 本記事を大幅に加筆した「Riemann幾何学ユーザーのための情報幾何学入門」を上記の書籍に掲載しています。

何の話かというと

Riemann幾何学の知識を前提に、「双対平坦な多様体」を自然な形で導入する説明方法ってないかなーと考えていて、思いついた説明のストーリーです。

Riemann幾何学の復習

Riemann幾何学では、接続 ∇ に対して、計量的(平行移動が内積を保存する)、かつ、捩率 T がゼロという次の条件が課せられます。

X g(Y,Z) = g(\nabla_XY,Z)+g(Y,\nabla_XZ) ―― (1)

T=\nabla_XY-\nabla_YX - [X,Y] = 0 ―― (2)

これらの条件を満たす接続は計量から一意に決まり、これが、Riemann接続と呼ばれるものでした。

これらの条件は、成分表示で次のようにも書けます。

\partial_kg_{ij}=\Gamma_{ki,j} + \Gamma_{kj,i} ―― (3)

T_{ij}^{\,\,\,k} = \Gamma_{ij}^{\,\,\,k} - \Gamma_{ji}^{\,\,\,k} = 0 ―― (4)

ここでさらに、曲率 R がゼロという条件を付け足すと、よく知られているように、この空間は平坦なユークリッド空間になります。すなわち、大域的に \Gamma_{ij}^{\,\,\,k}=0 となる局所座標系(アファイン座標系)が存在することになります。この事を実際に証明してみると、接続 ∇ が計量的であるという条件が大きな役割を果たすことがわかります。それでは、仮に、接続 ∇ が計量的であるという条件をはずしてみると、いったいどのような幾何学を展開することができるのでしょうか・・・。

双対接続の導入

接続 ∇ が計量的であるという条件をただはずすだけでは、あまりにも条件がゆるくなるので、ここで、ちょっとユニークな次の条件を考えてみます。

計量 g を持つ多様体 M に対して、二種類の接続 \nabla,\,\nabla^* が定義されており、次の2つの条件を満たすものとします。

X g(Y,Z) = g(\nabla_XY,Z)+g(Y,\nabla^*_XZ) ―― (5)

 T + T^* = 0 ―― (6)

(5) は、ある点の2つの接ベクトルについて、一方を \nabla で平行移動して、もう一方を \nabla^* で平行移動した際に、その内積が変化しないという条件を表します。これより、\overline\nabla = \frac{1}{2}(\nabla + \nabla^*) で新しい接続を定義すると、\overline\nabla について (1) が成り立つことが計算で確認できます。

また、捩率の成分表示 (4) を見ると \overline\nabla の捩率は \overline T = \frac{1}{2}(T + T^*) になることがわかります。つまり、(6) は、\overline\nabla の捩率がゼロであることを要請しており、結局は、\overline\nabla がRiemann接続であることになります。

このような条件を満たす接続の組 (\nabla,\,\nabla^*) を双対接続と呼ぶことにします。(厳密には、単に「双対接続」と言った場合は、(6)の条件は課せられません。ただし、本稿の主題となる「双対平坦な空間」では必ず (6) の条件が満たされます。)

双対平坦な空間

ここで、双対接続における、それぞれの接続についての曲率、および、捩率について考えると、次の面白い関係が証明されます。

[定理 1] \nabla に関する曲率 R がゼロであることと、\nabla^* に関する曲率 R^* がゼロであることは同値である。

(証明)
点 P で接ベクトル A と B を取って、これらを閉曲線にそって、A は\nabla に関する平行移動、B は\nabla^* に関する平行移動を行う。点 P に戻ってきた際の接ベクトルを A' および B' とすると、(5) の条件より次が成り立つ。

 g(A,B) = g(A',B')

したがって、R=0 とすると、A=A' より、任意の A について、g(A,B) = g(A,B')、すなわち、g(A,B-B') = 0 が成立する。計量の正定値性から、これは、B=B'、すなわち、R'=0 を意味する。(証明終わり)

これと同様に、(6) の条件から、 \nabla に関する捩率 T がゼロであることと、\nabla^* に関する捩率 T^* がゼロであることが同値になることもすぐにわかります。つまり、 \nabla が(R=0, T=0 という意味で)平坦ならば、 \nabla^* も(R^*=0, T^*=0 という意味で)平坦になるのです。このように、双対接続を持っており、さらに、両方の接続について平坦な空間を「双対平坦な空間」と呼ぶことにします。

双対平坦な空間では、それぞれの接続についてアファイン座標系、すなわち、大域的に \Gamma_{ij}^{\,\,\,k}=0 となる局所座標系が存在します。ただし、一方の接続に対するアファイン座標系は、他方の接続に対するアファイン座標系にはなりません。それぞれのアファイン座標系の間には、何か特別な関係があるのでしょうか・・・?

双対平坦な空間の構成方法

一般の双対平坦な空間を調べる前に、具体的な双対平坦な空間(双対接続)を作り出す「3分クッキング」の例を紹介します。

まずはじめに、内積も接続も持たない多様体 M を持ってきて、この上に、適当な座標系 \theta と、この座標系で見た時に、微分可能で凸関数になっている関数 \psi(\theta) を用意します。\psi(\theta) が凸関数であることから、ヘッセ行列は正定値になるので、これをこの空間の計量として導入します。

 g_{ij}(\theta) = \frac{\partial^2}{\partial \theta_i \partial \theta_j}\psi(\theta) ―― (7)

さらに、この座標系がアファイン座標系になるように、接続 \nabla を導入しておきます。

つづいて、双対座標の方を用意します。\psi(\theta) が凸関数であることから、次のルジャンドル変換によって、双対座標 {\eta} と双対凸関数 \varphi({\eta}) を定義することができます。

 \eta_i := \partial_i\psi({\theta}) ―― (8)

 \varphi({\eta}) := \max_{{\theta}'}\left\{\theta'^i\eta_i-\psi({\theta}')\right\} ―― (9)

以下の議論では、\theta{\eta} は (8) の関係で互いの関数になっていると理解します。

ちなみに、ルジャンドル変換の性質として、次の双対関係が成り立つことも証明されます。

 \theta^i = \partial^i\varphi({\eta})

 \psi({\theta}) = \max_{{\eta}'}\left\{\theta^i\eta'_i-\varphi({\eta}')\right\}

 \psi({\theta})+\varphi({\eta})=\theta^i\eta_i

(証明は下記を参照)
enakai00.hatenablog.com

そして、双対座標 \eta がアファイン座標系になるように、接続 \nabla^* を導入します。

そうすると、接続の組 (\nabla,\,\nabla^*) は、(5) の条件を満たす「双対接続」になることが証明されます。

[証明]
\theta 座標系では、\Gamma の成分はゼロになるので、(3) と同様の成分表示を考えて、(5) は次と同値になる。

 \partial_kg_{ij}=\Gamma^*_{kj,i} ―― (10)

一方、\eta 座標系では \Gamma^* の成分はゼロになることから、\Gamma^* の成分を \eta 座標系から \theta 座標系に変換する公式を書き下すと次になる。

 {\Gamma^*}_{ij}^{\,\,\,k} = \frac{\partial^2\eta_l}{\partial\theta^i\partial\theta^j}\frac{\partial \theta^k}{\partial \eta_l}

ここで g_{km} = \partial_k\partial_m\psi(\theta) = \frac{\partial\eta_m}{\partial\theta_k} を両辺にかけると

 (左辺)= {\Gamma^*}_{ij}^{\,\,\,k}g_{km} = {\Gamma^*}_{ij,m}

 (右辺)= \frac{\partial^2\eta_l}{\partial\theta^i\partial\theta^j}\frac{\partial \theta^k}{\partial \eta_l}\frac{\partial\eta_m}{\partial\theta_k}
=\frac{\partial^2\eta_l}{\partial\theta^i\partial\theta^j}\delta_m^l
=\frac{\partial^2\eta_m}{\partial\theta^i\partial\theta^j}
=\partial_i\partial_j\partial_m\psi(\theta)
=\partial_ig_{mj}

これで (10) が示された。(証明終わり)

ちなみに、この証明の中で使った関係式 g_{ij} = \frac{\partial\eta_i}{\partial\theta_j} は、g_{ij} が座標変換 \eta \rightarrow \theta のヤコビ行列になっていることを示しており、その逆行列は逆変換のヤコビ行列 g^{ij}= \frac{\partial\theta_i}{\partial\eta_j} で与えられることになります。これはちょうど、座標変換の公式と g_{ij}g^{ij} による足の上げ下げが一致することを示しています。

 \eta_i = g_{ij}\theta^j,\,\,\theta^i = g^{ij}\eta_j

同様に \partial_i\theta^i による偏微分、\partial^i\eta_i による偏微分とみなすことにすれば、偏微分演算子についても足の上げ下げが可能となります。

すると次の計算からわかるように、それぞれの座標系における基底ベクトル \{\partial_i\}\{\partial^i\} は互いに直行する座標系になっていることもわかります。

 g(\partial_i,\partial^j) = g(\partial_i,g^{jk}\partial_k) = g^{jk}g_{ik} = \delta^j_i ―― (11)

ここから、\partial_i\partial^i の内積は座標に依存しない定数ということになりますが、これは、双対接続の意味を考えると当然です。座標系 \theta は接続 \nabla に対するアファイン座標系ですので、定数成分の接ベクトル場 a^i\partial_i は接続 \nabla に関して並行なベクトルの集まりになります。同様に、定数成分の接ベクトル場 b_j\partial^j は接続 \nabla^* に関して並行です。したがって、これらの各点での内積はすべて同じ値になるはずで、それが g(a^i\partial_i, b_j\partial^j) = a^ib_i になるというわけです。

見方を変えると、この構成方法のポイントは、(7)(8) に集約されると言えます。これらから、g_{ij} = \frac{\partial\eta_i}{\partial\theta_j} という「計量=ヤコビ行列」という関係が生まれて、その結果、(11) のようにそれぞれの平行移動で正規直行性(すなわち計量)が保存されるような基底ベクトルが作られたというわけです。

以上から、任意の座標系 \theta と任意の凸関数 \psi(\theta) があれば、そこからルジャンドル変換を通して、自然な形で、双対平坦な空間とそれぞれの接続に対するアファイン座標系が構成できることがわかりました。凸関数の数だけ双対平坦な空間があるというわけです。

それでは逆に、任意の双対平坦な空間があった時、逆にそれを導くような凸関数を見つけることはできるのでしょうか・・・? 実はこれができてしまうのです。どどーーーん。

任意の双対平坦な空間に対応する凸関数がある事の証明

(7)(8)から(11)に至る道筋を逆にたどっていきます・・・。

任意の双対平坦な多様体 M があるとして、その計量と双対接続をまとめて (g,\nabla,\nabla^*) と表記します。

[補題 1] 双対平坦な多様体 M に対して、次を満たす \nabla アファイン座標系 \theta\nabla^* アファイン座標系 \eta を取ることができる。

 g(\partial_i,\partial^j) = g(\partial_i,g^{jk}\partial_k) = g^{jk}g_{ik} = \delta^j_i ―― (11)

ここで、\partial_i=\frac{\partial}{\partial \theta^i},\,\,\partial^i=\frac{\partial}{\partial \eta_i} とする。

(証明)
M が双対平坦であることから、何らかの \nabla アファイン座標系 x\nabla^* アファイン座標系 y が存在する。M 上の点 P を固定して、点 P における内積値を用いて、定数行列 G を次で定義する。

 G_{ij} = g\left(\left(\frac{\partial}{\partial x^i}\right)_P, \left(\frac{\partial}{\partial y^j}\right)_P\right)

ここで新しい座標系 \theta\eta を次で定義する。

 \theta^i = x^i,\,\,\eta_i=G_{ij}y^j

アファイン座標系の定数行列 G による一次変換は再びアファイン座標系になるので、\eta\nabla^* アファイン座標系である。これらが (11) の関係を満たすことを示す。

まず、点 P において考えると、次が自明に成り立つ。

 g\left(\left(\frac{\partial}{\partial \theta^i}\right)_P, \left(\frac{\partial}{\partial \eta_j}\right)_P\right)
= g\left(\left(\frac{\partial}{\partial x^i}\right)_P, \left(\sum_k (G^{-1})_{jk}\frac{\partial}{\partial y_k}\right)_P\right)
= G^{-1}_{jk}G_{ik} = \delta^j_i

一方、\frac{\partial}{\partial \theta^i}\frac{\partial}{\partial \eta_j} を定数係数 1 を持った定数成分の接ベクトル場と考えると、 \theta\eta がアファイン座標系であることから、これらは、それぞれ、\nabla\nabla^* に関して平行な接ベクトル場と言える。したがって、双対接続の定義よりすべての点で内積が同じになることから、すべての点で (11) が成り立つことが言える。(証明終わり)

[補題 2] 補題 1 を満たす座標系 \theta,\,\,\eta について、次が成り立つ。

 g_{ij} = g(\partial_i, \partial_j) = \frac{\partial\eta_i}{\partial\theta^j} ―― (12)

 g^{ij} = g(\partial^i, \partial^j) = \frac{\partial\theta^i}{\partial\eta_j} ―― (13)

(証明)
g(\partial_i, \partial_j)=g\left(\frac{\partial\eta_k}{\partial\theta_i}\partial^k, \partial_j\right)
= \frac{\partial\eta_k}{\partial\theta_i} \delta^k_j = \frac{\partial\eta_j}{\partial\theta_i}

g の対称性より、これは (12) に等しい。(13) も同様の計算になる。(証明終わり)

[補題 3] 補題 1 を満たす座標系 \theta,\,\,\eta について、2つの凸関数 \psi(\theta), \,\,\varphi(\eta) が存在して、次が成立する。

 \eta_i = \partial_i\psi(\theta),\,\,\theta^i = \partial^i\varphi(\eta)

 \psi(\theta) + \varphi(\eta) - \theta^i\eta_i = 0

(証明)
(12) において g の対称性より、\partial_j\eta_i = \partial_i\eta_j となるので、両辺を \theta_j で積分して

 \eta_i = \int^{\theta_j}\partial_i\eta_jd\theta_j + c=\partial_i\left( \int^{\theta_j}\eta_jd\theta_j + c\theta_i \right)c は積分の始点に依存する定数)

従って、\psi(\theta) = \int^{\theta_j}\eta_jd\theta_j + c\theta_i +CC は任意の定数)として、\eta_i = \partial_i\psi(\theta) が成り立つ。\theta^i = \partial^i\varphi(\eta) についても同様。

また、(12)(13) より、\psi(\theta), \,\,\varphi(\eta) のヘッセ行列は、計量の行列(およびその逆行列)に一致するので、正定値行列であり、これらは凸関数になっている。

さらに、次の計算から、関数 \psi(\theta) + \varphi(\eta) - \theta^i\eta_i の全微分は 0 になることがわかる。

 d\left(\psi(\theta) + \varphi(\eta) - \theta^i\eta_i\right) = (\partial_i\psi)d\theta^i + (\partial^i\varphi)d\eta_i -\eta_id\theta^i - \theta^id\eta_i = 0

従って、この関数は定数関数であり、\psi(\theta) が持つ任意定数 C を調整すれば、\psi(\theta) + \varphi(\eta) - \theta^i\eta_i = 0 にできる。(証明終わり)

補題 1 〜補題 3 により、任意の双対平坦な空間 M に対して、凸関数 \psi(\theta) によるルジャンドル変換で結びついた、双対アファイン座標系が構成できることがわかりました。

以上の議論を振り返ると、「双対的な意味で計量が保存される」ことと、「双対的な意味でのアファイン座標系(双対アファイン座標系)が存在」することから、「計量=ヤコビ行列」という計量に対する強い縛りが得られたことがわかります。これは、Riemann多様体において「計量の保存」と「アファイン座標系の存在」という条件から「計量=単位行列」(つまりユークリッド空間)という縛りが得られたことに対応すると考えられます。

Riemann多様体の場合、ユークリッド空間になってしまえばそれ以上の広がりはありませんが、双対平坦な空間の場合は、「計量=ヤコビ行列」において、計量の対称性からヤコビ行列の対称性という奇妙な可積分条件が生まれて、そこからポテンシャル関数 \psi(\theta) の存在とルジャンドル変換による座標系の繋がりが生み出されたことになります。

で・・・

ここから先は、ポテンシャル関数からダイバージェンスを導入して、拡張ピタゴラスの定理へと標準的にすすめばよいのかと。