ブログ

行列式と置換⑥:置換(permutation)と行列式(determinant)

線形代数の枠組みで$n$次正方行列の行列式(determinant)を取り扱うにあたっては置換(permutation)という概念を抑えておく必要があります。当記事では置換(permutation)と行列式(determinant)について取りまとめを行いました。
作成にあたっては「チャート式シリーズ 大学教養 線形代数」の第$4$章「行列式」を主に参考にしました。

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

置換と行列式

互換の符号

互換$\sigma=(i \quad j)$の符号は常に$\mathrm{sgn}(\sigma)=-1$であり、全ての互換は奇置換である。

置換を用いた行列式の定義

$n$次正方行列$A=(a_{ij})$の行列式$\det{(A)}$は$1, \cdots , n$の$n$個の文字の置換$\sigma$を用いて下記のように定義される。
$$
\large
\begin{align}
\det{(A)} = \sum_{\sigma} \mathrm{sgn}(\sigma) a_{1 \sigma(1)} a_{2 \sigma(2)} \cdots a_{n \sigma(n)}
\end{align}
$$

上記を元に、$2$次正方行列$\displaystyle A = \left( \begin{array}{cc} a_{11} & a_{12} \\ a_{21} & a_{22} \end{array} \right)$の行列式$\det{(A)}$は、置換$\sigma$が$\displaystyle \sigma_{1} = \left[ \begin{array}{cc} 1 & 2 \\ 1 & 2 \end{array} \right]$と$\displaystyle \sigma_{2} = \left[ \begin{array}{cc} 1 & 2 \\ 2 & 1 \end{array} \right]$の$2$種類取り得ることから下記のような式で計算することができる。
$$
\large
\begin{align}
\det{(A)} &= \sum_{\sigma} \mathrm{sgn}(\sigma) a_{1 \sigma(1)} a_{2 \sigma(2)} \\
&= \mathrm{sgn}(\sigma_{1}) a_{1 \sigma_{1}(1)} a_{2 \sigma_{1}(2)} + \mathrm{sgn}(\sigma_{2}) a_{1 \sigma_{2}(1)} a_{2 \sigma_{2}(2)} \\
&= a_{11} a_{22} \, – \, a_{12} a_{21}
\end{align}
$$

上記の式変形の理解にあたっては$\sigma_{1}$は単位置換であるから$\mathrm{sgn}(\sigma_{1})=1$、$\sigma_{2}$は互換であるから$\mathrm{sgn}(\sigma_{2})=-1$であることを注意しておくと良い。

例題の確認

以下、「チャート式シリーズ 大学教養 線形代数」の例題の確認を行う。

基本例題$058$

・$[1]$
$$
\large
\begin{align}
A = \left( \begin{array}{cc} 1 & 2 \\ 3 & 4 \end{array} \right)
\end{align}
$$

$\det{(A)}$は下記のように計算できる。
$$
\large
\begin{align}
\det{(A)} &= \left| \begin{array}{cc} 1 & 2 \\ 3 & 4 \end{array} \right| \\
&= 1 \cdot 4 \, – \, 2 \cdot 3 \\
&= 4 \, – \, 6 = -2
\end{align}
$$

・$[2]$
$$
\large
\begin{align}
A = \left( \begin{array}{cc} 0 & 1 \\ 1 & 0 \end{array} \right)
\end{align}
$$

$\det{(A)}$は下記のように計算できる。
$$
\large
\begin{align}
\det{(A)} &= \left| \begin{array}{cc} 0 & 1 \\ 1 & 0 \end{array} \right| \\
&= 0 \cdot 0 \, – \, 1 \cdot 1 \\
&= 0 \, – \, 1 = -1
\end{align}
$$

基本例題$062$

・$[1]$
$i$列目が$\mathbf{a}_{i}$である$n$次正方行列$A$は下記のように表される。
$$
\large
\begin{align} A &= \left( \begin{array}{ccc} \mathbf{a}_{1} & \cdots & \mathbf{a}_{n} \end{array} \right) \\
\mathbf{a}_{i} &= \left( \begin{array}{c} a_{1i} \\ \vdots \\ a_{ni} \end{array} \right) = \left( \begin{array}{c} 0 \\ \vdots \\ 0 \end{array} \right)
\end{align}
$$

また、行列$A$の行列式は行列式の定義より下記のように表される。
$$
\large
\begin{align}
\det{(A)} = \sum_{\sigma} \mathrm{sgn}(\sigma) a_{1 \sigma(1)} a_{2 \sigma(2)} \cdots a_{n \sigma(n)}
\end{align}
$$

ここで任意の$\sigma$について$\sigma(k)=i$となる$k$が存在するが、$\mathbf{a}_{i}=\mathbf{0}$であるので$\sigma(k)=i$に対応する任意の$j$について$a_{j \sigma(k)} = a_{ji} = 0$である。よって行列式$\det{(A)}$は$\det{(A)}=0$となる。

行列のpノルム(p-norm)の定義・計算方法・計算例の確認

ベクトル(vector)や行列(matrix)のノルム(norm)は類似度の計算など、様々な場面で応用される重要トピックです。当記事ではシンプルかつよく用いられるフロベニウスノルムに加えて行列のpノルム(p-norm)の定義や成立する式と、具体的な計算例の確認などを行いました。
作成にあたっては「Matrix Computations」のSection$\, 2.3$「Matrix Norms」の内容を主に参考にしました。

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

行列のノルムの定義

フロベニウスノルム

行列$A \in \mathbb{R}^{m \times n}$のフロベニウスノルム(Frobe­nius norm)を$||A||_{F}$とおくと、$||A||_{F}$は下記のような式で定義されます。
$$
\large
\begin{align}
||A||_{F} = \left( \sum_{i=1}^{m} \sum_{j=1}^{n} |a_{ij}|^{2} \right)^{\frac{1}
2}
\end{align}
$$

上記はベクトルの$2$-normのシンプルな拡張と見なすこともできます。一方で行列の$2$-normを含む$p$-normは上記とは異なる式で定義されるので注意が必要です。行列の$p$-normの定義については次項で問い扱います。

p-norm

行列$A \in \mathbb{R}^{m \times n}$の$p$-normを$||A||_{p}$とおくと、$||A||_{p}$は下記のような式で定義されます。
$$
\large
\begin{align}
||A||_{p} = \sup_{x \neq 0} \frac{||Ax||_{p}}{||x||_{p}} = \sup_{x \neq 0} \left| \middle| A \left( \frac{x}{||x||_{p}} \right) \middle| \right|_{p} = \max_{||x||_{p}=1} ||Ax||_{p} \quad (1)
\end{align}
$$

次節では$\displaystyle ||A||_{p} = \max_{||x||_{p}=1} ||Ax||_{p}$を元に$||A||_{p}$について成立する式を詳しく確認します。

行列のp-normについて成立する式

$1$-norm

行列$A \in \mathbb{R}^{m \times n}$の$1$-normである$||A||_{p}$は下記のように計算することができます。
$$
\large
\begin{align}
||A||_{1} = \max_{1 \leq j \leq n} \sum_{i=1}^{m} |a_{ij}| \quad (2)
\end{align}
$$

上記は「行列$A$の$1$-norm」は「$j$列の要素の絶対値の和が最大となる際に、$j$列の絶対値の和を計算することで得られる」と解釈できます。以下、$(2)$式を$(1)$式から導出します。まず、$(1)$式に$p=1$を代入することで下記のような式を得ることができます。
$$
\large
\begin{align}
||A||_{1} &= \max_{||x||_{1}=1} ||Ax||_{1} \quad (1)’ \\
&= \max_{||x||_{1}=1} \sum_{i=1}^{m} |a_{i1}x_{1} + \cdots a_{in}x_{n}| \\
& \leq \max_{||x||_{1}=1} \sum_{i=1}^{m} \sum_{j=1}^{n} |a_{ij}| |x_{j}|
\end{align}
$$

上記の式では$||x||_{1}=1$より$|x_1| + \cdots |x_n| = 1$であるので、$\displaystyle \sum_{i=1}^{m} |a_{ij}|$が最大となる$j$について$|x_j|=1$とすることで$||A||_{1}$は最大値を取ります。よって$(2)$式が成立することが確認できます。

$$
\large
\begin{align}
A = \left( \begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array} \right)
\end{align}
$$

