코딩하는 해맑은 거북이
[딥러닝] RNN (Recurrent Neural Network) 본문
본 게시물의 내용은 'RNN 첫걸음(부스트캠프 AI Tech)' 강의를 듣고 작성하였다.
시퀀스 데이터 이해하기
시퀀스 데이터 : 순차적으로 들어오는 데이터
소리, 문자열, 주가 등의 데이터를 시퀀스(sequence) 데이터로 분류한다.
시계열(time-series)데이터는 시간 순서에 따라 나열된 데이터로 시퀀스 데이터에 속한다.
시퀀스 데이터는 독립동등분포(i.i.d.; independently and identically distributed) 가정을 잘 위배하기 때문에 순서를 바꾸거나 과거 정보에 손실이 발생하면 데이터의 확률분포도 바뀌게 된다.
<예제>
개가 사람을 물었다.
사람이 개를 물었다.
2개의 문장이 있을 때, 첫번째 문장은 많이 발생할 수 있는 일이다.
두 번째은 문법적으로 맞지만, 위치를 바꿈으로써 의미와 데이터 관측빈도도 굉장히 바뀌게 된다.
시퀀스 데이터는 순서를 바꾸거나 과거 정보에 손실이 발생하면 데이터의 확률분포가 바뀔 수 있기 때문에
과거 정보 또는 앞뒤 맥락없이 미래 정보를 예측하는 것은 굉장히 어렵고, 인위적으로 데이터의 순서를 조작해서 예측하게 되면 원하고자 하는 모델링이 잘 되지 않는 확률이 높아진다.
즉, 시퀀스 데이터는 독립동등분포 가정이 깨지기 쉽기 때문에 소리, 문자열, 주가 등의 데이터들에 대해 위치를 바꿀 때 조심해야 한다.
시퀀스 데이터를 어떻게 다루나요?
이전 시퀀스의 정보(과거 정보)를 가지고 앞으로 발생할 데이터의 확률분포를 다루기 위해 조건부확률을 이용할 수 있다.
베이즈 법칙을 사용하면 아래와 같이 수식을 풀어낼 수 있다.
위 조건부확률은 과거의 모든 정보를 사용하지만 시퀀스 데이터를 분석할 때 모든 과거 정보들이 필요한 것은 아니다.
시퀀스 데이터를 다루기 위해선 길이가 가변적인 데이터를 다룰 수 있는 모델이 필요하다.
현재 시점에서 봤을 때, 최근 몇년간 혹은 앞서 몇 개의 문장만 보고서도 모델링이 가능한 문제는 가변적으로 초기시점부터 모든 정보를 다 사용할 필요 없이 고정된 길이 τ 만큼의 시퀀스만 사용하면 된다.
고정된 길이 τ(Tau, 타우) 만큼의 시퀀스만 사용하는 경우 AR(τ) (AutoregressiveModel) 자기회귀모델이라고 부른다.
또 다른 방법은 바로 이전 정보를 제외한 나머지 정보들을 \(H_t\) 라는 잠재변수로 인코딩해서 활용하는 잠재 AR 모델이다. 바로 이전 정보와 잠재변수 2가지 정보를 가지고 현재 시점과 미래 정보를 예측할 수 있기 때문에 길이가 가변적이지 않고 고정된 길이 데이터를 가지고 모델링 할 수 있다.
그래서 과거의 모든 데이터를 활용해서 예측할 수 있고 가변적인 데이터 문제를 고정된 길이의 데이터로 바꿀 수 있다는 장점이 있다.
문제는 과거의 정보들을 잠재변수로 어떻게 인코딩하는지이다.
>> 이 문제를 해결하기 위해 등장한게 RNN 이다.
잠재변수 \(H_t\) 를 신경망을 통해 반복해서 사용하여 시퀀스 데이터의 패턴을 학습하는 모델이 RNN 이다.
Recurrent Neural Network을 이해하기
가장 기본적인 RNN 모형은 MLP와 유사한 모양이다.
\(W^{(1)}\), \(W^{(2)}\) 은 시퀀스와 상관없이 불변인 행렬이다.
이 모델은 입력 행렬이 t번째 데이터만 들어오기 때문에 과거의 정보를 다룰 수 없다.
RNN은 이전 순서의 잠재변수와 현재의 입력을 활용하여 모델링한다.
잠재변수인 \(H_t\) 를 복제해서 다음 순서의 잠재변수를 인코딩하는데 사용한다.
유의할 점은 가중치 행렬이 3개가 나오게 된다.
\(W_X^{(1)}\) : 입력 데이터에서 부터 선형모델을 통해서 잠재변수로 인코딩하는 가중치
\(W_H^{(1)}\) : 이전 시점의 잠재변수로부터 정보를 받아서 현재 시점의 잠재변수로 인코딩하는 가중치
\(W^{(2)}\) : 잠재변수를 통해서 다시 출력으로 만들어주는 가중치
>> 위의 가중치 행렬 3개는 t에 따라 변하지 않는 가중치 행렬이다!
>> t에 따라 변하는 것은 오로지 잠재변수와 입력벡터이다.
RNN의 역전파는 잠재변수의 연결그래프에 따라 순차적으로 계산한다.
이를 Backpropagation Through Time (BPTT) 이라 하며 RNN의 역전파 방법이다.
잠재변수에 들어오는 그레디언트 2가지는 다음 시점에서의 잠재변수에서 들어오게되는 그레디언트 벡터와 출력에서 들어오는 그레디언트 벡터이다. 이 2가지를 입력과 이전 시점의 잠재변수로 전달하고 이를 반복해서 RNN의 학습이 이루어진다.
BPTT를 좀 더 살펴봅시다
BPTT를 통해 RNN의 가중치행렬의 미분을 계산해보면 아래와 같이 미분의 곱으로 이루어진 항이 계산된다.
시퀀스 길이가 길어질수록 곱해지는 값이 1보다 크면 굉장히 크게 되고,
1보다 작으면 굉장히 작은 값으로 떨어지기 때문에 미분값이 엄청 커지거나 엄청 작아지게 될 확률이 높다.
그래서 일반적인 BPTT를 모든 t 시점에서 적용하면 RNN의 학습이 굉장히 불안정해지기 쉽다.
여기서 그레디언트가 0으로 줄어드는 (과거의 정보를 잃어버리는) 즉, 기울기 소실되는 것이 가장 큰 문제가 된다.
기울기 소실의 해결책?
시퀀스 길이가 길어지는 경우 BPTT를 통한 역전파 알고리즘의 계산이 불안정해지므로 길이를 끊는 것이 필요하다.
그래서 BPTT를 모든 시점에 대해 계산하는 것이 아니라 미래의 정보들 중에서 몇 개는 끊고, 오로지 과거의 정보들에 해당하는 몇 개의 블록을 나눠서 BPTT를 진행하는 것을 truncated BPTT 라 부른다.
이 방법을 통해서 기울기 소실을 해결할 수 있다.
그러나, 완전한 해결책이 아니다!
truncated BPTT를 통해서 기울기 소실 문제를 해결할 수 있지만,
오늘날에는 기울기 소실 문제 때문에 기본적인 RNN 모형을 사용하지않고
길이가 긴 시퀀스를 처리하는데 있어서는 LSTM, GRU 라는 다른 advanced된 RNN 네트워크를 사용한다.
이런 문제들 때문에 VanillaRNN은 길이가 긴 시퀀스를 처리하는데 문제가 있습니다.
'AI' 카테고리의 다른 글
인공지능(AI) 기초 다지기 (10) (0) | 2023.03.09 |
---|---|
인공지능(AI) 기초 다지기 (9) (0) | 2023.03.06 |
[딥러닝] CNN (Convolutional Neural Network) (0) | 2022.12.31 |
딥러닝 기초 다지기 (4) (0) | 2022.12.26 |
딥러닝 기초 다지기 (3) (0) | 2022.12.25 |