작성자: 15기 조우영
우리가 흔히 많이 쓰는 활성화 함수인 Sigmoid는 미분값의 범위가 0부터 최대 0.25까지고, tanh 같은 경우에는 0부터 최대 1까지의 값을 갖는다. 따라서 back propagation이 진행되면서 1보다 작은 값이 계속해서 곱해지게 되고, 이로 인해 gradient가 제대로 전달되지 못하고 0으로 수렴해 소실되는 현상을 의미한다.
Vanishing Gradient와는 정반대의 상황으로, 기울기의 절대값이 1이 넘는 활성화 함수를 사용 시, 절대값이 1보다 큰 값이 계속해서 곱해져, 이로 인해 gradient가 비정상적으로 커지는 현상을 의미한다.
앞으로 소개할 LSTM도 RNN구조의 한 종류이고, 기존 RNN구조(Vanilla RNN)의 문제들을 보완하기 위해 새로 제시된 모델이기 때문에 RNN에 대해 먼저 간단히 소개하고 넘어가겠다.
input이 hidden layer를 통과하면서 output으로 향함과 동시의 다음 state의 hidden layer에 다시 들어가는 구조를 통해 순서를 가지고 순차적으로 벌어지는 sequential data들을 처리하고 있다.
RNN에 대한 보다 자세한 설명은
https://www.youtube.com/watch?v=AsNTP8Kwu80
등을 참고하면 좋을 것 같다.
하지만, RNN은 Activation function으로 tanh 사용하기 때문에 몇 가지 문제가 발생하는데,
그리고 이런 문제들을 보완하기 위해 고안된 것이 Long short-term memory, LSTM이다.
* 여기서 개인적으로 한 가지 의문이 들었는데, Activation function으로 tanh 사용하기 때문에 문제가 발생한다면, 어렵게 새로운 구조를 생각해내는 것보다는 ReLU activation function을 사용하면 간단히 해결이 되지 않을까?하는 의문이었다.
이에 대한 답은, ReLU는 상한선이 존재하지 않는 활성화 함수이기에, forward 연산 시 값이 너무 커지는 문제가 발생해 RNN 구조에서 잘 사용되지 않는다고 한다.
cell state에는 더하기 연산만 존재하기 때문에 backpropagation시의 정보 손실이 존재하지 않아 vanishing gradient가 발생하지 않고 더 긴 time 학습이 가능하고, 이를 계속 뒤로 넘겨주는 것으로 RNN에서 forward 연산 시에 발생하던 장기 의존성 문제 또한 해결이 가능하다.
2-1. Gate 구조 도입-Input Gate
이전 unit의 출력값인 $h_{t-1}$과 $x_t$를 입력으로 받아 이에 activation function을 적용한 값 $s_t$에 0과 1사이의 값을 갖는 $i_t$를 곱하여 장기기억 cell에 현재와 바로 직전 정보에 대한 업데이트 비율을 결정함
수식으로는 다음과 같이 표현된다.
* 참고: 왜 tanh가 아닌 tanh의 변형인 Squash function을 사용했을까?
tanh와 squash function을 미분하면 위와 같은 형태를 띄는데, Squash function이 좀 더 넓게 퍼져있는 것을 볼 수 있다. Squash function의 이런 구조가 vanishing gradient 문제에 대해 tanh function보다 덜 취약하기 때문에 변형을 하여 사용한 것으로 보인다.
2-2. Gate 구조 도입-Output Gate
Cell state에 squash activation을 하고 이에 0과 1사이의 값을 곱하는 방식으로, cell state를 이용하여 다음 출력값이 될 $h_t$를 결정
* 지금까지에 대해 보다 완전한 정보를 갖고 있는 $c_t$에서 일부 정보만을 필터링하여 현재 time step에 직접적으로 필요한 정보만을 갖도록 하는 것으로 이해할 수 있다.
수식으로는 다음과 같이 표현된다.
그런데, 앞서 ReLU를 사용하지 않은 이유가, 상한선이 존재하지 않는 활성화 함수이기에, forward 연산 시 값이 너무 커지는 문제가 발생하기 때문이라 했는데, 이건 단순히 더하기 연산만을 반복적으로 수행하는 cell state도 마찬가지가 아닌가? 맞다. 그래서 이를 해결하기 위해 forget gate라는 하나의 gate가 추가된 LSTM 모델이 후에 고안되었는데, 이것이 현재는 Vanilla LSTM으로 굳어져있다. 추가로, 앞서 언급한 squash function의 구조가 tanh function보다 이러한 문제에 취약하기 때문에 Vanilla LSTM에서는 tanh를 사용한다.
그런데 sigmoid 활성화 함수를 이용하는 forget gate를 사용하면 다시 vanishing gradient 문제가 발생하지 않을까?
실제로 발생한다. 하지만 LSTM 구조에서는 sigmoid 활성화 함수를 cell state에 직접 적용하는 것이 아닌 그 결과를 곱하는 것이기 때문에 덜 취약하고, 추가로 뒤에 input gate를 통해 구해진 값이 더해지기 때문에, forget gate를 통해 구해지는 값과 input gate를 통해 구해지는 값이 상호 보완적으로 어느정도 이 문제를 완충시켜준다고 한다. 또한, weight의 값을 이용하여 forget gate의 sigmoid activation 결과 값이 1에 가깝도록 학습하는 것이 가능하기 때문에, vanishing gradient에 대해 기존 Vanilla-RNN보다 강한 모습을 보여주고, 1000개 time step 정도까지는 문제 없이 사용이 가능하다고 한다.
참고 자료:
https://www.youtube.com/watch?v=IgIHjiCgECw&t=1310s
https://www.youtube.com/watch?v=YCzL96nL7j0&t=1089s
댓글 영역