たとえば上記のように$A$が定義されるとき、$|x_3| = 1$のとき$||A||_{1} = 9$が得られます。

$\infty$-norm

行列$A \in \mathbb{R}^{m \times n}$の$1$-normである$||A||_{\infty}$は下記のように計算することができます。
$$
\large
\begin{align}
||A||_{\infty} = \max_{1 \leq i \leq m} \sum_{j=1}^{n} |a_{ij}| \quad (3)
\end{align}
$$

以下、$(3)$式の導出を行います。$(1)$式と$\displaystyle ||x||_{\infty} = \max_{1 \leq i \leq m} |x_{i}|$に基づいて$||A||_{\infty}$は下記のような式で表すことができます。
$$
\large
\begin{align}
||A||_{\infty} &= \max_{||x||_{\infty}=1} ||Ax||_{\infty} \quad (1)^{”} \\
&= \max_{1 \leq i \leq m} | a_{i1}x_{1} + \cdots a_{in}x_{n} | \\
&= \max_{1 \leq i \leq m} \sum_{j=1}^{n} |a_{ij}| |x_{j}|
\end{align}
$$

ここで$||x||_{\infty}=1$より、$\displaystyle \sum_{j=1}^{n} |a_{ij}| |x_{j}|$は$x_1 = \cdots = x_{n} = 1$のとき最大値$\displaystyle \sum_{j=1}^{n} |a_{ij}|$を取ります。よって$(3)$式が成立することが確認できます。

$$
\large
\begin{align}
A = \left( \begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array} \right)
\end{align}
$$

たとえば上記のように$A$が定義されるとき、$|x_1| = |x_2| = |x_3| = 1$のとき$||A||_{\infty} = 15$が得られます。

$2$-normの計算式

行列$A \in \mathbb{R}^{m \times n}$について$A^{\mathrm{T}} A$の固有多項式を$p(\lambda)=\det{(A^{\mathrm{T}} A \, – \, \lambda I_{n})}$とおくとき$2$-normである$||A||_{2}$は下記のような式で計算することができます。
$$
\large
\begin{align}
||A||_{2} = \sqrt{\lambda_{\max} (A^{\mathrm{T}} A)} \quad (4)
\end{align}
$$

上記の$\lambda_{\max} (A^{\mathrm{T}} A)$は$A^{\mathrm{T}} A$の最大固有値に対応します。

$2$-normの計算式の導出

$A \in \mathbb{R}^{m \times n}$と$x \in \mathbb{R}^{n}$についてスカラー関数$g(x)$を下記のように定義します。
$$
\large
\begin{align}
g(x) = \frac{1}{2} \cdot \frac{||Ax||_{2}^{2}}{||x||_{2}^{2}} = \frac{1}{2} \cdot \frac{x^{\mathrm{T}} A^{\mathrm{T}} A x}{x^{\mathrm{T}} x}
\end{align}
$$

このとき、$g(x)$のベクトル微分$\displaystyle \nabla g(x) = \frac{\partial}{\partial x} g(x)$は下記のように計算できます。
$$
\large
\begin{align}
\nabla g(x) &= \frac{(x^{\mathrm{T}} x) A^{\mathrm{T}} A x \, – \, (x^{\mathrm{T}} A^{\mathrm{T}} A x)x}{(x^{\mathrm{T}} x)^{2}}
\end{align}
$$

ここで$||Az||_{2}=||A||_{2}$が成立するように$A \in \mathbb{R}^{m \times n}$について$z \in \mathbb{R}^{n}, \, ||z||_{2}=z^{\mathrm{T}} z=1$を仮定するとき、$\nabla g(z) = 0$が成立し、下記のような式を得ることができます。
$$
\large
\begin{align}
\nabla g(z) &= 0 \\
\frac{(z^{\mathrm{T}} z) A^{\mathrm{T}} A z \, – \, (x^{\mathrm{T}} A^{\mathrm{T}} Az)z}{(z^{\mathrm{T}} z)^{2}} &= 0 \\
1 \cdot A^{\mathrm{T}} A z \, – \, (z^{\mathrm{T}} A^{\mathrm{T}} A z)z &= 0 \\
A^{\mathrm{T}} A z &= (z^{\mathrm{T}} A^{\mathrm{T}} A z)z \\
A^{\mathrm{T}} A z &= \mu^{2} z
\end{align}
$$

上記の変形にあたって、$\mu^{2} = z^{\mathrm{T}} A^{\mathrm{T}} A z = ||Az||_{2}^{2}$のように$\mu$を定義しました。このとき$||Az||_{2}=||A||_{2}$を仮定したことより、$\mu^{2} = ||Az||_{2}^{2} = ||A||_{2}^{2}$が成立します。よって、$||A||_{2}$を得るにあたっては、$A^{\mathrm{T}} A z = \mu^{2} z$が成立する最大の$\mu$を求めれば良いことが確認できます。したがって固有方程式$\det{(A^{\mathrm{T}} A \, – \, \lambda I_{n})}$の最大固有値$\lambda(A^{\mathrm{T}} A)$を用いて$||A||_{2}$は下記のように表すことができます。
$$
\large
\begin{align} ||A||_{2} = \sqrt{\lambda_{\max} (A^{\mathrm{T}} A)}
\end{align}
$$

上記は前項の$(4)$式に一致します。

・ベクトル微分の式の導出について

直交行列とフロベニウスノルム

$Q \in \mathbb{R}^{m \times m}, \, Z \in \mathbb{R}^{n \times n}$が直交行列であるとき、$A \in \mathbb{R}^{m \times n}$のノルムについて下記の式が成立します。
$$
\large
\begin{align}
||QAZ||_{F} &= ||A||_{F} \quad (5) \\
||QAZ||_{2} &= ||A||_{2} \quad (6)
\end{align}
$$

$(5)$式の導出

まず、$A$の$j$列を$A(:,j)$とおくとき、$||QA||_{F}^{2}$は下記のように表すことができます。
$$
\large
\begin{align}
||QA||_{F}^{2} = \sum_{j=1}^{n} ||QA(:,j)||_{2}^{2}
\end{align}
$$

上記の式の$||QA(:,j)||_{2}^{2}$は行列ではなくベクトルの$2$-normであることに注意が必要です。また、ここで$Q$が直交行列であることより下記が成立します。
$$
\large
\begin{align}
||QA||_{F}^{2} &= \sum_{j=1}^{n} ||QA(:,j)||_{2}^{2} \\
&= \sum_{j=1}^{n} (QA(:,j))^{\mathrm{T}}(QA(:,j)) \\
&= \sum_{j=1}^{n} A(:,j)^{\mathrm{T}} Q^{\mathrm{T}} QA(:,j) \\
&= \sum_{j=1}^{n} A(:,j)^{\mathrm{T}} A(:,j) \\
&= \sum_{j=1}^{n} ||A(:,j)||_{2}^{2} \\
&= ||A||_{F}^{2}
\end{align}
$$

上記に基づいて、$||QAZ||_{F}^{2}$は下記のように式変形することができます。
$$
\large
\begin{align}
||QAZ||_{F}^{2} &= ||Q(AZ)||_{F}^{2} \\
&= ||AZ||_{F}^{2} \\
&= ||(AZ)^{\mathrm{T}}||_{F}^{2} \\
&= ||Z^{\mathrm{T}} A^{\mathrm{T}}||_{F}^{2} \\
&= ||A^{\mathrm{T}}||_{F}^{2} \\
&= ||A||_{F}^{2} \quad (5)’
\end{align}
$$

上記の導出にあたっては直交行列$Z$の転置である$Z^{\mathrm{T}}$も直交行列であることを用いました。直交行列の転置が直交行列であることは下記のように示すことができます。
$$
\large
\begin{align}
Z Z^{\mathrm{T}} &= I_{n} \\
(Z Z^{\mathrm{T}})^{\mathrm{T}} &= I_{n}^{\mathrm{T}} \\
(Z^{\mathrm{T}})^{\mathrm{T}} Z^{\mathrm{T}} &= I_{n}
\end{align}
$$

$(6)$式の導出

$||QA||_{2}$は$(1)$式に基づいて下記のように表すことができます。
$$
\large
\begin{align}
||QA||_{2} = \max_{||x||_{p}=1} ||QAx||_{2}
\end{align}
$$

