Julie의 Tech 블로그

딥러닝 기초 - 텐서(Tensor)와 신경망 학습 과정 본문

Tech/ML, DL

딥러닝 기초 - 텐서(Tensor)와 신경망 학습 과정

Julie's tech 2021. 5. 12. 23:47
728x90

딥러닝 모델 공부 시작 전에, 기초를 다시 잡고 간다는 마음으로 텐서와 딥러닝 역사에 대해 간략하게 살펴보았다.

우선 텐서부터 짚고 넘어가자.

텐서는 데이터를 담는 컨테이너로도 볼 수 있다.

스칼라인 0 차원 텐서부터, 1차원 벡터, 2차원 행렬, 고차원 텐서 등이 있다.

텐서의 속성으로는 축(rank)과 크기(shape)가 있다.

타입은 float32, uint8, float64가 있다.

실제 딥러닝에 사용되는 사례들로 텐서들을 분류해보면 아래와 같다.

1. 벡터 데이터 : (samples, features)

2. 시계열 데이터 : (samples, timesteps, features)

3. 이미지 : (samples, height, width, channels) or (samples, channels, height, width)

4. 동영상 : (samples, frames, height, width, channels) or (samples, frames, channels, height, width)

* 이미지의 경우 channel을 전반 / 후반에 배치하는 것에 따라 channel-first와 channel-last 방식으로 나뉜다.

** Tensorflow는 channel-last로, theano는 channel-first로, 케라스는 양쪽 다 지원한다.


변화율에 대해

신경망은 이러한 텐서들의 연산을 연결한 구조체로 볼 수 있다.

실제로 신경망의 각 층은 입력데이터를 다음과 같이 변환한다.

activation_func(dot(W, input) + b)

모델은 이 가중치들(커널, 편향으로 각각 부름)의 적정값을 찾도록 학습된다.

가장 초기에는 무작위 초기화(random initialization)으로 셋팅되고,

이에 따라 input값이 변환되어 다음 층으로 넘겨지며(forward pass)

예측된 값을 실제 값과 연산한 손실 함수를 최소화하는 방향으로 (back-ward propagation) 가중치를 변경한다.

위 과정에서 손실을 줄이는 방향으로 가중치 값을 업데이트하는 방법으로는 가장 단순하게도,

가중치 원소 행렬을 고정하고, 특정 원소 하나를 바꾸어 loss를 계산해본 뒤, 이전에 비해 줄여질 경우 가중치를 업데이트하는 방식이 있다.

하지만 위 방식은 연산에 소요되는 비용이 있어 비효율적이다.

따라서 가중치에 대한 손실의 gradient를 계산하는 방식을 취하게 된다.


Gradient에 대해

gradient를 알기 위해서는 변화율에 대해 알아야 한다.

변화율에 대한 설명은 함수를 예시로 들어 이해해보면 아래와 같다.

어떤 f(x) = y 함수에서, x를 아주 미미하게 움직였을 때, y의 변화를 아래와 같이 정리해볼 수 있다.

f ( x + epsilon_x ) = y + epsilon_y

위 함수에서 epsilon_x는 이름대로 아주 미미한 값이라면,

어떤 p에서 f는 기울기 a의 선형함수로 근사할 수 있다.

f ( x + epsilon_x) = y + a * epsilon_x

이 떄 기울기 a는 점 p에서 f의 변화율(derivative)라고 한다.

a가 음수이면 x를 양수만큼 이동하면 값이 감소하게 되고,

a가 양수이면 x를 음수만큼 이동하면 값이 감소하게 된다.

여기서 input을 텐서로 변경해보자.

y_pred = dot(W, x) loss_value = loss(y_pred, y)

loss_value라는 함수는 x, y를 고정하면 W의 함수로 볼 수 있다. loss_value = f(W)

포인트 W0에서 f의 변화율은 gradient(f)(W0)이고, 이는 W0에서 f(W)의 기울기를 나타내는 텐서이다.

따라서 위에서 본 로직대로, 이 함수는 gradient의 반대 방향으로 W를 움직이면 loss인 f(W)를 줄인다.

다시 정리하면, input인 x값이 고정이고, initialized된 W0 값에 따라 y_pred가 계산되면,

손실함수에서 W0에서의 변화율인 gradient 텐서값의 반대 방향으로 움직여 손실이 감소되도록 한다.

gradient가 음수이면 양수만큼 W를 step만큼 움직이고, 양수이면 반대로 행동한다.

* step은 가중치의 변경 비율

수학적으로 이 내용을 모두 정리하면,

gradient(f) (W) = 0 이라는 문제의 해를 발견해야하고,

위 식은 n개 변수 다항식이다. 여기서 n은 신경망의 가중치 개수이다.

위 방식이 mini-batch SGD(mini-batch stochastic gradient descent)이다.

* stochastic이란 확률적(Random)이란 의미이다.

이처럼 SGD를 변종하여 여러 가지 Optimizer 함수가 있다.

우리가 흔히 사용하는 Adagrad부터, SGD, RMSProp등이 있다.

SGD에서 global minimum이 아닌 local minimum에 도달하는 문제를 방지하기 위해,

모멘텀(과거 gradient를 참고하여 가중치 업데이트)이라는 방식을 사용하기도 한다.

전체 내용을 다시 요약하면,

신경망은 가중치를 계속해서 조절하여 손실 함수를 최소화하는 방향으로 학습하며,

네트워크 구성시에 손실함수(loss function)와 성과 측정 지표(metric), Optimizer를 지정한다.


신경망에 대해

신경망의 구성 단위는 layer이다. 이 layer는 하나 이상의 input 텐서를 받아, 하나 이상의 텐서를 출력한다.

* 2D텐서로 저장된 벡터는 보통 fully connected layer나 densely connected layer로 처리된다.

** 3D텐서로 저장된 시퀀스 데이터는 보통 recurrent layer로 처리된다.

*** 4D텐서로 저장되는 이미지 데이터는 Conv2D layer로 처리된다.

모델은 이러한 층으로 DAG(Directed Acyclic Graph)를 구성했다고 볼 수 있다.

input 값을 받아들여 출력 값을 out하는 구조이기 때문이다.


Keras에 대해

딥러닝 라이브러리 중 하나인 케라스는 3가지의 백엔드 엔진을 사용한다.

바로 구글의 Tensorflow, 몬트리올 대학 연구소의 Theano, 마이크로소프트의 CNTK이다.

케라스를 사용하려면 최소 셋 중 하나를 설치해야한다.

케라스는 CPU, GPU 환경 모두를 지원한다.


참고도서

https://book.naver.com/bookdb/book_detail.nhn?bid=14069088

 

케라스 창시자에게 배우는 딥러닝

단어 하나, 코드 한 줄 버릴 것이 없다!창시자의 철학까지 담은 딥러닝 입문서단어 하나, 코드 한 줄 버릴 것이 없다!창시자의 철학까지 담은 딥러닝 입문서케라스 창시자이자 구글 딥러닝 연구원인 저자는 ‘인공 지능의 민주화’를 강조한다. 이 책 역시 많은 사람에게 딥러닝을 전달하는 또 다른 방법이며, 딥러닝 이면의 개념과 구현을 가능하면 쉽게 이해할 수 있게 하는 데 중점을 두었다. 1부에서는 딥러닝, 신경망, 머신 러닝의 기초를, 2부에서는 컴퓨터 비전, 텍스트, 시퀀스, 생성 모델을 위한 딥러닝 같은 실전 딥러닝을 설명한다. 이외...

book.naver.com

반응형