- Dense
: 인풋(과거의 정보+현재의 raw 정보)으로부터 모델의 목적에 도움이 될만한 새로운 특징을 추출하는 것
(feature representation)
- Recurrent Neural Network (RNN)
: 시계열 데이터를 처리하게 좋은 뉴럴 네트워크 구조
‘시점별 정보’를 언급하고 싶을 때는 hidden state라는 표현을 씀
CNN | RNN |
이미지 구역별로 같은 weight 공유 | 시간 별로 같은 weight 공유 -> 과거와 현재는 같은 weight를 공유 |
- First Order System
: 현재 시간의 상태가 이전 시간의 상태와 관련이 있다 가정
Xt = f(Xt-1)
위 그림은 RNN과 ANN의 차이점을 그린 그림이다.
RNN의 그림을 좀 더 풀어서 그리게 되면 아래 그림과 같다
- weight sharing ( => Wxx)
: 가중치를 동일한 값 재사용
가중치를 여러 계층에서 공유하여 모델을 간소화하고 더 빠르게 학습시키는 기술
자연어 처리를 할 때, 각 단어를 벡터로 표현하여 모델에 입력한다. 이 때, 단어의 개수가 많아지면, 모든 단어에 대해 각각 가중치를 할당하는 것은 매우 비효율적이다. 이 때, weight sharing을 사용하면, 모든 단어에 대해 동일한 가중치를 사용하여 모델의 크기를 줄이고, 훈련 속도를 높일 수 있다.
- return_sequences = True: 모든 시점에서 제작한 특징값들을 다음 레이어로 다 넘겨라
-> rnn 다음 레이어는 모든 시점의 정보를 전부 고려하도록 할 것이다.
- return_sequences = False: 맨 마지막 시점의 특징값들만 다음 레이어로 다 넘겨라
-> rnn이 제작한 정보 중 , 맨 마지막 시점만(최신정보를 더 중요하게) 다음 레이어가 고려하게 하고 싶다
< RNN Training >
- Back-propagation through time (BPTT)
: 파라미터를 최적화하기 위해 역전파 방법을 쓴다. 역전파란, 예측값과 실제값을 비교해서 나온 차이(loss)의 크기에 따라 다시 input layer 방향으로 역으로 파라미터를 최적화해주는 방법이다. pytorch, tensorflow 가 대신 해줌.
단 hidden layer가 너무 많아지면 역전파 효과가 약해지는데 이것을 Gradient Vanish 라고 함
- problem Types
(1) Many to Many -> 번역
(2) Many to One -> 예측
(3) One to Many -> 생성
- RNN의 단점
: state Xt에 Wxx가 계속 곱해지기 때문에 exploding gradient, vasnishing gradient 발생
=> Gated RNNs: LSTM / GRU 로 해결 한다.
1. exploding gradient
: 무한대로 뻗어 나간다
loss가 inf가 뜨는 현상 발생함
* 해결책 => Gradient clipping: 상한, 하한을 정해놓음
2. vanishing gradient
: 0으로 수렴한다
학습 도중 파악이 어렵다. loss가 0이 되면 학습이 종료된건지 vanishing gradient가 발생한건지 알 수 없다.
- Long Short Term Memory (LSTM)
: Gradient flow를 제어할 수 있는 밸브 역할을 한다고 생각하면 쉽다.
state space의 입력, 상태, 출력 구조는 동일하나 Gate 구조가 추가되었다.
Gate 종류: Input Gate / Forget Gate / Output Gate / Cell state
1. Forget Gate
: 새로운 입력과 이전 state를 참조해서 이 정보를 얼마의 비율로 사용할 것인지 결정한다. (즉, 얼마나 잊어버릴 것인지)
전 시점의 hidden state와 현재 입력에 대한 연산을 진행하고 activation 함수로 sigmoid 함수를 적용한다. sigmoid는 0~1 사이 값으로 출력하는데, 0에 가까울수록 많은 정보를 잊은 것이고 1에 가까울수록 많은 정보를 기억하는 것이다. 그렇기 때문에 forget gate의 연산으로 나온 값은 과거 정보에 대해서 얼마나 잊냐, 얼마나 기억하냐를 가지고 있는 값이다.
2. Input Gate
: 새로운 입력과 이전 상태를 참조해서 이 정보들을 얼마나 활용할 것인가를 결정한다. (즉, 어떤 정보를 활용할 것 인가)
전 시점의 hidden state와 현 시점의 입력 값에 대한 연산을 진행한다. forget gate와 달리 sigmoid와 tanh 활성화 함수로 연산하게 되는데, sigmoid는 얼마나 잊냐, 얼마냐 기억하냐를 의미하고, tanh는 –1~1 값으로 출력하므로 미래에 현재 정보를 cell state에 얼마나 더할지를 결정하는 역할을 한다.
3. Cell state
: 얼마나 잊을지, 얼마나 이용할지를 적절히 섞는다. forget gate에서 sigmoid로 나온 값과, input gate에서 sigmoid로 나온 값, tanh로 나온 값의 원소별 곱을 한다. 이 연산을 통해 이전 시점의 cell 정보를 얼마나 유지할지, 현재 input 값을 얼마나 유지할지를 현재 시점의 cell state를 갱신하는 것이다.
4. Output Gate
: 일련 정보들을 모두 종합해서 다음 상태를 결정한다.
현 시점의 hidden state는 현 시점의 cell state와 함께 계산되며 출력과 동시에 다음 시점으로 hidden state로 넘긴다.
- GRU
: LSTM의 간소화 버전이다. (Cell state가 없음)
LSTM보다 파라미터 수가 적으므로 학습 시간이 절약 되지만 LSTM보다 성능이 좋은지는 알 수 없다. 그러나 RNN보단 LSTM, GRU가 확실한 성능을 보장한다.