ここで$Q$が直交行列、$QAx$がベクトルであることに基づいて$||QAx||_{2}^{2}$について下記のような変形を行うことができます。
$$
\large
\begin{align}
||QAx||_{2}^{2} &= (QAx)^{\mathrm{T}} (QAx) \\
&= x^{\mathrm{T}} A^{\mathrm{T}} Q^{\mathrm{T}} Q A x \\
&= x^{\mathrm{T}} A^{\mathrm{T}} A x \\
&= (Ax)^{\mathrm{T}} (Ax) \\
&= ||Ax||_{2}^{2}
\end{align}
$$

よって、$||QA||_{2}$は下記のように表すことができます。
$$
\large
\begin{align}
||QA||_{2} &= \max_{||x||_{p}=1} ||QAx||_{2} \\
&= \max_{||x||_{p}=1} ||Ax||_{2} \\
&= ||A||_{2}
\end{align}
$$

上記に基づいて、$||QAZ||_{2}^{2}$は$(5)$式の導出と同様に下記のように式変形することができます。
$$
\large
\begin{align}
||QAZ||_{2}^{2} &= ||Q(AZ)||_{2}^{2} \\
&= ||AZ||_{2}^{2} \\
&= ||(AZ)^{\mathrm{T}}||_{2}^{2} \\
&= ||Z^{\mathrm{T}} A^{\mathrm{T}}||_{2}^{2} \\
&= ||A^{\mathrm{T}}||_{2}^{2} \\
&= ||A||_{2}^{2} \quad (6)’
\end{align}
$$

ベクトルのpノルム(p-norm)の定義と具体的な計算例の確認

ベクトル(vector)や行列(matrix)のノルム(norm)は類似度の計算など、様々な場面で応用される重要トピックです。当記事ではベクトルのpノルム(p-norm)の定義と成立する等式(equality)や不等式(inequality)、具体的な計算例の確認などを行いました。
作成にあたっては「Matrix Computations」のSection$\, 2.2$「Vector Norms」の内容を主に参考にしました。

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

p-normの定義

p-normの式定義

$n$次元ベクトル$x \in \mathbb{R}^{n}$のp-normを$||x||_{p}$とおくとき、$||x||_{p}$は下記のように定義されます。
$$
\large
\begin{align}
||x||_{p} &= (|x_1|^{p} + |x_2|^{p} + \cdots + |x_n|^{p})^{\frac{1}{p}} \quad (1) \\
&= \left( \sum_{i=1}^{n} |x_i|^{p} \right)^{\frac{1}{p}}
\end{align}
$$

上記に基づいて$1$-norm、$2$-norm、$\infty$-normはそれぞれ下記のように表すことができます。
$$
\large
\begin{align}
||x||_{1} &= |x_1| + |x_2| + \cdots + |x_n| = \sum_{i=1}^{n} |x_i| \\
||x||_{2} &= (|x_1|^{2} + |x_2|^{2} + \cdots + |x_n|^{2})^{\frac{1}{2}} = (x^{\mathrm{T}} x)^{\frac{1}{2}} \\
||x||_{\infty} &= \max_{1 \leq i \leq n} |x_{i}|
\end{align}
$$

$1$-norm、$2$-normについては$p$に$p=1, p=2$を代入することで式が成立することが確認できるので、以下$\infty$-normについて具体例を元に詳しく確認します。
$$
\large
\begin{align}
x = \left( \begin{array}{c} 1 \\ 2 \\ 0 \end{array} \right)
\end{align}
$$

たとえば上記のように$x \in \mathbb{R}^{3}$が表される場合、$||x||_{10}$は$(1)$式に$p=10$を代入することで下記のように計算できます。
$$
\large
\begin{align}
||x||_{10} &= (|1|^{10} + |2|^{10} + 0^{10})^{\frac{1}{10}} \quad (1)’ \\
&= ( 1 + 2^{10} )^{\frac{1}{10}} \\
& \simeq ( 2^{10} )^{\frac{1}{10}} = 2
\end{align}
$$

上記は$p=20, p=100$の場合も同様です。よって、$p \to \infty$のとき$\displaystyle ||x||_{p} \to \max_{1 \leq i \leq n} |x_{i}|$が成立するであろうことが推察できます。

Absolute and Relative Errors

統計や機械学習の分野では誤差を定義することが多いので、当項ではノルムを用いたAbsolute ErrorやRelative Errorの定義について確認を行います。ベクトル$x \in \mathbb{R}^{n}$をベクトル$\hat{x} \in \mathbb{R}^{n}$で近似するときのAbsolute Errorを$\epsilon_{\mathrm{abs}}$、Relative Errorを$\epsilon_{\mathrm{rel}}$とおくとき、$\epsilon_{\mathrm{abs}}$と$\epsilon_{\mathrm{rel}}$はそれぞれ下記のように定義されます。
$$
\large
\begin{align}
\epsilon_{\mathrm{abs}} &= ||\hat{x} \, – \, x||_{p} \\
\epsilon_{\mathrm{rel}} &= \frac{||\hat{x} \, – \, x||_{p}}{||x||_{p}}
\end{align}
$$

上記の計算にあたっては$p=2$が用いられることが一般的です。

p-normについて成立する式

Holder不等式

ベクトル$x \in \mathbb{R}^{n}, y \in \mathbb{R}^{n}$について下記のHolder不等式が成立します。
$$
\large
\begin{align}
|x^{\mathrm{T}} y| \leq ||x||_{p} ||y||_{p}
\end{align}
$$

上記は下記のように定義されるコーシー・シュワルツの不等式(Cauchy-Schwarz inequality)の一般形です。
$$
\large
\begin{align}
|x^{\mathrm{T}} y| \leq ||x||_{2} ||y||_{2}
\end{align}
$$

以下、具体例に基づいてーシー・シュワルツの不等式が成立することを確認します。
$$
\large
\begin{align}
x = \left( \begin{array}{c} 1 \\ 2 \\ 0 \end{array} \right), \quad x = \left( \begin{array}{c} 2 \\ 1 \\ 0 \end{array} \right)
\end{align}
$$

上記に対し、$x^{\mathrm{T}} y, \, ||x||_{2}, \, ||y||_{2}$はそれぞれ下記のように計算できます。
$$
\large
\begin{align}
x^{\mathrm{T}} y &= 1 \cdot 2 + 2 \cdot 1 + 0 \cdot 0 = 4 \\
||x||_{2} &= \sqrt{1^{2} + 2^{2} + 0^{2}} = \sqrt{5} \\
||y||_{2} &= \sqrt{2^{2} + 1^{2} + 0^{2}} = \sqrt{5}
\end{align}
$$

$4 \leq \sqrt{5} \cdot \sqrt{5}$であるので、$|x^{\mathrm{T}} y| \leq ||x||_{2} ||y||_{2}$が成立していることが確認できます。

直交行列について成立する式

$Q \in \mathbb{R}$を直交行列とするとき、$Q$とベクトル$x \in \mathbb{R}^{n}$について下記が成立します。
$$
\large
\begin{align}
||Qx||_{2}^{2} &= (Qx)^{\mathrm{T}} (Qx) \\
&= x^{\mathrm{T}} Q^{\mathrm{T}} Q x \\
&= x^{\mathrm{T}} x = ||x||_{2}^{2}
\end{align}
$$

上記の導出にあたっては直交行列の定義である$Q^{T} Q = Q^{-1} Q = I_{n}$を用いました。

Principal Anglesに基づくLoRAで用いる行列の最適なランク$r$の計算

LoRA(Low-Rank Adaptation)の論文ではPrincipal Angleに基づいてTransformerにおけるLoRAで用いる行列のランク$r$について実験が行われます。当記事ではPrincipal Angleの基本的な内容からLoRA論文の内容まで取りまとめを行いました。
LoRAの論文である「LoRA: Low-Rank Aaptation of Large Language Models」や「Matrix Computations」の内容を参考に作成を行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

Principal Anglesの計算

行列のrangeとnullspace

$\mathbb{R}^{n} \longrightarrow \mathbb{R}^{m}$の線形写像に対応する行列$A \in \mathbb{R}^{m \times n}$について、$\mathbb{R}^{m}$の部分空間$\mathrm{ran}(A)$を下記のように定義する。
$$
\large
\begin{align}
\mathrm{ran}(A) = \{ y \in \mathbb{R}^{m} : \, y = Ax \quad \mathrm{for} \,\, \mathrm{some} \,\, x \in \mathbb{R}^{n} \}
\end{align}
$$

