機械学習
数学
ベクトル
微分

機械学習関連でよく見かけるベクトルや行列による微分の間違いをまとめてみた


目的

記事の吊し上げはしませんが、「ベクトルで微分」などの数学的に誤った記述をQiitaでも見かける(特に機械学習関連)ので、その間違いをまとめます。


大前提

数学において、ベクトルや行列で何かを微分することはできません。


定義

この記事で扱う知識を簡単にまとめますが、「知ってるよ」って方は読み飛ばしてください。


スカラー

方向を持たず大きさだけで表される量

例えば、$1, 2, 3$ などの単なる数字や、$x, x^{2}, x^{3}, \phi (x)$ などの関数でも方向を持たないものがあります。


ベクトル

大きさと方向を持つ量

言い換えると、

スカラーに単位ベクトルをかけたもの

graph.jpg

単位ベクトルとは、上図の $\boldsymbol{i} = \left( 1, 0, 0 \right), \ \boldsymbol{j} = \left( 0, 1, 0 \right), \ \boldsymbol{k} = \left( 0, 0, 1 \right)$ のことです。

これらを用いると、ベクトルの $\boldsymbol{r}$ ( $x, y, z$ 成分がそれぞれ $a, b, c$ )は次のように表すことができます。

\boldsymbol{r} = \left( a, b, c \right) = a \boldsymbol{i} + b \boldsymbol{j} + c \boldsymbol{k}

お分かりの方も多いと思いますが、念のため補足しておくと、ベクトルは通常 $\boldsymbol{r}$ のように太字で表します。


行列

正直、行列を一言で説明するのは難しいのですが、強いて簡潔にまとめる(数学的な正確さは考慮しない)とすると、

ベクトルの複合形

と言えるかもしれません。

例えば、次の $M \times N$ 行列を考えてみましょう。

\boldsymbol{A} =

\left(
\begin{array}{@{\,}cccc@{\,}}
a_{11} & a_{12} & \ldots & a_{1N} \\
a_{21} & a_{22} & \ldots & a_{2N} \\
\vdots & \vdots & \ddots & \vdots \\
a_{M1} & a_{M2} & \ldots & a_{MN}
\end{array}
\right)

$\left(i = 1, 2, \cdots, M\right)$ 、$\left(j = 1, 2, \cdots, N\right)$ とすると、行列の各成分は $a_{ij}$ で表すことができます。

特に、$M \times 1$ 行列 $\boldsymbol{A}$ のことを、

\boldsymbol{A} =

\left(
\begin{array}{@{\,}c}
a_{11} \\
a_{21} \\
\vdots \\
a_{M1}
\end{array}
\right)

と書き、$M$ 次元列ベクトルと呼びます。また、$1 \times N$ 行列のことを $N$ 次元行ベクトルと呼び、$\left( a_{11}, a_{12}, \cdots, a_{1N} \right)$ のように書くことができます。


微分

この記事のテーマには微分も含まれるので、「微分できるとはどういうことなのか」、「そもそも微分とは何か」を説明しておきます。ただし、数学的に厳密な記述は避け、例を出しながら説明していきます。


平均速度

ある物体(質点)の $x$ 方向への1次元(直線)運動を考えてみましょう。この物体が、時刻 $t$ から時刻 $t + \Delta t$ まで運動するときの平均速度 $\bar{\boldsymbol{v}}$ は次のように表すことができます。

\bar{\boldsymbol{v}} = \frac{\boldsymbol{x} \left( t + \Delta t \right) - \boldsymbol{x} \left( t \right)}{\Delta t}

平均速度の名の通り、運動した時間 $\Delta t$ で、その間に移動した距離 $\Delta \boldsymbol{x} \ \left( \equiv \boldsymbol{x}(t+\Delta t) - \boldsymbol{x} (t) \right)$ を割ったものです。したがって、$\bar{\boldsymbol{v}} = \Delta \boldsymbol{x} / \Delta t$ とも書くことができます。


瞬間速度

平均速度は、運動全体でどれくらいの速度だったかを表したものであり、時々刻々と速度が変化するマラソンランナーの時刻ごと(例えば1秒おき)のその瞬間的な速度を表してはいません。

