본문 바로가기
Data Science

ANN RNN LSTM 딥러닝 알고리즘 모델 구조 설명

by Lora Baek 2023. 4. 9.
300x250

ANN이란?

Artificial Neural Network의 약자로, 사람의 신경망 원리와 유사한 구조로 만든 머신러닝 알고리즘이다. 한국어로는 인공신경망이라고 하며, 이 ANN을 기초로 RNN, LSTM 등의 개념이 나오게 된다. CNN은 약간 다른 개념이기 때문에 추후 짚고 넘어가겠다.

 

RNN이란?

Recurrent Neural Network의 약자로, 재귀성(반복되는) 특징을 가지고 있는 신경망이다.

ANN은 input->hidden state->output의 과정을 거치며, 각 화살표에는 weight 즉 가중치가 주어진다.

RNN에서는 시간에 따라서 Weight가 보존되고, 시간에 따라 같은 hidden weight를 사용한다.

 

따라서, RNN의 대표적인 특성은 "시계열"데이터를 처리하기에 좋다는 것이다.

음성인식, 음악 생성기, 번역, 감정분석 등.. 데이터가 시간에 따라서 변한다면 RNN을 사용할 수 있다.

 

CNN RNN 차이

CNN은 이미지 구역별로 같은 필터를 써서 weight를 공유한다면, 

RNN은 시간별로 같은 weight를 공유한다. (과거와 현재는 같은 weight를 공유한다.)

 

 

RNN은 LSTM, Transfomer를 이해하는 기초 단계이므로 꼭 이해하고 넘어가자!

 

RNN은 언제 쓸까?

우리가 의뢰를 받아 주식을 예측해야 하는 상황을 가정해보자. 오늘은 4월 9일이다.

A 회사의 주가를 분석해달라고 해서 확인해보니, 우리는 이에 대한 정보를 4월 1일~8일까지 총 8일치를 가지고 있다.

그런데 B회사의 주가도 분석해달라고 한다. 그런데 확인해보니 4월 5일~8일뿐이다. 즉 4일치만 가지고 있다.

그러면 우리가 사용할 수 있는 데이터의 양은 정해져 있는데, 예측을 하기 위해서 이 sequential data의 양에 유연하게 대응할 수 있는 뉴럴 네트워크를 만들 필요가 있을 것이다.

 

그런데 가중치와 편향을 어떻게 사용할까? 우리는 이제까지 가격이 비슷했다면 계속 비슷할 것이고, 오르는 추세라면 오를 것이고, 내리는 추세라면 내릴 것이라는 걸 떠올릴 수 있다. 즉, trend를 읽어 내일의 가격을 예측할 수 있다.

 

이 트렌드를 기반으로 RNN에서는 feedbakc loop을 가지고 있다는 것이 특징이다.

2일 전의 데이터로 어제의 값을 예측하고, 그 값들을 바탕으로 오늘의 값을 예측한다.

input 이 몇 개이든, weight도 bias도 동일하다.

계산은 항상 가장 옛날의 값부터 최신의 값의 방향으로 진행되며, 마지막 output이 내일의 값에 대한 예측값이 될 것이다.

그럼 이제 RNN의 작동 원리에 대해서 좀 더 깊이 알아보자.

 

 

First Order System

한 마디로, 현재 시간의 상태가 이전 시간의 상태와 관련이 있다고 가정하는 것이다.

x를 어떤 상태(시세, 날씨 등), t를 시간이라고 한다면 

x_t = t일때의 상태라고 할 수 있을 것이다.