上記の部分空間を行列$A$のrangeといい、$\mathrm{ran}(A)$のように表す。

同様に$\mathbb{R}^{n}$の部分空間$\mathrm{null}(A)$を下記のように定義する。
$$
\large
\begin{align}
\mathrm{null}(A) = \{ x \in \mathbb{R}^{n} : \, Ax = 0 \}
\end{align}
$$

上記の部分空間を行列$A$のnullspaceといい、$\mathrm{null}(A)$のように表す1

また、下記が成立することも合わせて抑えておくと良い。
$$
\large
\begin{align}
\mathrm{dim}(\mathrm{ran}(A)) = n \, – \, \mathrm{dim}(\mathrm{null}(A))
\end{align}
$$

線形写像と部分空間

行列$A \in \mathbb{R}^{n \times p}$と行列$B \in \mathbb{R}^{n \times q}$を元に、部分空間$F$と$G$を下記のように定義する。
$$
\large
\begin{align}
F &= \mathrm{ran}(A) \\
G &= \mathrm{ran}(B)
\end{align}
$$

$p, q$については下記が成立すると仮定する。
$$
\large
\begin{align}
1 \leq q = \mathrm{dim}(F) \leq \mathrm{dim}(G) = p
\end{align}
$$

次項以降では、部分空間$F$と部分空間$G$の類似度を計算するにあたって、Principal AngleやPrincipal Vectorの定義を行う。

Principal Anglesの定義

部分空間$F$と部分空間$G$についてPrincipal Angles$\{ \theta_{i} \}_{i=1}^{q}$とPrincipal Vectors$\{ f_{i}, g_{i} \}_{i=1}^{q}$を下記の式が成立するように定義する。
$$
\large
\begin{align}
\cos{\theta_{k}} &= f_{k}^{\mathrm{T}} g_{k} = \max_{f \in F} \max_{g \in G} f^{\mathrm{T}} g \\
||f||_{2} &= 1, \quad ||g||_{2} = 1 \\
f^{\mathrm{T}}[f_1, \cdots , f_{k-1}] &= 0, \quad g^{\mathrm{T}}[g_1, \cdots , g_{k-1}] = 0
\end{align}
$$

上記の式に基づいて$i=1$から$i=q$まで、$\theta_{i}, \, f_{i}, \, g_{i}$をそれぞれ取得する。

また、$\cos{\theta}$は$\displaystyle 0 \leq \theta \leq \frac{\pi}{2}$で$\theta$について単調減少関数であることからPrincipal Angles$\{ \theta_{i} \}_{i=1}^{q}$について下記が成立する。
$$
\large
\begin{align}
0 \leq \theta_{1} \leq \cdots \leq \theta_{q} \leq \frac{\pi}{2} \quad (1)
\end{align}
$$

QR分解

行列$A \in \mathbb{R}^{n \times p}$、$B \in \mathbb{R}^{n \times q}$について下記のようなQR分解を仮定する。
$$
\large
\begin{align}
A &= Q_{A} R_{A}, \, Q_{A} \in \mathbb{R}^{n \times p}, \, R_{A} \in \mathbb{R}^{p \times p} \\
B &= Q_{B} R_{B}, \, Q_{B} \in \mathbb{R}^{n \times q}, \, R_{A} \in \mathbb{R}^{q \times q}
\end{align}
$$

QR分解については下記でも詳しく取り扱った。

SVD

$Q_{A}^{\mathrm{T}} Q_{B} \in \mathbb{R}^{p \times q}$について下記のようなSVDを行う。
$$
\large
\begin{align}
Q_{A}^{\mathrm{T}} Q_{B} &= Y \Sigma Z^{\mathrm{T}} \quad (2) \\
Y \in \mathbb{R}^{p \times p}, \, & \Sigma \in \mathbb{R}^{p \times q}, \, Z \in \mathbb{R}^{p \times q}
\end{align}
$$

上記の行列$Y$と$Z$の$i$列目をそれぞれ$y_i \in \mathbb{R}^{p \times 1}, z_i \in \mathbb{R}^{q \times 1}$、$\Sigma$の$(i,i)$成分を$\sigma_{i}$とおくとき、$(2)$式は下記のように表すことができる。
$$
\large
\begin{align}
Q_{A}^{\mathrm{T}} Q_{B} &= Y \Sigma Z^{\mathrm{T}} = \sum_{i=1}^{q} \sigma_{i} y_{i} z_{i}^{\mathrm{T}} \quad (2)’ \\
y_i \in \mathbb{R}^{p \times 1}, \, & z_{i}^{\mathrm{T}} \in \mathbb{R}^{1 \times q}, \, y_{i} z_{i}^{\mathrm{T}} \in \mathbb{R}^{p \times q}
\end{align}
$$

ここで$||Q_{A}^{\mathrm{T}} Q_{B}||_{2} \leq 1$より、$0 \leq \sigma_{i} \leq 1$が成立するので、$\sigma_{i} = \cos{\theta_{i}}$とおく。ここで$Q_{A}Y, Q_{B}Z$を下記のように定義する。
$$
\large
\begin{align}
Q_{A}Y &= [f_1| \cdots | f_p] \in \mathbb{R}^{n \times p} \\
Q_{B}Z &= [g_1| \cdots | g_q] \in \mathbb{R}^{n \times q}
\end{align}
$$

このとき、$f = Q_{A} u, \, u \in \mathbb{R}^{p}$、$g = Q_{B} v, \, v \in \mathbb{R}^{q}$とおくと、$f^{\mathrm{T}} g$は下記のように式変形することができる。
$$
\large
\begin{align}
f^{\mathrm{T}} g &= (Q_{A} u)^{\mathrm{T}} (Q_{B} v) \\
&= u^{\mathrm{T}} Q_{A}^{\mathrm{T}} Q_{B} v \\
&= u^{\mathrm{T}} (Q_{A}^{\mathrm{T}} Q_{B}) v \\
&= u^{\mathrm{T}} (Y \Sigma Z^{\mathrm{T}}) v \\
&= ((u^{\mathrm{T}} Y)^{\mathrm{T}})^{\mathrm{T}} \Sigma (Z^{\mathrm{T}} v) \\
&= (Y^{\mathrm{T}} u)^{\mathrm{T}} \Sigma (Z^{\mathrm{T}} v) \\
&= \sum_{i=1}^{q} \sigma_{i} (y_{i}^{\mathrm{T}} u) (z_{i}^{\mathrm{T}} v)
\end{align}
$$

ここで$(1)$より$\sigma_{1} \geq \cdots \geq \sigma_{q}$であるので、$u=y_{1}, \, v=z_{1}$のとき$f^{\mathrm{T}} g$は最大値$\sigma_{1}=\cos{\theta_{1}}$を取る。このとき$f_1=Q_{A}y_{1}, g_1=Q_{B} z_{1}$によってPrincipal Vectorも計算できる。このような手順に基づいてPrincipal Angles$\{ \theta_{i} \}_{i=1}^{q}$とPrincipal Vectors$\{ f_{i}, g_{i} \}_{i=1}^{q}$を$i=1$から$i=q$にかけて得ることができる。

Principal Angles and Vectorsを得るアルゴリズム

前項までの内容をアルゴリズムに直すと下記が得られる。

$[1]$ 行列$A \in \mathbb{R}^{n \times p}$と行列$B \in \mathbb{R}^{n \times q}$のQR分解を行う。
$$
\large
\begin{align}
A &= Q_{A} R_{A}, \, Q_{A} \in \mathbb{R}^{n \times p}, \, R_{A} \in \mathbb{R}^{p \times p} \\
B &= Q_{B} R_{B}, \, Q_{B} \in \mathbb{R}^{n \times q}, \, R_{B} \in \mathbb{R}^{q \times q}
\end{align}
$$

$[2]$ $C = Q_{A}^{\mathrm{T}} Q_{B}$とおき、$C$の特異値分解(SVD)を行う。
$$
\large
\begin{align}
C &= Y \Sigma Z^{\mathrm{T}} \\
Y^{\mathrm{T}} C Z &= \Sigma = \mathrm{diag}(\sigma_{k}) = \mathrm{diag}(\cos{\theta_{k}})
\end{align}
$$

