NLP 공부: 밑바닥부터 시작하는 딥러닝2 (5장 - 순환 신경망(RNN))

syi07030·2022년 4월 24일
0

ML

목록 보기
5/9

이 포스트는 "밑바닥부터 시작하는 딥러닝2 - 파이썬으로 직접 구현하며 배우는 순환 신경망과 자연어 처리 (한빛미디어, 사이토 고키 지음)" 책을 기반으로 공부해서 정리한 내용이다.

Chapter5: 순환 신경망(RNN)

  • Feed Forward 신경망: 흐름이 단방향, 구성이 단순, 많은 문제 응용 가능 but 시계열 데이터의 패턴을 충분히 학습할 수 없다 -> 순환 신경망(RNN) 등장

5.1 확률과 언어 모델

  • 윈도우 크기가 1인 CBOW 모델의 사후 확률 모델링
  • 좌우 비대칭으로도 윈도우 크기 설정 가능(ex:왼쪽 2, 오른쪽 0)
  • CBOW 모델의 학습 -> 손실 함수를 최소화하는 가중치 매개변수 찾기 -> 학습의 부산물인 단어의 분산 표현 얻기
  • 언어 모델(Language Model): 단어 나열에 확률을 부여, 특정한 단어의 시퀀스에 대해 그 시퀀스가 일어날 가능성이 어느 정도인지, 얼마나 자연스러운 시퀀스인지 확률로 평가
    ex) 기계 번역, 음성 인식(문장으로써 자연스러운지를 기준으로 순서 매김), 새로운 문장을 생성(확률분포에 따른 적한한 단어 샘플링 가능)
    - 언어 모델의 동시 확률 = 사후 확률의 총곱(타깃 단어보다 왼쪽에 있는 모든 단어를 맥락으로)
    - 조건부 언어 모델
    - 위의 사후 확률을 어떻게 구할 수 있을까?
    - CBOW에서는 맥락의 크기를 특정 값으로 한정하여 근사적으로 나타낼 수 있다
    여기서는 왼쪽 2개 단어로 한정
    2층 마르코프 연쇄(Markov Chain: 미래의 상태가 현재 상태에만 의존해 결정되는 것)
    -> 결국 특정 길이로 고정, 긴 맥락이 필요한 문제에 제대로 된 답을 도출 못함, 맥락 크기를 키울 수는 있으나 맥락 안의 단어 순서가 무시된다(bag-of-words)
  • 일반 CBOW 모델: 은닉층에서 더해지므로 순서 무시
  • 은닉층 연결(맥락의 단어 순서 고려) <- 신경 확률론적 언어 모델
    but 맥락의 크기에 비례해 가중치 매개변수 증가
    -> 해결책: RNN, 맥락이 아무리 길더라도 맥락 정보를 기억하는 매커니즘 -> 긴 시계열 데이터 대응 가능

++ word2vec: 단어의 분사 표현을 얻을 목적으로 고안된 기법, 언어 모델로 사용하는 경우는 잘 없음
RNN 이후에 word2vec 제안, RNN으로도 단어의 분산 표현 얻을 순 있으나 개선된 word2vec

5.2 RNN이란

  • 순환 신경망: 닫힌 경로 필요 -> 데이터가 순환하면서 정보가 끊임없이 갱신 + 과거 정보 기억
  • 출력이 2개로 분기하여 하나는 다시 입력으로
  • 시계열 데이터: 시간 방향으로 데이터 나열
  • 현 계층으로의 입력 + 전 계층의 출력을 입력 받음
  • 위의 값으로 갱신된다
  • RNN 계층: 상태를 가지는 계층, 메모리가 있는 계층 / h(t): 은닉 상태, 은닉 상태 벡터

++ Recursive Neural Network: 트리 구조 데이터를 처리하기 위한 신경망

  • 시간 방향으로 펼친 신경망의 오차역전파법 -> BPTT(Backpropagation Through Time)
    - 시계열 데이터의 시간 크기가 너무 크면 계산량과 메모리 사용량 등 문제
    - 계층이 길어짐에 따라 기울기 값이 조금씩 작아져 역전파되기 전에 0이 되어 소멸 가능
    -> Truncated BPTT(적당한 길이로 역전파의 연결을 잘라냄)
  • 순전파의 연결은 끊어지지 않고(데이터를 시간 순서대로 입력해야) 연전파의 연결만 끊어진다, 한 블록 안에서만 역전파 수행하면 된다
  • Truncated BPTT 미니배치 학습
  • 데이터 입력 시작 위치를 각 미니배치의 시작 위치로 이동, 데이터를 순서대로 입력하다가 끝에 도달하면 다시 처음부터 입력
    ⭐️데이터를 순서대로 제공, 미니배치별로 데이터를 제공하는 시작 위치 옮기기⭐️

5.3 RNN 구현

  • 최종적으로 구현해야하는 계층은 다음과 같은 Time RNN 계층(T개의 단계를 한꺼번에 수행)
  • 먼저 RNN 계층 구현
    - 은닉 상태 h 계산 순전파 및 역전파(총 3개의 연산:MatMul,+,tanh 로 구성)
  • Time RNN 계층에서 다음 블록으로 역전파의 연결은 끊어져있지만 순전파 연결은 이어져있으므로 은닉 상태를 인스턴스 변수 h에 저장해서 다음 블록에 전달
  • 은닉 상태 유지 여부에 대한 stateful 인수 필요

5.4 시계열 데이터 처리 계층 구현

  • RNNLM(RNN Language Model): RNN을 사용한 언어 모델
  • 위와 같이 Embedding(단어 id를 단어 벡터로 변환), RNN 계층에서 출력된 은닉 상태가 Affine, softmax함수를 거쳐 확률을 출력하고 손실을 계산하여 학습 및 갱신
  • 시계열 데이터 T개를 한꺼번에 처리하는 Time 계층들
  • RNN 계층이 과거에서 현재로 데이터를 계속 흘려보내줌으로써 과거의 정보를 인코딩해 기억할 수 있음 -> RNNLM이 과거 기억 + 다음 예측이 가능해짐
  • 손실 계산: 데이터 1개당 평균 손실 계산

5.5 RNNLM 학습과 평가

  • Truncated BPTT로 학습
  • 초기화: RNN 계층, Affine 계층에서 Xavier 초기값 사용
  • 언어 모델의 출력: 과거 단어로부터 다음에 출현할 단어의 확률분포
  • 언어 모델의 예측 성능 평가 척도: perplexity(혼란도)
  • perplexity는 (데이터 수가 하나일 때 정확히) 확률의 역수 -> 분기수(number of branches)로 이해 가능, 다음에 취할 수 있는 선택사항의 수
  • 입력 데이터가 여러개일 경우 다음과 같이 계산
  • perplexity가 작을수록 좋은 예측 성능을 갖는다.

** RNN 계층을 이용한 조건부 언어 모델은 이론적으로는 그때까지 등장한 모든 단어의 정보를 기억할 수 있다


학습한 코드는 여기에서
https://github.com/syi07030/NLP_study
위 코드는 이 책의 코드와 아래의 코드를 바탕으로 작성했습니다.
https://github.com/WegraLee/deep-learning-from-scratch-2
사진 출처 또한 여기에서: https://github.com/WegraLee/deep-learning-from-scratch-2

profile
잭과 근나물

0개의 댓글