본문 바로가기

pytorch

[머신러닝/딥러닝] 도대체 Tensor란 무엇인가!!!

반응형

딥러닝을 공부하기 전 반드시 알아야할 Tensors!
그냥 matrix, 배열 ! 이라고 하기엔 뭔가 찜찜해서 조금 더 찾아보았다. 먼저 간단하게 tensor가 무언인가 살펴보고 Dan 교수님(?)의 유튜버의 강의로 왜 이렇게 설명되었는지 자세히 알아보았다.

 

Tensor 란?

아주 간단히 말하자면 데이터(오직 숫자로 이루어진)의 배열이다. python에는 List, JS에는 array 라고 부르는 배열! matrix!

"The Facts of the Universe"
by Lillian Lieber

Lillian lieber라는 수학자는 tensors를 우주의 진리라고 표현했다. 그만큼 중요한 tensor....
tensor는 Rank (차원)를 가지는데 이는 개발할 때 자주 본 배열, 이중배열과 동일한 개념으로 아래 표를 보면 더 쉽게 이해할 수 있다.

RANK NAME EXAMPLE
0 scalar 1
1 vector [1, 0]
2 matrix [ [1, 0], [2, 0] ]
3 3 tensor [ [[1, 0], [2, 0]], [[0, 0], [2, 0]], [[1, 1], [2, 2]]]
4 n tensor [ (n-1)-tensor , (n-1)-tensor, (n-1)-tensor ... ]


위를 이미지로 표현하면

이렇게 나타낼 수 있다 !

먼저 "좌표계"에 대해 이해를 하면 좋을 것 같다. 좌표는 사실 존재하지않지만 사람이 물리현상을 잘 이해하고 기술하기 위해 임의로 만든 것이다. 우주에는 존재하지 않지만 시간이라는 것에 따라 위치가 변하는 물리현상들을 coordinate, chart를 도입해서 이해하고 설명하기 더 쉽기 때문이다.
이러한 관점에서 tensor의 가장 큰 특징 중 하나는 어떠한 coordinate, 좌표를 선택하든 같은 설명이 가능하도록 하는 것이다. 이는 아래 자세히 살펴볼 예정이다.

간단히 정리해보면,

scalar는 0차원의 수, rank 0
: 좌표계에 관계없이 유일무이하게 정해진 숫자, 방향 표시도 없어 인덱스도 없다.

vector는 1차원의 행렬, rank 1
: 면적, area를 표현할 수 있다. 특정 좌표점(Point, Position, or Event) 이 정해져야 하고 이 좌표점에서 다른 좌표/방향으로 어떠한 빠르기/세기로 갈지 나타내는 것

* vector field 란?
: 좌표계에 관계없이 유일무이하게 manifold(space) 상의 모든 지점에 정해진 vector들을 말한다.

* One-form : (: called One-form, or Co-vector, Co-variant vector)
vector와 비슷하지만 약간은 다르지만 흔히 우리가 알고 있는 gradient의 일반화라고 생각하면 된다.
좌표점 (위치)이 바뀜에 따라 각 위치마다 정해져 있는 Scalar 값이 얼마나, 어떻게 변하는가를 나타낸다.

matrix는 2차원의 "면, area" 인 행렬, rank 2

tensor는 matrix의 연속인 3차원이 된다. rank 3

위의 개념들은 https://kipid.tistory.com/entry/Tensor kipid님의 블로그에서 배웠다. 아주 상세하고 수학적인 지식으로 Tensor를 설명하시는 엄청난 분같다 🔥

 

 

Tensors를 실제로 코드로 작성해보면

scalar

import torch

# scalar 
scalar = torch.tensor(7)
scalar   # tensor(7) 
scalar.ndim  # 0

scalar 는 torch.tensor() 매서드로 만들어낼 수 있다. 모든 tensors들은 torch.tensor()를 사용한다. 

scalar 변수를 출력하면 tensor(7)이 나오고 .ndim 매서드로 차원을 출력하면 0 이 나온다. 

 

vector

#vector

vector = torch.tensor([7,7])
vector  # tensor([7,7])
vector.ndim  # 1

vector는 1차원으로 위와 같이 나타난다. 

 

matrix

# MATRIX
MATRIX = torch.tensor([[7,8],
                       [9,10]])
MATRIX  # tensor([[ 7,  8],[ 9, 10]])

MATRIX.ndim  # 2

matrix는 2차원으로

 

tensor

# TENSOR
TENSOR = torch.tensor([[[1,2,3],
                        [4,5,6],
                        [4,2,1]]])
TENSOR  # tensor([[[1, 2, 3],
         [4, 5, 6],
         [4, 2, 1]]])
         
TENSOR.ndim  # 3

tensor는 3차원으로 나온다. 

 

 

 

tensors가 실제로 사용되는 pytorch flow

사진, text, 음성 등 데이터를 Tensors로 변환 --> 특정 알고리즘에 입력 --> output 이된 tensors 구조로 이루어진 결과물 --> 로 인간이 이해할 수 있는 언어로 변환

출처 : Youtube Daniel Bourke

 


 

Tensors again


이제 Dan 교수님(?) 🧙🏻‍♂️ 과 함께 자세히 tensor의 원리를 이해해보기! Tensor에 대해 잘 이해하려면 Tensor 객체 클래스의 구성원인 Vector의 개념을 잘 잡는 것이 필요하다고 한다.