上記より、Principal Anglesの$\{ \theta_{k} \}_{k=1}^{\min(p,q)}$が得られる。

$[3]$ $Q_{A} Y, Q_{B} Z$に基づいて$\{ f_{k}, g_{k} \}_{k=1}^{\min(p,q)}$を得る。

TransformerにおけるLoRAで用いる行列の最適ランクの計算

全体方針

LoRAの論文ではFine-Tuning時にMLP(Multi Layer Perceptron)処理におけるパラメータ行列$W$の学習を、低ランクの行列の積を元に行う。

LoRA論文のSection$\, 7.2$では行列のランク$r$を決めるにあたって、実験に基づく考察が行われている。この際に前節で取り扱った「線形写像に対応する行列が生成する部分空間」のPrincipal Anglesを用いて類似度の計算が行われる。

以下、$r=8$と$r=64$の場合における写像$A_{r=8} \in \mathbb{R}^{8 \times D}, A_{r=64} \in \mathbb{R}^{64 \times D}$に基づく類似度の計算について確認を行う。

LoRA論文における写像の類似度の定義

$A_{r=8}^{\mathrm{T}} \in \mathbb{R}^{D \times 8}, A_{r=64}^{\mathrm{T}} \in \mathbb{R}^{D \times 64}$のQR分解を下記のように定義する2
$$
\large
\begin{align}
A_{r=8}^{\mathrm{T}} &= Q_{r=8} R_{r=8} = U_{A_{r=8}}^{\mathrm{T}} R_{r=8} \\
A_{r=64}^{\mathrm{T}} &= Q_{r=64} R_{r=64} = U_{A_{r=64}}^{\mathrm{T}} R_{r=64} \\
U_{A_{r=8}} & \in \mathbb{R}^{D \times 8}, \, U_{A_{r=64}} \in \mathbb{R}^{D \times 64}
\end{align}
$$

このとき、LoRA論文では「$U_{A_{r=8}}$の$i$列目までの行列$U^{i}_{A_{r=8}} \in \mathbb{R}^{D \times i}$による部分空間と$U_{A_{r=64}}$の$j$列目までの行列$U^{j}_{A_{r=64}} \in \mathbb{R}^{D \times j}$による部分空間の類似度」を$\phi(A_{r=8}, A_{r=64}, i, j)$のようにおき、下記のような式で定義する。
$$
\large
\begin{align}
\phi(A_{r=8}, A_{r=64}, i, j) = \frac{|| (U^{i}_{A_{r=8}})^{\mathrm{T}} U^{j}_{A_{r=64}} ||_{F}^{2}}{\min{(i,j)}} \in [0, 1]
\end{align}
$$

写像の類似度のPrincipal Anglesに基づく理解

$(U^{i}_{A_{r=8}})^{\mathrm{T}} U^{j}_{A_{r=64}} \in \mathbb{R}^{i \times j}$に下記のようにSVDを行う。
$$
\large
\begin{align}
(U^{i}_{A_{r=8}})^{\mathrm{T}} U^{j}_{A_{r=64}} &= Y \Sigma Z^{\mathrm{T}} \\
Y \in \mathrm{R}^{i \times i}, \, & \Sigma \in \mathbb{R}^{i \times j}, \, Z \in \mathbb{R}^{j \times j}
\end{align}
$$

このとき、$\Sigma$の対角成分の$\sigma_{1}, \cdots , \sigma_{\min(i,j)}$を$\sigma_{k} = \cos{\theta_{k}}$のように対応させたのが前節で取り扱ったPrincipal Anglesである。

「Grassmann discriminant analysis: a unifying view on subspace-based learning.」ではこの$\theta_{k}$を元に下記のようにProjection metricの$d_{P}(U^{i}_{A_{r=8}}, U^{j}_{A_{r=64}})$が定義される。
$$
\large
\begin{align}
d_{P}(U^{i}_{A_{r=8}}, U^{j}_{A_{r=64}}) &= \left( \sum_{k=1}^{m} \sin^{2}{\theta_{k}} \right)^{\frac{1}{2}} = \left( m \, – \, \sum_{k=1}^{m} \cos^{2}{\theta_{k}} \right)^{\frac{1}{2}} \\
m &= \min{(i,j)}
\end{align}
$$

ここでLoRA論文における$\phi(A_{r=8}, A_{r=64}, i, j)$は下記のように式変形を行うことができる3
$$
\large
\begin{align}
\phi(A_{r=8}, A_{r=64}, i, j) &= \frac{|| (U^{i}_{A_{r=8}})^{\mathrm{T}} U^{j}_{A_{r=64}} ||_{F}^{2}}{m} \\
&= \frac{\sum_{k=1}^{m} \sigma_{k}^{2}}{m} \\
&= \frac{\sum_{k=1}^{m} \cos^{2}{\theta_{k}}}{m} \\
&= \frac{\sum_{k=1}^{m} (1 – \sin^{2}{\theta_{k}})}{m} \\
&= \frac{m \, – \, \sum_{k=1}^{m} \sin^{2}{\theta_{k}}}{m} \\
&= 1 \, – \, \frac{d_{P}(U^{i}_{A_{r=8}}, U^{j}_{A_{r=64}})}{m} \\
m &= \min{(i,j)}
\end{align}
$$

LoRA論文の実験結果の解釈

LoRA論文 Figure$\, 3$

上図の結果より、$i$や$j$が小さいときベクトル空間が類似していることが確認できる。

参考

・LoRA論文

  1. nullspaceの定義は線形代数における核(kernel)と同義だが、ここでは「Matrix Computations」の表記に基づいてnullspaceを用いた。 ↩︎
  2. LoRA論文のSection$\, 7.2$では「SVDの右側のユニタリ行列を得る(we perform singular value decomposition and obtain the right-singular unitary matrices)」のように記載があるが、前節の内容に合わせてQR分解で統一させた。また、「右側を得る」という点については、$A^{\mathrm{T}} = QR$に対し、$A = ((A^{\mathrm{T}}))^{\mathrm{T}} = (QR)^{\mathrm{T}} = R^{\mathrm{T}} Q^{\mathrm{T}} = R^{\mathrm{T}}U$であるので、本文中のように$A^{\mathrm{T}}$のQR分解を行ったのちに$U = Q^{\mathrm{T}} \longrightarrow Q=U^{\mathrm{T}}$で表すのがわかりやすいと思われた。 ↩︎
  3. LoRA論文では$\displaystyle \frac{1}{m}(1 \, – \, d_{P}(U^{i}_{A_{r=8}}, U^{j}_{A_{r=64}}))$のように結果が表されていたが、計算が合わなかったので結果のみ改変した。 ↩︎

【LoRA】Low-Rank Adaptationの概要とTransformerへの導入

Fine-Tuningを行うにあたって、低ランクの行列分解に基づく手法であるLoRA(Low-Rank Adaptation)は実用上の観点から大変有力な手法です。当記事ではLoRAの概要とLoRAのTransformerへの適用について取りまとめました。
LoRAの論文である「LoRA: Low-Rank Aaptation of Large Language Models」の内容を参考に作成を行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

LoRAの概要

パラメータ行列の分解

LoRA(Low-Rank Adaptation)ではFine-Tuningの際に全結合層(MLP)の計算に用いるパラメータ行列の分解を行います。たとえばパラメータ行列$W \in \mathbb{R}^{D \times D}$を用いる場合、$W$は下記のように分解することができます。
$$
\large
\begin{align}
W & \longrightarrow XY \\
X & \in \mathbb{R}^{D \times r}, \, Y \in \mathbb{R}^{r \times D}
\end{align}
$$

上記のように分解を行う場合、$D=10{,}000, r=10$であれば「$W$のパラメータ数」と「$X$と$Y$のパラメータ数の合計」はそれぞれ下記のように計算できます。
・$W$のパラメータ数
$$
\large
\begin{align}
10{,}000 \times 10{,}000 = 10^{8}
\end{align}
$$

・$X$と$Y$のパラメータ数の合計
$$
\large
\begin{align}
10,000 \times 10 + 10 \times 10{,}000 = 2 \times 10^{4}
\end{align}
$$

