관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

순환 신경망(RNN) 1 - 순환 신경망과 알고리즘 본문

인공지능/딥러닝

순환 신경망(RNN) 1 - 순환 신경망과 알고리즘

huenuri 2024. 12. 18. 12:32

여기서부터는 텐서플로 책으로 학습해보려고 한다. 3단원까지만 공부하고 점심을 먹으며 쉬어야겠다.


 

 

 

 

 

순환 신경망

Recurrent Neural Network(Elman, 1990) 모델은 순차적인 정보 처리 신경망이라고 번역할 수 있다. 보통 약자인 RNN으로 부른다. 자연어 데이터, 음성 데이터와 이 순서가 있는 시퀀스(Sequence) 데이터 또는 시계열 데이터를 분석하는 데 적합한 신경망이다.

 

예를 들어 “함께 성장하는 커뮤니티를 만들고 싶다”라는 문장이 있다면 이전에 배운 완전연결 신경망(FC)이나 합성곱(CNN) 신경망에서는 순서 상관없이 데이터를 입력(Input)받는다. [그림 5-1]의 왼쪽 그림처럼 동시에 모델에 모두 입력된다.

반면, 순환신경망(RNN)에서는 데이터 순서를 유지하면서 차례대로 입력한다. [그림 5-1] 오른쪽 그림처럼 각 단어는 순차적으로 하나씩 모델에 반복적으로 입력된다.

 

 

 

 

[그림 5-2]를 보면, RNN 모델에서 문장을 각 단어별로 구분하여 ① 함께 ② 성장하는 ③ 커뮤니티를 ④ 만들고 ⑤ 싶다 순서대로 입력된다. 순환신경망의 입력값은 우리가 가지고 있는 데이터 ①~⑤ 뿐 아니라 ① 값이 RNN을 거쳐 나온 상태(state)값도 입력으로 활용된다. “입력1”뿐 아니라 RNN을 거쳐 나온 출력 값인 상태를 “입력2”로 함께 사용되는 것이 특징이다. 이 과정을 계속 반복하기 때문에 ‘순환한다’는 뜻에서 순환신경망이라고 부른다.

 

 

입력1
① 함께 → ② 성장하는 → ③ 커뮤니티를 → ④ 만들고 → ⑤ 싶다

 

입력2(상태 값)
각 단어의 출력이 상태 값으로 순차적으로 다음 RNN에 입력됨


 

 

 

 

순환신경망은 이전의 상태가 현 시점에 영향을 주고 이를 순차적으로 반영해 결과를 얻는다. 쉽게 말해 과거의 결과가 현재에 영향을 미친다는 것이다. 이는 앞서 배운 완전연결 신경망(FC), 합성곱 신경망(CNN)과의 큰 차이점이다.

RNN을 간단히 표현하면 [그림 5-3]과 같이 나타낼 수 있다. 순방향 뉴런은 입력에서 출력으로 연결되고, 출력이 다시 입력으로 연결되는 부분이 반복되면서 순환신경망을 형성한다.

 

[그림 5-3] 순환신경망

  1. 순방향 뉴런
    • 입력 → F(x) → 출력
  2. 순환 뉴런
    • 입력 → F(x) → 출력 (출력이 다시 입력으로 연결됨)

 

 

 

 

순환신경망은 일반적으로 다음과 같은 5가지 유형으로 구분할 수 있다.

  • One to One : 가장 기본적인 순환신경망(RNN) 형태이다.
  • One to Many : 이미지를 입력으로 넣고 문장을 출력하는 이미지 캡션에 활용된다.
  • Many to One : 문장을 입력으로 넣고 긍정 또는 부정으로 출력하는 감성 분류에 활용된다.
  • Many to Many : 기계 번역, 챗봇, 품사 예측 등 다양하게 활용되고 있다.


 

 

 

 

 

알고리즘

대표적인 순환신경망 알고리즘에는 RNN(1986, D. Rumelhart 데이비드 루멜하르트), LSTM(1997, S. Hochreiter, J. Schmidhuber 혹스라이터와 슈미트후버), GRU(2014, 조경현) 등이 있다.

 

텐서플로 케라스는 이들 SimpleRNN, LSTM, GRU 레이어를 기본 클래스 함수로 제공하고 있다. 따라서 텐서플로 케라스 API를 이용하면 RNN 모델을 간단하게 구현할 수 있다.

