Closed eubinecto closed 4 years ago
sentiment analysis를 예시로, 한번 다음과 같은 사고 실험을 해보자.
최근에 본 영화중에, 보고나서 정말 재미있었던, 혹은 재미없었던 영화가 있는가?
지금 그런 영화를 떠올려보고, 스스로 왜 그 영화를 긍정적 /부정적으로 평가했는지를 한번 생각해보자.
"영화가 재미있었다/재미없었다"라는 판단을 하기위해 영화의 모든 줄거리를 떠올려야 했는가? 남주와 여주가 사랑에 빠지고, 관계에 위기가 오고, 이후에는 다시 만났으며... 등등. 굳이 그런 세세한 내용을 다 상기하지 않아도(애초에 가능하지도 않다), 우리는 영화의 줄거리에 대한 전반적인 기억을 바탕으로 영화가 재미있었다, 재미 없었다 라고 판단할 수 있다.
영화에 대한 내용을 떠올릴 수 있을 정도의 장기기억은 필요하지만, 그 장기기억이 영화 그 자체일 필요는 없다. 재미있었다, 나쁘다를 판단할 수 있는 기억만 장기기억에 남아 있으면 충분하다.
즉, 단기기억과 함께 장기기억도 필요하지만, 우리의 뇌는 어떠한 일을 수행하기위해 정말로 필수적인 기억만을 장기기억에 남기며, 필요없는 기억은 장기기억에서 지운다.
이러한 "필요한 기억은 저장하고 필요없는 기억은 장기기억에서 지운다"라는 생각이 LSTM의 기본적인 작동원리를 설명하는 생각.
모델 | 예를 들면 이런 것 |
---|---|
RNN | |
LSTM |
시작부터 내부를 너무 자세하게 들여다보기 전에, 일단 최상위 abstraction에서 RNN과 어떤 차이점이 있는지부터 살펴보자.
From the book NLP in Action:
RNN (unrolled) | LSTM (unrolled) |
---|---|
chapt 8, Loopy (recurrent) neural networks (RNNs), pg252 | chapt 9, Improving retention with long short-term memory networks, pg 227 |
RNN과의 차이점은 크게 두가지.
그렇다면 LSTM의 hidden layer 속은 어떻게 다른걸까?
LSTM 셀의 기본구조 |
---|
처음 보면 굉장히 복잡하게 생겼다. 하지만 RNN셀과의 차이점과, 내부 장치 4개의 역할을 이해를 하면, 생각보다 간단하다.
먼저 RNN셀과 비교를 해보면서 LSTM은 RNN과 무엇이 다른지 살펴보자.
.. | RNN | LSTM |
---|---|---|
구조 | ||
입력 | h_t-1 concatx_t |
h_t-1 concatx_t , 그리고 이전 시간대까지의 장기기억을 담당하는 c_t-1 |
출력 | h_t (현 시간대까지의 단기기억만 생성) |
h_t 혹은 c_t (현 시간대까지의 단기기억, 장기기억 둘다 생성) |
"장치"의 개수 | 1개 per memory cell | 4개 per memory cell |
단기기억 생성 | h_t 를 출력하는 FC가 존재 |
3번째 장치가 동일한 역할을 함. (input block) |
장기기억 생성 | 없음. 모든 단기기억은 여러 시간대의 FC를 거치면서 흐릿해짐(vanishing gradient) | 그 어떠한 FC도 거치지 않는 장기기억의 "컨베이어 벨트"가 존재. 게이트들에 의해 정보가 조금씩 변형되기는 하지만, FC를 거치지 않기 때문에 시간대가 길어져도 vanishing gradient로 인한 정보 손실 위험이 없음 |
구조적인 차이점은 그러하다.
저 못생긴 그림을 자세히 보면, 성분곱셈이 3군데 있는 것을 알 수 있다. 그리고 이 연산은 반드시 sigmoid를 activation으로 하는 레이어 다음에 따라온다. 이는 0또는 1에 가까운 값을 출력하는 sigmoid 함수가 필요한 기억만 선택적으로 가져가는 일종의 필터, 혹은 "게이트" (albeit continuous)로 쓰이는데, 그렇게 쓸 수 있는 방법이 성분곱셈이기 때문이다.
그렇게 쓰이는 장치 3개를 좀 더 자세히 들여다 보자.
게이트 | 참고 그림 | 역할 |
---|---|---|
forget gate | 과거의 단기기억 & 현재에 대한 기억을 바탕으로, 장기기억 벡터에서 필요가 없다고 판단되는 성분은 시그모이드 출력값을 0에 가깝게 조절해, 해당 장기기억을 지운다. | |
input gate | 과거의 단기기억 & 현재에 대한 기억을 바탕으로, input block에서 막 생성된 단기기억 벡터의 성분 중, 장기 기억으로 전환할 가치가 있는 성분만 시그모이드 출력값을 1에 가깝게 조절해, 해당 단기기억을 장기기억으로 전환한다. ("전환" = 성분 덧셈 to c_t-1 ) |
|
output gate | 과거의 단기기억 & 현재에 대한 기억을 바탕으로, 장기기억 벡터의 성분 중, 다음 시간대의 단기기억으로 쓸만한 성분만 시그모이드 출력값을 1에 가깝게 조절해, 해당 장기기억을 다음 시간대의 단기기억으로 사용한다. |
즉, 성분곰셈이 이루어지는 구간이, 기억이 잊혀지거나 더해지는 구간으로 볼 수 있다. 그렇게 기억의 흐름을 통제하는 역할을 한다는 점에서, 위 3개의 장치를 게이트라고 부르는 것.
슬라이드 |
---|
편항 값의 초기값을 1로 설정하는 부분: https://github.com/eubinecto/k4ji_ai/blob/e94a5d01fb0fb59a82e0a32e016356bbc9a75840/eb/src/chap_11/rnn_lstm_model.py#L21
이미 0으로 초기화된 bias중, 일부분만 1.0으로 초기화 한다.
forget gate의 역할이 학습이 진행되면서 장기기억에서 필요없는 기억을 골라내 잊어버리는 것이기는 하지만, 학습이 시작되기전에는 어떤정보가 불필요한지 판단하기 어렵기 때문에, 일단 망각보다는 기억쪽에 무게를 두고 학습을 시작하기 위함.
슬라이드 |
---|
앞서 언급했듯, 망각 게이트와는 반대로 입력 게이트의 역할은 단기 기억 벡터의 성분 중에서 장기기억으로 전환해야한다고 판단되는 것들을 가려내는 것.
때문에 일단 망각에 무게를 두고 학습을 함.
슬라이드 |
---|
왜 게이트가 아니라 블록?
이 장치는 기억을 필터링하기 위해서 존재하는 장치가 아님. 기억을 생성하는 역할을 하는 장치. 때문에 게이트라고 부르지 않는다.
슬라이드 |
---|
이런 과정을 거친 최종 출력값은 그러면 무엇을 의미하는가?
말 그대로 hidden state이기 때문에 무엇을 의미하는지 정확하게 해석할 수는 없지만, 입력 값에 따른 출력값의 패턴을 살펴보면, 때때로 그 의미가 interpretable할 때도 있다.
의미 추측 | hidden state 시각화 |
---|---|
url에 강하게 반응함 | |
brackets에 강하게 반응함 |
슬라이드 |
---|
그림으로 보면 복잡해일 수 있지만서도, 수식으로는 보면 생각보다 그렇게 복잡하지 않다.
슬라이드 |
---|
가능한 LSTM 의 구조 |
---|
forward_lstm_layer
중:
https://github.com/eubinecto/k4ji_ai/blob/e94a5d01fb0fb59a82e0a32e016356bbc9a75840/eb/src/chap_11/rnn_lstm_model.py#L68-L71
무조건 순환벡터(단기기억)을 출력하는대신, 상태벡터(장기기억)을 출력하도록 만들 수 있다.
그럼 순환벡터를 출력으로 사용하는 경우, 성능차이는 어떻게 될까?
rnn & lstm 성능 차이 비교 |
---|
도시소음 분류 문제의 경우, 에폭이 작을 때에도, 클 때에도, 상태벡터를 출력한 경우가 성능이 가장 좋은 것으로 나타남.
이게 항상 이런가? 단기기억보다는 장기기억을 출력으로 사용하는 편이 항상 더 좋은 성능을 보이는가?
pg.523: "아직 성급히 결론 내리기는 이르지만 어쨋든 순환 벡터 대신 상태 벡터를 이용하는 변형을 허용하는 것은 유용해보인다 pg.525: "...그 중에서도 순환 벡터보다 상태 벡터 출력을 이용하는 쪽이 좋은 결과를 보여주었다."
음.. 책 어디에도 그런 주장은 없는 듯.
아마도 데이터 셋 마다, 문제마다 다르지 않을까 싶다.
슬라이드 |
---|
이에 대한 자세한 설명은 여기에서:
LSTM: intuition
LSTM의 구조
장치1: 망각 게이트
장치2: 입력 게이트
장치3: 입력 블록
장치4: 출력 게이트
상태벡터와 순환 벡터 값의 결정
LSTM계층의 출력
LSTM파라미터 구성