본문 바로가기
Study/DL

[밑시딥2] Chapter 5~6. 순환신경망(RNN)& 게이트가 추가된 RNN

by hyeon827 2024. 1. 25.

언어 모델

  • 단어 나열에 확률 부여
  • 특정한 단어의 시퀀스에 대해서, 그 시퀀스가 일어날 가능성이 어느 정도인지를 확률로 평가
  • 기계 번역과 음성 인식에 언어 모델 응용
  • 음성 인식 시스템의 경우, 사람의 음성으로부터 몇 개의 문장 후보 생성
  • 그런 다음 언어 모델을 사용하여 후보 문장이 '문장으로써 자연스러운지'를 기준으로 순서를 매김
  • 또한 언어 모델은 새로운 문장을 생성하는 용도로도 이용
  • 단어 순서의 자연스러움을 확률적으로 평가하여 그 확률분포에 따라 다음으로 적합한 단어를 '자아낼' 수 있음
  • P(w1,...,wm): w1,...,wm이라는 순서로 출현할 확률(동시확률)
  • 동시 확률은 사후 확률의 총곱으로 나타낼 수 있음
  • 주목할 점은 이 사후 확률은 타킷 단어보다 왼쪽에 있는 모든 단어를 맥락으로 했을 때의 확률

  • 위 결과는 확률의 곱셈정리로부터 유도

  • 정리하자면 목표는 P(wt | w1, ..., wt-1) 확률을 얻는 것 (조건부 언어 모델)
  • 이 확률을 계산할 수 있다면 언어 모델의 동시 확률 P(w1, ... , wm)을 구할 수 있음

 

CBOW 모델을 언어모델에 적용

  • CBOW에서는 맥락의 크기를 특정 값으로 한정하여 근사적으로 나타낼 수 있음
  • 예시에서는 맥락을 왼쪽 2개 단어로 한정(임의로 설정 가능)

 

  • 임의의 길이로 설정할 수 있다고 해도, 결국 특정 길이로 '고정'
  • 긴 맥락이 필요한 문제에 제대로 된 답을 도출 못함
  • 맥락 크키는 얼마든지 키울 수 있으나 CBOW 모델에서는 맥락 안의 단어 순서 무시(bag-of-words)
  • 왼쪽 그림과 같이 CBOW 모델의 은닉층에서는 단어 벡터들이 더해지므로 맥락의 단어 순서 무시
  • 그렇다면 오른쪽 그림처럼 맥락의 단어 벡터를 은닉층에서 연결하는 방식 생각할 수 있음
  • But, 연결하는 방식을 취하면 맥락의 크기에 비례해 가중치 매개변수도 늘어나게 됨

    => RNN 사용하여 해결 (맥락이 아무리 길더라도 그 맥락의 정보를 기억하는 매커니즘)

 

 

RNN 

  • 순환하는 신경망
  • 순환하기 위해서는 '닫힌 경로' 필요
  • 순환 경로를 따라 데이터는 끊임없이 순환하기 때문에 과거의 정보를 기억하는 동시에 최신 데이터로 갱신될 수 있음
  • 아래 그림처럼 RNN 계층은 순환하는 경로 포함
  • t: 시각 (시계열 데이터가 입력됨을 표현)
  • xt: 각 단어의 분산 표현(단어 벡터)

  • 각 시각의 RNN 계층은 그 계층으로의 입력1개 전의 RNN 게층으로부터의 출력을 받음
  • 이 두 정보를 바탕으로 현 시각의 출력 계산

  • RNN에서는 가중치가 2개 존재
  • 하나는 입력 x를 출력 h로 변환하기 위한 가중치 W(x)
  • 다른 하나는 1개의  RNN 출력을 다음 시각의 출력으로 변환하기 위한 가중치 W(h)
  • 또한 편항 b도 존재, h(t-1)과 x(t)는 행벡터
  • 행렬 곱을 계산하고, 그 합을 tanh 함수 이용해 변환

  • h(t)다른 계층을 향해 위쪽으로 출력되는 동시에, 다음 시각의 RNN 계층을 향해 오른쪽으로도 출력
  • 위 식을 보면 현재의 출력(ht)은 한 시각 이전 출력(ht-1)에 기초에 계산
  • 다른 관점으로 보면, RNN은 h라는 '상태'를 가지고 있으며, 위 식을 통해 갱신된다고 해석
  • '상태를 가지는 계층' or '메모리가 있는 계층'

 

