본문 바로가기
  • 공부 기록 인생 기록
Python/NLP

순환 신경망(RNN)

by 티권 2023. 3. 14.

RNN

RNN(Recurrent Neural Network)이란?

- 입력과 출력을 시퀀스 단위로 처리하는 시퀀스 모델

- 가장 기본적인 인공신경망 시퀀스 모델

 

시퀀스 모델이란??

- 연속적인 입력으로 부터 연속적인 출력을 생성하는 모델

- EX) 챗봇, 기계번역

- 단어의 시퀀스 = 문장 ,   문장(단어 시퀀스)을 입력받는 모델을 시퀀스 모델로 볼 수 있음!

 

RNN 특징

- 피드포워드 신경망이 아님

  : 피드포워드 신경망에서는 시계열 데이터의 성질(패턴)을 충분히 학습할 수 없음.

- 은닉층의 노드에서 활성화 함수를 통해 나온 결과값을

  -> 출력층 방향으로 + 은닉층의 노드의 다음 계산의 입력으로

 

" 즉, 활성화 함수를 거쳐서 나온 출력 값을 출력층 방향으로 내보내고,

이 값을 그 다음으로 들어오는 입력값과 함께 자신의 입력으로 사용 "

 

이 역할을 하는 게 바로 셀(cell)

 

셀(cell)

- RNN에서 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드

- 메모리 셀, RNN 셀 이라고도 함

- 각각의 시점에서 바로 이전 시점에서의 은닉층의 메모리 셀에서 나온 값을 자신의 입력으로 사용

 

현재 시점 t에서 메모리 셀이 갖고 있는 값은 과거 메모리 셀들의 값에 영향을 받은 것!

 

 

은닉 상태(hidden state)

- 메모리 셀의 출력 

- 메모리 셀이 출력층 방향 혹은 t+1시점의 자신에게 보내는 값

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

 

 

 

 

위 그림을 통해 직관적으로 이해할 수 있다

 

1시점의 메모리셀

입력 : x1

출력 : y1, x1의 정보가 반영된 은닉상태(h1)

 

2시점의 메모리셀

입력 : x2, 1시점의 메모리 셀이 출력한 은닉상태

출력 : y2, x1,x2의 정보가 반영된 은닉상태(h2)

 

...

정확히 말하면 메모리셀이 뱉어내는 건 은닉상태 뿐이고, 

다음 시점의 메모리셀의 입력으로 은닉상태가 들어가고, 은닉상태가 가중치와 편향과 합쳐져서 출력층에서 y로 나오는 것

 

즉 t시점의 y는 1,2,3... 시점의 x값들이 메모리 셀을 지나 출력된 값들이 누적되어 있음.

여기서 x1,x2,x3...은 노드가 t개 있다는 의미가 아니라 t시점이라는 의미

 

언어모델로 비유하면, 각각의 x는 단어, 벡터 (x1,x2,...,xt)는 문장

 

 

RNN의 입력은 아래 그림과 같다

 

 

batch_size = 한 번에 학습하는 데이터의 양

input_length = 시점(t)의 수, 입력 시퀀스의 길이, timestamp

input_dim = 입력 벡터의 차원

 

 

요약

- RNN 셀은 t-1시점에서의 은닉 상태와 t시점에서의 입력 벡터를 입력으로 받고, t에서의 은닉 상태를 만듦

- 이때 t에서의 은닉 상태는 다음에 또 다른 은닉층이나 출력층이 존재할 경우에는 다음 층으로 보내거나, 필요없으면 값을 무시할 수 있음

- RNN 셀은 다음 시점에 해당하는 t+1의 RNN 셀의 입력으로 현재 t에서의 은닉 상태를 입력으로 보냄


여러개의 노드로 부터 입력이 들어오는 RNN은 아래 그림과 같다

 

 

입력 벡터의 차원(입력 벡터의 뉴런 수) : 4

은닉 상태의 크기(은닉층의 뉴런 수) : 2

출력층의 출력 벡터의 차원(출력층의 뉴런 수) : 2

 

ex) "나는 배고프다"

time step 1 : "나는" 이라는 단어가 차원이 4인 벡터로써 입력됨

time step 2 : "배고프다" 라는 단어가 차원이 4인 벡터 + time step 1의 은닉상태가 입력됨


RNN 활용

RNN은 다양한 용도로 사용할 수 있다

아래 그림은 입력과 출력의 길이에 따라서 달라지는 RNN의 형태를 나타낸 것

 

 

일 대 다

- 하나의 입력에 대해서 여러개의 출력

- ex) 이미지 캡셔닝 (하나의 이미지 입력에 대해서 사진 제목(단어들의 나열, 시퀀스 데이터)을 출력)

 

다 대 일

- ex) 감성 분류, 스팸 메일 분류

 

다 대 다

- ex) 챗봇, 번역기, 개체명 인식, 품사 태깅

 

 

 

왼쪽 그림

- 다 대 일 문제인 경우

 

오른쪽 그림

- 모든 시점의 은닉 상태 전달

- 다음에 RNN 은닉층이 하나 더 있는 경우 or 다 대 다 문제인 경우

 

RNN 은닉층이 여러개 인 경우


수식

 

수식으로 표현하면 위 그림과 같다

t시점의 메모리 셀에는 t시점의 x와 t-1시점의 은닉상태가 입력으로 들어온다

여기에 가중치와 편향이 더해져 활성화함수(tanh)를 지나 t시점의 은닉상태가 출력된다

t시점의 은닉상태는 t+1시점의 메모리셀에 입력으로 들어간다

t시점의 은닉상태는 가중치와 편향이 더해져 활성화함수를 지나 t시점의 출력층으로 나간다

 

- 은닉상태를 구할 때 활성화함수는 주로 tanh를 사용

- 하나의 층에서는 x,h,y에 대한 가중치 w는 모두 동일한 값. 하지만 은닉층이 여러개라면 층마다 다름

 

 

벡터로 표현하면 위 그림과 같다

문장 시퀀스 데이터가 입력값이라면,  d = 단어 벡터의 차원


양방향 RNN

 

- 이전의 정보들 뿐만 아니라 이후의 정보도 활용

ex) 운동을 열심히 하는 것은 [ ]을 늘리는데 효과적이다.

- 이전과 이후의 시점 모두를 고려해서 현재 시점의 예측을 더욱 정확하게 할 수 있도록 고안된 것

 

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

-> 현재 시점의 출력층에서 출력값을 예측하기 위해

1. 앞 시점의 은닉 상태(Forward States) (앞서 언급했던 내용과 같음)

2. 뒤 시점의 은닉 상태(Backward States)

 

뒤 시점의 은닉 상태

- 입력 시퀀스를 반대로 읽는 것


Char RNN

- 문자단위 RNN

- 단어 단위 뿐만 아니라, 문자 단위의 RNN도 가능

 

 

위 그림은 다 대 다, 다 대 일로 구현된 Char RNN 이다

'Python > NLP' 카테고리의 다른 글

워드 임베딩이란  (0) 2023.03.20
RNN 언어 모델(RNNLM)  (0) 2023.03.19
피드 포워드 신경망 언어 모델(NNLM)  (0) 2023.03.14
펄플렉서티(Perplexity, PPL)  (0) 2023.03.14
N-gram 언어 모델  (0) 2023.03.14