본문 바로가기
CVLab/cs231n (2016)

cs231n - lecture10(RNN)

by print_soo 2024. 10. 9.

Recurrent Neural Networks (RNN)

 

 

기본적인 NN: Input Layer와 Output Layer는 순서가 없지만, 각각에 대해서는 순서가 있다고 처리를 할 수 있다

 

Image Captioning: 이미지를 보고 그에 맞는 설명을 자동으로 생성하는 기술.

 

Sentiment Classification: 문장의 감정을 분석하여 긍정적인지 부정적인지를 분류하는 기술.

 

Machine Translation: 한 언어로 된 문장을 다른 언어로 번역하는 기술.

 

Video classification: 비디오의 각 프레임을 분석하여 그 내용을 분류하는 기술. 비디오에서 중요한 것은 예측이 현재 시점의 프레임만 하는 것이 아니라 과거의 모든 프레임에 대한 처리가 되어야한다.

 


RNN 작동 원리

 

 

RNN은 입력 값이 시간에 따라 순차적으로 들어올 때, 이전 상태와 현재 입력을 함께 고려하여 출력을 만들어내는 신경망구조이다.

 

 

입력 벡터 Xt : 시간 t에서 주어진 입력 벡터이다. 이 값은 시간에 따라지는 입력 시퀀스를 나타낸다. 예를 들어 음성 데이터를 다룰 때는 소리의 파형이 시간에 따라 변하기 때문에 연속된 소리 데이터를 입력 시퀀스라고 할 수 있다.

 

이전 상태 H t-1 : RNN은 시퀀스 데이터의 특성을 반영하기 위해서 시간 t-1에서 계산된 상태 값을 기억하고 이를 사용한다. 이 값은 현재 입력을 처리할 때 중요한 역할을 한다.

 

새로운 상태 Ht : 현재 시간 t에서의 새로운 상태는 함수 fw를 통해서 계산된다. 이 함수는 매개변수로 W를 사용해서 이전 상태Ht-1과 현재 입력 벡터 Xt를 결합한 후 새로운 상태 Ht를 출력한다.

 

함수 fw : 이 함수는 RNN의 핵심으로 이전 상태와 현재 입력을 결합하여 새로운 상태를 계산하는 비선형함수이다. 

 

 

쉽게 말해서, RNN은 각 단계에서 이전 상태(A)에 저장된 정보를 현재 입력과 결합해서 새로운 상태(B)를 출력하고, 또 다음 입력이 들어오면 상태(B)를 통해서 입력값과 결합해서 상태(C)를 결합한다. 상태(C)에는 (A), (B)의 정보가 모두 들어가 있는 상태이다. 이런식으로 전체 입력 시퀀스가 처리되고, 마지막 상태에서 최종 출력을 도출한다.

 

여기서 중요한 것은 모든 입력 시퀀스 데이터가 들어올 때는 같은 함수, 매개변수W를 사용해야한다는 것이다.

 

 


 

Character-level Language Model 예시

간단한 예시를 한번보자. 

 

 

 

 

 

간단한 예시로 "hello"라는 단어가 RNN에 입력된다고 가정하면, 각 문자가 Input layer를 통해 순차적으로 입력된다. 각 문자가 들어올 때마다 RNN은 이전의 hidden state와 현재 입력을 결합하여 새로운 hidden state를 계산하고, 이를 바탕으로 Output layer에서 출력을 생성한다.

 

 

 

 

이미지로 살펴보자.

 

 

 

Input Layer

  • 각 시간마다 입력 문자가 Input Layer를 통해서 들어간다.
  • 각각의 입력을 벡터화시켜서 h = [1 0 0 0], e = [0 1 0 0] 등으로 표현한다.

 

Hidden Layer

  • Hidden Layer는 이전 단계에서 계산된 hidden state와 현재 입력을 결합해서 새로운 hidden state를 만든다.
  • 첫 번째로 "h"가 입력되었을 때, 가중치 행렬 W_xh와 결합하여 첫 번째 hidden state를 만든다. 그림에서 첫 번째 hidden state는 [0.3, −0.1, 0.9]로 나타난다.
  • 두 번째로 "h"가 입력되었을 때, 가중치 행렬 W_xh와 결합하여 첫 번째 hidden state를 만든다. 그림에서 두 번째 hidden state는 [1.0, 0.3, 0.1]로 생성된다. 이 과정에서 가중치 행렬 W_xh, W_hh가 사용된다.
  • 이 과정은 이후에도 반복되며, 각 입력마다 새로운 hidden state가 생성된다.

