ブログ

データ可視化のためのプラットフォームの基礎: jupyterlab

データの可視化は、データを様々な角度から確認し、データ自体を理解する目的で行われることが多い印象です。探索的データ分析(EDA)と呼ばれることもあります。このような背景から、データ可視化にあたっては、あらかじめ仕様を設定してソースコードを書いていくソフトウェア開発と比較して、柔軟なプラットフォームが求められます。このようなプラットフォームとして、Jupyterlabがよく使われていると思います。

ここでは、jupyterlabの環境構築の一例とjupyterlabの使い方の基礎をまとめます。

jupyterlab

jupyterlabは、pythonの他、Rやjuliaなど各種のプログラミング言語のインタラクティブな実行環境です。ソースコードと実行結果、また、ドキュメント(Markdownをサポート)を一つのnotebookという単位でまとめることが特徴です。

データ分析では、仮説に基づいてデータを色々な角度から確認することが多いですが(探索的データ分析)、その際にjupyterlabのインタラクティブな実行環境が役に立ちます。また、notebook単位で実験結果をまとめるなどすることで、実験の管理や関係者への情報共有に有効です。

jupyterlabについての詳細は、公式ドキュメントを参照してください。

https://jupyterlab.readthedocs.io/en/stable/

jupyterlabの導入

様々な形態

jupyterlabの実行形式として有名なものに下記のものがあります。

提供形態概要環境構築難易度
Jupyterlab各自の環境に実行環境を構築する。もっともメジャーでカスタマイズの自由もあるが、python環境の構築と管理など多少難易度が高い。
公式ドキュメントで環境構築手順が紹介されている。
jupyterlab-desktopjupyterlabのデスクトップアプリ。公式のGithubリポジトリでインストールイメージが提供されており、基本的には通常のアプリと同じ手順(インストールイメージのダブルクリック)でインストールが可能。○(インストーラのダブルクリック)
Google colab正確にはjupyterlabではないが、Googleが提供するWebサービス。jupyterlabとインターフェースが共通で、同じnotebookが実行可能。
環境構築の手間がなく、notebookの共有なども容易なので、初学者はまずこちらを利用するのが良い。(Google colabの利用で基本的な使い方としては十分と思われる。)
https://colab.research.google.com/?hl=ja
◎(環境構築不要)

インストール: jupyterlab

ここではjupyterlabをローカルに導入する手順について簡単に紹介します。詳細はインストール手順は公式ドキュメントに記載されているのでそちらを参照してください。

前提

python実行環境が構築されていることを前提とします。

ここでは、pipを利用したインストール手順のみを紹介します。Anacondaなどを使った導入手順は公式ドキュメントに記載されているので、そちらを参照ください。(基本的にはあまり変わりません)

インストール

下記の通りpipコマンドでインストールできます。

> pip install jupyterlab

他にも、Dockerが使える場合には、jupyterlabが提供するjupyter/datascience-notebookを利用するとインストールの手間がなく導入できます。

起動

ローカルな環境で利用する場合には、下記のコマンドでサーバが起動します。

> jupyter lab

正常に立ち上がると、自動でWebブラウザが開き、Jupyterlabのスタート画面が表示されます。

Webブラウザが自動で立ち上がらない場合には、下記のようなURLで接続できます(接続先のアドレス、ポート番号を変更した場合は変更した値を指定)。

http://localhost:8888

利用の環境によっては、Jupyterlabの接続ポートを指定したい場合などがあると思います。その時には、起動オプションで --port パラメータを設定します。

> jupyter lab --port 58888

上記のように起動することで、接続先ポートは58888になります。

jupyterlab基本操作

画面構成

左サイドバーには、現在いるフォルダのファイル構成が表示されています。フォルダをダブルクリックするとさらに下の階層に遷移出来ます。

中央にはランチャー(Launcher)が表示されています。notebookの作成などはランチャーから行います。

notebookの作成

ランチャーが表示されている状態で、「Notebook」>「Python3」をクリックするとPythonのnotebookが作成されます(下記)。

notebookは「セル」という単位を基本にしており、このセルにコードやドキュメントを記入していきます。実行はセル単位で行うので、ひとまとまりの処理を一つのセルに書いていくのが良いと思います。

コード実行

コードの実行は、上部メニューの「▷」ボタンを押すか、Ctrlキーを押しながらEnterキーを押すことで、セルに記載のコードが実行されます。

実行結果として、print文など標準出力への出力はセルの下部に表示されます。また、matplotlibなどでのplotもセルの下部に表示されます。

notebookはコードだけでなく、ドキュメントも記述可能です。上図のように、セル単位でMarkdownタイプのセルにすることで、ドキュメントを記述することが出来ます。

出力(共有)

notebookは、ipynbというファイル形式(拡張子)です。実態はテキストファイルです。

このファイル自体を他者と共有することも可能ですが、レポートとして利用したい場合などでは、HTML形式に変換してダウンロードすることも可能です。

まとめ

参考

プログラミング これだけは知っとけ!: 0からのPython入門

小学校でのプログラミング教育も始まり、ますます「プログラミング」という技術が万人に求められる状況になっています。
しかしながら、「プログラミング」という技術に興味はあるが、苦手意識があるという方も少なくないと思います。

この苦手意識は、「プログラミング」というと何らかのプログラミング言語を駆使してアプリを作るなどソフトウェア開発に関する技術にばかり目がいくことが原因ではないかと考えています。
我々は、ソフトウェア開発はプログラミングのごく一部であると考えており、「プログラミング」的な考え方が重要であると考えています。

そこで本稿では、プログラミング的な考え方から始めて、最低限知っておくべき技術をまとめます。具体的な技術の解説にはPythonを利用しますが、ここで述べる考え方は他のどの言語でも共通する考え方です。

プログラミング的考え方

目標達成のための考え方

ここでいう「プログラミング的な考え方」とは、次の5つの考え方です。

プログラミング的考え方何をするのか得られるもの
目標設定まずは全体で何を達成したいのかを定義します。入力は何で、出力として何を得たいのかを決めましょう。入出力を明確にすることで、「やりたいこと」が明確になります
タスク分解設定した目標を達成するために、何が必要なのかを細かく分解します。大きな目標も小さなタスクの集まりとして考えることで、目標を達成するための筋道が見えてきますね
共通部分の抽出分解したタスクの中で、共通したタスクをまとめます。共通した部分はまとめて実行したりできますね
タスクフローの設計目標を達成するためにタスクの流れ、組み合わせを考えます。タスクの流れを組み替えるだけで効率化できたりします
シミュレーション上記のフローに矛盾がないか、頭の中で考えたり、実際に小さい問題を例に試したりします。これで計画が実現可能なのか、目標が達成できる見込みがあるのかが確認できます

この表を見て分かる通り、決して「ソフトウェア開発」だけに必要な考え方ではありません。多くの仕事で自然にこのような考え方をしていると思います。

プログラミング的な考え方を意識するということは、タスクの抽象化ということに繋がります。このような考え方は、あらゆる仕事、また、生活の中でも普遍的に役立つ考え方です。

手段としての「プログラミング」

プログラミングというのは、あくまで手段であり、目標を達成するために何をするのかが重要です。

「オブジェクト思考」などソフトウェア開発に関する技術や考え方は色々ありますが、これらは、効率的にとか、他人との共有をしやすくするなどの理由があって作られています。

自分だけが一時的に目標達成のために動かすだけなら、愚直に書いても良いわけです。いわゆる「スパゲッティコード」だとしても良いわけです。

あくまでもプログラミングは手段であるということを認識しましょう。

「意識の低いプログラミング」

上述の通り、プログラミングはあくまでも手段であるため、その目的が満たされれば、「可読性が高い」など、いわゆる「綺麗なソースコード」を書くことに囚われる必要はありません。

まず始めるにあたっては、意識を低く、とにかく動けば良いというつもりで書いていくことが重要です。
(まず書いてみないことには何も始まらないので)

なお、綺麗なソースコードや機能的な書き方、一目でわかる変数名などは他人とのシェアや数ヶ月先の自分自身がメンテナンスするためには重要な考え方です。なので、プログラミング自体に慣れていった後では、「書き方」というものにも拘っていくべきではあると思います。

プログラムを書いてみる

この後は実際にプログラムを書いてみます。

「プログラミング的考え方」を「意識低く」実現していきます。

実行環境の用意

世の中には、ソフトウェアを開発するための開発環境がたくさんあります。それらは、効率的な開発を進めたり、複数人での共有を容易にするなど色々な理由があって存在します。

しかし、上記のようにプログラミング的な考え方を実践するだけであれば、凝った環境は必要ありません。目標達成のためにもっともシンプルな環境を使えば良いのです。

ここでは、ブラウザとGoogleアカウントさえあれば即座にプログラミングができる環境として、Google Colabratoryを利用します。

Google Colabの基本的な使い方

https://colab.research.google.com/?hl=ja

最低限知っておくべきプログラミング技術

上記の通り、プログラミングとは手段であると捉えると、以下で解説する4つの項目でかなり多くのことが達成できます。これらはどのプログラミング言語でも共通の普遍的な要素なので、必ず抑えておくようにしましょう。

変数

値を代入するブロック。

このブロックをつなげて管理するものが「リスト」または「配列」と呼ばれる。

演算

変数に格納される「値」を処理する機能。もっとも単純な演算は四則演算。

演算をまとめて関数とする。

条件分岐

変数の値に依存して別の処理を実行させる機能。

ループ

一連の処理を繰り返す。

プログラミング実例

この後に何を知るべきか

ここまでは、本当に最低限知っておくべき技術を解説してきました。ここに挙げた技術だけで多くのタスクをこなすソフトウェアを開発することは可能です。ここでは、さらに知っておくと良い考え方を解説します。

ライブラリの利用

「プログラミング的な考え方」では目標をを分解して小さな処理に分割して整理することだと初めに書きました。

この「処理」は似たタスクに共通して適用できる場合が多くあります(できるだけ共通な一般的な処理に細分化できることが望ましい)。さまざまなタスクに利用できる処理は、世界中のどこか別の人にも必要な場合があります。

すると、誰かがその処理をする機能をまとめた「ライブラリ」を提供していることが少なくありません。自分が欲しい機能は誰か別の人も欲しがっていると考えることが重要です。プログラムを書く前に、その処理をするライブラリが公開されてないかを探しましょう。

実際のプログラム開発では、できるだけ独自のコードを書かずに、公開されているライブラリを利用していくことが望ましいです。なぜなら、公開されているコードは多くの人の目に晒され、堅牢で汎用的な書かれ方をしていることが多いからです。つまり、バグが減るということです。

