データサイエンティストならいつの間にか知っているグラム行列【これでAttentionも理解できる】

相関係数（共分散行列）やコサイン類似度の行列などの距離を一般化したようなものがグラム行列である。

# グラム行列の定義
### 簡単な定義
```math
G = \left(
\begin{array}{ccccc}
v_{1} * v_{1} & \cdots & v_{n} * v_{1} \\
\vdots & \ddots & \vdots  \\
v_{1} * v_{n} & \cdots & v_{n} * v_{n} 
\end{array}
\right)
```

$v$は数ベクトルを示す。
$v * v$は内積を示す。
つまり、グラム行列全体は内積で構成された行列となる。


### グラム行列を分解すると
またグラム行列は以下のように分解できる。
```math

A = \left(
\begin{array} 
(v_1 \\ 
v_2 \\ 
\cdots \\
v_n 
\end{array}
\right)とするとき

```

```math
G = A  A^T
```

$A$は数ベクトル$v$が複数集まって構成された行列である。**別の言い方をすると$A$は数ベクトルをカラムと見立てた時のデータセットである**。
データセットとデータセットの転置したものを掛け算したものがグラム行列となる。

### 内積について
ここで内積について復習する。
```math
\displaylines{
a = (a_1, a_2) \\
b = (b_1, b_2) \\
とベクトルaとbを定義する
}
```
この時
```math
a_1 \times b_1 + a_2 \times b_2 = a * b(=内積)
```
つまり数ベクトルの各要素を掛け合い、それを合算したものが内積である。

また内積は次のようにも表現できる。
```math
a * b = |a|\times|b|\times cos(\theta)
```
この時、
```math
\displaylines{
|a|=\sqrt{a_1^2 + a_2^2} \\
でありこれは数ベクトルの大きさを示す。
}
```

つまり、内積とはみんな大好きコサイン類似度に定数を掛けたものであり、別の言い方をするとベクトル同士の関連度合いを内包している。

最後にグラム行列に戻ると、各要素はカラム(数ベクトル)同士の内積で表現されており、全カラムの組み合わせを網羅している。そして、それはとても簡単に計算できる。具体的はデータセットとそれ自身を転置したものを掛け算するだけである。そうすると各カラム同士の関係性を一気に取得できる




# グラム行列と分散共分散行列
共分散について確認する。
```math
Cov(v_i, v_j) = E[v_i * v_j] - \mu_i \mu_j
```
この時、各変数$v_{n}$を各平均$\mu_n$で引き算し、センタリングする。

すると$\mu_n=0$となるため、上記の右辺の第２項がなくなります。期待値の式を定義通りに解体すると
```math
Cov(v_i, v_j) = E[v_i * v_j] = \frac{1}{N}\sum_{r=1}^N v_{ir} \times v_{jr}
```
$\sum$部分の計算はベクトルの内積の計算式と同じになるので
```math
Cov(v_i, v_j) = \frac{1}{N}v_i * v_r 
```
となる。

データセットの各カラムでセンタリングし、データセットを転置したもの自身と掛け算した後、サンプル数で割り算すると
```math
\frac{1}{N}A * A^T = \frac{1}{N}G
```
となる。

分散共分散行列と相関行列はほとんど似ているから相関行列とグラム行列の関係は省略するで

https://manabitimes.jp/math/1294

# グラム行列とコサイン類似度
内積は以下のように展開できます
```math
v_i * v_j = |v_i| \times |v_j| \times cos(\theta)
```

従って、各$v_n$の$|v_n|$を計算し（L2ノルムを計算することと同義）、あらかじめ割ったもの同士の内積を計算するとコサイン類似度が計算できます。

```math
\displaylines{
Z = \frac{A}{|A|} \\
C = ZZ^T
}
```
この時$|A|$は各ベクトルのノルムを格納したベクトル

# Attention
Transfomerの内部の機構の1つであるAttentionもグラム行列で説明することができます。

Attentionの式は以下になります。
```math
softmax(\frac{QK^T}{s})V
```
AttentionはKeyとQuery、Valueで構成されますが、これらは要するに何らかの値が入った行列です。sはスケーリングするための定数です。

AttentionはSelf-AttentionとCross-Attentionの２種類があります。
まずSelf-Attenionについて説明します。

### Self-Attention
Self-AttentionではKはQの行列を転置したもの、VはQの値そのものです。
従って、Self-Attentionは以下の式のように書き換えられます。
```math
softmax(\frac{QQ^T}{s})Q
```
ここでグラム行列$QQ^T$がありますね。つまり、Self-Attentionでは自らの値との類似度を計算していることになります。自身との類似度計算後、Softmax関数により正規化し、同じ行列$Q$を掛けることで、自身のどの部分の値を強調するのかを計算していることになります。

### Cross-Attention
StableDiffusionではQは画像情報、KとVはテキスト情報などの条件付けの情報となります。
従って、$QとK^T$の掛け算では画像と条件付けの類似度のようなものを計算し、VにSoftmax関数で正規化した値を掛けることで、条件付けと画像情報がしっかりと関連した画像が生成されるという仕組みになります。



# 参考文献
グラム行列の定義と性質について；

https://mathlandscape.com/gram-matrix/#:~:text=%E3%82%B0%E3%83%A9%E3%83%A0%E8%A1%8C%E5%88%97%E3%81%A8%E3%81%AF%EF%BC%8C%20(%20i,%E3%81%AA%E3%82%8B%E8%A1%8C%E5%88%97%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82

相関行列の定義と分散共分散行列との関係：

https://manabitimes.jp/math/1294

統計学や機械学習で使われる分散共分散行列、相関行列とグラム行列の関係：

https://blog.shikoan.com/cov-corr-gram-matrix/#%E5%B9%B3%E5%9D%87%E3%81%A7%E5%BC%95%E3%81%8B%E3%82%8C%E3%81%A6%E3%81%84%E3%81%9F%E3%82%89%E3%80%81%E5%88%86%E6%95%A3%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%EF%BC%9D%E3%82%B0%E3%83%A9%E3%83%A0%E8%A1%8C%E5%88%97%E3%81%AE%E6%9C%9F%E5%BE%85%E5%80%A4

AIアートの新時代（著：koshian2）：

https://www.amazon.co.jp/AI%E3%82%A2%E3%83%BC%E3%83%88%E3%81%AE%E6%96%B0%E6%99%82%E4%BB%A3-CLIP%E3%81%A8Stable-Diffusion%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E7%94%BB%E5%83%8F%E7%94%9F%E6%88%90%E6%8A%80%E8%A1%93%E3%81%A8%E3%81%9D%E3%81%AE%E5%BF%9C%E7%94%A8-koshian2/dp/B0C87VKZT5