꿈이 너무 많은 한 대학생의 공간

5. 텐서란 무엇인가요? 본문

인공지능/딥러닝 이론 및 파이썬 실습

5. 텐서란 무엇인가요?

청울울청 2020. 7. 5. 17:35

본 포스팅은 구름EDU 딥러닝 이론 및 파이썬 실습 (허민석) 을 참고하여 작성된 요약본입니다. 비전문가가 작성하였으므로 참고만 해주시길 부탁드립니다.

 

1. 텐서

 

텐서는 간단하게 말하자면 C언어의 배열이다. C언어에서 1차원, 2차원 배열이 있듯이 텐서도 여러가지 종류가 있다.

텐서의 랭크(C언어의서의 N차원 배열 에서의 N)에 따라 불리는 이름이 다르다.

 

랭크가 0이면 Scalar(스칼라) 라고 부른다. [ 1 ] 처럼 하나의 값을 가지고 있는 것을 스칼라 라고 부른다.

 

랭크가 1이면 Vector(벡터) 라고 부른다. [ 1, 2, 3 ] 처럼 스칼라보다 더 많은 값을 가지면서 같은 차원으로 이루어진 것을 벡터 라고 부른다. 스칼라와 차이점은 역시 자료의 수이다. 1차원(쉽게 말하기 위해 C언어에서의 다차원 배열 기준으로 설명한다) 배열로 이루어져 있으며 하나의 값을 가지고 있으면 스칼라, 1차원 배열이자 두 가지 이상의 값을 가지고 있으면 벡터 라고 부른다.

 

랭크가 2이면 Matrix(행렬) 이라고 부른다. [ [1, 2, 3], [4, 5, 6] ] 으로 이루어져 있으며 "2차원 배열" 이라고 불리는 형태이다. 간단히 말하자면 벡터를 여러 개 가지고 있는 것이 행렬 이라고 부른다.

 

랭크가 3이면 텐서, 혹은 3d Tensor 라고 부른다. (앞에 붙는 말 없이 텐서 라고 얘기한다면 주로 3 Tensor을 의미한다)

역시 텐서 또한 행렬을 여러 개 가지고 있는 것이다. 형태는 [ [ [1, 2] , [3, 4] ], [ [5, 6], [7, 8] ] ] 으로 이루어져 있다.

 

랭크가 3 이상부터는 랭크 뒤에 Tensor를 붙여 부른다. 즉 랭크가 4이면 4d Tensor, 6이면 6d Tensor, n이면 n d Tensor 라고 불리는 것이다.

 

이미지 출처 : https://rekt77.tistory.com/102

쉽게 얘기하자면 다음과 같다. 벡터는 1차원(1차원은 표현할 수 없지만 간단히 위와 같이 표현한다), 행렬은 2차원, 3d tensor는 3차원, 4d tensor는 4차원(4, 5, 6차원 또한 표현할 수 없기에 위와 같이 간단히 표현한다)으로 이루어져 있다.

 

2. NLP(자연어 처리)에서의 텐서

 

세 가지의 예시 문장이 있다고 가정하다.

 

hi john

 

hi james

 

hi brian

 

위 문장의 구성 요소는 각각 hi, john, james, brian 으로 이루어져 있다. 이를 Unique Word 라고 정의하고, Index를 넣어 구별하자.

 

hi는 0, john은 1, james는 2, brian은 3으로 Index를 붙이자.

 

NLP에서는 one hot encoding 라는 표기법을 사용해 문장을 표현한다. 자연어 처리와 이에 대한 표기법은 후에 설명할 것이다. 

 

one hot encoding을 사용해 각 단어를 vector 로 구성한다면 다음과 같다.

 

hi : [1, 0, 0, 0] / john : [0, 1, 0, 0] / james : [0, 0, 1, 0] / brian : [0, 0, 0, 1] 

 

