Recurrent Neural Network , 순환 신경망

2023. 9. 6. 18:02자연어처리

대부분의 신경망은 입력의 길이가 고정되어 있어 자연어 처리를 위한 신경망으로는 한계가 있다.

결국 다양한 길이의 입력 시퀀스를 처리 할 수 있는 인공신경망이 필요하게 되었는데 자연어 처리에 있어 대표적으로 사용되는 인공 신경망이 바로 RNN이다. 

 

RNN은 입력과 출력을 시퀀스 단위로 처리하는 시퀀스 모델이다. 

번역기를 생각해보면 입력은 번역하고자 하는 단어의 시퀀스인 문장이다. 출력에 해당되는 번역된 문장도 시퀀스이다.

 

시퀀스를 처리하기 위해 고안된 모델을 시퀀스 모델이라고 하고, RNN은 기본적인 인공 신경망 시퀀스 모델이다.

 

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

앞에 나온 신경망들은 전부 은닉층에서 활성화 함수를 지난 값은 오직 출력층 방향으로만 향했는데 이를 피드 포워드 신경망(Feed Forward Neural Network)이라고 한다.

 

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

x는 입력층의 입력벡터 , y는 출력층의 출력 벡터라고 했을 때  

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

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

 

 

은닉층의 메모리 셀은

각각의 시점에서 바로 이전 시점에서의 은닉층의 메모리 셀에서 나온 값을

자신의 입력으로 사용하는 재귀적 활동을 하고 있다.

 

여기서 t를 현재 시험의 변수 라고 하였을 때 메모리 셀이 출력층 방향 또는 다음 시점인 t+1의 자신에게 보내는 값을 은닉 상태(hidden state) 라고 한다.

 

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

 

 

RNN을 표현할 때는 일반적으로 위의 그림에서 좌측과 같이 화살표로 사이클을 그려서 재귀 형태로 표현하기도 하는데,

우측과 같이 사이클을 그리는 화살표 대신 여러 시점으로 펼쳐서 표현하기도 한다.

 

RNN에서는 뉴런이라는 단위보다는 입력층과 출력층에서는 각각 입력 벡터와 출력 벡터, 은닉층에서는 은닉 상태라는 표현을 주로 사용한다.

 

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

 


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

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


 

예를 들어 하나의 입력에 대해서 여러개의 출력을 의미하는 일 대 다 구조의 모델은 하나의 이미지 입력에 대해서 사진의 제목을 출력하는 이미지 캡셔닝 작업에 사용할 수 있다. 

 

또한 단어 시퀀스에 대해서 하나의 출력을 하는 다 대 일(many-to-one) 구조의 모델은 입력 문서가 긍정적인지 부정적인지를 판별하는 sentiment classification, 또는 메일이 정상 메일인지 스팸 메일인지 판별하는 spam detection에 사용할 수 있다.

 

다 대 다(many-to-many) 구조의 모델의 경우에는 사용자가 문장을 입력하면 대답 문장을 출력하는 챗봇과 입력 문장으로부터 번역된 문장을 출력하는 번역기, 또는 '태깅 작업' 챕터에서 배우는 개체명 인식이나 품사 태깅과 같은 작업이 속한다.

 


현재 시점 t에서의 은닉 상태값을 ht 라고 정의하자, 은닉층의 메모리 셀은 ht를 계산하기 위해서 총 두개의 가중치를 가진다.

하나는 입력층을 위한 가중치이고, 하나는 이전 시점 t-1의 은닉 상태값인 h(t-1) 을 위한 가중치이다.

RNN의 은닉층 연산을 벡터와 행렬 연산으로 이해해보자.

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

 

 

이때 ℎ를 계산하기 위한 활성화 함수로는 주로 하이퍼볼릭탄젠트 함수(tanh)가 사용된다.

위의 식에서 각각의 가중치 값은 하나의 층에서는 모든 시점에서 값을 동일하게 공유한다.

하지만 은닉층이 2개 이상일 경우에는 각 은닉층에서의 가중치는 서로 다르다.

 

2.  깊은 순환 신경망(Deep Recurrent Neural Network)

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

3. 양방향 순환 신경망(Bidirectional Recurrent Neural Network)

양방향 순환 신경망은 시점 t에서의 출력값을 예측할 때 이전 시점의 입력뿐만 아니라, 이후 시점의 입력 또한 예측에 기여할 수 있다는 아이디어에 기반한다.

 

빈 칸 채우기 문제를 풀 때 이전에 나온 단어들만으로 빈 칸을 채우려고 시도해보면 정보가 부족하다. 

RNN이 풀고자 하는 문제 중에서는 과거 시점의 입력 뿐만 아니라 미래 시점의 입력에 힌트가 있는 경우가 많은데, 이전과 이후의 시점 모두를 고려해서 현재 시점의 예측을 더욱 정확하게 할 수 있도록 고안된 것이 양방향 RNN 이다.

 

양방향 RNN은 하나의 출력값을 예측 할 때 기본적으로 두 개의 메모리 셀을 사용한다. 첫번째 메모리 셀은 앞 시점의 은닉 상태를 전달 받아 계산하고 두번째 셀은 뒤 시점의 은닉 상태를 전달 받아 현재의 은닉 상태를 계산한다. 

은닉층을 무조건 추가한다고 해서 모델의 성능이 좋아지는 것은 아니다. 은닉층을 추가하면 학습 할 수 있는 양이 많아지지만 반대로 훈련 데이터 또한 많은 양이 필요하다. 

 

 

출처: 위키독스 자연어처리