본문 바로가기
Data Science/NLP

[NLP] RNN (Recurrent Neural Network)

by VAMOSSS 2022. 3. 28.
반응형

 

본 글은 카이스트 최윤재 교수님의 Programming for AI (AI504, Fall 2020), Class 9: Recurrent Neural NetworksWikiDocs의 딥 러닝을 이용한 자연어 처리 입문를 바탕으로 정리한 글입니다.

순환 신경망 (Recurrent Neural Network, RNN)

입력과 출력을 시퀀스 단위로 처리하는 모델을 시퀀스 모델이라 하는데,

RNN은 딥러닝에 있어 가장 기본적인 시퀀스 모델이고 자연어 처리(NLP)와 TimeSeries data에 활용됩니다.

 

용어는 비슷하지만 순환 신경망과 재귀 신경망(Recursive Neural Network)은 전혀 다른 개념입니다.

 

피드 포워드 신경망(Feed Forward Neural Network)은 은닉층에서 활성화 함수를 지난 값은 전부 오직 출력층 방향으로만 향합니다.

피드 포워드 신경망은 입력의 길이가 고정되어 있어 자연어 처리를 위한 신경망으로는 한계가 있습니다.

 

RNN (Vanilla RNN)

RNN은 은닉층의 노드에서 활성화 함수를 통해 나온 결괏값을 출력층 방향으로도 보내면서, 다시 은닉층 노드의 다음 계산의 입력으로 보내는 특징을 갖고 있습니다.

RNN에서 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드를 셀(cell)이라고 합니다.

이 셀은 이전의 값을 기억하려고 하는 일종의 메모리 역할을 수행하므로 이를 메모리 셀 또는 RNN 셀이라고 표현합니다.

 

은닉층(hidden, latent layer)의 메모리 셀은 각각의 시점(time step)에서 바로 이전 시점에서의 은닉층의 메모리 셀에서 나온 값을 자신의 입력으로 사용하는 재귀적 활동(updated by recursive rule)을 하고 있습니다.

 

메모리 셀이 출력층 방향으로 또는 다음 시점 t+1의 자신에게 보내는 값을 은닉 상태(hidden state)라고 합니다.

다시 말해 t 시점의 메모리 셀은 t-1 시점의 메모리 셀이 보낸 은닉 상태 값을 t 시점의 은닉 상태 계산을 위한 입력값으로 사용합니다.

위의 두 그림은 동일한 그림으로 단지 사이클을 그리는 화살표를 사용하여 표현하였느냐, 시점의 흐름에 따라서 표현하였느냐의 차이일 뿐 둘 다 동일한 RNN을 표현하고 있습니다.

 

피드 포워드 신경망에서는 뉴런이라는 단위를 사용했지만, RNN에서는 뉴런이라는 단위보다는 입력층과 출력층에서는 각각 입력 벡터 출력 벡터, 은닉층에서는 은닉 상태라는 표현을 주로 사용합니다.

 

위의 그림에서 회색과 초록색으로 표현한 각 네모들은 기본적으로 벡터 단위를 가정하고 있습니다.

피드 포워드 신경망과의 차이를 비교하기 위해서 RNN을 뉴런 단위로 시각화해보겠습니다.

중요하게 봐야 할 점은 은닉층 뉴런의 상태 값이 다음 시점의 은닉층 뉴런의 입력값으로 사용된다는 점과 현재 time step에서의 input(\(x_t\))도 영향을 미친다는 점입니다.

 

가장 단순한 형태의 RNN이라고 하여 바닐라 RNN(Vanilla RNN)이라고도 부릅니다.

 

RNN에 대한 수식

은닉층의 메모리 셀은 \(h_t\) (현재 시점 t에서의 은닉 상태 값)를 계산하기 위해서 총 두 개의 가중치를 갖게 됩니다.

  • \(W_x\) : 입력층에서 입력값을 위한 가중치
  • \(W_h\) : 이전 시점 t-1의 은닉 상태 값을 위한 가중치

이를 식으로 표현하면 다음과 같습니다.

  • 은닉층 : $$h_{t} = tanh(W_{x} x_{t} + W_{h}h_{t−1} + b)$$
  • 출력층 : $$yt=f(W_yh_t+b)$$
  • 단, f는 비선형 활성화 함수 중 하나.
    • sigmoid
    • tanh
    • ReLU
    • ...

※ 중요한 점은 2개의 weight(\(W_x\), \(W_h\))가 모든 single time step에서 동일하다는 점입니다.

input의 길이를 예상할 수 없기때문에 은닉층의 수도 예상할 수 없으므로 weight는 고정된 상태라고 생각하시면 될 것 같습니다.

(은닉층의 수는 input의 길이와 동일합니다, input 들어올 때마다 층 생성)

 

은닉층 연산을 벡터와 행렬 연산으로 이해

RNN의 은닉층 연산을 벡터와 행렬 연산으로 이해할 수 있습니다.

자연어 처리에서 RNN의 입력 \(x_t\)는 대부분의 경우에서 단어 벡터로 간주할 수 있는데, 단어 벡터의 차원을 d라고 하고, 은닉 상태의 크기를 \(D_h\)라고 하였을 때 각 벡터와 행렬의 크기는 다음과 같습니다.

$$x_t = (d × 1)$$

$$W_x = (D_{h} × d)$$

$$W_h = (D_{h} × D_{h})$$

$$h_{t-1} = (D_{h} × 1)$$

$$b : (D_{h} × 1)$$

 