BPTT

  • 순환 구조를 펼친 후의 RNN에는 오차역전파법을 적용할 수 있음
  • 여기서의 오차역전파법은 '시간 방향으로 펼친 신경망의 오차역전파법'(=BPTT)

  • But, 긴 시계열 데이터를 학습할 때 문제
  • 시계열 데이터의 시간 크기가 커지는 것에 비례하여 BPTT가 소비하는 컴퓨팅 자원도 증가
  • 큰 시계열 데이터를 취급할 때는 흔히 신경망 연결을 적당한 길이로 끊어 작은 신경망 여러 개로 만듦
  • 그리고 이 잘라낸 작은 신경망에서 오차역전파법 수행(=Truncated BPTT)
  • 제대로 구현하려면 '역전파'의 연결만 끊고 순전파 연결은 반드시 그대로 유지(기울기 소실 방지)
  • 아래 그림에서 RNN 계층을 길이 10개 단위로 학습할 수 있도록 역전파 연걸을 끊음
  • RNN에서 Truncated BPTT를 수행할 때는 데이터를 '순서대로' 입력해야 함

 

Truncated BPTT

  • 지금까지의 이야기는 미니배치 수가 1일 때 해당
  • 미니배치의 수를  '2'로 하여  학습하기 위해서는 데이터를 주는 시작 위치를 각 미니배치의 시작 위치로 '옮겨줘야' 함
  • 첫 번째 미니배치 -> 처음부터 순서대로  데이터 제공
  • 두 번째 미니배치 -> 500번째 데이터를 시작 위치로 정하고 순서대로 제공

 

  • Time RNN 계층 : 순환 구조를 펼친 후의 계층들을 하나의 계층으로 간주

 

RNNLM

  • RNN을 사용한 언어 모델 (RNN Language Model)
  • 첫 번째 층은 Embedding 계층(단어 ID를 단어의 분산 표현으로 변환)
  • 분산 표현이 RNN 계층에 입력
  • 그리고 RNN 계층이 위로 출력한 은닉 상태는 Affine 계층을 거쳐 Softmax 계층으로 전해짐

  • "say" 입력 시 Softmax 계층 출력은 "goodbye"와 "hello", 두 곳에서 높게 나옴
  • 여기서 주목할 것은 RNN 계층은 "you say"라는 맥락을 '기억'하고 있다는 사실
  • 더 정확하게 말하면 RNN 계층은 "you say"라는 과거의 정보를 응집된 은닉 상태 벡터로 저장

 

Time Softmax with Loss (Cross Entropy Error)

  • x0이나 x1등의 데이터는 아래층에서부터 전해지는 '점수'
  • 또한, t0 나 t1등의 데이터는 정답 레이블
  • T개의 Softmax with Loss 계층이 각각 손실을 산출을 해 합산한 뒤 평균한 값이 최종 손실

 