つまり、瞬間的な速度を表すには、先ほどの時刻平均の取り方を超短時間にすればいいのです。これを数学的に書くと、

\boldsymbol{v} \left( t \right) = \lim_{\Delta t \to 0} \frac{\Delta \boldsymbol{x}}{\Delta t}

であり、以下では、次のように書くことにします。

\frac{d \boldsymbol{x} \left( t \right)}{dt} \equiv

\lim_{\Delta t \to 0} \frac{\Delta \boldsymbol{x}}{\Delta t}

これがまさに、微分の定義(導関数)であり、次式が導かれます。

\frac{d \boldsymbol{x} \left( t \right)}{dt} =

\lim_{\Delta t \to 0} \frac{\boldsymbol{x} \left( t + \Delta t \right) - \boldsymbol{x} \left( t \right)}{\Delta t}

$dx/dt$ はグラフの曲線の接線にあたり、勾配(gradient)とも呼ばれます。


ベクトルによる微分の間違い


間違いその1: スカラーのベクトル微分

まずは、よく見かける例を示します。

\frac{d \phi \left( x_{1}, x_{2}, \cdots, x_{N} \right)}{d \boldsymbol{x}}

= \left(
\frac{\partial \phi}{\partial x_{1}},
\frac{\partial \phi}{\partial x_{2}},
\cdots,
\frac{\partial \phi}{\partial x_{N}}
\right)

そもそもベクトルが分母にある時点で、気持ち悪いと思うべきです。微分でなくとも、ベクトルが分母に現れることは決してないのです。

ベクトルは大きさと向きを持つ量と上で説明しました。つまり、ベクトルで何かを割る(ベクトルが分母にある)ということは、大きさと向きでその何かを割るということです。考えてみてください。向きで何かを割ることはできますか?

少し話が逸れましたが、上式の左辺 $\to$ 右辺が正しくないので、その逆で右辺から左辺を導いてみましょう。ここでは、簡単のため用いるベクトルは3次元に限定します。

\boldsymbol{x} = x \boldsymbol{i} + y \boldsymbol{j} + z \boldsymbol{k}

= x \left( 1, 0, 0 \right)
+ y \left( 0, 1, 0 \right)
+ z \left( 0, 0, 1 \right)

これを用いると、

\begin{split}

\left(
\frac{\partial \phi}{\partial x},
\frac{\partial \phi}{\partial y},
\frac{\partial \phi}{\partial z}
\right)
&=
\frac{\partial \phi}{\partial x} \boldsymbol{i} +
\frac{\partial \phi}{\partial y} \boldsymbol{j} +
\frac{\partial \phi}{\partial z} \boldsymbol{k} \\
&=
\left(
\frac{\partial}{\partial x} \boldsymbol{i} +
\frac{\partial}{\partial y} \boldsymbol{j} +
\frac{\partial}{\partial z} \boldsymbol{k}
\right)
\phi \\
&\equiv
\boldsymbol{\nabla} \phi
\end{split}

となります。これこそがナブラ $\nabla$ の定義であり、$\nabla \phi$ は関数 $\phi$ の勾配として $\text{grad} \ \phi$ とも書かれます。

では、間違いの数式に戻ってもう一度だけ、左辺 $\to$ 右辺を考えてみましょう。

\begin{split}

\frac{d \phi \left( x, y, z \right)}{d \boldsymbol{x}}
&=
\frac{\partial}{\partial \left( x \boldsymbol{i} + y \boldsymbol{j} + z \boldsymbol{k} \right)} \phi \\
&=
\frac{\partial}{\partial x \boldsymbol{i} + \partial y \boldsymbol{j} + \partial z \boldsymbol{k}} \phi
\end{split}

仮に、ベクトルが分母に書けたとしても、これは計算不可能です。間違った例では、これを $dx, dy, dz$ で分配しているようですが、それも間違いです。


間違いその2: ベクトルのベクトル微分

これも、まずは間違いの例を示します。

\frac{d \boldsymbol{A} \left( x, y, z \right)}{d \boldsymbol{x}}

