처음 딥러닝을 공부하고 텐서플로우를 배울 때 가장 먼저 든 생각은 "'텐서(Tensor)'가 뭐지?" 였다. '텐서플로우(Tensorflow)'라는 이름도 텐서의 연산 그래프를 계산하는 것에서 착안됐다는 이야기를 들었으니 자연스레 궁금해졌다. 하지만 검색해도 '벡터나 행렬같은 데이터를 하나로 아우르는 값'이라고만 설명하고, 수학적 정의는 이해하기가 어려웠다. 무엇보다도 텐서가 무엇인지 몰라도 텐서플로우를 쓰는데 문제가 없다는 것 때문에 나 또한 그렇게 받아들였다.
하지만 문득 CS182 강의를 정리하다가 3차원 텐서와 4차원 텐서를 행렬곱하는 과정을 보자 사글아들었던 궁금증이 다시 돌아왔다. 그래도 이번엔 텐서 연산은 많이 써왔으니 암묵적으로라도 이해하지 않을까 싶었다.
우리가 사용하는 데이터는 모두 텐서다
텐서를 매우 간단하게 설명하자면 단순한 '배열' 이다. 단순히 하나의 값인 스칼라부터, 한 레이블의 값을 담는 벡터, 선형 레이어의 가중치인 행렬, 이미지나 소리 데이터까지 모두 배열이라는 자료구조를 통해 표현하고 저장할 수 있다. 우리는 데이터의 차원수에 따라 스칼라, 벡터, 행렬과 같은 다른 이름을 붙이지만 배열은 0차원부터 4차원, 또 더 큰 고차원까지 배열이라는 동일한 구조 하에 다룰 수 있다.
컴퓨터 구조에서는 배열이지만, 그렇다면 수학에서는 어떨까? 수학에도 '배열'과 비슷한 성질을 가진 자료형이 존재한다. 그것이 '텐서'다. 텐서 또한 스칼라, 벡터, 행렬을 하나의 텐서로 표현할 수 있다. 또한 어떤 고차원 데이터도 가능하다.
텐서는 선형대수의 거의 모든 연산을 사용할 수 있다
하지만 구조만 나타낼 수 있어서는 안된다. 우리는 이러한 데이터를 저장만 하지 않는다. 다양한 연산으로 그래디언트를 구해 가중치를 업데이트하고 데이터를 분석한다. 그렇다면 배열과 텐서 모두 벡터와 행렬의 연산을 사용할 수 있어야 할 것이다.
일단 배열은 인덱싱을 통해 벡터와 행렬 연산을 흉내낼 수 있다. 벡터와 행렬의 연산 모두 본인들이 가진 요소들의 스칼라 연산을 통해 정의되므로 배열은 인덱싱으로 요소를 가져오는 방식으로 스칼라 연산을 수행한다. 심지어 이제는 벡터 연산이 CPU에서 기본으로 제공되고 GPU 또한 행렬 연산에 필요한 스칼라 계산를을 한번에 수행할 수 있다.
텐서 또한 배열처럼 인덱싱을 통해 벡터와 행렬 연산을 수행할 수 있다. 오히려 행렬곱처럼 고차원 텐서로까지 연산을 확장할 수도 있다. 어떻게 가능한지 텐서 표현부터 차근차근 알아보자.
먼저, 간단하게 텐서를 표현하는 방법을 알아보자.
$$
A_{ijk}
$$
위의 식은 i,j,k 축을 가진 3차원 텐서 A를 나타낸 것이다. 이는 행렬도 비슷하게 표현하니 익숙할 것이다. 만약 5차원이면 더 늘려서
$$
B_{ijklm}
$$
처럼 단순하게 표현하면 된다. 이제 저 차원 표기에 숫자를 넣으면 인덱싱이 되는 것이다.
이제 행렬 곱을 표현해보자. 행렬곱은 다음과 같이 정의된다.
$$
(A\cdot B)_{ij} = \sum_{k=1}^na_{ik}b_{kj}
$$
그리고 2차원 텐서 두개의 행렬곱은 이렇게 표현한다.
$$
(A\cdot B)_{ij} = \sum_kA_{ik}B_{kj}
$$
정말 별 차이가 없다. 심지어 의미도 같다. 텐서에서는 위의 연산이 같은 길이의 차원을 하나로 합쳐 줄인다고 해서 '텐서 축소' 연산이라고 부른다.
그런데 아까 텐서에서는 행렬곱을 고차원으로 확장할 수 있다고 했다. 이는 다음과 같이 사용할 수 있다.
$$
C_{i_1i_2…i_pj_1j_2…j_q}=\sum_kA_{i_1i_2…i_pk}B_{kj_1j_2…j_q}
$$
결론
- 컴퓨터에서는 배열, 수학에서는 텐서
- 스칼라, 벡터, 행렬 등 다른 자료형의 연산을 텐서가 모두 아우를 수 있다.
- 즉, 다른 자료형의 연산이 아니라 모두 같은 자료형의 연산으로 표현하기 위해 텐서를 사용했다.
생각보다 특별한 이유는 없었다. 머신러닝에서 다루는 다양한 자료 타입과 연산을 동일한 타입으로 표현하기 위해 수학의 텐서를 사용한 것이라 볼 수 있다.
다만, 텐서가 구조에 비해 단순한 자료형은 아닌것으로 보인다. 위키피디아에서는 기울기 또한 텐서 자료형으로 표현할 수 있고, 텐서 자체도 곡면에 대한 미분 기하학에서 시작했다고 하는걸 보면 단순히 어떤 데이터만 나타낼 수 있는건 아닌듯 하다. 다만 이를 정확히 이해하려면 쌍대공간을 이해해야 하는데, 이는 시간이 더 많이 필요해 보인다. 적어도 텐서플로우의 텐서가 왜 쓰였는지는 알 수 있어서 이정도로 만족한다.