上記のようにLoRAではパラメータ$W$を$XY$のように分解してFine-Tuningの際に$X$と$Y$とそれぞれ学習を行います。このような処理を行うことでFine-Tuningの際の学習パラメータを減らすことが可能になります。

LoRA論文 Figure$\, 1$

LoRAの処理の概要は上図からも確認できます。パラメータの初期値は$r \times D$の行列の値を正規分布$\mathcal{N}(0, \sigma^{2})$に基づいてサンプリングし、$D \times r$の行列を零行列で用意します1

図では$W \in \mathbb{R}^{D \times D}$が前提である一方で、論文の本文では$d \times k$で表記されている箇所があることは合わせて注意しておくと良いと思います。

一部のパラメータのみのFine-Tuning

Fine-Tuning時にLoRAを用いるにあたっては、基本的に全てのパラメータを用いずに一部のパラメータのみのFine-Tuningを行います。どのパラメータをFine-TuningするかはPre-trained modelやdownstream taskの特性に合わせて検討されます。

推論時の処理

LoRAではFine-Tuning時にパラメータ$W$をUpdateするのではなく、初期値が$0$の$\Delta W$に蓄積させるような処理が行われます。逆に推論時にはFine-Tuning時に学習した結果の$\Delta W$に対応する$W$に対して$W + \Delta W$を計算することで推論を行うことができます。

このような枠組みでFine-Tuningや推論を行うことで、推論時の処理を大きく変えないことが可能です。また、大元のパラメータの値を変えないことから、LoRAの入れ替えをスムーズに行うことが可能であり、アプリケーションへの反映がしやすくなります。

TransformerへのLoRAの導入

TransformerにおけるMLP

TransformerではMultiHead Attention時のlinear projectionと$2$層FFN(FeedForward Network)の$2$つの処理をMLPと見なすことができ、LoRA(Low-Rank Adaptation)を適用することが可能です2

LoRAの論文ではMultiHead Attention時の$W_q, W_k, W_v, W_o$を用いるlinear projectionのみ実験されておりFFNはfuture workの課題とされているので、以下$W_q, W_k, W_v, W_o$についてのみ確認を行います。

MultiHead AttentionのどのパラメータにLoRAを用いるか

LoRA論文のSection$\, 7.1$ではTransformerにおけるMultiHead AttentionのどのパラメータにLoRAを用いるかについて実験を元に考察が行われています。LoRA論文では$1{,}750$億のパラメータ数で構成されるGPT-$3$に対し、LoRAで用いるパラメータ数を$1{,}800$万とする条件下で実験が行われており、「$r=8$で$W_q, W_k, W_v, W_o$をどれか$1$つだけ用いるパターン」と「$r=4$かつ$2$つのパラメータを用いるパターン」、「$r=2$かつ$4$つ全てのパラメータを学習させるパターン」についてそれぞれパフォーマンスが計測されます。$1{,}800$万は$96 \times 12288 \times 8 \times 2 = 18{,}874{,}368$に基づきます。

LoRA論文 Table$\, 5$

上記の表より、$r$を大きくするよりFine-Tuning対象のパラメータを増やすのが有力であるということが確認できます。この結果から、それほど複雑でないFine-Tuningタスクでは行列のランクが小さくても十分であると見なすことができます3

また、$W_q, W_k, W_v$の学習にあたっては、一般的なMultiHead Attentionの処理はヘッド毎にパラメータ行列を計算するように立式される一方で、$D \times D$のパラメータ行列で計算した後に分割する演算で表すこともできます。このような点に基づいてMultiHead AttentionにおけるLoRAでは$D \times D$を$D \times r$と$r \times D$で分割し、学習を行うことが可能です。

  1. LoRAではFine-Tuning時にパラメータ$W$をUpdateするのではなく初期値が$0$の$\Delta W$に蓄積させるような処理が行われるので、学習前の$\Delta W$が零行列となるように初期値を設定する必要があります。 ↩︎
  2. MLPと見なせるかではなく、処理にパラメータ行列の積の演算が含まれるかで判断するのがシンプルで良いと思います。 ↩︎
  3. LoRA論文では$r=2$でも十分であったのはタスクが簡単であったからと推察されており、たとえば多言語が前提となる場合は$r=2$では十分でない可能性があると記載されています。 ↩︎

GELU(Gaussian Error Linear Unit)の数式とグラフの描画

近年様々なタスクに用いられるTransformer処理では活性化関数にGELU(Gaussian Error Linear Unit)が用いられることが多いです。当記事ではGELUの数式の確認と、Pythonを用いたグラフの描画を行いました。
当記事の作成にあたっては、GELU論文や「深層学習 第$2$版」の第$2$章「ネットワークの基本構造」の内容などを参考にしました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

GELUの数式

標準正規分布の累積分布関数

GELU(Gaussian Error Linear Unit)の数式には標準正規分布$\mathcal{N}(0,1)$の累積分布関数が用いられます。標準正規分布の確率密度関数を$\phi(x)$、累積分布関数を$\Phi(x)$とおくとき、$\phi(x), \Phi(x)$はそれぞれ下記のように表されます。
$$
\large
\begin{align}
\phi(x) &= \frac{1}{\sqrt{2 \pi}} \exp{ \left( \frac{x^{2}}{2} \right) } \\
\Phi(x) &= \int_{-\infty}^{x} \phi(t) dt
\end{align}
$$

GELUの数式

前項で確認を行った標準正規分布の累積分布関数$\Phi(x)$を元にGELUの数式$\mathrm{GELU}(x)$は下記のように定義されます。
$$
\large
\begin{align}
\mathrm{GELU}(x) = x \Phi(x)
\end{align}
$$

GELUの微分

$\mathrm{GELU}(x) = x \Phi(x)$は下記のように計算することができます。
$$
\large
\begin{align}
\frac{d}{dx} \mathrm{GELU}(x) &= \frac{d}{dx} (x \Phi(x)) \\
&= \Phi(x) + x \cdot \frac{d}{dx} \Phi(x) \\
&= \Phi(x) + x \phi(x) \quad (1)
\end{align}
$$

GELUのグラフの描画

ReLUとGELUのグラフは下記を実行することで行うことができます。

import numpy as np
from scipy import stats

import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme()

x = np.arange(-2.5, 2.51, 0.01)

y_relu = np.maximum(0, x)
y_gelu = x * stats.norm.cdf(x)

plt.plot(x, y_relu, label="ReLU")
plt.plot(x, y_gelu, label="GELU")

plt.legend()
plt.show()

・実行結果

上記のGELUの理解にあたっては、下記を実行するとわかりやすいと思います。

x = np.arange(-1., 2., 0.01)

y = x
y_gelu = x * stats.norm.cdf(x)

plt.plot(x, y, label="ReLU")
plt.plot(x, y_gelu, label="GELU")

plt.plot(x, np.zeros(x.shape[0]), "k--")

print("Phi(-1): {:.2f}".format(stats.norm.cdf(-1)))
print("Phi(1): {:.2f}".format(stats.norm.cdf(1)))
print("Phi(2): {:.2f}".format(stats.norm.cdf(2)))

plt.legend()
plt.show()

・実行結果

$\Phi(-1)=0.16, \, \Phi(1)=0.84, \, \Phi(2)=0.98$のような値が得られた一方で、$x=-1$ではオレンジが青のおおよそ$0.16$倍、$x=1$ではオレンジが青のおおよそ$0.84$倍、$x=2$ではオレンジが青のおおよそ$0.98$倍であることがそれぞれ確認できます。

また、$x=0$で微分を行うことのできないReLUに対し、GELUでは微分を行うことが可能です。前節の$(1)$式に基づいてGELUの$x=0$における接線は下記のように描画することができます。

x = np.arange(-1., 2., 0.01)

y_gelu = x * stats.norm.cdf(x)
y_tangent = stats.norm.cdf(0) * x

plt.plot(x, y_gelu, label="GELU")
plt.plot(x, y_tangent, label="tangent_line")

plt.plot([0], [0], "go")

plt.legend()
plt.show()

・実行結果

参考

・GELU論文

【SETR論文まとめ】Transformerを用いたSemantic Segmentation

Segmentationタスクには従来VGGNetやResNetなどのCNNをbackboneに持つネットワークを用いることが主流であった一方で、近年Transformerの導入も行われています。当記事ではSemantic SegmentationにTransformerを導入した研究であるSETRについて取りまとめました。
SETRの論文である「Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers」の内容を参考に作成を行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