RNN 알고리즘과 작동 메커니즘을 완벽하게 알지 못하더라도 간단한 순환신경망을 충분히 만들 수 있다. 필요에 따라 자연어 처리를 먼저 학습하고 추후 순환신경망 구조를 학습해도 된다.

 

RNN, LSTM, GRU가 어떤 구조인지 자세히 알아보자.


 

 

 

1. SimpleRNN

[그림 5-5]는 가장 기본적인 단일 순환신경망 구조를 보여준다. 왼쪽 그림과 오른쪽 그림은 사실상 동일한 형태를 다른 방식으로 표현한 것이다. 즉, 매 시점 적용되는 가중치가 동일해 왼쪽과 같이 심플하게 표현하기도 한다. 입력값(x), 은닉 상태(h), 출력 값(o)으로 구성되고 U, V, W는 네트워크의 가중치이다. 아래 첨자 tttime step이고 시퀀스 데이터의 연속적인 순서를 나타낸다.

 

 

 

 

 

 


 

 

 

 

2. LSTM

순환신경망 모델을 학습할 때는 기본적인 RNN 구조부터 학습하지만 실무적으로는 SimpleRNN보다는 성능이 뛰어난 LSTMGRU를 선호한다.

 

입력 문장의 길이가 길어질수록 simpleRNN은 멀리 떨어진 단어와의 관련성을 파악하기 어려워 성능이 떨어지는 단점이 있다. 이는 과거 정보가 마지막까지 전달되지 못하는 장기 의존성 문제(long-term dependency problem)라고 한다. 이러한 문제가 발생되는 원인은 모델이 복잡할수록 경사가 기하급수적으로 감소(예: 수렴하는 경사 소실)과 기울기가 너무 큰 값이 되면서 나타나는 경사 폭발로 제대로 된 훈련이 어렵다. 이로 인해 장기 의존성 문제가 발생된다.

 

이 문제를 해결하고자 LSTM(Long Short-Term Memory)이 제안되었다. LSTM은 장단기 메모리를 활용해 잊어야 할 것기억해야 할 것을 조절한다. 예를 들어 “텐서플로 스터디 모임이 너무 좋았다”라는 문장이 있다. 긍정 또는 부정을 알고자 할 때 “너무 좋았다”라는 부분이 중요한 정보이며, 문장의 마지막 부분에 위치해 있어 기억하기도 쉽다.

 

[그림 5-8] 장기 의존성이 없는 순환신경망

  • 입력 문장: 텐서플로 → 스터디 → 모임이 → 너무 → 좋았다
  • RNN 예시: 마지막 단어 “좋았다”에 집중하여 긍정 또는 부정 판단

 

 

 

 

하지만 [그림 5-9]와 같이 긴 문장 속에 긍정적인 표현이 앞부분에 있다면 중요한 정보임에도 불구하고 모델은 최종 분류 단계에서 이 정보를 기억하지 못할 수 있다. 중요한 정보를 잊지 않고 다음 단계로 계속 넘겨주기 위해서 LSTM에서는 셀 상태(cell state)와 게이트(gate) 개념을 도입한다.

[그림 5-9] 장기 의존성이 있는 순환신경망

  • 입력 문장 : 이 책 → 좋다 → 텐서플로 → 공부 → 이다
  • RNN이 순차적으로 단어를 처리하지만, 장기 의존성 문제로 인해 앞부분의 중요한 정보를 기억하기 어려워져 긍정 or 부정을 판단하기 힘들어질 수 있음

 

 


 

 

 

 

3. GRU


 

 

 

 

학습을 마치고

이 책은 스캔이 잘 되지 않고 화질이 너무 흐리게 나왔다. 몇 번을 했으나 결과가 같아서 그냥 진행하기로 했다. 나중에 프린터기를 좋은 것으로 구매해서 스캔하고 편집할 일이 많지 않았으면 좋겠다.

그림과 기호가 많아 스캔을 하여 보는 편이 훨씬 더 나은 것 같았다. 순환 신경망과 알고리즘의 구조에 대해 어느 정도익혔으니 이제 순환 신경망을 활용한 실습도 시작해봐야지.