저와 비슷한 지식의 오류를 가진 이들을 위해 다소 장황한 이야기를 적습니다.
이 단락은 뛰어넘으셔도 좋습니다.
이 사건은 저의 무지와 대한수학회의 부적절한 용어 선정으로 인해 시작되었습니다.

수학을 멀리한 저는 벡터간 연산을 내적, 외적 크게 두 갈래로 이해하고 (+인자간 연산), 내적과 외적은 같은 연산이 여러 이름을 가지고 있다고 알고 있었습니다. 그런데 numpy의 vectorization을 연습하는 과정에서 마주친 numpy.outer() 연산이 제가 알고 있는 그 외적이 아니더군요.
간혹 machine learning 관련 글을 읽으며 나오는 outer product를 머릿속에서 cross product로 상상하며 이해해 왔기 때문에 충격이 적지 않았습니다.
내가 알던 외적 = Cross Product, numpy.cross(). 결과물 = vector.
$
\begin{equation}\mathbf{a} \times \mathbf{b} = \begin{bmatrix}\mathbf{i}&\mathbf{j}&\mathbf{k} \\a_{1}&a_{2}&a_{3} \\b_{1}&b_{2}&b_{3} \\\end{bmatrix} = (a_{2}b_{3}-a_{3}b_{2})\mathbf{i} + (a_{3}b_{1}-a_{1}b_{3})\mathbf{j} + (a_{1}b_{2}-a_{2}b_{1})\mathbf{k}\end{equation}
$
처음 본 외적 = Outer Product, numpy.outer(). 결과물 = matrix.
$
\begin{equation}\mathbf{a} \otimes \mathbf{b} = \mathbf{a}\mathbf{b}^\top = \begin{bmatrix}a_{1}\\a_{2}\\a_{3}\end{bmatrix}\begin{bmatrix}b_{1}&b_{2}&b_{3}\end{bmatrix}=\begin{bmatrix}a_{1}b_{1}&a_{1}b_{2}&a_{1}b_{3}\\a_{2}b_{1}&a_{2}b_{2}&a_{2}b_{3}\\a_{3}b_{1}&a_{3}b_{2}&a_{3}b_{3}\\ \end{bmatrix}\end{equation}
$
그리고 대한수학회에서는 서로 다른 이 둘을 모두 외적으로 번역하고 있습니다.
"왜 다른 연산을 같은 이름으로 부르지? 내가 알고 있던 건 뭐지?" 라는 멘탈 데미지를 입고 wikipedia를 중심으로 구글링을 한 결과, 사실은 둘이 같은 것이라는 설명을 보고 2차 데미지를 입습니다.
- 딥러닝하는 의사님께서 친절한 설명을 주셨습니다.
Cross Product와Outer Product는 비슷하지만 본질적으로 다르다고 합니다.
- 그 외 아래 레퍼런스를 참고했습니다.
jjycjn's Math Storehouse
MATH3MA
StackExchange Mathematics
Wolfram Mathworld
YBIGTA님 github
Cross Product를 일반화하면 Exterior Product가 됩니다. (Euclidean → non-Euclidean)Outer Product는 두 vector의 Tensor Product를 행렬로 표현한 것입니다. Tensor Product와 Exterior Product를 간략히 공부해 봅시다.
Tensor Product를 사용합니다.Tensor Product 입니다.서로 다른 차원의 벡터공간들을 어떻게 합칠 수 있을까요? 선택지는 행렬밖에 없습니다.
우리가 가진 도구가 많지 않아서 발생하는 일입니다.
$V$와 $W$에 각기 $\mathbf{v} = \begin{bmatrix}v_{1}\\v_{2}\\\vdots\\v_{n}\end{bmatrix}, \mathbf{w} = \begin{bmatrix}w_{1}\\w_{2}\\\vdots\\w_{m}\end{bmatrix}$ 이라는 두 행렬이 있고, $\mathbf{v} = v_{1}\mathbf{e_{1}} + v_{2}\mathbf{e_{2}} + \cdots + v_{n}\mathbf{e_{n}}$ 일 때
$
\mathbf{v}\otimes\mathbf{w} = \begin{bmatrix}v_{1}w_{1}&v_{1}w_{2}&\cdots&v_{1}w_{m}\\v_{2}w_{1}&v_{2}w_{2}&\cdots&v_{2}w_{m}\\\vdots&\vdots&\ddots&\vdots\\v_{n}w_{1}&v_{n}w_{2}&\cdots&v_{n}w_{m}\\\end{bmatrix}
$ 으로 정의됩니다.
따라서 $\text{dim}(V\otimes W) = \text{dim}(V)\times\text{dim}(V)$ 가 됩니다.
서로 다른 벡터 두 개를 연산해야 하니 덧셈은 사실상 불가능하고, 서로 독립인 행과 열을 가진 행렬로만 표현이 가능한 것입니다.
Exterior Product의 시작점은 벡터공간 $V$와 $W$가 있을 때, 이들로부터 만들어낸 Tensor Product $V\otimes W$ 입니다.quotient이라는 개념을 이해해 봅시다. Exterior product가 quotient로 정의되기 때문입니다.mod와 같습니다. 이걸 우리는 $\text{Z/24Z}$, 또는 $\text{Z/~}$로 표기합니다. equivalence relation입니다.두 개의 vector space $\text{V}$로부터 생성되는 tensor product $V\otimes V$를 생각해 봅시다.
예를 들면, 아래와 같은 행렬들은 모두 0입니다.
$(1,2) \otimes (1, 2) = \begin{bmatrix}1&2\\2&4\end{bmatrix}= 0$
$(0,1) \otimes (0, 1) = \begin{bmatrix}0&0\\0&1\end{bmatrix}= 0$
왜 0으로 정의했나면, 넓이와 부피 때문에 그렇습니다.
exterior product는 넓이, 부피, 초부피를 의미합니다.
그리고, 직관적으로 하나의 벡터로 생성되는 도형의 부피는 0이기 때문입니다.
Alternating Albegra입니다.
Tensor Product : "두 벡터 공간의 정보를 다 가진 새로운 벡터공간을 만들고 싶다." Exterior Product : "벡터들로 이루어진 공간의 부피와 넓이를 구하고 싶다."Outer Product이고, 두 벡터로 이루어진 공간의 부피가 Cross Product입니다. outer product의 determinant는 0입니다. Style Transfer에서의 Gram Matrix¶outer product의 사용 예시로, style transfer에 적용된 gram matrix를 간단히 소개합니다. source : YBIGTA님 github 글
(1) Style Transfer

(2) Activation Maps
VGG와 같은 convolutional layers에 통과시키면, 필터 갯수만큼의 새로운 map이 나옵니다. 
(3) Correlations between channels: Gram matrix
이 matrix를 $A$라고 합시다.

channel간 correlation은 $A \otimes A = AA^{T}$로 표현할 수 있습니다.
이를 Gram matrix라고 부릅니다.

Style Image (S)의 activation map으로부터 gram matrix를 만든 것을 $G^{[l](S)}$, Generation Image(G)를 같은 방법으로 변환한 것을 $G^{[l](G)}$라고 부릅시다.
Gram matrix는 각각 S의 Style, G의 Style 정보를 담고 있다고 볼 수 있습니다. 