FOS에서는 x_t = f(x_(t-1) 라는 수식이 성립한다.

즉 현재 시간의 상태는 바로 이전 시간일 때의 상태에 대한 어떠한 함수로 나타내어진다고 가정하는 것이 FOS의 가정이다.

다른 말로 하면 Autonomous system =  외부 입력 없이 자기 혼자서 잘 돌아가는 시스템. 

 

입력이 있다면?

현재 시간의 상태(x_t)는 이전 시간의 상태(x_(t-1))와 현재의 입력(u_t)과 관계있게 된다.

이제 autonomous는 아니지만 역시 first order system이다.

 

모든 상태 x_t 가 모든 시간 t에서 관측 가능한가?(observable?)

날씨에 영향을 주는 입력요소는 많다. 날씨에 대한 완벽한 예측은 어려울 수 있고, 일부만을 볼 수 있다.

그렇기 때문에 x_t의 일부만을 관측할 수 있다. 

그러므로 관측 가능한 변수들의 모음을 따로 만들어줘야 하는데, 그걸 State-Space Model 이라고 한다.

 

State-Space Model

1차원 시스템의 모형에서, 관측 가능한 상태의 모음을 출력 y_t라고 한다면 우리는 이를 아래와 같이 표현한다.

이 함수는 선형일수도, 비선형일 수도 있지만 일반적으로 h라는 비선형함수를 사용한다.

그러면 이제 위의 두 수식을 통해 u_t는 입력, y_t는 출력이라는 걸 알게 됐다.

입력과 출력 사이에 보이지 않는 것 = hidden. Neural Network 구조.

hidden layer들이 있는 곳 = hidden state. 이 hidden state에서 어떻게든 weight들을 곱해서, 마지막 hidden state에서 output을 내는 것일 수도 있다.

 

어떤 시스템을 해석하기 위한 3요소

입력 u

상태 x

출력 y

 

x는 스스로 돌고 u를 받고, 다시 self-feedback을 한 후, y를 내놓는다.

ANN : 입력 u->x->y. 중간에 self-feedback loop이 없다.

RNN : 입력 u->x->self-feedback(x)->y. 

f가 시간에 따라 변하지 않기 때문에, 시간에 따라 변하는 것에 대한 weight를 공유한다

시간 t가 1->2->3으로 진행됨에 따라서, 시간에 따라서 모형을 푼다면,

x_2는 x_1의 hidden state를 참조하고, x_3는 x_2의 hidden state를 참조한다.

맨 처음에 초기조건인 x_0가 있어야 하는데 보통은 random initialize, 0, 1 중 하나를 둔다.

 

-상태 x_t는 hidden layer의 state를 의미한다. 

-상태 x_t는 이전까지의 상태와, 이전까지의 입력을 대표할 수 있는 압축본이라고 볼 수도 있을 것이다.

-상태 x_t는 시계열로 들어오는 입력들을 최대한 상세히 표현할 수 있어야 한다.

 

원래 풀고 싶었던 문제 : intput과 output을 바로 연결하고 싶다.

대신 풀 문제 : hidden state를 거치게 하기 때문에 약간의 변경이 생기게 된다. 마지막 state에서 첫번째 input, 두번째 input.. 모두 합치기 때문에, 이를 일종의 압축본이라고 볼 수 있다. 이를 First-order Markov Model 이라고 부른다. 

 

이렇게 state를 거쳐서 간접적으로 오는 first-order Markov Model. 직전 단계의 은닉층 정보만 가져오는 건 second-order인데, RNN에서는 이렇게까지는 쓰지 않는다.

 

RNN의 함수와 weight

RNN State-space model에서 근사하는 함수는 2개(f,h). 여기서 f는 u~x + 셀프 피드백 루프까지, h는 x->y로 가는 과정.

우리는 함수 f와 h를 근사하기 위해서 neural network 두 개를 사용한다. 

뉴럴 네트워크를 식 형태로 나타내기 위해서 선형모델에 activation funcion을 사용해서 비선형성을 부여한다.

그러면 함수 f_t는 x_t-1에 weight가 붙고, u_t에 weight가 붙고, b_x라는 bias가 붙은 형태에 활성화 함수(보통 하이퍼볼릭 탄젠트) 를 입히고

함수 y_t는 x_t에 weight가 붙고 b_y라는 bias가 붙은 형태에 활성화 함수를 입힌 모습이 된다.(linear, softmax)

여기서 사용한 parameter matrix는 총 5개가 된다.

 

RNN Training

ANN,CNN에서처럼 back-propagation을 이용. 시간에 따른 역전파를 BPTT(Back-propagation through time)라 한다.

 

RNN 문제 타입

Many-to-many : input이 여러개, output도 여러개. 역전파를 할 때도 전체 다 계산. -> 번역할 때 사용.

Many-to-one : output이 하나. 역전파를 할 때도 output으로 연결된 하나만 보고 나머지는 보지 않음. -> 예측할 때 사용

One-to-many : input 하나, output은 전체. 전체를 다 loss-function으로 계산. -> 생성할 때 사용

Sequence-to-sequence(seq2seq) = many-to-one + one-to-many

 

---

 

지금까지 RNN에 대해서 열심히 알아보았지만, 사실 RNN 자체는 현재에서 거의 쓰이지 않는다.

바로 Vanishing/Exploding gradient problem 즉 기울기의 소실과 폭주 문제가 있기 때문이다.

 

우리는 최적의 값을 찾기 위해 역전파를 통해 cost 함수의 기울기가 0이 되는 지점 - loss를 최소한으로 하는 local minimum 값을 찾게 되는데, 그 과정에서 기울기가 폭주하거나 아예 소실되어버리는 문제가 발생한다.

(이 말이 이해되지 않는다면 아래 포스팅을 추천하고 싶다)

2023.04.04 - [Data Science] - 경사하강법 비용함수(cost) 이해하기

 

가중치가 1보다 크다면, 예를 들어 2라면?

first input 값은 2배 증가하고, 각 네트워크를 거칠 때마다 2배,4배,8배.. 계속 증가해서 결국 지나치게 큰 값이 된다.

 

반대로 가중치가 1보다 작다면, 점점 작아져서 없어지게 된다.

 

그럼 RNN이 쓰이지도 않는데 왜 배웠나요?

바로 현재 쓰이고 있는 모델들의 기반이 되기 때문이다. 이걸 이해해야 우리가 쓰는 모델이 어떻게 돌아가는지를 이해할 수 있게 된다.

앞에서 말한 문제들을 해결하기 위해 나온 게 LSTM이다.

 

LSTM

LSTM은 RNN의 한 종류이지만, 맨 마지막 output의 시점으로 봤을 때 아래 두 가지를 모두 갖는다.

가장 오래된 함수에 대한 장기 기억(Long-term memory)

그리고 가장 최신의 함수에 대한 기억(Short-term memory)

또한 시그모이드와 탄젠트 하이퍼볼릭 함수를 거쳐서 가중치를 적절히 계속 조정하기 때문에 기울기 소실과 폭주 문제를 막아줄수도 있다.

LSTM만으로도 정리할 내용이 많기 때문에 다른 포스팅에서 따로 다뤄보고자 한다!

 

아래 참고자료를 기반으로 공부하며 작성한 내용으로, 저작권은 원작자에게 있습니다.

https://www.youtube.com/watch?v=Hn3GHHOXKCE&list=PL7SDcmtbDTTzQ69rNQ85LyA2WAx438pxz&index=9&ab_channel=%EB%A9%94%ED%83%80%EC%BD%94%EB%93%9CM 

https://www.youtube.com/watch?v=AsNTP8Kwu80&ab_channel=StatQuestwithJoshStarmer 

 

댓글