Output Layer

  • Hidden layer에서 계산된 hidden state를 바탕으로 Output layer에서 출력이 계산된다. 이때 가중치 행렬 W_hy가 사용된다.
  • 첫 번째 hidden state [0.3, −0.1, 0.9]는 Output layer에서 가중치 W_hy와 결합되어 첫 번째 출력이 계산된다. 이 출력은 [1.0,2.2,−3.0,4.1]로 나타난다.
  • 두 번째 입력 "e"가 들어왔을 때는 , 두 번째 hidden state [1.0, 0.3, 0.1]가 Output layer로 전달되어 출력 가 계산된다. 
  • 이 과정에서는 다음에 어떤 단어가 올지를 예상하는 건데, 그림에서 출력 값들을 살펴보면, "e", 가 나올 곳은 "o"를 예측하는 등 제대로된 모델은 아니다. 

 

위 모델은 제대로된 모델이 아니기때문에, 각 출력들에서 softmax 분류기를 통해서 Loss를 계산하고, 그 Loss값으로 역전파를 통해서 가중치를 다시 업데이트하는 작업을 한다.

 

 

코드를 입력 데이터로 넣으면 각각의 cell들이 주의 깊에 보는 특징들에는 아래와 같이 quote(""), line length, if statement, comment등이 있다.

 

 


RNN을 잘 활용한 Image Captioning 예시

 

 

 

Image Captioning에는 총 2가지 단계가 있는데, CNN을 통해서 이미지를 분석하고 그 결과 값을 RNN에서 입력 값으로 받아서 출력해준다.

 

 

 

좀 더 자세히 살펴보자.

 

1. 이미지 특징 추출(CNN)

CNN을 통해서 추출한 이미지의 특징을 하나의 1차원 벡터로 변환해서 RNN으로 전달한다.

 

 

2. 설명 생성 단계(RNN)

: RNN은 이미지 캡셔닝에서 다음 단어를 예측하는 일, 이미지 정보를 예측하는 일을 동시에 진행해야한다.

  • 초기 상태 설정
    • CNN에서 추출한 이미지의 특징 벡터는 RNN의 초기 입력으로 들어간다. 이 벡터는 RNN에 의해 첫 번째 단어를 생성하기 위한 정보로 사용된다.
  • 첫 번째 단어 예측
    • 이미지 특징 벡터가 RNN에 입력되고 RNN은 학습된 파라미터를 사용해 첫 번째 단어를 예측한다. 보통 This, A  같은 것을 예측한다.
    • 예를 들어 모자를 쓴 남자를 설명해야 한다면 A man with hat을 결과로 가져와야하기 때문에 A가 첫 단어가 된다.
  • 다음 단어 생성
    • A나 This가 생성된 후, 해당 단어는 RNN의 다음 단계에 입력으로 전달된다.
    • 이제 RNN은 hiddent state와 Xt-1을 이용해서 두 번째 단어를 생성한다.
    • 이런식으로 두 번째는 A를 통해서 man을 예측하고, 세 번째는 A man을 통해서 with을 예측하게 된다.
  • 종료
    • 단어 생성은 RNN이 종료 토큰<END>을 예측할 떄까지 출력한다.

 


LSTM (Long Short Term Memory)

기본 작동 원리

LSTM은 RNN의 한 종류로, 시퀀스 데이터에서 장기 종속성 즉, 시퀀스 초반에 등장한 데이터가 현재 또는 미래의 예측에 중요한 영향을 미치는 상황을 해결하기 위해서 고안되었다.  기존 RNN과 같은 구조는 시퀀스 데이터가 길어지면, 초기 정보를 잊어버리거나 약하게 기억하는 경향이 있다. 따라서 시퀀스 데이터가 길어기면 과거의 정보가 점점 희미해져 장기적인 의존 관계를 유지하는게 어려워 초반 데이터를 이용하는 예측의 경우 모델 성능 저하되는 문제가 생긴다. 

 

 

 

 