前提の確認

Transformerの概要

Dot Product Attentionに主に基づくTransformerの仕組みについては既知である前提で当記事はまとめました。下記などに解説コンテンツを作成しましたので、合わせて参照ください。

・直感的に理解するTransformerの仕組み(統計の森作成)

ViT

SETR

処理の概要

SETR(Segmentation TRansformer)の処理の概要は下図より確認できます。

SETR論文 Figure$\, 1$

上図の$(\mathrm{a})$より、SETRにおける処理の全体像が確認できます。基本的な処理構造はTransformer・ViTと同様な構成です。一方、DecoderではSegmentationタスク用の処理が行われており、$(\mathrm{b})$ではDecoderにおける基本処理、$(\mathrm{c})$ではmulti-level feature aggregationを用いたDecoderの処理の改良(SETR-MLA)についてそれぞれ図解されています。以下、それぞれについて詳しく確認を行います。

Transformerへの入力の用意

入力が$x \in \mathbb{R}^{H \times W \times 3}$のように得られるとき、ピクセル単位でTransformerの処理を行うとTransformerの系列の長さが$500 \times 500 \times 3 = 750{,}000$のように大変大きな値になります1

そこでSETRではViTなどに同じく、$16 \times 16$ピクセルを$1$つのパッチと見なし、Linear Projectionなどを行うことで$x_{f} \in \mathbb{R}^{\frac{H}{16} \times \frac{W}{16} \times C}$のようなTransformerへの入力を作成します。

ここで行われているLinear Projection処理には「CvTで用いられる畳み込み」や「SegFormerで用いられるOverlapped Patch Merging」のような改良が考案されているので、合わせて確認しておくと良いと思います。

基本的なUpsamplingの概要

Transformerの出力のFeature mapが$\displaystyle Z^{L_{e}} \in \mathbb{R}^{\frac{HW}{256} \times C}$のように表されるとき、セグメンテーションを行うにあたってFeature mapを$\displaystyle Z’ \in \mathbb{R}^{\frac{H}{16} \times \frac{W}{16} \times C}$のような形式に変形を行います。

基本的な手法ではカテゴリ数を$K$とするとき$\displaystyle Z’ \in \mathbb{R}^{\frac{H}{16} \times \frac{W}{16} \times C}$を$\displaystyle \frac{H}{16} \times \frac{W}{16} \times K$に変形し、その後にUpsamplingを行いピクセル単位の分類を行います2

Progressive Upsampling

前項のようにUpsamplingを一度に行う手法はノイズが多い予測となり得ることから、SETRでは段階的なアップサンプリング(PUP; Progressive UPsampling)が主に用いられます。

SETR論文 Figure$\, 1 \, (\mathrm{b})$

PUPでは上図のように$2$倍を$4$回行うことで$\displaystyle \frac{H}{16} \times \frac{W}{16}$を$H \times W$に変換します。このようなDecoderを用いる場合を、SETR論文ではSETR-PUPのように表します。

Multi-Level feature Aggregation

SETR論文ではFPN(Feature Pyramid Network)のように段階的に特徴マップを採用して用いるという手法も検討されています。
$$
\large
\begin{align}
\{ Z^{1}, Z^{2}, \cdots , Z^{L_e} \}
\end{align}
$$

上記のようにTransformerの各層のfeature mapが表される際に$M$個のレイヤーを用いて推論を行う場合、下記のように表されるレイヤーの集合$\{ Z^{m} \}$を用いてMulti-Level feature Aggregation(MLA)の処理が行われます。
$$
\large
\begin{align}
\{ Z^{m} \}, \quad m \in \left\{ \frac{L^{e}}{M}, 2 \frac{L^{e}}{M}, \cdots , M \frac{L^{e}}{M} \right\}
\end{align}
$$

たとえば$L_e=12, M=3$の時は$\{ Z^{3}, Z^{6}, Z^{9}, Z^{12} \}$を用いてMulti-Level feature Aggregationが行われます。このようにMLAに基づくDecoderを用いる場合を、SETR論文ではSETR-MLAのように表します。

SETR論文 Table$\, 2$

上記がSETR論文におけるパフォーマンスの表です。基本的にはSETR-PUPのパフォーマンスが良いことが確認できます。

SETR-MLAのパフォーマンスがそれほどよくない点についてはそもそもFPNの利点である「ダウンサンプリングによって解像度が低くなる前のfeature mapを反映させられる点」が実現できていないというのにあるのではないかと思います。

SETRが出たタイミングがViTと同時であるので、MLAの改良にあたってはその少し後に取り組まれた階層型のViTに基づく手法であるSegFormerに着目すると良いと思います。

参考

・Transformer論文
・SETR論文

  1. Transformerのデフォルトは$512$であり、Attentionの計算が原理的には$N^{2}$に比例することから$750{,}000$をそのまま取り扱うと計算量がボトルネックになります。 ↩︎
  2. Cityscapesを用いる場合、$K=19$であるので$19$クラス分類が行われます。 ↩︎

【Grad-CAM論文まとめ】勾配計算に基づいた予測に寄与する中間層の可視化

クラス活性マッピング(CAM; Class Activation Mapping)はDeepLearningにおける予測に寄与した領域の可視化を行う際に用いる手法です。当記事では特定のネットワーク構造でしか用いることのできないCAMを一般的に用いれるように拡張を行ったGrad-CAMについて取りまとめました。
Grad-CAMの論文である「Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization」や「深層学習 第$2$版」第$9$章「説明と可視化」の内容を参考に作成を行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

前提の確認

クラス活性マッピング

クラス活性マッピング(CAM; Class Activation Mapping)の最もシンプルな例には、下記のようなCNN構造を持つ場合が挙げられます。

(最終畳み込み層、ReLUが活性化関数)$\, \longrightarrow \,$(大域平均プーリング(GAP)層)$\, \longrightarrow \,$(ソフトマックス関数)$\, \longrightarrow \,$(クラススコア)

上記のような場合、最終畳み込み層の出力のFeature mapを$A \in \mathbb{R}^{H \times W \times C}$とすると、ReLUによって$Z$の全ての成分について$A_{ijc} \geq 0$が成立することからFeature mapのチャネル方向の$k$番目を$A_{k} \in \mathbb{R}^{H \times W}$とおくと、$A_{k}$の平均がソフトマックス関数の入力となります。よって、$A_{k}$の可視化を行うことでクラス$k$の分類にどの領域が寄与しているかの確認ができます。

また、CAMは下記のようなネットワーク構造を持つ場合も行うことができます。

(最終畳み込み層、ReLUが活性化関数)$\, \longrightarrow \,$(GAP層)$\, \longrightarrow \,$($1$層の全結合層)$\, \longrightarrow \,$(ソフトマックス関数)$\, \longrightarrow \,$(クラススコア)

上記のようなネットワークの場合、チャネル$c$からクラス$k \in \{ 1, 2, \cdots , K \}$への全結合層のパラメータを$w_{ck}$とおくと、クラス$k$についてのクラス活性$L_{\mathrm{CAM}}^{k}$は下記のように計算できます1
$$
\large
\begin{align}
L_{\mathrm{CAM}}^{k} = \sum_{c=1}^{C} w_{ck} Z_{c}
\end{align}
$$

Grad-CAM

Grad-CAMの概要・数式

Grad-CAMの処理の全体像は下図を元に掴むと良いです。

Grad-CAM論文 Figure$\, 2$

Grad-CAMに基づくクラス$k$のクラス活性$L_{\mathrm{Grad-CAM}}^{k} \in \mathbb{R}^{H \times W}$はFeature mapの$A^{c}, \, c = 1, \cdots C$、クラス$k \in \{ 1, 2, \cdots , K \}$のソフトマックスへの入力値$y^{k}$を元に下記のように定義されます。
$$
\large
\begin{align}
L_{\mathrm{Grad-CAM}}^{k} &= \mathrm{ReLU} \left( \sum_{c=1}^{C} \alpha_{c}^{k} A^{c} \right) \\
\alpha_{c}^{k} &= \frac{1}{HW} \sum_{i=1}^{H} \sum_{j=1}^{W} \frac{\partial y^{k}}{\partial A_{ij}^{c}}
\end{align}
$$

Grad-CAMは上記のように偏微分の計算に基づいてCAM(Class Activation Mapping)の一般化を行う手法です。

