15. TensorFlow 2.x - SimpleRNN 소개
참고: https://youtu.be/kn21-Z3fuH0?si=DRuXy3QE_iFOc6At
SimpleRNN은 RNN중에서 제일 간단한 형태로 이해를 돕기에 좋다.
위의 슬라이드는 시간순으로 나열해서 그렇지 지난 글에서 설명한 구조와 동일한 것으로,
과거의 activation함수의 결과값을 현재의 입력에 추가해 준다.
즉, 현재의 입력에 과거의 결과를 포함시켜주므로 이력이 필요한 추론에 적합한 모델이 되는 것이다.
위 슬라이드에서 보듯이, 과거의 데이터를 몇개까지 사용할 것인지 (window size, w),
얼마나 먼 미래를 예측할 지(horizon factor, h)를 결정해야 한다.
SimpleRNN 모델을 만들때 keras에서 지원하는 api는 SimpleRNN이다. 아래 슬라이드를 보자.
입력은 3개를 사용하고 출력은 하나 앞의 값을 예측하는 모델이므로,
window size = 3, horizon factor = 1 이 된다.
SimpleRNN()에서 units은 노드 수를 의미하고, activation은 활성화 함수, input_shape은 입력 형태인데,
앞의 인자는 window size와 같고, 뒤의 인자는 입력으로 사용되는 데이터의 개수를 의미한다.
여기서 중요한 것은 입력 데이터를 어떻게 만들어 주느냐이다.
batch size는 윈도우 크기로 나누어져 있는 데이터 뭉치가 개수를 말하고,
input dims는 RNN에 한번에 들어가는 데이터 수를 말한다. (input_shape의 두번째 인자)
앞의 예제를 계속 사용하면, window size = 3인 데이터가 아래와 같이 있다고 하면,
(1,2,3), (2,3,4), (3,4,5), (4,5,6)
window size로 묶인 데이터 뭉치가 4개이므로 batch size = 4이다.
time step은 window size와 동일하므로 time step = 3,
한 번에 1개의 데이터가 입력되므로 input dims = 1이 된다.
--> 여기서 한 번에 1개의 데이터가 입력된다는 의미는 RNN 모델의 입력 데이터는 (1,2,3) 중에
맨 먼저 '1'만 입력되고, 다음은 '2', 그 다음은 '3', 이렇게 입력 된다는 의미이다.
실제 입력 데이터는 다음과 같이 3차원 텐서 형식으로 만들어져야 한다. (위 예제를 게속 사용)
[
[ [1], [2], [3] ],
[ [2], [3], [4] ],
[ [3], [4], [5] ],
[ [4], [5], [6] ]
]
실제 코드로 구현해 보자.
위와 같이 삼각함수를 이용하여 데이터를 만들었다.
이를 RNN의 입력으로 사용하여 추론을 잘 하는지 살펴보려고 한다.
먼저 RNN의 입력 형식으로 데이터를 만들어 준다.
이제 모델을 만들고 학습시킨다.
RNN의 노드를 128개로, 활성화 함수는 tanh로 하면, 16769개의 인자들을 찾아내는 학습을 해야한다.
손실함수를 mse, 최적화 함수를 adam으로 하고 100번 학습시키면,
처음에는 mae (오차)가 0.099 에서 끝으로 가면, 오차가 0.0097까지 줄어든다.
이제 검증용 데이터를 이용해서 추론값과 정답을 비교해 보도록 하자.
그래프에서 보듯이 거의 유사하게 추론하고 있음을 알 수 있다. (간단한 문제이기 때문일 것이다.)
overfitting은 어떤지 잠깐 살펴보도록 하자.
여기서 overfitting은 문제되지 않는 것으로 보인다.
다음 글에서는 많이 사용하는 LSTM 모델을 사용하여 예측해보자.