=
\left(
\begin{array}{}
\frac{\partial A_{1}}{\partial x} &
\frac{\partial A_{2}}{\partial x} &
\frac{\partial A_{3}}{\partial x} \\
\frac{\partial A_{1}}{\partial y} &
\frac{\partial A_{2}}{\partial y} &
\frac{\partial A_{3}}{\partial y} \\
\frac{\partial A_{1}}{\partial z} &
\frac{\partial A_{2}}{\partial z} &
\frac{\partial A_{3}}{\partial z} \\
\end{array}
\right)

ただし、その1で用いた単位ベクトルを使って、$\boldsymbol{A} = A_{1} \boldsymbol{i} + A_{2} \boldsymbol{j} + A_{3} \boldsymbol{k}$ とします。

では、スカラーの場合と同様に右辺 $\to$ 左辺を導いてみましょう。

\begin{split}

\left(
\begin{array}{}
\frac{\partial A_{1}}{\partial x} &
\frac{\partial A_{2}}{\partial x} &
\frac{\partial A_{3}}{\partial x} \\
\frac{\partial A_{1}}{\partial y} &
\frac{\partial A_{2}}{\partial y} &
\frac{\partial A_{3}}{\partial y} \\
\frac{\partial A_{1}}{\partial z} &
\frac{\partial A_{2}}{\partial z} &
\frac{\partial A_{3}}{\partial z} \\
\end{array}
\right)
&=
\left(
\begin{array}{}
\frac{\partial}{\partial x} \\
\frac{\partial}{\partial y} \\
\frac{\partial}{\partial z}
\end{array}
\right)
\cdot
\left(
A_{1},
A_{2},
A_{3}
\right) \\
&=
\boldsymbol{\nabla}^{T} \cdot \boldsymbol{A}
\end{split}

やはり、元の式とは違う結果が出てきました。

式の掛け算時に現れている ($\cdot$) は、ベクトル演算で内積を表すものです。この説明をすると、本題から逸れてしまうので、ここでは単にベクトル同士の掛け算だと認識してください。

それでは、導かれた式 $\boldsymbol{\nabla} \cdot \boldsymbol{A}$ を説明しましょう。

$\boldsymbol{\nabla} \cdot \boldsymbol{A}$ は発散(divergence)と呼ばれ、ベクトル $\boldsymbol{A} \left( \boldsymbol{x} \right)$ の各点におけるベクトル流れの傾向(どのように発散しているか)を表します。

そのため、$\boldsymbol{\nabla} \cdot \boldsymbol{A}$ の計算結果は、ベクトルではなくスカラーになります。ある点の情報を知りたいとき、例えば $\left( x, y, z \right) = \left( 5, 10, 7 \right)$ を入れれば、その点における流れの量が一意に導かれるようになっているのです。

しかし、右辺 $\to$ 左辺で導かれた結果は、$\boldsymbol{\nabla}^{T} \cdot \boldsymbol{A}$ となっています。

これは、物理的意味を持たない量であることに注意してください。

また、元の間違った式において、テンソルを使って計算しようという試みも見受けられますが、どうやらテンソルを分かっていらっしゃらないように感じます。

先ほども述べましたが、ベクトルが分母に現れた時点でそれはベクトルではなく、この世に存在しない数学です。ベクトルとは1階のテンソルのことを言います。つまり、ベクトルで微分のようなこの世にない計算に添字を用いるとき、それはテンソル演算ではなく単に添字を無理矢理つけただけということです。


間違いその3: 行列による微分

省略します。

機会があれば、更新します。


まとめ

まずは、曖昧な知識ではなく正確な知識を身につけましょう。

間違った数学を用いると、必ず解けない計算が出てきます。

たまたま計算ができてしまった(間違った計算法なので本当はできていない)時のアルゴリズムで別の計算をしたとき、バグが出てしまうかもしれません。

正しく動くシステムを作るためにも、正確な計算を行いましょう。

そして、提言としましては、「機械学習に用いられるアルゴリズムの数式が物理的意味を持たないものであって良いのでしょうか。」ということです。

現在の素粒子物理学は、群論と呼ばれる数学でまとめあげることで、対称性の美しさから多くの宇宙の性質が導かれました。

人の行動やその他諸々の統計を扱う際には、きっともっと美しい数学が隠れているのではないでしょうか。