参考

正規分布の母平均の片側検定・両側検定における検出力関数(power function)の描画

数理統計学の検定論で出てくる検出力関数(power function)は一様最強力検定や一様最強力検定の理解にあたって重要な概念です。当記事では不偏検定の導入の際に用いられる正規分布の母平均の両側検定を行う際の検出力関数の描画を取り扱いました。
「数理統計学 統計的推論の基礎(共立出版)」の$10$章の「統計的仮説検定の考え方」の内容を主に参考に、作成を行いました。

・参考:有意水準$\alpha$と検出力$1-\beta$の値に基づくサンプルサイズ設計
https://www.hello-statisticians.com/explain-terms-cat/sample_size1.html

前提の確認

正規分布の確率密度関数

当記事では分散$1$の正規分布$\mathcal{N}(\mu,1)$に関して考察を行う。$\mathcal{N}(\mu,1)$の確率密度関数を$\phi(x; \mu)$とおくと、$\phi(x; \mu)$は下記のように表すことができる。
$$
\large
\begin{align}
\phi(x; \mu) = \frac{1}{\sqrt{2 \pi}} \exp{ \left[ -\frac{(x-\mu)^2}{2} \right] } \quad (1)
\end{align}
$$

また、上記の累積分布関数を$\Phi(x; \mu)$とおくと下記のように表せる。
$$
\large
\begin{align}
\Phi(x; \mu) = \int_{-\infty}^{x} \phi(u; \mu) du
\end{align}
$$

有意水準・検出力の定義と解釈

正規分布の母平均$\mu$に関する仮説検定を行うにあたって帰無仮説$H_0: \, \mu=\mu_0$、対立仮説$H_1: \, \mu=\mu_1$を定義する。このとき$\mu_0 < \mu_1$であれば下記のような図で仮説検定を表すことができる。

青が$\mathcal{N}(\mu_0,1)$、緑が$\mathcal{N}(\mu_1,1)$に対応すると仮定する

ここで上記の検定統計量$T(x)$に関して$T(x) \geq 1.96$を棄却域(rejection region)の$C$と定義する。このとき有意水準を$\alpha(C)$、検出力を$1-\beta(C)$とおくと、図の青色の領域と$\alpha(C)$、図の緑色の領域と$\beta(C)$がそれぞれ対応する。

また、前項で確認を行なった正規分布の確率密度関数を表す$(1)$式を元に有意水準$\alpha(C)$と検出力を$1-\beta(C)$はそれぞれ下記のような数式で表すことができる。
$$
\large
\begin{align}
\alpha(C) &= \int_{C} \phi(x; \mu_0) dx \\
1-\beta(C) &= \int_{C} \phi(x; \mu_1) dx
\end{align}
$$

数式の理解にあたっては$\phi(x; \mu_0)$が図の青色の曲線に対応し、$\phi(x; \mu_1)$が図の緑色の曲線に対応することに着目しておくと良い。

検出力と検出力関数

サンプルサイズ設計のような統計学の活用の際は検出力が主に用いられるが、数理統計学における検定論では検出力関数を元に考察を行うので抑えておくと良い。

検出力は対立仮説のパラメータの集合である$\Theta_1$を元に表されることが多い一方で、検出力関数は帰無仮説のパラメータの集合の$\Theta_0$の範囲を含む$\theta \in \Theta_0 \cup \Theta_1$で表すことが多いので注意が必要である。

$\theta \in \Theta_0 \cup \Theta_1$で表すのは片側検定の場合は$\theta \in \Theta_1$に対して一様最強力検定があるが、両側検定では不偏検定を用いるにあたって$\theta \in \Theta_0$の区間も合わせて図示を行う必要があるからではないかと推察される。

上記に基づいて正規分布における検出力関数$1-\beta(C,\mu)$を下記のように定義する。
$$
\large
\begin{align}
1-\beta(C,\mu) = \int_{C} \phi(x; \mu) dx
\end{align}
$$

片側検定の検出力関数

$$
\large
\begin{align}
H_0 &: \, \mu = 0 \\
H_1 &: \, \mu > 0
\end{align}
$$

上記のように定義を行なった両側検定の帰無仮説$H_0$と対立仮説$H_1$に対し、下記のような棄却域$C_1, C_2, C_3$を仮定する。
$$
\large
\begin{align}
C_1 &= \left\{ \bar{x}: \bar{x} > \frac{1.645}{\sqrt{n}} \right\} \\
C_2 &= \left\{ \bar{x}: \bar{x} > \frac{1.96}{\sqrt{n}} \right\} \\
C_3 &= \left\{ \bar{x}: \bar{x} > \frac{2.576}{\sqrt{n}} \right\}
\end{align}
$$

このとき棄却域$C_1, C_2$に対してそれぞれの検出力関数は母平均$\mu$に関して下記のように計算できる。
$$
\large
\begin{align}
1-\beta(C_1,\mu) &= \int_{C_1} f(x; \mu) dx \\
&= P(Z > 1.645 – \sqrt{n} \mu) \\
1-\beta(C_2,\mu) &= \int_{C_2} f(x; \mu) dx \\
&= P(Z > 1.96 – \sqrt{n} \mu) \\
1-\beta(C_3,\mu) &= \int_{C_3} f(x; \mu) dx \\
&= P(Z > 2.576 – \sqrt{n} \mu)
\end{align}
$$

上記は$\mu$の関数であるので、次節で$\mu$の値に対応する検出力$1-\beta(C_1), 1-\beta(C_2), 1-\beta(C_3)$のグラフの描画を行う。

両側検定の検出力関数

$$
\large
\begin{align}
H_0 &: \, \mu = 0 \\
H_1 &: \, \mu \neq 0
\end{align}
$$

上記のように定義を行なった両側検定の帰無仮説$H_0$と対立仮説$H_1$に対し、下記のような棄却域$C_1, C_2, C_3$を仮定する。
$$
\large
\begin{align}
C_1 &= \left\{ \bar{x}: \bar{x} > \frac{1.645}{\sqrt{n}} \right\} \\
C_2 &= \left\{ \bar{x}: \bar{x} < -\frac{1.645}{\sqrt{n}} \right\} \\
C_3 &= \left\{ \bar{x}: |\bar{x}| > \frac{1.96}{\sqrt{n}} \right\}
\end{align}
$$

このとき棄却域$C_1, C_2, C_3$に対してそれぞれの検出力関数は母平均$\mu$に関して下記のように計算できる。
$$
\large
\begin{align}
1-\beta(C_1,\mu) &= \int_{C_1} f(x; \mu) dx \\
&= P(Z > 1.645 – \sqrt{n} \mu) \\
1-\beta(C_2,\mu) &= \int_{C_2} f(x; \mu) dx \\
&= P(Z < -1.645 – \sqrt{n} \mu) \\
1-\beta(C_3,\mu) &= \int_{C_3} f(x; \mu) dx \\
&= P(Z > 1.96 – \sqrt{n} \mu) + P(Z < -1.96 – \sqrt{n} \mu)
\end{align}
$$

上記は$\mu$の関数であるので、次節で$\mu$の値に対応する検出力$1-\beta(C_1), 1-\beta(C_2), 1-\beta(C_3)$のグラフの描画を行う。

検出力関数の描画

片側検定

$$
\large
\begin{align}
1-\beta(C_1,\mu) &= P(Z > 1.645 – \sqrt{n} \mu) \\
1-\beta(C_2,\mu) &= P(Z > 1.96 – \sqrt{n} \mu) \\
1-\beta(C_3,\mu) &= P(Z > 2.576 – \sqrt{n} \mu)
\end{align}
$$

ここで$n=1$の場合を考えると下記が得られる。
$$
\large
\begin{align}
1-\beta(C_1,\mu) &= P(Z > 1.645 – \mu) \\
1-\beta(C_2,\mu) &= P(Z > 1.96 – \mu) \\
1-\beta(C_3,\mu) &= P(Z > 2.576 – \mu)
\end{align}
$$

上記に基づいて下記を実行することでグラフの描画を行うことができる。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

mu = np.arange(-5., 5.01, 0.01)

f_1 = 1. - stats.norm.cdf(1.645-mu)
f_2 = 1. - stats.norm.cdf(1.96-mu)
f_3 = 1. - stats.norm.cdf(2.576-mu)

plt.plot(mu, f_1, label="C_1")
plt.plot(mu, f_2, label="C_2")
plt.plot(mu, f_3, label="C_3")

plt.legend(loc="upper left")
plt.show()

・実行結果

ここで検出力関数は$C_1, C_2, C_3$の順に大きいが、$C_1, C_2, C_3$はそれぞれ$\alpha=0.05, 0.025, 0.005$に対応しており、それぞれの有意水準$\alpha$の値で一様最強力であることが確認できる。

また、片側検定では$\mu_0 < \mu_1$などを仮定することから、$\mu > \mu_0$と表すこともできる。一方で検出力関数の理解しやすさの観点から当記事では両側検定と同様な定義を用いた。

両側検定

$$
\large
\begin{align}
1-\beta(C_1,\mu) &= P(Z > 1.645 – \sqrt{n} \mu) \\
1-\beta(C_2,\mu) &= P(Z < -1.645 – \sqrt{n} \mu) \\
1-\beta(C_3,\mu) &= P(Z > 1.96 – \sqrt{n} \mu) + P(Z < -1.96 – \sqrt{n} \mu)
\end{align}
$$

ここで$n=1$の場合を考えると下記が得られる。
$$
\large
\begin{align}
1-\beta(C_1,\mu) &= P(Z > 1.645 – \mu) \\
1-\beta(C_2,\mu) &= P(Z < -1.645 – \mu) \\
1-\beta(C_3,\mu) &= P(Z > 1.96 – \mu) + P(Z < -1.96 – \mu)
\end{align}
$$

上記に基づいて下記を実行することでグラフの描画を行うことができる。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

mu = np.arange(-5., 5.01, 0.01)

f_1 = 1.-stats.norm.cdf(1.645-mu)
f_2 = stats.norm.cdf(-1.645-mu)
f_3 = 1. - stats.norm.cdf(1.96-mu) + stats.norm.cdf(-1.96-mu)

plt.plot(mu, f_1, label="C_1")
plt.plot(mu, f_2, label="C_2")
plt.plot(mu, f_3, label="C_3")

plt.legend()
plt.show()

・実行結果