언어 모델의 평가

  • 언어 모델의 예측 성능을 평가하는 척도로 퍼플렉서티(perplexity) 자주 이용(값이 작을수록 좋은 성능)
  • 퍼플렉서티는 간단히 말하면 '확률의 역수'
  • ex) 모델 1에 "you" 단어를 입력하여 정답인 "say"의 확률을 0.8로 예측 -> 퍼플렉서티 = 1/0.8=1.25
  • ex) 모델 2는 정답인 "say"의 확률이 0.2라고 예측 -> 퍼플렉서티 1/0.2=5.0
  • 1.25 나 5.0은 '분기 수'로 해석할 수 있음
  • 분기 수란 다음에 취할 수 있는 선택사항의 수
  • 즉, 좋은 모델이 예측한 '분기 수'가 1.25라는 것은 다음에 출현할 수 있는 단어의 후보를 1개 정도로 좁혔다는 뜻
  • 반면 나쁜 모델에서는 후보가 아직 5개나 된다는 의미

   입력 데이터가 여러 개일 경우

  • N : 데이터의 총개수
  • tn : 원핫 벡터로 나타낸 정답 레이블
  • tnk :  n개째 데이터의 k번째 값
  • ynk : 확률분포
  • L : 신경망의 손실
  • eL : 퍼플렉서티(perplexity) 

 

RNN의 문제점

  • 시계열 데이터의 장기 의존 관계를 학습하기 어려움
  • BPTT에서 기울기 소실 혹은 기울기 폭팔이 일어나기 때문

기울기 소실 또는 기울기 폭발 원인

  • 시간 방향 기울기에 주목하면 역전파로 전해지는 기울기는 차례로 'tanh' , '+', 'MatMul' 연산 통과

 

  • 점선이 y = tanh(x)의 미분
  • 그 값은 1.0 이하이고, x가 0으로부터 멀어질수록 작아짐
  • 달리 말하면, 역전파에서는 기울기가 tanh 노드를 지날 때마다 값은 계속 작아진다는 뜻
  • ReLU로 바꾸면 기울기 소실을 줄일 수 있음

  • tanh 노드 무시 가정
  • MatMul 노드에서의 역전파는 dhWh^T라는 행렬 곱으로 기울기를 계산
  • 그리고 같은 계산을 시계열 데이터의 시간 크기만큼 반복
  • Wh가 '스칼라'인 경우 1보다 크면 지수적으로 증가하고, 1보다 작으면 지수적으로 감소
  • Wh가 '행렬'인 경우 '특잇값' 척도를 활용하여 1보다 크면 지수적으로 증가하고, 1보다 작으면 지수적으로 감소할 가능성이 높다고 예측 할 수 있음(반드시 X)

기울기 폭발 대책

기울기 클리핑(gradients clipping)

  • g^은 신경망에서 사용되는 모든 매개변수의 기울기를 하나로 모은 것
  • 기울기의 L2 노름이 문턱값(threshold)을 초과하면 두 번째 줄의 수식과 같이 기울기를 수정

기울기 소실 대책

  • 게이트가 추가된 RNN

LSTM

  • c(기억 셀)라는 경로 추가
  • 기억 셀의 특징은 데이터를 LSTM 계층 내에서만 주고받는다는 것
  • 즉, LSTM 계층 내에서만 완결되고, 다른 계층으로는 출력하지 X
  • 반면, LSTM의 은닉상태 h는 RNN 계층과 마찬가지로 다른 계층으로 출력

  • ct는 과거로부터 시각 t까지 필요한 모든 정보가 저장돼 있다고 가정
  • ct는 3개의 입력(ct-1, ht-1, xt)으로부터 '어떤 계산'을 수행
  • 핵심은 갱신된 ct를 사용해 은닉 상태 ht를 계산 
  • ht = tanh(ct)

게이트

  • 게이트의 열림 상태는 0.0~1.0 사이의 실수로 나타냄 (1.0은 완전 개방)
  • 중요한 것은 '게이트를 얼마나 열까'라는 것도 데이터로부터 자동으로 학습한다는 점

output 게이트

  • tanh(ct)의 각 원소에 대해 '그것이 다음 시각의 은닉 상태에 얼마나 중요한가'를 조정
  • 한편, 이 게이트는 다음 은닉 상태 ht의 출력을 담당하는 게이트(=output 게이트)
  • output 게이트의 열림 상태는 입력 xt와 이전 상태 ht-1로부터 구함
  • 여기서 사용하는 가중치 매개변수와 편향에는 output의 첫 글자인 o 첨자 추가
  • 시그모이드 함수를 거쳐 출력 게이트의 출력 o를 구함
  • 마지막으로 o와 tanh(ct)의 원소별 곱을 ht로 출력하는 것(= 아다마르 곱)

   * tanh(-1.0~1.0) -> 그 안에 인코딩된 '정보'의 강약(정도)을 표시한다고 해석

   * sigmoid(0.0~1.0) -> 데이터를 얼마만큼 통과시킬지를 정하는 비율

