본문 바로가기
Book Review/[케라스 창시자에게 배우는 딥러닝] 리뷰

신경망 이해를 위한 Tensor(텐서), Gradient(그레이디언트)

by 3n952 2022. 11. 23.

딥러닝을 이해하려면 여러 가지 수학 개념과 친숙해질 필요가 있습니다.

텐서, 미분, 경사 하강법 등이 있는데요.

 

이번 포스트의 목표는 비전공자도 이해할 수 있도록 최대한 간결하게 이 수학적 개념들을 설명하는 것 입니다.

수학적 개념들의 연산, 기하학적 해석에 대해서는 언급하지 않고 간결하게 설명해보겠습니다.


수학적 개념들을 설명하기 앞서 신경망의 핵심 구조인 층에 대해 간단히 알아보겠습니다.

신경망의 핵심 구조는 층(layer)입니다.

그림1) 신경망의 입력층, 중간층, 출력층

그림1과 같이 입력층, 중간층(은닉층), 출력층으로 나누어집니다. 

입력값이 입력신호로 들어오면 각 층에서 더욱 의미있는 표현을 입력된 데이터로 부터 추출합니다.

즉, 데이터를 정제시키고 표현을 강화하여 결국 의미있는 값을 찾아내는 것을 의미합니다.

 

이해하기 쉽게 예를 들어보겠습니다. 돌, 모래, 금이 섞인 토양이 있다고 가정해봅시다.

돌, 모래, 금이 섞인 토양이 입력층으로 들어오면 1번 여과기가 돌을 걸러줄 것입니다(표현이 강화됨).

이후 모래와 금이 섞인 토양을 2번 여과기(1번 여과기보다 더 작은 틈이 있다)가 금을 추출할 수 있게 해줍니다.

결국 돌, 모래, 금이 섞인 토양을 2번의 여과기(층)을 통해 금(원하는 값)을 얻었다고 볼 수 있습니다.

 

 

신경망의 층의 개념과 역할을 간단하게 이해봤습니다.

지금부터는 데이터 표현을 위한 수학적 구성요소에 대해 하나하나 알아보겠습니다.

 

1. 텐서 (Tensor)

 

최신의 머신러닝 시스템은 일반적으로 텐서를 기본 데이터 구조로 사용합니다.

텐서를 이해하는 것이 꼭 필요합니다.

 

텐서는 데이터를 위한 컨테이너라고 생각하면 됩니다. 숫자들이 모여있는 형태를 나타냅니다.

따라서 텐서는 임의의 차원 개수를 가지는 행렬의 일반화된 모습을 띕니다.

(텐서에서는 차원(dimension)을 종종 축(axis)이라고 부릅니다.)

 

 

그림2) 텐서의 다양한 형태

 

그림2를 보면 쉽게 이해할 수 있습니다.

하나하나 따라가보면서 이해해보겠습니다.

 

 

우선, 스칼라(scalar)는 하나의 숫자만 담고 있는 텐서를 의미합니다.

같은 표현으로는 스칼라 텐서, 랭크-0 텐서, 0D 텐서가 있습니다.

여기서 나오는 랭크(rank)는 텐서의 축 개수를 의미합니다.

 

 

벡터(vector)는 랭크-1 텐서, 1D 텐서라고 부릅니다. 스칼라에서 알 수 있듯이 딱 하나의 축을 가지는 것입니다.

여기서 주의할 점은 벡터와 텐서를 혼동하면 안되는 것 입니다.

가령 ([12, 3, 5, 16, 7])의 넘파이 배열 형태의 벡터가 있다고 하면,

5개의 원소를 가지고 있으므로 5차원 벡터입니다. 하지만 5차원 텐서는 아닙니다.

5차원 벡터는 하나의 축을 따라 5개의 차원을 가진 것을 의미하고 5차원 텐서는 5개의 축을 가진 것을 의미합니다.

 

 

행렬(matrix)은 벡터의 배열입니다. 랭크-2 텐서, 2D 텐서라고 불립니다.

행렬에는 2개의 축이 있습니다. 하나는 행(row), 다른 하나는 열(column)입니다.

그림2로 예시를 들면 첫번째 가로축(15, 1, ..., 11)이 첫번째 행이고, 첫번째 세로축(15, -3, ..., 7)이 첫번째 열입니다.

 

 

3차원 텐서는 랭크-3 텐서, 3D 텐서라고 합니다. 행렬들을 하나의 새로운 배열로 합치는 것을 상상해보면 됩니다.

그림2에서와 같이 행렬을 2차원의 평면이라고 생각하면 3차원 텐서는 행렬로 채워진 3차원 직육면체라고 생각하면 됩니다.

 

그럼 4차원 텐서는 무엇일까요? 

4차원 텐서는 3차원 텐서들을 하나의 배열로 합치면 만들어집니다.

딥러닝에서는 보통 4차원 텐서까지 다루지만, 동영상 데이터를 다룰 때 5차원 텐서까지 활용하기도 합니다.

 

파이썬에서 텐서를 활용하기 위해서는 3가지의 핵심 속성을 알 필요가 있습니다.

1.축의 개수(랭크), 2.크기(shape), 3.데이터 타입

 

축의 개수는 랭크를 의미합니다. 가령 랭크-3 텐서에는 3개의 축이 있습니다. 파이썬 라이브러리에서는 ndim 속성에 저장되어 있습니다.