LSTM은 장기 종속성 문제를 해결하기 위해서 시퀀스의 중요한 정보를 장기간 유지하고, 필요할 때만 새로운 정보를 추가하거나 불필요한 정보를 잃도록 설계되었다. 이 때 중요한 것이 Cell state이다.

 

Cell state란 LSTM의 장기적인 기억을 저장하는 역할을 한다. Cell state는 각 시점에서 업데이트 되며 Forget Gate, Input Gate, Output Gate를 통해 정보를 유지하거나 버리는 메커니즘이 적용된다.

 


 

신경망 상태(c) 처리

 

LSTM의 핵심은 Cell state이다. Cell state는 각 시점에서 업데이트되지만, 게이트 메커니즘을 통해 제어된다.

 

  • Forget Gate(f)
    • 이전 시점의 cell state에서 어떤 정보를 유지하고 어떤 정보를 버릴지를 결정하는 게이트이다.
    • Forget Gate의 결과는 이전의 cell state와 곱해져 기억할 정보만 남긴다.
  • Input Gate(i)
    • 새로운 정보를 입력 받아 cell state에 추가할지 결정한다.
    • 새로운 정보는 tanh함수를 통해서 비선형 변환된 후 cell state에 추가된다.
  • Cell state 업데이트
    • 최종적으로, cell state는 이전 상태에서 유지할 정보와 새롭게 입력된 정보를 결합해서 업데이트 된다.
    • ⬇️ 아래는 Cell state 업데이트 공식이다

 

 

이점 시점의 cell state와 forget gate(f)를 이용해서 이전 cell state에서 어떤 부분을 유지할지 결정한다. 그리고 input gate(i)와 g(새로운 정보의 후보)를 통해서 새로운 정보의 후보에서 어떤 부분을 얼마나 들여올지를 결정한다.

 

즉, 이전 cell state의 일부분 + 새로운 정보의 일부분이 현재 cell state가 된다.

 



게이트 작동 방식

 

 

Hidden State (로컬 저장소)와 Cell State (DB)

Hidden state와 Cell state를 각각 로컬 저장소 - 프로그램 종료시 데이터 휘발 / DB - 프로그램 종료시에도 데이터 유지로 비유해봤다.

 

Cell state (DB): 장기적으로 중요한 데이터를 저장하며, 그 데이터는 시퀀스가 진행되는 동안 계속 유지된다. 장기적으로 보관해야 할 정보를 저장소처럼 관리하는 역할을 하고, 시퀀스가 길어져도 중요한 정보가 소실되지 않도록 한다.

 

Hidden state (로컬 저장소): 단기적으로 필요한 정보만을 저장한다. 각 시점에서 현재 입력과 관련된 정보에 집중하여, 그 시점의 출력을 생성한다. 즉, Hidden state는 현재 시점에서 필요한 계산이나 작업을 빠르게 수행하기 위해 즉시 사용되는 정보들을 가지고 있다.

 

 

두 State의 관계

 

Cell state는 변경 사항을 반영하지만, 장기적으로 유지할 정보에 대해서도 계속 관리한다. Forget gate를 통해서 불필요한 정보를 삭제하고, Input gate를 통해서 새로운 정보를 추가하여 업데이트하지만, 계속해서 중요한 정보를 유지하는 특성을 갖고 있다.

 

Hidden state는 각 시간 단계에서 input과 이전 hidden state를 기반으로 현재 시점에 필요한 정보를 빠르게 처리하고 출력을 생성한다. 하지만 시퀀스가 진행되면서 오래된 정보는 점점 사라지고 새로운 정보를 덮으면서 처리된다.

 

 

 

따라서, 각 시점에서 Cell state과 Hidden state는 서로 데이터 교환을 한다.

 

Cell state   ➡️   Hidden state

Cell state는 Output gate를 통해서 Cell state의 정보를 선택적으로 hidden state로 전달한다. 

이 과정은 로컬 저장소가 프로그램에 특정한 작업을 수행하기 위해 DB 데이터를 Get하는 과정과 유사하다.

 

Hidden state   ➡️  Cell state