上図は「数理統計学 統計的推論の基礎(共立出版)」の図$10.4$と同様の図であることが確認できる。グラフより棄却域$C_3$は一様最強力検定ではないが、全区間で$\alpha=0.05$を上回る検出力を持つ不偏検定に限れば一様最強力である。このような検定を一様最強力不偏検定という。

多次元テイラー展開・多次元ニュートン法と連立方程式の近似解の計算

一様最強力不偏検定で両側検定の両側の棄却域を計算のような連立方程式はそのまま解くことができないので、多次元ニュートン法が適用されます。当記事では多次元テイラー展開を用いた多次元ニュートン法の導出や、多次元ニュートン法を用いた連立方程式の近似解の計算について取り扱いました。

・$1$次元のニュートン法
https://www.hello-statisticians.com/optimization/newton_taylor1.html

テイラー展開

$1$変数関数のテイラー展開

関数$f(x)$に関して点$x=a$を中心とするテイラー展開は下記のように表せる。
$$
\large
\begin{align}
f(x) &= \sum_{n=0}^{\infty} \frac{f^{(n)}(a)}{n!} (x-a)^{n} \\
&= \frac{f(a)}{0!}(x-a)^{0} + \frac{f'(a)}{1!} (x-a)^{1} + \frac{f^{”}(a)}{2!} (x-a)^{2} + \cdots \\
&= f(a) + f'(a)(x-a) + \frac{f^{”}(a)}{2} (x-a)^{2} + \cdots
\end{align}
$$

多変数関数のテイラー展開

以下具体的に表記を行うにあたって$2$変数関数$f_1(x_1,x_2)$と$f_2(x_1,x_2)$を元にテイラー展開の式を確認する。$(x_1,x_2)=(a_1,a_2)$を中心とするテイラー展開の式は下記のように表せる。
$$
\large
\begin{align}
\left(\begin{array}{c} f_1(x_1,x_2) \\ f_2(x_1,x_2) \end{array} \right) &= \left(\begin{array}{c} f_1(a_1,a_2) \\ f_2(a_1,a_2) \end{array} \right) + \left(\begin{array}{cc} \displaystyle \frac{\partial f_1}{\partial x_1} & \displaystyle \frac{\partial f_1}{\partial x_2} \\ \displaystyle \frac{\partial f_2}{\partial x_1} & \displaystyle \frac{\partial f_2}{\partial x_2} \end{array} \right) \left(\begin{array}{c} x_1-a_1 \\ x_2-a_2 \end{array} \right) + \cdots \quad (1) \\
&= \left(\begin{array}{c} f_1(a_1,a_2) \\ f_2(a_1,a_2) \end{array} \right) + \left(\begin{array}{c} \displaystyle \frac{\partial f_1}{\partial x_1}(x_1-a_1) + \frac{\partial f_1}{\partial x_2}(x_2-a_2) \\ \displaystyle \frac{\partial f_2}{\partial x_1}(x_1-a_1) + \frac{\partial f_2}{\partial x_2}(x_2-a_2) \end{array} \right) + \cdots
\end{align}
$$

ここで偏微分が含まれる行列を下記のように定義する。
$$
\large
\begin{align}
J(x_1,x_2) = \left(\begin{array}{cc} \displaystyle \frac{\partial f_1}{\partial x_1} & \displaystyle \frac{\partial f_1}{\partial x_2} \\ \displaystyle \frac{\partial f_2}{\partial x_1} & \displaystyle \frac{\partial f_2}{\partial x_2} \end{array} \right)
\end{align}
$$

上記の行列をヤコビ行列という。ここでは$2$変数関数を取り扱ったが、多変数関数でも同様な式で表される。

多次元ニュートン法の導出

$1$変数関数のテイラー近似とニュートン法の導出

$$
\large
\begin{align}
f(x_{n+1}) \simeq f(x_n) + f'(x_n)(x_{n+1}-x_{n}) = 0 \quad (2)
\end{align}
$$

$1$変数関数のニュートン法は上記の式を$x_{n+1}$ついて解くことで下記のように得られる。
$$
\large
\begin{align}
x_{n+1} = x_{n} – \frac{f(x_{n})}{f'(x_{n})}
\end{align}
$$

詳しい式変形は下記で取り扱ったので省略を行なった。

多次元ニュートン法の導出

前項の$(2)$式では$x_{n+1}-x_{n}$について式を解くことで$\displaystyle x_{n+1} = x_{n} – \frac{f(x_{n})}{f'(x_{n})}$を得ることができた。前節の$(1)$式についても同様な式変形を下記のように行うことができる。
$$
\begin{align}
\left(\begin{array}{c} f_1(x_1^{(n+1)},x_2^{(n+1)}) \\ f_2(x_1^{(n+1)},x_2^{(n+1)}) \end{array} \right) \simeq \left(\begin{array}{c} f_1(x_1^{(n)},x_2^{(n)}) \\ f_2(x_1^{(n)},x_2^{(n)}) \end{array} \right) + & \left(\begin{array}{cc} \displaystyle \frac{\partial f_1}{\partial x_1} & \displaystyle \frac{\partial f_1}{\partial x_2} \\ \displaystyle \frac{\partial f_2}{\partial x_1} & \displaystyle \frac{\partial f_2}{\partial x_2} \end{array} \middle) \right|_{x_1=x_1^{(n)},x_2=x_2^{(n)}} \left(\begin{array}{c} x_1^{(n+1)}-x_1^{(n)} \\ x_2^{(n+1)}-x_2^{(n)} \end{array} \right) = \left(\begin{array}{c} 0 \\ 0 \end{array} \right) \\
\left(\begin{array}{c} f_1(x_1^{(n)},x_2^{(n)}) \\ f_2(x_1^{(n)},x_2^{(n)}) \end{array} \right) + J(x_1^{(n)},x_2^{(n)}) \left(\begin{array}{c} x_1^{(n+1)}-x_1^{(n)} \\ x_2^{(n+1)}-x_2^{(n)} \end{array} \right) &= \left(\begin{array}{c} 0 \\ 0 \end{array} \right) \\
\left(\begin{array}{c} x_1^{(n+1)} \\ x_2^{(n+1)} \end{array} \right) &= \left(\begin{array}{c} x_1^{(n)} \\ x_2^{(n)} \end{array} \right) – J(x_1^{(n)},x_2^{(n)})^{-1} \left(\begin{array}{c} f_1(x_1^{(n)},x_2^{(n)}) \\ f_2(x_1^{(n)},x_2^{(n)}) \end{array} \right) \quad (3)
\end{align}
$$

上記は$2$変数の場合を表したが、$3$変数以上の場合も同様に導出することができる。

連立方程式の解

$$
\large
\begin{align}
\left(\begin{array}{c} f_1(x_1,x_2) \\ f_2(x_1,x_2) \end{array} \right) = \left(\begin{array}{c} 0.9 – \exp(-x_1) + \exp(-x_2) \\ x_1\exp(-x_1) – x_2\exp(-x_2) \end{array} \right) = \left(\begin{array}{c} 0 \\ 0 \end{array} \right)
\end{align}
$$

上記に対し、ヤコビ行列$J(x_1,x_2)$は下記のように計算できる。
$$
\large
\begin{align}
J(x_1,x_2) &= \left(\begin{array}{cc} \displaystyle \frac{\partial f_1}{\partial x_1} & \displaystyle \frac{\partial f_1}{\partial x_2} \\ \displaystyle \frac{\partial f_2}{\partial x_1} & \displaystyle \frac{\partial f_2}{\partial x_2} \end{array} \right) \\
&= \left(\begin{array}{cc} \exp{(-x_1)} & -\exp{(-x_2)} \\ (1-x_1)\exp{(-x_1)} & -(1-x_2)\exp{(-x_2)} \end{array} \right)
\end{align}
$$

上記の連立方程式の解は$(3)$式を元に下記のように計算を行うことができる。

import numpy as np

def calc_f1(x_1, x_2):
    return 0.9 - np.exp(-x_1) + np.exp(-x_2)

def calc_f2(x_1, x_2):
    return x_1*np.exp(-x_1) - x_2*np.exp(-x_2)

x = np.array([[0.7],[1.5]])

for i in range(10):
    J = np.array([[np.exp(-x[0,0]), -np.exp(-x[1,0])], [(1.-x[0,0])*np.exp(-x[0,0]), -(1.-x[1,0])*np.exp(-x[1,0])]])
    x = x - np.linalg.solve(J, np.array([[calc_f1(x[0,0],x[1,0])], [calc_f2(x[0,0],x[1,0])]]))

print(x)

・実行結果

array([[ 0.08381479],
       [ 3.93214595]])

上記の結果が適切であることは、下記を実行することで確認することができる。

print(calc_f1(0.08381479, 3.93214595))
print(calc_f2(0.08381479, 3.93214595))

実行結果がほぼ$0$であるので、連立方程式の近似解の$x_1 \simeq 0.083, x_2 \simeq 3.932$が得られたと解釈できる。

【ゲーム×幾何分布】確率分布・期待値に基づくポケモンの連続技に関する考察

確率分布や期待値の計算例に用いるにあたって、ポケモンの連続技は適した題材であると思われましたので、具体的な期待値の計算や考察などを取りまとめました。ポケモンの連続技は主に幾何分布の観点から考えると理解しやすいので、幾何分布を中心に取り扱いを行いました。

・ゲーム × 統計 まとめ
https://www.hello-statisticians.com/game_stat

前提の確認

問題設定:ポケモンの連続技の仕様

ポケモンの連続技の仕様は大きく分けて下記の$2$つがあります。

・①命中判定後に命中回数の判定がある場合
・②1回ごとに命中判定がある場合

「ダブルアタック」や「すいりゅうれんだ」のように攻撃回数が固定であるものもありますが、確率的な取り扱いがシンプルなのでここでは省略しました。①は「おうふくビンタ」や「タネマシンガン」、②は「トリプルキック」や「トリプルアクセル」がそれぞれ該当します。

①は$2$〜$5$回命中の場合は$2$回と$3$回が$\displaystyle \frac{1}{3}$、$4$回と$5$回が$\displaystyle \frac{1}{6}$のように設定されます。

統計的な取り扱いを考えるにあたっては、①は表で確率分布を表せばよく、②は幾何分布を考えれば良いです。各技と関連する期待値に関しては次節で取り扱いを行います。

幾何分布の概要

下記で詳しく取り扱いました。

連続技と関連する期待値

おうふくビンタ・タネマシンガン etc

「おうふくビンタ」や「タネマシンガン」の命中回数を確率変数$X$で表すと、下記のような確率分布を持ちます。

$X$$2$$3$$4$$5$
$p(x)$$\displaystyle \frac{1}{3}$$\displaystyle \frac{1}{3}$$\displaystyle \frac{1}{6}$$\displaystyle \frac{1}{6}$

このとき技の当たる回数の期待値$E[X]$は下記のように計算することができます。
$$
\large
\begin{align}
E[X] &= 2 \cdot \frac{1}{3} + 3 \cdot \frac{1}{3} + 4 \cdot \frac{1}{6} + 5 \cdot \frac{1}{6} \\
&= \frac{2 \cdot 2 + 3 \cdot 2 + 4 + 5}{6} \\
&= \frac{19}{6} = 3.16 \cdots
\end{align}
$$

上記より、「おうふくビンタ」や「タネマシンガン」が命中する期待値は$3.16 \cdots$であると考えることができます。

また、連続技は技の威力をポケモンの特性と合わせて計算する必要があります。具体的には「$1$回あたりの威力が$1.5$倍になるテクニシャン」と「必ず$5$回当たるスキルリンク」のそれぞれの期待値を計算する場合などがあります。

技の威力を定数$c$とおくとき、それぞれの威力の期待値をテクニシャン$E[Y_t]$、スキルリンク$E[Y_s]$とおくと、それぞれ期待値は下記のように計算できます。
$$
\large
\begin{align}
E[Y_t] &= c \times \frac{19}{6} \times \frac{3}{2} \\
&= \frac{19c}{4} \\
E[Y_s] &= 5c = \frac{20c}{4}
\end{align}
$$

上記より、$\displaystyle E[Y_s]-E[Y_t] = \frac{c}{4}$なので、技$1$回あたりが$20$のときに技の威力の期待値が$5$変わることが計算できます。

トリプルキック・トリプルアクセル

「トリプルキック」や「トリプルアクセル」は$1$回ごとに命中判定がある技であり、表す確率変数の取り得る値に上限がある場合の幾何分布であると考えることができます。$1$回あたりの外れる確率を$p$、当たる回数の確率変数を$X$とおくと、確率関数$p(x)$は下記のように表すことができます。
$$
\large
\begin{align}
p(x) &= p(1-p)^{x}, \quad x=0,1,2 \\
p(3) &= 1 – \sum_{x=0}^{2} p(x)
\end{align}
$$

上記に「トリプルキック」や「トリプルアクセル」の$p=0.1, 1-p=0.9$を代入することで下記のような確率分布の表を得ることができます。

$X$$0$$1$$2$$3$
$p(x)$$0.1$$0.09$$0.081$$0.729$

上記より、$3$回当たる確率が$72.9$%であることが確認できます。また、「トリプルキック」や「トリプルアクセル」の威力は$1$回目が$20$、$2$回目が$40$、$3$回目が$60$であるので、技の威力の期待値を$E[Y]$とおくと、$E[Y]$は下記のように計算できます。
$$
\large
\begin{align}
E[Y] &= 20 \times 0.09 + (20+40) \times 0.081 + (20+40+60) \times 0.729 \\
&= 94.14
\end{align}
$$

ねずみざん

「ねずみざん」は「トリプルキック」や「トリプルアクセル」と同様に$1$回あたりに命中判定のある技ですが、上限が$10$回なので、取り扱いがやや難しくなります。

import numpy as np

p = 0.1

prob = np.zeros(10+1)
prob[0] = p

for i in range(9):
    prob[i+1] = prob[i]*(1-p)
prob[-1] = 1.-np.sum(prob[:-1])

for i in range(11):
    print("Prob {} Hit: {:.3}".format(i,prob[i]))

・実行結果

Prob 0 Hit: 0.1
Prob 1 Hit: 0.09
Prob 2 Hit: 0.081
Prob 3 Hit: 0.0729
Prob 4 Hit: 0.0656
Prob 5 Hit: 0.059
Prob 6 Hit: 0.0531
Prob 7 Hit: 0.0478
Prob 8 Hit: 0.043
Prob 9 Hit: 0.0387
Prob 10 Hit: 0.349

上記の結果を表にまとめると下記のように表すことができます。

$X$$0$$1$$2$$3$$4$$5$$6$$7$$8$$9$$10$
$p(x)$$0.1$ $0.09$$0.081$$0.0729$$0.0656$$0.059$$0.0531$$0.0478$$0.043$$0.0387$$0.349$

また、$1$回あたりの威力が$20$であるので技威力の期待値は下記のように計算できます。

power = 20
num_attack = np.arange(0,11,1)
print(np.sum(power * num_attack * prob))

・実行結果

117.2...

単調尤度比(monotone likelihood ratio)と指数型分布族

ネイマン・ピアソンの補題で定義される尤度比(likelihood ratio)が標本や統計量の単調増加関数で得られるとき、単調尤度比といいます。当記事では確率密度関数が指数型分布族で表される際に、どのような場合に尤度比が単調尤度比になるかについて確認を行います。
「数理統計学(共立出版)」のCh.$10$「統計的仮説検定の考え方」の内容などに基づいて作成を行いました。

・「数理統計学 統計的推論の基礎」 解答まとめ
https://www.hello-statisticians.com/answer_textbook_math_stat#green

前提知識の確認

指数型分布族の確率密度関数

確率変数$X$に対応する指数型分布族の確率密度関数を$f_{X}(x|\theta)$とおくと、$f_{X}(x|\theta)$は下記のように表される。
$$
\large
\begin{align}
f_{X}(x|\theta) &= \exp{[h_1(x)g_1(\theta) + g_2(\theta) + h_2(x)]} \quad (1) \\
&= h_0(x)\exp{[h_1(x)g_1(\theta) + g_2(\theta)]} \quad (2)
\end{align}
$$

指数型分布族の確率密度関数は主に上記の$(1), (2)$のどちらかで表されることが多いが、単に$h_0(x)=\exp(h_2(x))$で置き換えられるのでそれほど難しくはない。ここでは$f_{X}(x|\theta_0)$と$f_{X}(x|\theta_1)$の比を考えるので、以下約分しやすい$(2)$の表記を用いる。

帰無仮説と対立仮説

統計的仮説検定では母数の$\theta$について帰無仮説$H_0: \, \theta \in \Theta_{0}$が成立するか、対立仮説$H_1: \, \theta \in \Theta_{1}$が成立するかを観測値に基づいて検定を行う。

以下、取り扱いをシンプルにするにあたって帰無仮説を$H_0: \, \theta = \theta_0$、対立仮説を$H_1: \, \theta = \theta_1, \, \theta_0 < \theta_1$で表すと仮定する。

帰無仮説$H_0$、対立仮説$H_1$、有意水準$\alpha$、検出力$1-\beta$の直感的な理解に関しては下記でも取り扱ったので合わせて確認しておくと良い。

尤度比の定義

尤度比$L(x)$は$f_{X}(x|\theta_0)$と$f_{X}(x|\theta_1)$の比を元に下記のように定義される。
$$
\large
\begin{align}
L(x) = \frac{f_{X}(x|\theta_1)}{f_{X}(x|\theta_0)}
\end{align}
$$

ここで任意の$\theta_0 < \theta_1$について尤度比$L(x)$が統計量$T(x)$に関する単調増加関数であるとき、$L(x)$を統計量$T$の単調尤度比(monotone likelihood ratio)であるという。

単調尤度比と指数型分布族

指数型分布族における単調尤度比

$$
\large
\begin{align}
f_{X}(x|\theta) = h_0(x)\exp{[h_1(x)g_1(\theta) + g_2(\theta)]} \quad (2)
\end{align}
$$

前節で取り扱った指数型分布族の確率密度関数の$(2)$式は上記のように表される。このとき、「$g_1(\theta)$が$\theta$の単調増加関数であれば、尤度比$L(x)$が単調尤度比である」ことを以下に示す。

・導出
$L(x)$は下記のように表すことができる。
$$
\large
\begin{align}
L(x) &= \frac{f_{X}(x|\theta_1)}{f_{X}(x|\theta_0)} \\
&= \frac{\cancel{h_0(x)}\exp{[h_1(x)g_1(\theta_1) + g_2(\theta_1)]}}{\cancel{h_0(x)}\exp{[h_1(x)g_1(\theta_0) + g_2(\theta_0)]}} \\
&= \frac{\exp{(g_2(\theta_1))}}{\exp{(g_2(\theta_0))}} \exp{[h_1(x)(g_1(\theta_1)-g_1(\theta_0))]}
\end{align}
$$

上記に対し$h_1(x)=T(x)$を適用すると、$g_1(\theta)$が$\theta$の単調増加関数であることから「$g_1(\theta_1)-g_1(\theta_0) \geq 0$」が成立するので、$L(x)$は$T(x)$の単調増加関数となる。よって、$L(x)$は$T(x)=h_1(x)$の単調尤度比である。

正規分布の母平均

$X \sim \mathcal{N}(\mu,1)$であるとき、正規分布の母平均の検定にあたって、帰無仮説$H_0: \, \mu=\mu_0$、対立仮説$H_1: \, \mu=\mu_1, \, \mu_0 < \mu_1$を仮定する。ここで正規分布$\mathcal{N}(\mu,1)$の尤度関数$L(\mu)$は下記のように表せる。
$$
\large
\begin{align}
L(\mu) &= \frac{1}{\sqrt{2 \pi}} \exp{ \left[ -\frac{(x-\mu)^2}{2} \right] } \\
&= \frac{1}{\sqrt{2 \pi}} \exp{ \left[ -\frac{1}{2}(x^2 – 2 x \mu + \mu^2) \right] } \\
&= h_0(x) \exp{ \left[ x \mu – \frac{\mu^2}{2} \right] }
\end{align}
$$

このとき$g_1(\mu)=\mu$は単調増加であるので、$L(\mu)$は$T(x)=h_1(x)=x$について単調尤度比である。

グラフニューラルネットワーク(GNN; Graph Neural Network)入門

グラフニューラルネットワーク(GNN)が取り上げられることはそれほど多くはない一方で、Transformerを理解するにあたってはGNNを理解しておくことで直感的な理解が可能になります。当記事ではGNNの基本的な内容について把握できるように入門にあたって抑えておくべき事項をまとめました。

・Transformerの直感的理解
https://www.hello-statisticians.com/ml/deeplearning/transformer1.html

前提知識

Transformerとグラフニューラルネットワーク

下記で詳しく取り扱いました。当記事は下記の副読的な内容になるように取りまとめました。

Transformerグラフニューラルネットワークネットワーク分析」と大まかに解釈できるので、当記事ではグラフニューラルネットワークについて詳しく取り扱います。

集合と要素

グラフ理論では基本的に数ⅠAの「集合」で取り扱われる内容を元に立式されます。当項では「集合」の基本的な式表記の確認を行います。たとえばサイコロの出目の$1$〜$6$の集合を$X$とおくとき$X$は下記のように定義できます。
$$
\large
\begin{align}
X = \{ 1, 2, 3, 4, 5, 6 \}
\end{align}
$$

このとき$X$の要素を$x$とおくと、$x \in X$のように表すことができます。$x \in X$は$x$が$1$〜$6$の要素を取りうることを表しており、「$1 \in X$」〜「$6 \in X$」も同義です。

「集合」については下記でも詳しくまとめましたので合わせて参照ください。

グラフ理論の式定義

グラフ理論の基本要素であるノード、エッジ、隣接行列の概要は上記で取り扱いましたので省略します。基本的には「点と線で物事の関連性を表す」と認識できれば十分です。当項では以下、グラフ理論やグラフニューラルネットワークを取り扱う際に用いられる数式について確認を行います。

グラフをGraphの$G$、ノードの集合を頂点を表すVerticeやVertexの$V$、エッジの集合をEdgeの$E$で定義すると、下記のような等式で表すことができます。
$$
\large
\begin{align}
G = (V,E) \quad (1)
\end{align}
$$

上記の式は論文などのフォーマルな議論ではよく用いられますがグラフ理論を学んだことがないと抽象的で理解しにくいので、具体例に基づいて確認します。

グラフ理論:Wikipediaより $\quad$ 左がグラフ、右がグラフに対応する隣接行列

上図は「Transformerの解説」で用いたグラフの例ですが、上図を元に$(1)$式を具体的に確認します。図では$1$〜$6$のノードがあるので、ノードは$1$〜$6$の集合に対応します。よって、ノードの集合$V$は下記のように表されます。
$$
\large
\begin{align}
V = \{ 1, 2, 3, 4, 5, 6 \}
\end{align}
$$

また、グラフでは$1$と$2,5$、$2$と$1,3,5$、$3$と$2,4$、$4$と$3,5,6$、$5$と$1,2,4$、$6$と$4$がそれぞれ連結していることが確認できます。よって、エッジの集合$E$は下記のように表すことができます。
$$
\large
\begin{align}
E = \{ (1,2), (1,5), &(2,1), (2,3), (2,5), (3,2), (3,4), (4,3), (4,5), (4,6), \\
& (5,1), (5,2), (5,4), (6,4) \} \quad (2)
\end{align}
$$

上記では有向グラフの取り扱いに基づいて$(1,2)$と$(2,1)$を区別しましたが、無向グラフであることを前提に表記する場合は「左<右」を前提とできるので、下記のように表すことができます。
$$
\large
\begin{align}
E = { (1,2), (1,5), (2,3), (2,5), (3,4), (4,5), (4,6) } \quad (3)
\end{align}
$$

$(2)$と$(3)$を確認すると、$(3)$の要素のエッジの数は$7$個であり、$14$個である$(2)$のちょうど半分であることが確認できます。このことは「向きを考慮しない場合はエッジの数が半分になる」と解釈すれば良いです。

有向グラフを用いるか無向グラフを用いるかについては、グラフニューラルネットワークを取り扱う場合はそれぞれのノード単位で処理が行われるので、有向グラフを前提にすると考えやすいのではないかと思います。

グラフニューラルネットワークで必要な数式

前項ではグラフ理論におけるノード$V$とエッジ$E$の定義について確認を行いました。当項では前項の内容に加えてグラフニューラルネットワークで必要になる式定義を確認します。文字の選定は「A Comprehensive Survey on Graph Neural Networks」を参考に行いました。

ノードの特徴量

グラフニューラルネットワークではノードやエッジ単位に特徴量・隠れ層を割り当てます。ノード単位で計算を行うことが理解しやすいかつ多いので、当項では$n$個のノードに$d$次元の特徴量を割り当てる前提で式の確認を行います。
$$
\large
\begin{align}
X \in \mathbb{R}^{n \times d}
\end{align}
$$

上記の数式は一見難しいですが、「それぞれの要素が実数である$n$行$d$列の行列$X$を定義する」という意味合いであり、単に略記であると理解しておけば良いです。$n$個のノードへの$d$次元のベクトルの割り当ては、図で表すと下記のように表すことができます。

$n=5, d=5$でノードに特徴量を割り当てた場合

上図では$n=5, d=5$でノードに特徴量を割り当てた場合の図示を行いました。ここで各ノードに割り当てられたベクトルを$\vec{x}_{v}, \, v \in V$、グラフニューラルネットワークにおける$l$層目のグラフにおける隠れ層を$h_{v}^{l}$とおき、$h_{v}^{0} = \vec{x}_v$が成立すると仮定します。

このとき、$h_{v}^{0}$に対し、$L$層の処理を行うと$h_{v}^{L}$が得られますが、$h_{1}^{L}, \cdots , h_{n}^{L}$に基づきノードの分類やグラフの分類などを行うことができます。$h_{v}^{0}$から$h_{v}^{L}$を得る際の処理は次節で確認します。

ノードの集合・要素と$\displaystyle \sum$

$\displaystyle \sum$は$\displaystyle \sum_{i=1}^{n} x_1 = x_1 + \cdots + c_n$のような用いられ方をすることが多い一方で、集合や要素の表記に基づいて$\displaystyle \sum$が用いられることもあるので注意が必要です。

例えば上記のようなグラフに対し、$l$層におけるノード$1$に隣接するノードの隠れ層の和は下記のように表すことができます。
$$
\large
\begin{align}
\sum_{w \in N(1)} h_{w}^{l} = h_{2}^{l} + h_{3}^{l} + h_{4}^{l} + h_{5}^{l}
\end{align}
$$

このような式表記は一見難しく見えますが、グラフにおける特定のノードに隣接するノードの集合のようにインデックスが不規則になる場合の和の計算などの際に有用かつよく用いられるので、抑えておくと良いと思います。

ネットワーク分析

単語のベクトル表現に基づいてベクトル類似度を計算し、この値に基づいてグラフを描くことが可能です。この一連の流れは「ネットワーク分析」などのようにいわれますが、詳しくは下記で取り扱いました。

グラフニューラルネットワーク

MPNNフレームワーク

グラフニューラルネットワークの数式表記に関しては様々なものがありますが、MPNN(Message Passing Neural Network)の定義を元に考えると理解しやすいと思います。よって、当記事ではMPNN論文の数式を元にグラフニューラルネットワークの数式を定義し解釈を確認します。

グラフニューラルネットワークの基本式

$$
\large
\begin{align}
m_{v}^{l+1} &= \sum_{w \in N(v)} M_{l}(h_{v}^{l}, h_{w}^{l}, e_{vw}) \quad (4) \\
h_{v}^{l+1} &= U_{l}(h_{v}^{l}, m_{v}^{l+1}) \quad (5) \\
v & \in V
\end{align}
$$

上記の式はMPNN(Message Passing Neural Network)論文の$(1), (2)$式の$t$を$l$に置き換えて表しましたが、グラフニューラルネットワークの内部処理は上記を元に概ね理解することが可能です。

ここで$(4)$式の$M_{l}$は$l$層におけるノード間のMessage Passingの関数、$(5)$式の$U_{l}$は$l$層におけるノード内のUpdateの関数を表します。$M_{l}$、$U_{l}$をシンプルな表記で表す場合は下記のように表すことができます。
$$
\large
\begin{align}
m_{v}^{l+1} &= \sum_{w \in N(v)} c(e_{vw}) h_{w}^{l} \quad (6) \\
h_{v}^{l+1} &= \mathrm{sigmoid}((h_{v}^{l}+m_{v}^{l+1}) W_{v}^{l}) \quad (7) \\
W_{v}^{l} & \in \mathbb{R}^{d \times d}
\end{align}
$$

$(6)$式の$N(v)$はノード$v$に隣接するノードの集合、$c(e_{vw})$はエッジ$e_{vw}$の重みを計算する関数を表します。$d \times d$行列の$W_{v}^{l}$はニューラルネットワークの学習パラメータに対応します。

また、$(7)$式はMLP(Multi Layer Perceptron)の式に対応することも合わせて抑えておくと良いです。$L$層のグラフニューラルネットワークでは$(6), (7)$式のような処理を$L$回繰り返し、次項で確認するようなグラフニューラルネットワークのタスクを解くにあたって活用されます。

グラフニューラルネットワークのタスク設定

グラフニューラルネットワークを用いて解くタスクは主に「①ノード分類」と「②グラフ分類」の$2$つを抑えておくと良いです。「A Comprehensive Survey on Graph Neural Networks」の図がわかりやすいので簡単に確認します。

・ノード分類(Node Classification)

A Comprehensive Survey on Graph Neural Networks. Fig.$2a$

・グラフ分類(Graph Classification)

A Comprehensive Survey on Graph Neural Networks. Fig.$2b$

直感的にはたとえば「水泳教室に通う」際に、「生徒」を「ノード」、「スクールへの所属」を「エッジ」で表す場合、個々の生徒の上達を判定することを「ノード分類」、スクール全体の上達を判定することを「グラフ分類」と対応させて理解すると良いと思います。

また、「グラフ分類」を行うことができる場合、「スクール全体の上達」のようなグラフ全体の何らかの特徴量が抽出されたと解釈することもできます。グラフニューラルネットワークの一例であるTransformerではこのように抽出が行われた特徴量を活用して、様々なタスクを解くことが可能になります。

参考

・MPNN論文
・A Comprehensive Survey on Graph Neural Networks
・グラフ理論と機械学習(運営者作成)

3.5.3 母分散の比の区間推定 〜統計検定2級対応・統計学入門まとめ〜

当まとめでは統計検定$2$級の公式テキストの副教材に用いることができるように、統計学入門に関して取り扱います。当記事では「統計検定$2$級対応 統計学基礎」の$3.5.3$節「母分散の比の区間推定」の内容を$F$分布を用いた母分散の比の取り扱いについて取りまとめを行いました。
統計検定$2$級のテキストとの対応がわかりやすいように、目次を「統計検定$2$級対応 統計学基礎」と対応させました。学びやすさの観点からあえて目次を対応させましたが、当まとめは「統計の森」オリジナルのコンテンツであり、統計検定の公式とは一切関係ないことにご注意ください。

・統計検定$2$級対応・統計学入門まとめ
https://www.hello-statisticians.com/stat_basic

「母分散の比の区間推定」の概要

概要

散らばりの度合いを表す「分散」や「標準偏差」などの指標は常に正の値を取ることから差ではなく比を元に取り扱うのが適切です。当記事では以下$F$分布を元に、$2$つの母集団から得られる標本の母分散の比の区間推定に関して確認を行います。

発展事項

$F$検定に用いる$F$分布の確率密度関数の導出に関しては下記などで詳しく取り扱いました。

必要な数学

「区間推定」の結果の導出にあたっては不等号に関する計算がよく出てくるので、抑えておく必要があります。
$$
\large
\begin{align}
-1.96 \frac{\sigma}{\sqrt{n}} \leq \bar{x}-\mu \leq 1.96 \frac{\sigma}{\sqrt{n}}
\end{align}
$$

上記のような数式を$\mu$に関して解く必要があるので、特に$-x<-y$が$x>y$に対応することは必須です。

母分散の比の区間推定

検定統計量の導出

F分布

$$
\large
\begin{align}
X & \sim \chi^2(m) \\
Y & \sim \chi^2(n)
\end{align}
$$

上記のように$X$と$Y$がそれぞれ自由度$m$と$n$の$\chi^2$分布に従う場合を仮定します。このとき、下記のように$F$を考えることができます。
$$
\large
\begin{align}
F = \frac{X/m}{Y/n} \sim F(m,n)
\end{align}
$$

上記の$F(m,n)$は自由度$(m,m)$の$F$分布(F-distribution)を表します。

母分散の推定・検定

母分散の推定・検定にあたっては、下記のように定める統計量$\chi^2$を用います。
$$
\large
\begin{align}
\chi^2 &= \frac{(n-1)\hat{\sigma}^2}{\sigma^2} \sim \chi^2(n-1) \\
\hat{\sigma}^2 &= \frac{1}{n-1} \sum_{i=1}^{n} (X_i-\overline{X})^2
\end{align}
$$

上記の$\hat{\sigma}^2$は不偏標本分散に対応します。

F統計量

母分散$\sigma_x^2$と$\sigma_y^2$の$2$つの母集団に関して、それぞれ$m$個と$n$個の標本の不偏標本分散$\hat{\sigma}_x^2$と$\hat{\sigma}_y^2$を仮定します。このとき下記が成立します。
$$
\large
\begin{align}
\frac{(m-1)\hat{\sigma}_x^{2}}{\sigma_x^{2}} & \sim \chi^{2}(m-1) \\
\frac{(n-1)\hat{\sigma}_y^{2}}{\sigma_y^{2}} & \sim \chi^{2}(n-1)
\end{align}
$$

上記と「$F$分布」の内容を元に、$2$つの母集団の母分散の比の統計量$F$を下記のように定義することができます。
$$
\large
\begin{align}
F &= \frac{\frac{(m-1)\hat{\sigma}_x^{2}}{\sigma_x^{2} (m-1)}}{\frac{(n-1)\hat{\sigma}_y^{2}}{\sigma_y^{2} (n-1)}} \\
&= \frac{\hat{\sigma}_x^{2}}{\sigma_x^{2}} \cdot \frac{\sigma_y^{2}}{\hat{\sigma}_y^{2}} \sim F(m-1,n-1)
\end{align}
$$

母分散の比の区間推定

前項の内容に基づいて母分散の比$\displaystyle \frac{\sigma_x^{2}}{\sigma_y^{2}}$の$95$%区間は下記のように表すことができます。
$$
\large
\begin{align}
F_{\alpha=0.975}(m-1,n-1) \leq & F \leq F_{\alpha=0.025}(m-1,n-1) \\
\frac{1}{F_{\alpha=0.025}(n-1,m-1)} \leq & \frac{\hat{\sigma}_x^{2}}{\sigma_x^{2}} \cdot \frac{\sigma_y^{2}}{\hat{\sigma}_y^{2}} \leq F_{\alpha=0.025}(m-1,n-1) \\
\frac{1}{F_{\alpha=0.025}(m-1,n-1)} \frac{\hat{\sigma}_x^{2}}{\hat{\sigma}_y^{2}} \leq & \frac{\sigma_x^{2}}{\sigma_y^{2}} \leq F_{\alpha=0.025}(n-1,m-1) \frac{\hat{\sigma}_x^{2}}{\hat{\sigma}_y^{2}}
\end{align}
$$

ここで$16$個の標本に基づいて$\hat{\sigma}_x^2=6$、$11$個の標本に基づいて$\hat{\sigma}_y^2=3$が観測される場合、母分散の比$\displaystyle \frac{\sigma_x^{2}}{\sigma_y^{2}}$の$95$%区間は下記のように計算できます。
$$
\large
\begin{align}
\frac{1}{F_{\alpha=0.025}(m-1,n-1)} \frac{\hat{\sigma}_x^{2}}{\hat{\sigma}_y^{2}} \leq & \frac{\sigma_x^{2}}{\sigma_y^{2}} \leq F_{\alpha=0.025}(n-1,m-1) \frac{\hat{\sigma}_x^{2}}{\hat{\sigma}_y^{2}} \\
\frac{2}{2.845} \leq & \frac{\sigma_x^{2}}{\sigma_y^{2}} \leq 2.544 \times 2 \\
0.703 \leq & \frac{\sigma_x^{2}}{\sigma_y^{2}} \leq 5.088
\end{align}
$$

「統計検定$2$級対応 統計学基礎」では$\displaystyle \frac{\sigma_x^{2}}{\sigma_y^{2}}$ではなく$\displaystyle \frac{\sigma_y^{2}}{\sigma_x^{2}}$が用いられるが、上記の不等号の両辺の逆数を元に不等号を入れ替えると結果が一致します。

統計学を学ぶにあたって最低限抑えておきたい数学 〜ベクトルの基本と内積〜

当記事では「統計学を学ぶにあたって最低限抑えておきたい数学」の中から「ベクトルの基本と内積」に関して取り扱います。ベクトルは複数の数字を同時に取り扱う考え方で、多次元の変数を取り扱う際などに必須になるので抑えておくと良いです。
取りまとめにあたっては数学の解説に関してはなるべくシンプルに取り扱いますが、統計学への応用に関連した複雑な内容に関しては目次に「*」をつけました。「*」がついているものはやや難しいので、読み飛ばしても問題ありません。

・基本数学まとめ
https://www.hello-statisticians.com/math_basic

ベクトルの基本

ベクトルの概要

ベクトルは「大きさ」と「向き」の$2$つで表される概念です。たとえば強風の注意報が出る場合はどの方角か以上に「秒速$x$m/s」が重要である一方で、夏や冬の雨量や積雪量の予報にあたっては「季節風がどの方角から吹くか」が「秒速$x$m/s」と同様に重要になります。

風速の例と同様に、単に「大きさ」を知れば良い場合と、「向き」も含めて重要な場合が色々とあります。このような場合に「大きさ」と「向き」を同時に取り扱う概念が「ベクトル」です。

ベクトルの式表記

ベクトルの式表記にあたっては数ⅡBでは$\vec{x}$のように表されることが多いです。一方、線形代数などではボールド体を用いて$\mathbf{x}$のように表される場合が多いですが、線形代数的な式変形がメインでない場合は$\vec{x}$を用いるで良いと思います。

ベクトルは「向き」と「大きさ」を取り扱う量であるので、$\vec{x}$の大きさを表す表記があると使いやすいです。このような際には$|\vec{x}|$のように表されることが多いです。

ベクトルの成分表示

前項のようにベクトルは$\vec{x}$のように定義されますが、ベクトルを$x$-$y$平面上の成分で表示することで様々な応用に用いることができます。具体的には下記のようにベクトルの成分表示を行うことができます。

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1., 2.])
loc = np.zeros(2)

plt.quiver(loc[0], loc[1], x[0], x[1], color="green", angles="xy", scale_units ="xy", scale=1)
plt.grid()

plt.xlim(-1, 2)
plt.ylim(-1, 3)
plt.show()

・実行結果

上記は$\vec{x}=(1, 2)$に対応します。上記は$x$-$y$平面上の成分に対応しますが、$x$-$y$-$z$空間上の成分に対応させて$3$次元で描画を行うことも可能です。また、ベクトルの成分表記は$\vec{x}=(1, 2)$のように横に書かずに下記のように縦に表記することもできます。
$$
\large
\begin{align}
\vec{x} &= \left(\begin{array}{c} 1 \\ 2 \end{array} \right) \\
\vec{y} &= \left(\begin{array}{c} 1 \\ 2 \\ 3 \\ 4 \\ 5 \end{array} \right)
\end{align}
$$

ベクトルの加減

当項ではベクトルの加減について取り扱います。
$$
\large
\begin{align}
\vec{x} &= \left(\begin{array}{c} 2 \\ 1 \\ 2 \end{array} \right) \\
\vec{y} &= \left(\begin{array}{c} 1 \\ 2 \\ 3 \end{array} \right)
\end{align}
$$

上記のように定めた$\vec{x}, \vec{y}$に関して下記のように計算を行うことができます。
$$
\large
\begin{align}
\vec{x}+\vec{y} &= \left(\begin{array}{c} 2 \\ 1 \\ 2 \end{array} \right) + \left(\begin{array}{c} 1 \\ 2 \\ 3 \end{array} \right) = \left(\begin{array}{c} 3 \\ 3 \\ 5 \end{array} \right) \\
\vec{x}-\vec{y} &= \left(\begin{array}{c} 2 \\ 1 \\ 2 \end{array} \right) – \left(\begin{array}{c} 1 \\ 2 \\ 3 \end{array} \right) = \left(\begin{array}{c} 1 \\ -1 \\ -1 \end{array} \right)
\end{align}
$$

「ベクトルの成分表示」にあたっては横表記、縦表記のどちらも用いることができますが、上記のような演算を行う際には縦表記を用いると計算が見やすいです。

ベクトルのスカラー積

当項ではベクトルのスカラー積について取り扱います。ベクトルの積には主にスカラー積、内積、外積がありますが、スカラー積は当項で、内積は次節で取り扱います。外積は当記事では省略します。
$$
\large
\begin{align}
\vec{x} &= \left(\begin{array}{c} 1 \\ 2 \\ 3 \end{array} \right)
\end{align}
$$

上記のように定義した$\vec{x}$に関して下記のようにスカラー積の計算を行うことができます。
$$
\large
\begin{align}
2\vec{x} &= 2 \left(\begin{array}{c} 1 \\ 2 \\ 3 \end{array} \right) \\
&= \left(\begin{array}{c} 2 \\ 4 \\ 6 \end{array} \right)
\end{align}
$$

内積

内積の概要

前節ではベクトルとスカラーの積について取り扱いましたが、当項ではベクトルとベクトルの積について取り扱います。ベクトルとベクトルの積を考えるにあたっては主に内積と外積がありますが、以下、内積について取り扱います。

ベクトル$\vec{x}, \vec{y}$の内積$\vec{x} \cdot \vec{y}$は$2$つのベクトルのなす角$\theta$を用いて下記のように定義します。
$$
\large
\begin{align}
\vec{x} \cdot \vec{y} = |\vec{x}| |\vec{y}| \cos{\theta}
\end{align}
$$

次に以下のように$\vec{x}, \vec{y}$が成分表示ができると仮定します。
$$
\large
\begin{align}
\vec{x} &= \left(\begin{array}{c} x_1 \\ x_2 \end{array} \right) \\
\vec{y} &= \left(\begin{array}{c} y_1 \\ y_2 \end{array} \right)
\end{align}
$$

このとき内積は下記のように表すことができます。
$$
\large
\begin{align}
\vec{x} \cdot \vec{y} &= \left(\begin{array}{c} x_1 \\ x_2 \end{array} \right) \cdot \left(\begin{array}{c} y_1 \\ y_2 \end{array} \right) \\
&= x_1 y_1 + x_2 y_2
\end{align}
$$

ベクトルの類似度と内積

「ベクトルが同じ向きを向くか」を判断する際の指標に$2$つのベクトルのなす角の$\cos{\theta}$を用いることができます。内積の定義の式を$\cos{\theta}$に関して解くと下記が得られます。
$$
\large
\begin{align}
\vec{x} \cdot \vec{y} &= |\vec{x}| |\vec{y}| \cos{\theta} \\
\cos{\theta} &= \frac{\vec{x} \cdot \vec{y}}{|\vec{x}| |\vec{y}|}
\end{align}
$$

上記を元に$\vec{x}$と$\vec{y}$の類似度を計算することができます。近年DeepLearningの領域でよく用いられるTransformerのDot Product Attentionは内積を元に処理を行うなど、内積の応用例は多いので、式定義は抑えておくと良いと思います。

ネットワーク分析から直感的に理解するTransformerの仕組みと処理の流れ

昨今のDeepLearningの研究を席巻するTransformerの解説は複雑なものが多く、なかなか直感的に理解するのは難しいです。そこで当記事では「グラフ理論」や「ネットワーク分析」の知見を元に直感的にTransformerを理解できるように取りまとめを行いました。

概要

Transformerの解説などには難しいものが多いですが、基本的には下記に基づいて直感的に理解することができます。

① Transformerはネットワーク分析に類似する
② Transformerはグラフニューラルネットワークの一種である
③ グラフニューラルネットワークはRNNの拡張である

上記はどれも表立って解説されることが少ないので、解説コンテンツなどで取り扱われるケースは稀です。当記事では以下、必要な知識を前提知識で取り扱ったのちにTransformerの仕組みについて詳しく確認を行います。

前提知識

Word2vecに基づく単語のベクトル表記

単語をおよそ$100$〜$1,000$次元のベクトルに変換する手法の総称をWord$2$vecといいます。狭義にはWord$2$vecが$2013$年の研究を指す場合もありますが、単に「Word to Vector」の概念を表すと考えることもできるので当記事では総称と定めました。

Word$2$vecの大まかな理解にあたっては、「概念をベクトルで表す」ことが理解できれば良いです。たとえば新商品の紹介をする際に「レトルトカレー」であれば、「食品、保存食、温めが必要、辛い、肉入り」などに基づいて$0$or$1$の質的変数を作成することが可能です。

上記のように考えることで、「新商品のレトルトカレー」を属性を表す変数に基づくベクトルである程度表すことが可能になります。Word$2$vecは単語をベクトル化する手順ですが、レトルトカレーと同様にベクトル化を行うと大まかに理解しておけば当記事の理解にあたっては一旦十分です。

具体的な例があるとわかりやすいので、「本屋に行った。統計の教科書を買った。」を元に以下、Word$2$vecを適用する際の大まかな処理について確認します。

「本屋に行った。統計の教科書を買った。」という文を単語に分解し、動詞を基本形に直し助詞を除外すると「本屋、行く、統計、教科書、買う」のような単語の列が得られます。このような単語の列は数列を拡張して系列と表され、系列モデリングなどのようにいわれることも多いです。

ここでそれぞれの単語の意味に着目することで、単語を下記のようなベクトルの表記で表すことができます。

Word$2$vecを用いて単語をベクトルで表す際にベクトルの要素に具体的な意味を対応させるわけではありませんが、このように解釈することが可能であることは抑えておくと良いです。Word$2$vecの詳細に関しては「深層学習による自然言語処理」の$3$章の解説がわかりやすいのでここでは省略します。

グラフ理論と隣接行列

グラフ理論は点と線で物事を表す理論です。たとえば駅の路線図では下記のように駅を点、路線を線で表します。

東京メトロホームページより

上記の路線図では「駅と駅が隣接するかどうか」を中心に取り扱う一方で、それぞれの位置や方角などは厳密に再現はされません。このように、「隣接するかどうか」のみに着目して物事を表す際の理論を「グラフ理論」といいます。

グラフ理論では点をノード(node)、線をエッジ(edge)、全体をグラフ(graph)と定義します。数式で表すと$G = (V,E)$のように表しますが、$V$が頂点のVertice、$E$がEdge、$G$がGraphであるとそれぞれ解釈すると良いです。

グラフの表記法に関しては主に$2$通りあり、「①図を用いる」と「②隣接行列を用いる」をそれぞれ抑えておくと良いです。例があるとわかりやすいので下記のWikipediaの例を元に確認します。

グラフ理論:Wikipediaより $\quad$ 左がグラフ、右がグラフに対応する隣接行列

上記の例ではノードをそれぞれ行列の行と列に対応させ、$2$つのノードが連結する場合は$1$、連結しない場合は$0$をそれぞれの要素に持ちます。たとえば$1$と$2$が連結するので$1$行$2$列と$2$行$1$列が$1$であることが確認できます。

このようにグラフ理論ではノードとエッジを用いて概念を表す理論であり、グラフの表記法には「①図を用いる」と「②隣接行列を用いる」の$2$通りあることを大まかに理解しておけば当記事の範囲では十分です。

ネットワーク分析

グラフ理論の教科書などでは、特定の定義されたグラフについて取り扱うことが多いですが、言語の取り扱いを考える際は前々項で取り扱ったWord$2$vecのように何らかの手法に基づいて各単語にベクトルを割り当て、その類似度に基づいてグラフを作成することがよく行われます。

単語の類似度などに基づいてグラフを作成することを従来的には「ネットワーク分析」といいますが、この際によく用いられるのがcos類似度です。
$$
\large
\begin{align}
\cos{\theta} &= \frac{\vec{x} \cdot \vec{y}}{|\vec{x}||\vec{y}|} \\
-1 \leq & \cos{\theta} \leq 1
\end{align}
$$

$2$つのベクトル$\vec{x}, \vec{y}$のなす角を$\theta$とおくとき、内積$\vec{x} \cdot \vec{y}$を用いることで$\cos{\theta}$は上記のように計算することができます。内積の計算の詳細については当記事では省略しますので詳しくは下記をご確認ください。

ここで$\cos{\theta}$は$2$つのベクトル$\vec{x}, \vec{y}$が同じ向きを向くかどうかの指標であると考えることができるので、ベクトルで表された単語の類似度を考えるにあたってcos類似度を用いるのは自然な考え方です。

上図で表した表はWord$2$vecの概要を確認するにあたって用いましたが、それぞれ「統計と教科書」、「本屋と教科書」が類似したベクトルであることが確認できます。それぞれのcos類似度は下記のように計算できます。
・統計と教科書
$$
\large
\begin{align}
\vec{x} &= \left(\begin{array}{c} 0 \\ 1 \\ 0 \\ 1 \\ 0 \end{array} \right), \, \vec{y} = \left(\begin{array}{c} 0 \\ 1 \\ 1 \\ 1 \\ 0 \end{array} \right) \\
\cos{\theta} &= \frac{\vec{x} \cdot \vec{y}}{|\vec{x}||\vec{y}|} \\
&= \frac{2}{\sqrt{2} \times \sqrt{3}} = 0.816 \cdots
\end{align}
$$

・本屋と教科書
$$
\large
\begin{align}
\vec{x} &= \left(\begin{array}{c} 1 \\ 1 \\ 1 \\ 0 \\ 0 \end{array} \right), \, \vec{y} = \left(\begin{array}{c} 0 \\ 1 \\ 1 \\ 1 \\ 0 \end{array} \right) \\
\cos{\theta} &= \frac{\vec{x} \cdot \vec{y}}{|\vec{x}||\vec{y}|} \\
&= \frac{2}{\sqrt{3} \times \sqrt{3}} = 0.666 \cdots
\end{align}
$$

「ネットワーク分析」ではcos類似度などを用いて計算を行なった結果を元に閾値を設定することでエッジを描くかを判断します。上記の例では閾値を$0.55$に設定し、単語をノードで表し、類似する単語をエッジでつなげることで下記のようなグラフを描くことができます。

上記では閾値を$0.55$に設定したのでこのようなグラフとなったことに注意が必要です。たとえば閾値を$0.5$に変更すると、「行くと買う」のcos類似度が$0.5$であるので下記のようなグラフが得られます。

Transformerではネットワーク分析と同様の考え方を用いることは次節で確認します。DeepLearning以前のネットワーク分析では単語の共起に基づくBag of Wordsなどが用いられましたが、TransformerではWord$2$vecが用いられるので当項ではWord$2$vecを元に確認を行いました。

数列・系列・言語モデル

「数列」を数以外の記号などを取り扱えるように拡張したものを「系列」といいます。「系列」はよく出てくるので、数列と対応させて理解しておくと良いと思います。言語モデルは当記事では省略しますが、「深層学習による自然言語処理」の$3$章が詳しいのでこちらなど参照ください。

DeepLearningとMLP

DeepLearningにおけるMLPは多層パーセプトロン(Multi Layer Perceptron)を意味しますが、グラフニューラルネットワークの一種であるTransformerではMLPの計算が途中で用いられます。MLPの解説などは「ゼロから作るDeepLearning」など、わかりやすいものが多いので、当記事では省略します。

LSTMの限界とAttention

LSTMはRNNを改良したニューラルネットワークであり、長い系列に対応できるとされますが、$20$〜$50$系列ほどが上限であり、それ以上の取り扱いが難しいです。そこで横に展開するRNNの層の重み付け和を取るAttentionという構造が考案されました。

Attention論文 Fig.$1$

上記のようにAttentionではRNNの計算の際にそれぞれの層の重み付け和を計算し、この値を元に推論などを行います。このような計算を行うことで、「伝言ゲーム」のように伝達が難しいRNNの構造を改善させることが可能です。

Attentionの論文ではRNNに導入する形式でAttentionが用いられますが、TransformerではRNN構造を用いずに全体の処理を構築することからTransformerの論文のタイトルが「Attention Is All You Need」であることは有名な話です。

入門書ではRNNとLSTMが分けて解説されることもありますが、論文などではLSTMもrecurrent(再帰的)な構造であることからLSTMを含めてRNNと表されることが多いので注意が必要です。Attentionの基本事項は「深層学習による自然言語処理」の$4$章が詳しいので下記を参照ください。

グラフニューラルネットワークの基本式

Transformerの理解にあたってはグラフニューラルネットワークの数式を抑えておくと良いです。以下、理解しやすさの観点からMPNN(Message Passing Neural Network)の数式を主に参考に作成を行いました。
$$
\large
\begin{align}
m_{v}^{t+1} &= \sum_{w \in N(v)} M_{t}(h_{v}^{t}, h_{w}^{t}, e_{vw}) \\
h_{v}^{t+1} &= U_{t}(h_{v}^{t}, m_{v}^{t+1})
\end{align}
$$

上記の式はMPNN(Message Passing Neural Network)論文の$(1), (2)$式をそのまま表しました。上記の理解にあたっては下記の点に注意すると良いです。

① ノード$v$の隠れ層$h_{v}^{t}$について取り扱う式である。隠れ層はそれぞれのノードにWord$2$vecのように数十〜数百の要素を持つベクトルが割り当てられたと考えれば良い。
② ノード$v$の隣接ノードの集合を$N(v)$と表し、$w \in N(v)$であるので隣接するノードは個々の$w$で表される。$\displaystyle \sum_{w \in N(v)}$の表記は$N(v)$の全ての要素に関する$M_{t}(h_{v}^{t}, h_{w}^{t}, e_{vw})$の和を取るという意味である。
③ $m_{v}^{t+1}$は隣接するノードの隠れ層のベクトルを元に計算する式を表す。たとえば駅間で乗客が移動するようにイメージすれば良い。この処理をMessage Passingと呼称するが、Attention処理における重み付け和の計算はこの処理の一例と解釈できる。
④ $2$式目の$U_t$はMessage Passing処理で集約したMessageを元にノード$v$の隠れ層をUpdateする関数を定義したものである。Transformerで用いられるMLP(Multi Layer Perceptron)処理はこの一例である。
⑤ $t$や$t+1$はニューラルネットワークのレイヤーに対応する。よって$l, l+1$を用いて表すこともあり得る。
⑥ $n$層のグラフニューラルネットワークを取り扱う際は$h_{v}^{t+n}$を全てのノードに関して計算し、「ノード単位の分類」や「グラフ全体の分類」などの処理を行う。
⑦ Transformerではグラフ全体の$h_{v}^{t+n}$を用いてその後の処理を実行する。オリジナルのTransformerでは翻訳タスクに用いられたが、BERTなどのように様々な応用事例がある。

MPNNフレームワークに基づくグラフニューラルネットワークの詳細や具体例に基づく式の解釈に関しては下記でまとめましたので、詳しくは下記をご確認ください。

Transformerの仕組み

Self-Attention

前節で確認したAttentionは非常に有力な処理モジュールである一方で、Attentionの処理における重みパラメータをどのように作成するかの手順を用意する必要があります。パラメータを外部から与える場合もあり得ますが、処理が複雑化し汎用的なモジュールになりにくいです。

上記に対し内部処理にAttentionの重みパラメータを計算するモジュールを用意するとシンプルに計算を行うことができます。このように通常の内部計算と同時にAttentionの重みパラメータを計算する仕組みをSelf-Attentionといいます。

Dot Product Attention

Self-Attentionの構造を実現させるにあたっては様々な計算方法がありますが、シンプルな手法の$1$つにDot Product Attentionがあります。ここでDot Product Attentionの「Dot Product」は内積を意味することは抑えておくと良いです。

Transformer論文 Fig.$2$の左

上図はTransformer論文における「Dot Product Attention」の処理を表しますが、QとKのmatmulの所で内積の計算を行い、その結果に基づいてVへのAttentionを計算すると解釈することができます。この処理は「ネットワーク分析」のグラフ作成と同様に理解することができます。

「ネットワーク分析」では単語のcos類似度の計算を行いグラフ化を行いましたが、cos類似度の計算は内積をそれぞれのベクトルの大きさで割ることで計算できるので、Dot Product Attentionの処理は概ねcos類似度の計算と同様な処理であると解釈できます。

RNN・Dot Product Attentionのグラフ理論に基づく解釈

RNNが直列的に表される処理である一方で、Dot Product Attentionは単語類似度に基づくグラフを元に表される処理であると解釈できます。

左はRNN、右はDot Product Attentionに基づく。左は一方向、右は双方向であることに注意

上図の例では単語が少ないのでどちらもそれほど大差ないように見えますが、右のように意味に基づくグラフを生成した上でRNNと同様にMLP処理を行う場合は、系列が$50$以上の場合も構造的に無理のない処理を行うことができます。

Multi Head Attention

Multi Head Attentionの解釈は一見難しいですが、基本的にはこれまでの処理を「並列で複数行う」と同義なので「アンサンブル学習」を行なったと解釈すれば良いです。Transformerにおけるグラフの構築は入力値に基づいて行われるので、並行処理で様々な結果が得られる可能性があります。

したがって、Multi Headを用いることで「ランダムフォレスト」のような「アンサンブル学習」と同様に計算のロバスト化を行うことができると解釈すると良いのではないかと思います。

Multi Head AttentionではたとえばWord$2$Vecの$512$次元を$8$分割し、それぞれ$64$次元ずつを元にDot Product Attentionの処理を行うようにイメージすれば良いです。

ランダムフォレストでは個々の学習器の学習の際に表型のデータから列と行をランダムに抜き出すことで相関の低い決定木を作成しますが、Multi Head AttentionではWord$2$Vecのベクトルを分割することでそれぞれ相関の低い計算結果を構築することができます。

また、この分割や再連結はTransformer論文ので下記のような数式で表されるパラメータ処理を行うことが一般的です。
$$
\large
\begin{align}
\mathrm{MultiHead}(Q,K,V) &= \mathrm{Concat}(\mathrm{head}_{1}, \cdots , \mathrm{head}_{h}) W^{O} \\
\mathrm{head}_{i} &= \mathrm{Attention}(QW_{i}^{Q}, KW_{i}^{K}, VW_{i}^{V}) \\
W_{i}^{Q} & \in \mathbb{R}^{d_{model} \times d_{k}}, \, W_{i}^{K} \in \mathbb{R}^{d_{model} \times d_{k}}, W_{i}^{V} \in \mathbb{R}^{d_{model} \times d_{v}}
\end{align}
$$

式は難しく見えますが、基本的には相関の低い結果を元にアンサンブル学習を行うランダムフォレストと同様に解釈しておければ十分だと思います。

グラフニューラルネットワークとTransformer

Transformerはグラフニューラルネットワークの一種と見なすと理解しやすいです。グラフニューラルネットワークではグラフが与えられた際に隣接するノードの持つ隠れ層の和などを計算することによってグラフに沿って伝達を行い、それぞれの隠れ層に関してMLP処理を行います。

RNNはグラフニューラルネットワークの一種であり、Recurrent(再帰)処理は一方向かつ一直線のグラフであると解釈することができます。

図の左のようなグラフに沿ってRNNの計算処理が行われるのと同様に、グラフニューラルネットワークでは上図の右のようにグラフが与えられ、それぞれ隣接するノードに基づいて和などの計算を行います。

基本的にグラフニューラルネットワークでは「①グラフに基づくノード間の伝達処理」と「②ノード毎のMLP処理」で構成されます。

Transformer論文 Fig.$1$を改変

Transformerは上記の赤枠のようにMulti-Head AttentionとFeed Forwardで構成されており、Multi-Head Attentionを構成するDot Product Attentionがネットワーク分析と同様にグラフを構築しグラフに基づいて相互に伝達を行う処理、Feed ForwardがMLP(Multi Layer Perceptron)処理であると解釈することができます。このように考えることでTransformerは単語類似度を元に構築されるグラフを用いたグラフニューラルネットワークであると解釈できます。

Transformerにおける学習パラメータは一見わかりにくいですが、Multi-Head AttentionではなくFeed Forward部分で行われることも注意して確認しておくと良いです。

グラフニューラルネットワークの定義は論文によって様々ではありますが、MPNN(Message Passing Neural Network)NLNN(Non Local Neural Network)の論文などを元に理解するとわかりやすいのではないかと思います。

グラフニューラルネットワークとRNN

RNNはグラフニューラルネットワークの一種と考えることもできますが、グラフニューラルネットワークは近年のトピックであることからグラフニューラルネットワークはRNNの拡張であると見なすこともできます。

グラフを用いて参照構造を表す試みによって、多くのDeepLearningの構造が抽象化可能であるのでグラフニューラルネットワークの概要は抑えておくと良いと思います。

また、単に外からグラフを与えるだけでなくTransformerのように内部処理でグラフを作成することで、グラフを用意する必要がないというのはなかなか強力です。

Transformerの構造に関する主要研究

Reformer

MLP-Mixer

まとめ

当記事の内容は下図のようにまとめることができます。

TransformerとMPNN型GNNの各層における処理の概要

Transformerの各層では主に「①グラフの構築」、「②ノード間処理」、「③ノード内のUpdate」の$3$つの処理が行われており、①は「ネットワーク分析」、②と③は「MPNN型のグラフニューラルネットワーク」の処理に対応すると解釈すると理解しやすいです。

参考

・Transformer論文
・Word$2$vec論文①
・Word$2$vec論文②
・Attention論文
・MPNN論文
・NLNN論文
・Reformer論文
・MLP-Mixer論文

・直感的に理解するTransformer(運営者作成)
・グラフ理論と機械学習(運営者作成)
・Pythonで理解する言語処理(運営者作成)