CNN은 주로 이미지 분류에서 높은 정확도를 보이며, 많이 사용된다.
하지만 1차원 CNN은 이미지가 아닌 시계열 분석이나 텍스트 분석을 하는 데 주로 많이 사용된다. 여기서 1차원이라는 것은 합성곱을 위한 커널과 적용하는 데이터의 sequence가 1차원의 모양을 가진다는 것을 의미한다.
이 때, 비록 1차원 CNN이라고 하더라도, 1차원 CNN의 입력과 출력 데이터는 3차원이어야 한다는 것이다. 3차원 구조는 (batch, time, feature)이다(참고로 image 데이터는 rgb 3개의 채널을 가짐).
2차원 CNN에서 n_filters는 몇 개의 window를 이용해 합성곱을 할 것인지를 정해주는 변수이다.
하지만 1차원 CNN에서 n_filters는 output의 수이다. 하나의 feature를 가지는 input 데이터에 서로 다른 n_filters개의 커널을 적용하여 그 커널 수만큼 output을 만드는 것이다.
논문: an empirical evaluation of generic convolutional and recurrent networks for sequence modeling
설명하기에 앞서 매우 다양한 유형으로 LSTM을 구성할 수 있다. 단방향, 양방향, 단층구조, 다층구조가 바로 그 유형이다.
시계열 X = {1,2,3,4,5} 가 주어졌을 때, Y = {6}이 나오도록 학습시키는 가장 단순한 형태다. 만약 x가 시간축의 차원이라고 하면 3차원의 구조가 되어야 하는 LSTM의 입력은 (1,5,1)이다.
시계열 X = {1,2,3,4,5} 가 주어졌을 때, Y = {2,3,4,5,6}이 나오도록 학습시키는 형태다. LSTM 레이어 부분에 return_sequences = True를 쓰고 그 아래에 TimeDistributed() 함수를 쓰면 many-to-many로 작동한다.
return_sequences = True 는 LSTM의 중간스텝의 출력을 모두 사용하라는 의미이고, TimeDistributed는 각 스텝마다 cost를 계산해서 하위 스텝으로 오류를 전파하여 각 weight를 업데이트하라는 의미다.
양방향 LSTM에는 Forward와 Backward 레이어가 있다. X = {1,2,3,4,5}이면 Forward 레이어는 1 -> 2 -> 3의 시퀀스가 학습되고, Backward 레이어는 3 <- 4 <- 5의 시퀀스가 학습된다.
다층 구조의 LSTM은 multi-layered LSTM, stacked LSTM이라고 한다.
지금까지의 시퀀스 데이터의 학습에서의 목표는 '지금까지 주어진 것을 보고 다음을 예측' 하는 것이다. 하지만 시퀀스의 과거의 값들 뿐만 아니라 이후의 값들에 의해서도 값이 결정될 수 있다.
Bidirectional은 이러한 문제를 해결하는 장치.
출처: 아마추어 퀀트 blog