SimpleRNN #[batch, timesteps, feature] 3차원 출력 2차원 (return_sequence 쓰면 3차원) model.add(SimpleRNN(10, input_shape=(5, 1))) units * (feature + bias + units) = params (10 * 10) + (1 * 10) + 10 = 120 =total params

LSTM 입력 [batch, timesteps, feature] 3차원 입력 [batch, input_length, input_dim]이라고도 명시 가능 출력 2차원 (return_sequence 쓰면 3차원) model.add(LSTM(10, input_shape=(5, 1))) 4 * units * (feature + bias + units) = params 4 * {(1010) + (110) + 10} = 480 =total params RNN의 4배

속도가 느리지만 일반적으로 대용량 시계열 데이터에서 최적의 성능을 뽑아낸다

GRU #[batch, timesteps, feature] 3차원 출력 2차원(return_sequence 쓰면 3차원)

model.add(LSTM(10, input_shape=(5, 1))) 3 * units * (feature + bias + units ) = params 3 * {(1010)+(110) + 10} = 360 ...정석이지만 최신 버전은 bias = 2 이기 때문에 3 * {(1010) + (110) + 10} = 390 =total params

속도가 LSTM보다는 빠르고 일반적으로 중저용량 시계열 데이터에서 최적의 성능을 뽑아낸다

시계열 데이터는 y값이 없다. 이미지 데이터도 라벨링 작업을 해야할 때가 있다(y를 만드는 작업) 와인 데이터를 예로 들면, 기본 문제는 퀄리티에 관한 문제였지만 화이트 와인인지, 레드 와인인지 구분하는 문제로 변형할 수도 있다. 이러한 문제들은 개발자가 직업 라벨링 작업을 해주어야한다. 개발자 본인은 timesteps(몇개씩 자를 건지) 고민하고, 어떤 데이터를 찾을 것인지 고민 해야 한다. split_x도 이 중 한 가지.