위의 내용을 종합해 보면 vector의 첫 요소는 hi, 두번째 요소는 john, 세번째 요소는 james, 네번째 요소는 brian으로 이루어져 있다. 즉 모든 단어의 관계를 vector로 표현할 수 있으니 문장 또한 벡터로 표현할 수 있다.

 

hi john : [ [1, 0, 0, 0] , [0, 1, 0, 0]

 

hi james : [ [1, 0, 0, 0] , [0, 0, 1, 0]

 

hi brian : [ [1, 0, 0, 0] , [0, 0, 0, 1]

 

(문장 전체를 벡터로 표시하는 것이 아닌 단어를 벡터로 치환한 것이다. 문장 전체를 표현한 것은 행렬이다)

 

이를 이용해 인공지능에게 입력할 때, hi john의 행렬과 hi james의 행렬과 hi brian의 행렬을 모두 따로따로 넣기보다는 행렬을 모두 조합해서 넣는 것이 훨씬 효율적이고 편리하다. 이를 mini batch 형식이라고 한다.

 

즉 인공지능에게 들어가는 형태는 총 [ [ [1, 0, 0, 0], [0, 1, 0, 0] ] , [ [1, 0, 0, 0] , [0, 0, 1, 0] ] , [ [1, 0, 0, 0] , [0, 0, 0, 1] ] ]

이런 형태가 될 것이다. 

 

여기서 정리를 해보면 단어는 총 4개의 수로 구성되어 하나의 벡터로 이루어져 있다. 즉 4 라고 표시할 수 있다. (4)

문장은 총 두 개의 단어로 이루어져 있다. 단어 하나는 결국 1개의 벡터이므로 문장은 2개의 벡터, 즉 행렬로 이루어져 있다. 윗 줄과 결합한다면 (2, 4) 로 쓸 수 있다.

최종적으로 인공지능에게 들어가는 값은 3개의 문장이다. 즉, (3, 2, 4) 로 쓸 수 있다. 

내용은 어렵지만 위에서 설명했던 개념이 모두 나왔다. 단어의 집합은 벡터, 문장은 행렬, 입력값은 3d 텐서이다.

 

입력값이 3d 텐서로 이루어져있으므로 요약하자면 (3, 2, 4) 에서의 3은 문장이 몇 개인지, 2는 한 문장에서 단어가 몇 개인지, 4는 단어가 몇 개인지로 알아볼 수 있다.

 

3. 이미지 처리에서의 텐서

 

이미지 출처 : 구름EDU 딥러닝 이론 및 파이썬 실습 (허민석) 

grayscale(회색조) 로 이루어진 이미지가 있다. 이를 3d 텐서로 나타내면 (3, 5, 5) 로 나타낼 수 있다.

이미지가 3개이므로 3, 이미지의 크기는 총 가로 5 세로 5 이므로 각각 5와 5가 들어가는 것이다.

이미지 출처 : 구름EDU 딥러닝 이론 및 파이썬 실습 (허민석) 

만약 rgb 값까지 들어간다면 4d 텐서로 변화하게 된다. 이미지의 갯수, 가로, 세로, rgb 값까지 들어가므로 4d 텐서가 된다. 여기서 rgb 값은 총 R, G, B로 이루어져 있으므로 이미지의 갯수, 가로, 세로, R, G, B 총 6개로 이루어져야 하지 않냐는 궁금증이 든다. 단순히 R, G, B 값을 벡터로 정의하고 이를 통틀어 RGB값이라고 정의한다면 구지 6d tensor 가 아닌 4d tensor 로도 충분히 표현할 수 있다. 

이미지 출처 : 구름EDU 딥러닝 이론 및 파이썬 실습 (허민석) 

더 나아가서 비디오의 형태를 텐서로 나타낸다면 어떻게 될까?

프레임, 한 프레임당의 이미지, 가로, 세로, RGB값까지 총 5개로 이루어진 텐서, 즉 5d tensor로 이루어진다.

 

이처럼 실생활에서 쓰이는 모든 것들을 tensor로 표현할 수 있는 것을 알게 되었다.

Comments