예를 들어, 배치 크기가 1이고, d와 \(D_h\) 두 값 모두를 4로 가정하였을 때, RNN의 은닉층 연산을 그림으로 표현하면 아래와 같습니다.

이때 \(h_t\)를 계산하기 위한 활성화 함수로는 주로 하이퍼볼릭 탄젠트 함수(tanh)가 사용되지만, ReLU로 바꿔 사용하는 시도도 있습니다.

 

위의 식에서 각각의 가중치 \(W_x\), \(W_h\), \(W_y\)의 값은 모든 시점에서 값을 동일하게 공유합니다.

만약, 은닉층이 2개 이상일 경우에는 은닉층 2개의 가중치는 서로 다릅니다.

 

출력층은 결과값인 \(y_t\)를 계산하기 위한 활성화 함수로는 상황에 따라 다를 텐데,

예를 들어서 이진 분류를 해야 하는 경우라면 시그모이드 함수를 사용할 수 있고 다양한 카테고리 중에서 선택해야 하는 문제라면 소프트맥스 함수를 사용하게 될 것입니다.

 

깊은 순환 신경망 (Deep RNN, Stacking RNN)

은닉층이 2개인 깊은 순환 신경망

위의 그림은 순환 신경망에서 은닉층이 1개 더 추가되어 은닉층이 2개인 깊은(deep) 순환 신경망의 모습을 보여줍니다.

첫 번째 은닉층은 다음 은닉층에 모든 시점에 대해서 은닉 상태 값을 다음 은닉층으로 보내주고 있습니다.

 

첫 번째 은닉층의 새로운 input은 \(x_t\)이고, 두 번째 은닉층의 새로운 input은 첫 번째 은닉층의 값입니다.

 

 

양방향 순환 신경망 (Bidirectional RNN)

양방향 순환 신경망은 시점 t에서의 출력 값을 예측할 때 이전 시점의 데이터뿐만 아니라, 이후 데이터로도 예측할 수 있다는 아이디어에 기반하여 양방향으로 진행(Forward & backward)합니다.

 

RNN이 과거 시점(time step)의 데이터들을 참고해서, 찾고자 하는 정답을 예측하지만 실제 문제에서는 과거 시점의 데이터만 고려하는 것이 아니라 향후 시점의 데이터에 힌트가 있는 경우도 많습니다.

그리고 문장이 매우 길면 앞에 있는 단어들의 거리가 멀기 때문에 마지막 은닉층에서는 잊혀질 것입니다. (vanishing gradient)

그래서 이전 시점의 데이터뿐만 아니라, 이후 시점의 데이터도 힌트로 활용하기 위해서 고안된 것이 양방향 RNN입니다.

양방향 순환 신경망

양방향 RNN은 하나의 출력 값을 예측하기 위해 기본적으로 두 개의 메모리 셀을 사용합니다.

  • 첫 번째 메모리 셀
    • 앞에서 배운 것처럼 앞 시점의 은닉 상태(Forward States)를 전달받아 현재의 은닉 상태를 계산
    • 위의 그림에서는 주황색 메모리 셀에 해당.
  • 두 번째 메모리 셀
    • 앞 시점의 은닉 상태가 아니라 뒤 시점의 은닉 상태(Backward States)를 전달받아 현재의 은닉 상태를 계산
    • 위의 그림에서는 초록색 메모리 셀에 해당

그리고 이 두 개의 값 모두가 출력층에서 출력 값을 예측하기 위해 사용됩니다. (concatenate하여 사용)

 

물론, 양방향 RNN도 다수의 은닉층을 가질 수 있습니다.

은닉층이 2개인 양방향 순환 신경망

다른 인공 신경망 모델들도 마찬가지이지만, 은닉층을 무조건 추가한다고 해서 모델의 성능이 좋아지는 것은 아닙니다.

은닉층을 추가하면, 학습할 수 있는 양이 많아지지만 또한 반대로 훈련 데이터 또한 그만큼 많이 필요합니다.

 

RNN의 자연어 처리에서의 사용 (Application)

RNN 셀의 각 시점 별 입, 출력의 단위는 사용자가 정의하기 나름이지만 가장 보편적인 단위는 '단어 벡터'입니다.

RNN은 입력과 출력의 길이를 다르게 설계할 수 있으므로 다양한 용도로 사용할 수 있습니다.

예시

  • 일 대 다(one-to-many)의 모델
    • 하나의 이미지 입력에 대해서 사진의 제목을 출력하는 이미지 캡셔닝(Image Captioning)
  • sequence-level classification/regression
    • sentiment classification : positive or negative (binary)
    • Topic classification : 어떤 category (multiclass)
    • spam detection
  • classification/regression at each step (각 스텝에 대한 출력 값이 존재 x1->y1, x2->y2, ...)
    • Language modeling : 다음 올 단어 예측
    • part-of-speech tagging : 각 단어가 들어오면 어떤 타입인지 구분(명사, 동사 ,,,)
  • sequence-to-sequence (다 대 다(many-to-many))
    • Translation : 영어 문장을 프랑스 문장으로 (one sequence to another sequence)
    • question answering : 질문이 들어오면 답을 출력 (chatbot)
    • 개체명 인식이나 품사 태깅
반응형

'Data Science > NLP' 카테고리의 다른 글

[NLP] NLP briefing  (0) 2022.05.04
[NLP] NLP Introduction  (0) 2022.05.03
[NLP] Attention Mechanism  (0) 2022.03.28
[NLP] GRU (Gated Recurrent Unit)  (0) 2022.03.28
[NLP] LSTM (Long Short-Term Memory, 장단기 메모리)  (0) 2022.03.28

댓글