Search
Duplicate

시각적 이해를 위한 머신러닝/ Recurrent Neural Networks

RNN에 대해서 이전에 들었던 것에 더 상세한 부분이 있음. 아래 페이지 참조
Neural Network의 여러 종류
Input, Output이 모두 1개인 것도 있고
Input이 여러 개인데 Output이 1개인 것도 있고
Input이 여러 개이고 Ouptut도 여러 개인 것도 있다.
Input이 1개인데, Output이 여러 개인 것도 있다.
Input과 Output 모두 여러 개인 것도 있다. —3번째와는 다름
RNN은 Input을 받을 때 자신의 상태를 업데이트하는 feedback loop를 돈다.
시퀀스를 펼치면 위와 같다.
input을 받아서 hidden state를 업데이트하고 output을 내보낸다. (output을 안 내보낼 수도 있음)
이전 hidden state(ht1h_{t-1})와 현재 input(xtx_{t})을 받아 hidden state(hth_{t})를 업데이트 한다.
hidden state를 업데이트 할 때는 tanh를 사용한다.
각 위치에서 사용되는 가중치(Whh,Wxh,WhyW_{hh}, W_{xh}, W_{hy})는 sequence가 바뀌더라도 항상 같은 것을 사용한다.
Loss가 각 output에 대해 발생하기 때문에 앞쪽에 있는 state에 대해 계속 Loss가 계산된다.
h1h_{1}y1,y2,y3y_{1}, y_{2}, y_{3}의 loss를 모두 받음. h3h_{3}y3y_{3}의 loss만 받음
만일 Many-to-One인 경우라면 Loss 계산을 한 번만 하게 된다.
이때 시퀀스가 길어지면 앞쪽 state의 값은 잃어버릴 수 있으므로, 그 값을 유지하고 있다가 최종 output을 계산할 때 함께 사용한다.
One-to-Many인 경우는 Input이 1개 뿐이므로, 이전 단계의 output을 input으로 넣어 사용한다.
Many-to-Many는 Many-to-One과 One-to-Many를 합하여 구성한다.
이때 Many-to-One은 Encoder라고 하고, One-to-Many는 Decoder라고 한다.
TensorFlow에서 RNN 사용하는 방법
RNN 장점
항상 같은 W를 쓰기 때문에 길이에 제한이 없다.
따라서 Input이 아무리 커져도 모델 사이즈가 커지지 않는다.
이론적으로는 오래 전 state도 현재에 활용 될 수 있음
RNN 단점
느림
순차적이라서 parallel하게 처리할 수 없음
vanishing gradient 문제가 발생함
현실적으로 long-range dependence를 해결하지 못 함
RNN의 Hidden Layer를 여러 층으로 쌓은 것을 Multi-layer RNN이라고 함
RNN 활용 예 - Image Captioning
이미지 보고 Q&A
Visual Dialog
Visual Language Navigation
RNN은 NLP에서 많이 쓰임
여기서는 Video와 Multi Modal 문제에 적용해 보겠다.
RNN의 Gradient 계산 방식
같은 W에 대해 Gradient 계산이 반복 됨
tanh는 1과 -1 사이의 값이 나오는데, 이걸 계속 반복해서 계산하면 0으로 가게 됨
그 옆의 W도 1보다 작으면 소실될 수 있고, 1보다 크면 폭발할 수 있음
폭발하는 경우를 막기 위해 특정 값 이상으로는 못 올라가게 clipping 할 수도 있음.
하지만 vanishing하는 경우는 해결이 불가
RNN 구조 notation을 오른쪽과 같이 축약하여 표기
Vanishing Gradient 문제를 해결하기 위한 방법이 LSTM
Fully-Connected를 반복해서 gradient가 소실되기 때문에 FC를 반복하지 않도록 하는 별도의 cell state라는 state를 추가하고, cell state는 FC를 하지 않음
그래도 long term memory(cell state)가 모든 정보를 계속 가지고 있으면 안되기 때문에 적절하게 잊어줄 수 있게 forget gate를 추가해 줌
이전 hidden state와 input을 fully-connected 하는 건 마찬가지 동일한데, 그것을 sigmoid 함수에 넣은 결과와 곱해서 이전 것 중에 잊어야 할 것은 잊게 해 줌
long term memory에서 잊어야 할 것을 잊은 후에는 새로운 것을 추가해 주기 위해 input gate를 추가해 줌
이전 hidden state와 input을 FC하고 sigmoid를 통과한 것까지는 동일한데, 이것을 tanh를 통과한 것과 곱한 뒤에 forget gate를 통과한 것에 더해 줌
그렇게 더해준 값이 cell state에 남겨짐
다음 state를 업데이트 하기 위해 output gate를 추가해 줌
이전 hidden state와 input을 FC하고 sigmoid를 통과한 것까지는 동일한데, 이것을 앞서 계산한 long-term 기억과 곱해서 long term 기억을 일부 반영한 후 hidden state를 업데이트 함
결국 long-term(cell state), short-term(hidden state)와 forget gate, input gate, output gate를 이용해서 구성 함
위 흐름에 대한 수식
장기 기억(Cell State)는 forget gate를 통해 데이터를 일부 잃지만, input gate에서 새로운 input을 지속적으로 더해주기만 하기 때문에 기억을 오래 유지할 수 있다.
반면 단기 기억(Hidden State)는 Fully-Connected와 장기 기억과의 곱이 다음 State로 넘어가기 때문에 기억을 잃게 됨. 가장 최근의 Input만 오래 살아 남는다.
LSTM은 Vanishing Gradient를 많이 줄여준다. 그러나 완전히 없애 주지는 못 한다.
LSTM과 비슷한 GRU 모델이 있다.
GRU는 state는 1개만 유지함.
별도의 state를 유지하지 않고도, 새로운 hidden state에 기존 hidden state와 convex combination 연산을 통해 이전 기억을 유지할 수 있도록 함
LSTM과 GRU 코드 예
LSTM은 RNN을 할 때 기본 선택으로 사용할 수 있다.
파라미터를 줄이고 싶을 때 GRU를 쓸 수 있다.
그런데 요즘은 Transformer가 대세임