크기는 텐서의 각 축을 따라 얼마나 많은 차원이 있는지 나타냅니다. 파이썬에서는 튜플(tuple)의 형태로 나타납니다.

가령, 2개의 축을 따라 a개, b개의 차원이 있는 행렬의 크기는 (a,b)가 될 것 입니다. 

데이터 타입은 텐서에 포함된 데이터가 파이썬에서 어떠한 데이터 타입으로 이루어져 있는지를 나타냅니다.

예를 들면 float16, float32, uint8 등이 있습니다.

 

 

2. 그레이디언트(gradient)

 

신경망의 학습은 다음과 같이 이뤄집니다. (이전 포스트에서 참고.)

 

1. 딥러닝 모델에 맞추어 입력 데이터를 입력층 넣어 은닉층을 통과하여 출력층에서 값을 내보냅니다.

2. 출력층에서 나온 값(예측값)과 타깃 값(실제값)의 차이를 측정하여 모델의 손실을 계산합니다.

3. 모델의 손실이 감소하는 방향으로 층에 속한 모든 가중치를 업데이트 합니다.

1,2,3 의 방식을 계속해서 반복하면 더 이상 모델의 손실이 줄 지 않는 구간이 생깁니다.

이 때 학습이 완료되는 것입니다. 

 

1,2 단계에서는 입출력과 텐서연산이 이뤄집니다. 따라서 텐서 연산만 알고 있으면 됩니다. (이번 포스트에서 다루지 않음)

3단계에서는 미분, 그레이디언트라는 수학 연산이 이뤄집니다. 그렇다면 미분, 그레이디언트가 무엇인지 알아보겠습니다.

 

3단계에서는 모델이 손실이 감소하는 방향으로 모든 가중치를 업데이트 한다고 말씀드렸습니다.

그렇다면 어떤 가중치 값이 증가해야하는 지 / 감소해야하는 지와 얼마만큼 업데이트 해야하는 지 알아야 할 것 입니다.

 

하나의 단순한 방식은 관심있는 가중치를 제외한 모든 가중치를 고정하고 관심있는 가중치를 변경시켜 보는 것입니다.

예를 들어 가중치 A가 관심있다고 하고 가중치 A를 0.5만큼 줄였을 때를 가정하겠습니다.

0.5만큼 줄여진 가중치가 모델을 통과하면 손실 값 0.6만큼 줄어드는 모습을 보였습니다.

가중치 A를 -0.5만큼 업데이트를 하는 것이 손실을 줄이는 데 기여했다고 판단할 것입니다.

이런 식으로 모델의 모든 가중치에 반복하면 최적의 가중치 값들로 업데이트 될 것입니다.

 

하지만 이러한 방식은 비용이 큰 비효율적인 방식입니다.

그 이유는 모든 가중치를 업데이트 할 때마다 모델을 패스하면서 매번 계산해야 하기 때문입니다.

이를 보안하기 위해 고안 된 방식이 경사 하강법(gradient descent) 입니다.

 

경사하강법을 이해하기 위해서는 고등학교 시간에 배운 미분, 도함수를 알고 있으면 됩니다.

 

연속적인 함수에서는 x를 조금 바꾸면 y도 조금 바뀝니다.

조금 바뀌는 부분이 극한 값으로 간다면

그 포인트에서의 기울기로 표현될 것 입니다.

 

그 때의 기울기를 도함수라고 합니다.

도함수를 유도할 수 있을 때 미분 가능하다고 할 수 있습니다.

 

 

 

 

 

 

도함수, 미분의 개념이 f(x)의 값을 최소화하는 x값을 찾는 작업(최적화, optimization)에 필수적입니다.

 

여기서 그레이디언트의 개념이 등장합니다. 텐서에서의 도함수를 그레이디언트(gradient)라고 부릅니다.

즉, 앞에서 배운 텐서가 입력으로 들어오는 함수로 도함수의 개념을 일반화 시킨 것입니다.

 

가중치 텐서에 대한 손실 값 나타내는 함수를 f(x)라고 하겠습니다.

f(x)에 대해서 도함수의 반대 방향으로 x를 조금 움직이면 f(x)값을 감소시킬 수 있을 것입니다.

도함수가 양수이면 f(x)가 증가하고, 도함수가 음수이면 f(x)가 감소하기 때문에 그 반대 방향으로 가야 최소값으로 도달할 수 있습니다.

 

미분 가능한 함수가 주어지면 이론적으로 함수의 최솟값을 해석적으로 구할 수 있게 됩니다.

함수의 최솟값은 도함수가 '0'인 지점이 될 것입니다.

따라서 도함수가 '0'인 지점 중 어떤 지점에서 f(x)값이 가장 낮은지 찾는 것이 경사하강법의 목표입니다.

 

요약 정리하자면, 데이터 샘플과 타깃을 랜덤하게 뽑아(초기화 과정으로 생각하면 됩니다.)

모델 가중치에 대한 손실의 그레이디언트를 계산하고, 계산된 그레이디언트의 반대방향으로 조금씩 움직이는 것이

경사하강법이라고 할 수 있겠습니다.

 

이번 포스트에서는 딥러닝에 필요한 수학적 개념인 텐서와 그레이디언트 + 관련된 개념들을 간단하게

살펴보았습니다. 다음 포스트에서는 역전파 알고리즘에 대해 설명하도록 하겠습니다.