NLP 공부: 밑바닥부터 시작하는 딥러닝2 (8장 - 어텐션)

syi07030·2022년 5월 8일
0

ML

목록 보기
8/9

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

Chapter8: 어텐션

8.1 어텐션의 구조

  • seq2seq의 근본적인 문제를 해결하고 크게 개선시킬 수 있는 어텐션 메커니즘
  • seq2seq의 문제점: encoder의 출력이 고정 길이 벡터 -> 아무리 긴 문장이 입력되더라도 항상 같은 길이의 벡터로 출력해야 함 -> 필요한 정보가 벡터에 다 담기지 못하게 된다
  • Encoder 개선
    - 출력 길이를 입력 문장의 길이에 따라 바꾸기
    - 시각별 LSTM 계층의 은닉 상태 벡터를 모두 사용
    - 결국 이 hs의 각 행은 직전에 입력된 단어에 대한 정보가 많이 포함, 즉 각 단어에 해당하는 벡터들의 집합이라 할 수 있음
    ++ 많은 딥러닝 프레임워크에서 RNN(LSTM, GRU) 계층을 초기화할 때 모든 시각의 은닉 상태 벡터 반환/마지막 은닝 상태 벡터만 반환 선택 가능
  • Decoder 개선
    - 입력과 출력의 여러 단어 중 어떤 단어끼리 서로 관련되어 있는지, 즉 고양이와 cat이 대응관계에 있는 것처럼 이러한 대응 관계를 seq2seq에 학습시켜야 한다(단어 또는 문구의 대응 관계를 나타내는 alignment 자동화)
    - 필요한 정보에만 주목하여 도착어 단어와 대응 관계에 있는 출발어 단어의 정보를 골라내기
    - 각 시각에서 decoder에 입력된 단어와 대응 관계인 단어의 벡터를 hs(encoder 출력값)에서 선택하기 -> 선택 과정을 미분 가능한 연산으로 바꾸기(오차역전파법 가능)
    - Attention Weight 계층: encoder가 출력하는 각 단어의 벡터 hs에 주목하여 해당 단어의 가중치 a 구함 - 은닉 벡터 h와 hs의 각 행의 유사도를 내적을 이용해 산출 -> softmax를 통한 정규화 -> 가중치 값으로 사용
    - Weight Sum 계층: a와 hs의 가중합을 구하고 그 결과를 맥락 벡터 c로 출력
    - 선택하는 작업을 이 가중합으로 대체, 만약 하나의 가중치가 1이고 나머지가 0이라면 그 벡터를 선택하는 것과 똑같은 효과
  • 최종
    - affine 계층에는 은닉 상태 벡터뿐만 아니라 맥락 벡터가 추가적으로 입력된다

8.2 어텐션을 갖춘 seq2seq 구현

  • encoder: 모든 은닉 상태 반환
  • decoder: 순전파, 역전파, 새로운 문장 생성 / attention 계층 연결

8.3 어텐션 평가

  • 날짜 형식 변경하는 문제 테스트
    - 간단하지 않음, 입력과 출력에 년,월,일 대응 관계 존재 -> 어텐션이 올바르게 주목하는지 확인 가능
  • 학습 결과 및 어텐션 시각화
  • 어텐션에서는 모델의 처리 논리가 인간의 논리를 따르는지를 판단 가능

8.4 어텐션에 관한 남은 이야기

  • 양방향 RNN
    - 단어의 주변 정보를 균형있게
    -구현 방법 중 한 가지는 2개의 LSTM 계층을 준비한 후 입력 단어의 순서를 조정
  • attention 계층의 위치
    - 앞 절에서 본 계층 구성이 좀 더 구현하기 쉬움, 쉽게 모듈화 가능
  • seq2seq 심층화
    - LSTM 계층을 깊게 쌓으면 표현력 높은 모델 쌓을 수 있음
    - 일반적으로 encoder와 decoder에서 같은 층수의 lstm 사용
    - 계층을 깊게 할 때는 일반화 성능을 떨어뜨리기 않기 위해 드롭아웃, 가중치 공유 등 사용
  • skip 연결(잔차 연결, 숏컷)
    - 층을 깊게 할 때 사용되는 중요한 기법
    - 계층을 넘어 선을 연결, 계층을 건너뛴다
    - 접속부에서 원소별 덧셈 -> 역전파 시 기울기를 그대로 흘려보내므로 기울기 손실/폭발 위험성 줄여 좋은 학습 가능
    - RNN 시간 방향에서 기울기 소실: 게이트 달린 RNN, 기울기 폭발: 기울기 클리핑, RNN 깊이 방향 기울기 소실: skip 연결 효과적

8.5 어텐션 응용

  • 구글 신경망 기계 번역(GNMT)
    - LSTM 계층 다층화, 양방향 LSTM, skip 연결, GPU 분산 학습
  • 트랜스포머
    - 딥러닝 학습은 GPU를 이용한 병렬 계산 환경에서 이루어짐, 하지만 RNN은 시간방향으로 병력적 계산이 불가능함
    -> RNN을 없애거나 병렬 계산할 수 있는 RNN 연구 활발
    -> 트랜스포머 모델: RNN이 아닌 어텐션을 사용해 처리
    - self-attention: 하나의 시계열 데이터 내에서 각 원소가 다른 원소들과 어떻게 관련되어있는지
    - 하나의 시계열 데이터 내에서 원소 간 대응 관계 구해짐
    - 피드포워드 신경망: 시간 방향으로 독립적으로 처리
    - GNMT보다 학습 시간을 큰 폭으로 줄이고 번역 품질도 상당히 올릴 수 있음
    -> 어텐션은 RNN을 대체하는 모듈로도 사용 가능하다
  • 뉴럴 튜링 머신(NTM)
    - 외부 메모리를 통한 혹장
    - encoder가 필요한 정보를 메모리에 적고, decoder가 메모리로부터 필요한 정보를 읽어 들인다
    - 이러한 메로리 조작을 미분 가능한 계산으로 구축 -> 학습 가능
    - LSTM 계층이 컨트롤러 역할
    - 콘텐츠 기반 어텐션(입력 벡터와 비슷한 벡터를 메모리로부터 찾아냄), 위치 기반 어텐션(이전 시각에서 주목한 메모리의 위치를 기준으로 그 전후로 이동, 1차원의 합성곱 연산으로 구현)
  • 외부 메모리를 사용함으로써 알고리즘을 학습하는 능력, 긴 시계열 기억 문제와 정렬 문제 해결 가능

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