NLP 공부: 밑바닥부터 시작하는 딥러닝2 (6장 - 게이트가 추가된 RNN)

syi07030·2022년 5월 2일
0

ML

목록 보기
6/9

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

Chapter6: 게이트가 추가된 RNN

  • 5장의 기본적인 RNN은 시계열 데이터에서 장기 의존 관계를 잘 학습할 수 없다는 문제점이 있다.
    -> 게이트가 추가된 RNN인 LSTM, GRU

6.1 RNN의 문제점

  • 장기 의존 관계 학습이 어려운 이유: RNN 계층이 과거 방향으로 의미 있는 기울기를 전달함으로써 학습이 이루어져야 하는데 그 기울기가 도중에 소실되거나 폭발이 일어나 가중치 매개변수가 제대로 갱신될 수 없는 상황이 발생
    - 활성화 함수 tanh 노드 지날 때마다 값이 계속 작아짐 -> 기울기 소실
    - MatMul 노드 역전파에서 매번 똑같은 가중치 행렬 곱이 일어남 -> 행렬의 특잇값(데이터가 얼마나 퍼져 있는가)에 따라 최댓값이 1보다 크면 기울기 폭발, 1보다 작으면 기울기 소실이 일어날 가능성이 높다
  • 기울기 폭발
    - 기울기 클리핑
  • 기울기 소실
    - 게이트가 추가된 RNN

6.2 기울기 소실과 LSTM

  • LSTM(Long Short-Term Memory)
  • c: 기억 셀, LSTM 전용의 기억 메커니즘, 다른 계층으로 출력은 하지 않음
  • 게이트: 열고 닫음 뿐만 아니라 얼마나 열리는지 열림 상태를 0.0 ~ 1.0 사이로 표현(시그모이드 사용), 열림 상태 또한 데이터로부터 자동으로 학습
  • 출력 게이트 O: tanh(c)의 각 원소에 대해 다음 시각의 은닉 상태에 얼마나 중요한가 조정
  • forget 게이트 f: 기억 셀에 무엇을 잊을까를 지시하는 게이트
  • 새로운 기억 셀 추가 g(게이트가 아니므로 활성화 함수로 tanh): 새로 기억해야 할 정보를 기억 셀에 추가
  • input 게이트로 i: g의 각 원소가 새로 추가되는 정보로써의 사치가 얼마나 큰지 판단
  • 기억셀의 역전파에서는 +, 야다마르 곱(원소별 곱)만이 존재: 매번 새로운 게이트 값을 이용하여 원소별 곱을 계산하므로 곱셈의 효과가 누적되지 않아 기울기 소실이 일어나기 어려움, forget 게이트가 제어함으로써 잊어도 된다고 판단한 기억 셀의 원소에 대해서는 기울기가 작아짐
    ++ 게이트에서는 활성화 함수로 시그모이드 함수(0.0 ~ 1.0 실수), 실질적인 정보를 지니는 데이터에는 tanh 함수(출력은 -1.0 ~ 1.0 사이의 실수)가 활성화 함수로 쓰임

6.3 LSTM 구현

  • 기억 셀에 대한 야마다르 곱, 게이트 3개, 새로운 기억 셀 추가, 은닉 상태 야마다르 곱 계산 추가
  • 아핀 변환은 한꺼번에(slice 사용)
  • 이러한 LSTM을 T개의 시계열 데이터를 한꺼번에 처리할 수 있는 Time LSTM 구현

6.4 LSTM을 사용한 언어 모델

  • 5장에서 구현한 언어 모델에서 Time RNN -> Time LSTM 계층으로 바꾼 것

6.5 RNNLM 추가 개선

  • LSTM 계층 다층화
    - PTB 데이터셋의 언어 모델에서는 LSTM의 층 수는 2~4개일 때 좋은 결과 얻는 듯(하이퍼파라미터 조정 문제)
  • 드롭아웃에 의한 과적합 억제
    - 과적합(overfitting): 훈련 데이터에만 너무 치중해 학습된 상태, 일반화 능력이 결여된 상태
    - 해결책: 훈련 데이터의 양 늘리기, 모델의 복잡도 줄이기, 정규화, 드롭아웃
    - 무작위로 뉴런을 선택하여 선택한 뉴런을 무시
    - 시계열 방향이 아닌 계층 깊이 방향으로 삽입, 시간축과는 독립적으로
    - 변형 드롭아웃: 깊이 방향뿐만 아니라 시간 방향에도 적용할 수 있어 언어 모델의 정확도를 더 향상시킬 수 있다
  • 가중치 공유
    - embedding, affine 계층의 가중치를 공유함으로써 학습하는 매개변수 수가 크게 줄어들고 동시에 정확도 향상

학습한 코드는 여기에서
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개의 댓글