이제 계속해서 나올 Vector component, vector는 방금 알았는데 vector component는 또 무엇인가?
components 또한 vector이며 이는 규모와 방향성을 가지고 있다. 2차원 위에 vector는 두 방향성을 가진다. 이 각각의 2차원 vector의 한 쪽을 component라고 부른다. 이 두 components는 Single two-dimensional vector와 같은 영향을 미치기 때문에 대체될 수 있다.

Vector components, 벡터 컴포넌트 직접 만들어보기

출처 : Youtube Dan Fleisch

벡터 컴포넌트가 무엇인지 알아보기위해 위에 작은 3개 작은 분필같은 것을 vector unit ( 검정색머리는 방향을 가리킴) 을 좌표에 위치시킨다. x,y 축 사이 놓인 커다란 방향성있는 나무토막은 vector 이다.

x 축 반대편에서 y축과 평행하게 불빛을 비추었을 때 생기는 그림자의 길이가 x component of the vector이다. 나무토막을 위로 각도를 더 올리면 x component는 작아지고 나무토막을 아래로 x축과 완전 평행하게 각도를 내리면 x component는 나무토막(vector)의 길이와 같아진다. 동일하게 y축 반대편에 x축과 평행하게 불빛을 비추었을 때 생기는 그림자가 y component of the vector 이다.

vector components를 또 다르게 시각화해서 볼 수 있는 방법이 있다.

Vector의 base 밑면에서 tip 끝까지 가려면 몇 개의 x-hat (or i-hat) 단위 벡터와 몇 개의 y-hat (or j-hat)단위 벡터가 필요한지 알아보면 된다. 위의 경우 4 x-hat, 3 y-hat 이 된다. z compoent는 0 이므로 오른쪽 사진과 표현할 수 있다. 큐브에 적힌 수는 길이, 바로 앞에 있는 분필모양 막대기의 검은 머리부분이 방향을 나타낸다.
오른쪽 사진의 숫자 4, 3, 0 => [4,3,0] 1차원 vector가 된다.

귀욤   column vectors

 

위의 컴포넌트를 아래처럼 바꾸면

A sub x, A sub y, A sub z

Ax, Ay, Az 가 된다. Ax 는 x-hat basis vector (바로 앞에 있는 검은머리 막대기) 에 Ay 는 y-hat basis vector 에, Az 는 z-hat basis vecor에 적용되는 component 이다.

Rank 1 Tensors : Vectors

각각의 component에 인덱스가 하나씩있다. 왜냐하면 각 컴포넌트마다 오직 하나의 방향표시기(indicator, 하나의 basis vector)가 있기 때문이다. ===> 이것이 vector를 tensors of rank 1 으로 만든다.

Rank 0 Tensor : Scalars

같은 토큰으로 scalar는 tensors of rank 0 로 간주한다.
scalars에는 방향표시기(Indicator)가 없고 그러므로 인덱스도 필요하지 않기 때문이다.

이제 더 높은 랭크의 Tensors를 살펴보자

Rank 2 Tensors

9 components + 9 sets of 2 basis vectors

이제 component에 Axx 이런식으로 두 개의 basis vectors가 붙는다.
=> tensors of rank 2 가 된다.

Rank 3 Tensors

27 components + 27 sets of 3 basis vectors

이제 Axxx , Axyx 이렇게 세개의 Sub이 있다. 그리고 그 방향에 맞게 막대기들이 놓여있다. 첫 9개의 vectors는 아래에 있는 vectors units 들을 가리키고 중간의 9개 vectors들은 오른쪽에 있는 것들을, 마지막 9개의 vectors들은 뒤에 있는 vectors를 표현하고 있다. 한 면마다 각기 다른 vectors들을 가진 것이 tensors rank 3이다.

영상으로 설명을 들으니 굉장히 큰 도움이 되었다! 한국 자막도 나와서 편하게 볼 수 있고 Dan교수님이 뭔가 설명을 쉽게 해주셔서 한번 보시길 추천드린다! (링크 아래 첨부)

The power of Tensors

지금까지 알아본 components와 basis vectors는 매우 중요하다고 한다. 이 둘의 결합이 어떻게 Tensors를 그렇게 강력하게 만들까?

The answer is this. All observers, in all reference frames, agree not on the basis vectors, not on the components, but on the combination of components and basis vectors. The reason for that is that the basis vectors transform one way between reference frames, and the components transform in just such a way so as to keep the combination of components and basis vectors the same for all observers.

기준계에 있는 모든 관찰자들이 basis vectors와 components 각각이 아닌 이 두 가지를 합한 combination에 동의한다. 그 이유는 basis vectors가 기준계 사이에서 한 방향으로 변화하고 그리고 components도 components와 basis vectors의 combination을 모든 관찰자들에게 똑같이 보여지기 위해 같은 방향으로 변화하기 때문이다.

* 기준계, reference frames : 운동이 의미를 가지기 위해서는 이 "운동"을 측정하기 위한 기준계


이러한 tensors의 특징으로 Lillian Lieber가 tensors를 "우주의 진리"라고 한 것 같다.!





Reference : https://www.youtube.com/watch?v=f5liqUk0ZTw
https://kipid.tistory.com/entry/Tensor
https://www.youtube.com/watch?v=Z_ikDlimN6A

반응형