아다마르 곱

 

forget 게이트

  • ct-1의 기억 중에서 불필요한 기억을 잊게 해주는 게이트 추가
  • forget 게이트의 출력 f와 이전 기억 셀인 ct-1과의 원소별 곱을 통해 ct를 구함

 

새로운 기억 셀

  • 새로 기억해야 할 정보를 기억 셀에 추가('게이트' X) -> 따라서 tanh 함수 사용
  • tanh 노드가 계싼한 결과가 이전 시각의 기억 셀 ct-1에 더해짐

 

input 게이트

  • g에 게이트 하나 추가
  • g의 각 원소가 새루 추가되는 정보로써의 가치가 얼마나 큰지를 판단
  • i와 g의 원소별 곱 결과를 기억 셀에 추가

 

LSTM의 기울기 흐름

  • '+' 노드는 상류에서 전해지는 기울기를 그대로 흘릴 뿐이라 기울기 변화는 일어나지 X
  • 'x' 노드는 '행렬 곱'이 아닌 '원소별 곱'으로 계산되어 곱셈 효과 누적 X -> 기울기 소실 X
  • 'x' 노드 forget 게이트가 제어하여 '잊어서는 안 된다'고 판단한 원소에 대해 그 기울기가 약화되지 않은 채로 과거 방향으로 전해짐 -> 기억 셀의 기울기가 소실 없이 전파되리라 기대

   * 아핀 변환을 수행해 한꺼번에 계산하고 slice을 통해 나눠줌

   * 역전파에서는 반대로 slice을 통해 기울기를 결합

 

RNNLM 추가 개선

LSTM 계층 다층화

  • LSTM 계층을 2층, 3층 식으로 여러 겹 쌓으면 언어 모델의 정확도 향상 기대
  • 첫 번째 LSTM 계층의 은닉 상태가 두 번째 LSTM 계층에 입력
  • 층 수 결정은 하이퍼파라미터에 관한 문제 -> 처리할 문제 복잡도나 준비된 학습 데이터의 양에 따라 결정
  • 참고로, PTB 데이터셋의 언어 모델에서는 LSTM의 층 수는 2~4 정도일 때 좋은 결과

 

드롭아웃에 의한 과적합 억제

  • LSTM 계층의 시계열 방향으로 삽입(좋은 방법 X)
  • 시간의 흐름에 따라 정보가 사라질 수 있음
  • 즉, 흐르는 시간에 비례해 드롭아웃에 의한 노이즈가 축적

  • 깊이 방향(상하 방향)으로 삽입
  • 시간 방향(좌우 방향)으로 아무리 진행해도 정보를 잃지 않음

  • 최근 연구에서는 RNN의 시간 방향 정규화를 목표로 하는 방법이 다양하게 제안
  • 예컨대 변형 드롭아웃
  • 깊이 방향은 물론 시간 방향에도 이용할 수 있어서 언어 모델의 정확도를 한층 더 향상
  • 같은 계층에 속한 드롭아웃들은 같은 마스크를 공유(통과/차단을 결정하는 이진형태의 무작위 패턴)
  • 이에 따라 정보를 잃게 되는 방법도 '고정'되므로, 일반적인 드롭아웃 때와 달리 정보가 지수적으로 손실되는 사태 X

 

가중치 공유

  • Embedding 계층의 가중치와 Affine 계층의 가중치를 연결하는 기법
  • 두 계층의 가중치를 공유함으로써 학습하는 매개변수 수가 크게 줄어드는 동시에 정확도도 향상