参考

・Grad-CAM

  1. Grad-CAMの論文ではFeature mapのインデックスが$k$、クラス分類のインデックスが$c$で表されますが、「$K$クラス分類問題」や「チャネル数$C$」などのように表されることが多いので当記事では逆に用いました。 ↩︎

【SimCSE】対照学習(Contrastive Learning)に基づくベクトル表現の取得②

SimCSE(Simple Contrastive Learning of Sentence Embeddings)は対照学習(Contrastive Learning)を用いてテキストのベクトル表現を抽出する手法です。当記事ではSimCSEの一連の学習手順について取りまとめを行いました。
SimCLRの論文の「SimCSE: Simple Contrastive Learning of Sentence Embeddings」を参考に作成を行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

前提の確認

指示関数

指示関数(indicator function)の$\mathbb{1}_{[k \neq i]} \in \{ 0, 1 \}$は下記のように定義されます。
$$
\large
\mathbb{1}_{[k \neq i]} =
\begin{cases}
1 \quad \mathrm{if} \quad k \neq i \\
0 \quad \mathrm{otherwise}
\end{cases}
$$

SimCLR

SimCSEはSimCLRと同様に対照学習(Contrastive Learning)という枠組みに基づいて学習が行われます。SimCLRについては下記で詳しく取り扱いました。

SimCSE

SimCSEの全容

SimCSEの全容は下記を元に掴むと良いです。

SimCSE論文 Figure$\, 1$

SimCSEは「教師なしCSE(Unsupervised CSE)」と「教師ありCSE(Supervised CSE)」の二つに大別され、上図の$(\mathrm{a})$が教師なしCSE、$(\mathrm{b})$が教師ありCSEにそれぞれ対応します。

次項次々項でUnsupervised CSEとSupervised CSEについて詳しく確認を行います。

Unsupervised CSE

Unsupervised CSEでは同じ入力テキスト$x_i$をTransformerに$2$度入力し、FFN層で$2$種類のDropout maskの$z_i, z_i’$を作用させることで$2$種類のembeddingである$h_{i}^{z_{i}}, h_{i}^{z_{i}’}$を取得し、学習を行います。

学習にあたっては、SimCLRと同様に入力$x_i$について下記のようなlossの$l_i$を定義し、lossが最小になるようにパラメータの学習を行います。
$$
\large
\begin{align}
l_i &= -\log{ \frac{e^{\mathrm{sim}}(h_{i}^{z_{i}}, h_{i}^{z_{i}’})/\tau}{\sum_{j=1}^{N} e^{\mathrm{sim}}(h_{i}^{z_{i}}, h_{j}^{z_{j}’})/\tau} }
\end{align}
$$

SimSCEではハイパーパラメータであるDropout rateの$p$のデフォルト値が$p=0.1$とされることも合わせて抑えておくと良いです。

Supervised CSE

Supervised CSEではNLI(Natural Language Inference)のデータセットが用いられます。NLIでは対象の一文に対し、絶対的に正しい(entailment)、正しいかもしれない(neutral)、明確に正しくない(contradiction)の$3$つが与えられます。

Supervised CSEでは入力$x_i$に対し、entailmentを正例$x_i^{+}$、contradictionを負例$x_i^{-}$と見なし下記のように定義されるlossの$l_i$を最小化するように学習を行います。
$$
\large
\begin{align}
l_i &= -\log{ \frac{e^{\mathrm{sim}}(h_{i}, h_{i}^{+})/\tau}{\sum_{j=1}^{N} \left( e^{\mathrm{sim}(h_{i}, h_{j}^{+})/\tau} + e^{\mathrm{sim}(h_{i}, h_{j}^{-})/\tau} \right)} }
\end{align}
$$

参考

・SimCLR論文
・SimCSE論文

二部グラフ(bipartite graph)に基づくCross Attentionの解釈

TransformerのSelf-Attentionはグラフニューラルネットワーク(GNN)を元に理解することができます。当記事では二部グラフ(bipartite graph)に基づくTransformerのCross-Attentionの理解にあたって取りまとめを作成しました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

前提の確認

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

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

二部グラフ

グラフ理論における$2$部グラフ(bipartite graph)は「頂点集合を$2$つに分割して各部分の頂点は互いに隣接しないようにできるグラフ1」のことです。

$2$部グラフ①:英語版Wikipedia Bipartite graphより

上図のように$2$部グラフでは頂点集合を「赤」と「青」の$2$つに分割し、それぞれのノード間をエッジで連結します。上図のグラフは下図のように表すこともできます。

$2$部グラフ②:英語版Wikipedia Bipartite graphより

上図のような表し方に基づいて、「赤と青のそれぞれのノードが交互に出てくるグラフ」のように$2$部グラフを解釈することも可能です。また、赤と青の全てのノードの組み合わせをエッジで連結したグラフを完全$2$部グラフ(complete bipartite graph)といいます。

完全$2$部グラフ:英語版Wikipedia Bipartite graphより

完全$2$部グラフは上図のように表すことができます。上図のように$2$部グラフ・完全$2$部グラフでは$2$つのノード集合の要素数が一致しない場合があります。DeepLearningではMLP(Multi Layer Perceptron)の層間の計算を表した図が完全$2$部グラフに対応することは抑えておくと良いです。

当記事でのメインテーマであるTransformerにおけるCross-Attentionも完全$2$部グラフで表すことができることを次節で確認を行います。

$2$部グラフとCross-Attentionの解釈

Cross-Attentionの概要

Transformer論文におけるCross-Attention: Transformer論文Figure$\, 1$を改変

上図の赤枠で示すようにTransformerのDecoderではEncoderからの出力をKey・Value、Decoderへの入力をQueryとするCross-Attentionの処理が行われます。Cross-Attentionの名称は下記などを参考にしました2

A Survey of Transformers.のSection$2.1$ Vanilla Transformerより

Cross-AttentionはQuery・Key・Valueの用意の仕方がSelf-Attentionと異なる一方で、計算自体は同様なので、それぞれを$Q, K, V$と表すとき下記のような式でCross-Attentionの処理を表すことができます。
$$
\large
\begin{align}
\mathrm{CrossAttention}(Q, K, V) &= \mathrm{softmax} \left( \frac{Q K^{\mathrm{T}}}{\sqrt{d}} \right) V \quad (1) \\
Q & \neq K = V
\end{align}
$$

$2$部グラフとCross-Attentionの対応と処理の解釈

Cross-AttentionはQueryを$1$つ目のノード集合、Key・Valueを$2$つ目のノード集合とする完全$2$部グラフを元に表すことができます。

Cross-Attentionと完全$2$部グラフ:英語版Wikipedia Bipartite graphの図を改変

たとえば上図のように「青」のノード集合をQuery、「赤」のノード集合をKey・Valueに対応させ、それぞれのノード間の類似度を計算し、重み付け和を計算することで$(1)$式で表されるCross-Attentionと同様の計算を行うことができます。

TransformerのDecoderにおけるCross-Attention

TransformerのDecoderではCross-AttentionによってDecoderへのそれぞれの入力についてEncoderの出力を反映させます。このような処理に基づいて機械翻訳などに用いられる系列変換タスクや文章生成などを実現することができます。

Key・Valueのダウンサンプリングと計算の軽量化

Cross-AttentionではQueryとKey・Valueが一致する必要がないことから、Key・Valueのノードの数を削減し、計算の軽量化を実現することが可能です。たとえばPVTにおけるSpatial Reduction Attention(SRA)やSegFormerにおけるEfficient Self-Attentionなどが軽量化の例です。

Spatial Reduction Attention(SRA)やEfficient Self-Attentionでは隣接するViTのパッチが局所相関を持つことから局所領域でパッチを連結したものをKey・Valueと見なす手法です。このような処理を行うことでViTの計算量を抑えることが可能になります。

参考

・Transformer論文
・$2$部グラフ:Wikipedia
・Bipartite graph:Wikipedia

  1. Wikipediaの$2$部グラフの記載を引用 ↩︎
  2. Transformerのオリジナルの論文「Attention Is All You Need」ではCross-Attentionという名称は出てきませんが、Self-Attentionと分けて理解するにあたって何らかの名称があると良いので当記事ではSurvey論文を参考にCross-Attentionを用いました。 ↩︎