Hidden state는 현재 시점의 출력을 내보내면서, 이 출력을 기반으로 Cell state를 업데이트할 수 있는 정보를 제공한다. 

Input Gate를 통해 새로운 정보를 받아들여 장기 기억에 추가할지 결정한다.

이 과정은 프로그램이 로컬 저장소에서 계산한 결과를 DB에 저장하는 과정과 유사하다

 


RNN과 LSTM 차이점

정보 기억 및 손실

  • RNN: RNN은 시퀀스 데이터를 처리하면서 각 시간 단계에서 hidden state를 업데이트한다. 그러나 시퀀스가 길어질수록 기울기 소실(Gradient Vanishing) 문제로 인해 장기 기억을 유지하는 데 어려움을 겪는다. RNN은 기본적으로 짧은 시퀀스에서는 잘 작동하지만, 긴 시퀀스를 처리할 때는 과거 정보를 잃어버리는 경향이 강하다.
  • LSTM: LSTM은 Cell state라는 특별한 메모리 장치를 사용해 정보를 장기적으로 유지할 수 있다. Forget Gate와 Input Gate를 통해 어떤 정보를 기억할지와 어떤 정보를 잊을지를 결정하기 때문에, 긴 시퀀스에서도 중요한 정보를 잃지 않고 처리할 수 있다. LSTM은 이를 통해 장기 종속성 문제를 해결하며, 더 긴 시퀀스에서도 성능이 우수하다.

 

 

 

게이트 메커니즘

  • RNN: RNN은 단순히 입력을 받아들여 은닉 상태를 업데이트하는 구조로, 정보 흐름을 세부적으로 조정하는 메커니즘이 없다. 즉, RNN은 모든 정보가 동일하게 처리되며, 어떤 정보를 선택적으로 기억하거나 잊지 못한다.
  • LSTM: LSTM은 게이트 메커니즘을 통해 정보를 효율적으로 처리합니다. LSTM에는 세 가지 주요 게이트가 있다:
    • Forget Gate: 이전의 정보 중 어떤 부분을 잊을지 결정.
    • Input Gate: 새로운 정보 중 어떤 부분을 기억할지 결정.
    • Output Gate: 현재 시점에서 어떤 정보를 출력할지 결정.
    이 게이트 메커니즘 덕분에 LSTM은 정보 흐름을 더 세밀하게 제어할 수 있으며, RNN에 비해 정보 손실을 줄일 수 있다​.

 

 

 

Gradient 소실 문제

  • RNN: RNN은 역전파를 통해 학습할 때 기울기 소실(Gradient Vanishing) 문제가 발생할 수 있다. 이는 학습 과정에서 기울기가 소멸되어, 과거 입력이 현재 출력에 미치는 영향이 점차 줄어드는 현상이다. 특히 시퀀스가 길어질수록, 이 문제는 심각해진다.
  • LSTM: LSTM은 Gradient 소실 문제를 해결하는 데 매우 효과적이다. LSTM의 구조는 장기적으로 기울기를 유지하며, Gradient Clipping 같은 기법으로 기울기 폭발을 막고, 게이트 메커니즘을 통해 필요한 정보만 기억하면서 기울기 소실 문제를 완화한다.

 

 

 

성능 차이

  • RNN: RNN은 짧은 시퀀스에서는 효과적으로 동작하지만, 시퀀스가 길어지면 정보를 유지하는 능력이 떨어지기 때문에 성능이 저하된다. 특히, 장기 의존성을 가진 데이터에서는 RNN의 성능이 매우 제한적이다.
  • LSTM: LSTM은 긴 시퀀스를 처리하는 데 매우 강력하다. 장기 의존성(long-term dependency)을 효과적으로 처리할 수 있으며, RNN에 비해 훨씬 더 안정적으로 학습할 수 있다. 

 

 

 

 

 

 

'CVLab > cs231n (2016)' 카테고리의 다른 글

cs231n - lecture11(CNNs in practice)  (0) 2024.10.27
2024.10.11 Q&A  (1) 2024.10.11
cs231n - lecture09(CNN의 시각화 및 이해)  (5) 2024.10.06
2024.10.04 Q&A  (0) 2024.10.04
cs231n - lecture08(Localization and Detection)  (1) 2024.10.03