본문 바로가기
Study/DL

[밑시딥2] Chapter 8. 어텐션

by hyeon827 2024. 2. 3.

seq2seq 문제점

  • Encoder는 아무리 긴 문장이라도 고정 길이의 벡터로 변환

 

Encoder 개선

  • 각 시간의 은닉 상태 벡터를 모두 이용하면 입력된 단어와 같은 수의 벡터를 얻을 수 있음
  • '하나의 고정 길이 벡터'라는 제약으로부터 해방 (입력 문장의 길이에 비례한 정보를 인코딩할 수 O)

  • 시각별 LSTM 계층의 은닉 상태 백터는 직전에 입력된 단어의 '성분'이 많이 들어간 벡터
  • 이렇게 생각하면, Encoder가 출력하는 hs행렬은 각 단어에 해당하는 벡터들의 집합

 

Decoder 개선 ①

목표: '도착어 단어'와 대응 관계에 있는 '출발어 단어'의 정보를 골라내고 그 정보를 이용하여 번역 수행

 

=> 다시 말해, 필요한 정보에만 주목하여 그 정보로부터 시계열 변환을 수행하는 것

=> 이 구조를 'Attention'이라고 부름

 

  • 새롭게 '어떤 계산'을 수행하는 계층 추가
  • 이 '어떤 계산'이 받는 입력은 두가지로, 하나는 Encoder로부터 받는 hs, 다른 하나는 시각별 LSTM계층의 은닉 상태
  • 목표는 단어들의 얼라인먼트(alignment) 추출
  • 예컨대 Decoder가 'I'를 출력할 때, hs에서 '나'에 대응하는 벡터를 선택
  • 이러한 '선택' 작업을 '어떤 계산'으로 해내겠다는 것
  • 하지만 선택하는 작업은 미분할 수 없다는 문제 발생 (오차역전파 관련)

 

  • '하나를 선택'하는 게 아니라, '모든 것을 선택'한다는 아이디어로 미분 문제 해결
  • 이때 각 단어의 중요도(기여도)를 나타내는 '가중치'(기호a)를 별도로 계산
  • a는 확률분포처럼 각 원소가 0.0~1.0 사이의 스칼라이며, 모든 원소의 총합은 1
  • 각 단어의 중요도를 나타내는 가중치 a와 각 단어의 벡터 hs로부터 가중합을 구하여 벡터를 얻음(맥락 벡터  c)

  • "나"에 대응하는 가중치가 0.8
  • 이것이 의미하는 바는 맥락 벡터 c에 "나"벡터의 성분이 많이 포함되어 있다는 것
  • 즉, "나" 벡터를 '선택'하는 작업을 이 가중합으로 대체

Decoder 개선 ②

  • Decoder의 LSTM 계층의 은닉 상태 벡터를 h
  • 목표는 h가 hs의 각 단어 벡터와 얼마나 '비슷한가'를 수치로 나타내는 것
  • 가장 단순한 방법인 백터의 '내적' 이용(두 벡터가 얼마나 같은 방향을 향하고 있는가,유사도)
  • s는 정규화하기 전의 값이며, '점수'라고도 함(소프트맥스 함수 적용하여 정규화)

  • Weight Sum 계층

  • Attention weight 계층

Decoder 개선

  • Attention weight 계층은 Encoder가 출력하는 각 단어의 벡터 hs에 주목하여 해당 단어의 가중치 a 구함
  • 이어서 Weight Sum 계층이 a와 hs의 가중합을 구하고, 그 결과를 맥락 벡터 c로 출력
  • 이 일련의 계산을 수행하는 계층을 Attention 계층

  • Affine 계층에는 기존과 마찬가지로 LSTM 계층의 은닉 상태 벡터를 줌
  • 여기에 더해 Attention 계층의 맥락 벡터까지 입력하는 것

  • Time Attention 계층

 

양방향 LSTM (양방향 RNN)

  • 지금까지의 LSTM 계층에 더해 역방향으로 처리하는 LSTM 계층 추가
  • 각 시각에서는 이 두 LSTM 계층의 은닉 상태를 연결시킨 벡터를 최종 은닉 상태로 처리

=> 균형 잡힌 정보가 인코딩

 

  • 구현하기도 쉽다
  • 첫 번째 방법은 입력 문장을 '왼쪽부터 오른쪽으로' 처리하는 일반적인 LSTM 계층
  • 두 번째 방법은 LSTM 계층을 추가 할 때 입력 문장의 단어들을 반대 순서로 나열 후 두 LSTM 계층 출력 연결

 

Attention 계층 사용 방법

  • Attention 계층의 출력이 다음 시각의 LSTM 계층에 입력되도록 연결 가능
  • 이렇게 구성하면 LSTM 계층이 맥락 벡터의 정보 이용

  • Attention 계층의 위치를 달리하는 게 최종 정확도에는 어떤 영향을 주는 지는 실제 데이터를 사용해 검증 할 수 밖에
  • 앞의 두 모델은 맥락 벡터를 잘 활용하는 구성이라서 큰 차이가 없을 수 있음
  • 또한, 구현 관점에서는 LSTM 계층과 Affine 계층 사이에 Attention 계층을 삽입하는 쪽이 구현하기 쉬움
  • 그리고 Decoder의 데이터 흐름이 아래에서 위로 가는 한 방향이기 때문에 Attention 계층을 쉽게 모듈화 할 수 있음

 

seq2seq 심층화와 skip 연결

  • Encoder와 Decoder에서는 같은 층수의 LSTM 계층을 이용하는 것이 일반적
  • 한편, Attention 계층의 사용법은 여러 변형이 있을 수 있음
  • 여기에서는 Decoder의 LSTM 계층의 은닉 상태를 Attention 계층에 입력하고, Attention 계층의 출력인 맥락 벡터를 Decoder의 여러 계층으로 전파

  • 층을 깊게 할 때 사용되는 중요한 기법 중 'skip 연결' 존재
  • skip 연결은 '계층을 건너뛰는 연결'
  • skip 연결의 접속부에서는 2개의 출력이 '더해'짐(핵심)
  • 덧셈은 역전파 시 기울기를 '그대로 흘려'보내므로, skip 연결의 기울기가 아무런 영향을 받지 않고 모든 계층으로 흐름
  • 따라서 층이 깊어져도 기울기가 소실되지 않고 전파되어, 결과적으로 좋은 학습 기대

 

Attention 응용

구글 신경망 기계 번역(GNMT)

  • LSTM 계층의 다층화
  • 양방향 LSTM (Encoder의 첫 번째 계층만)
  • skip 연결
  • 다수의 GPU 분산 학습(속도 개선)

 

Transformer

  • RNN의 계산을 시간 방향으로 병렬 계산하기란 불가능
  • 이 점은 딥러닝 학습이 GPU를 사용한 병렬 계산 환경에서 이뤄진다는 점을 생각하면 큰 병목
  • 그래서 현재는 RNN을 없애는 연구가 활발하게 이루어지고 있고 그 중 유명한 기법이 'Transformer 모델'
  • Self-Attention 기술 이용
  • 하나의 시계열 데이터를 대상으로 한 어텐션
  • '하나의 시계열 데이터 내에서' 각 원소가 다른 원소들과 어떻게 관련되는지 살펴보자는 취지
  • Self-Attention은 두 입력선이 모두 하나의 시계열 데이터로부터 나옴

 

  • Transformer에서는 RNN 대신 Self-Attention 사용
  • 은닉층이 1개이고 활성화 함수로 ReLU를 이용한 완전연결계층 신경망 이용
  • 또한, NX는 회색 배경으로 둘러싸인 계층들을 N겹 쌓았다는 뜻
  • Transformer 이용 시 계산량을 줄이고 GPU를 이용한 병렬 계산의 혜택도 더 많이 누릴 수 있음

 

 

Neural Turing Machine(NTM)

  • 외부 메모리를 읽고 씀
  • 메모리 조작을 '미분 가능'한 계산으로 구축함
  • 따라서 메모리 조작 순서도 데이터로부터 학습할 수 있음
  • LSTM 계층이 '컨트롤러'가 되어 NTM의 주된 처리 수행
  • 각 시각에서 LSTM 게층의 은닉 상태를 Wirte Head 계층이 받아서 필요한 정보를 메모리에 씀
  • 그런 다음 Read Head 계층이 메모리로부터 중요한 정보를 읽어 들여 다음 시각의 LSTM 계층으로 전달

  • NTM은 컴퓨터 메모리 조작을 모방하기 위해 2개의 어텐션 이용
  • '콘텐츠 기반 어텐션'과 '위치 기반 어텐션'
  • 전자는 지금까지 본 어텐션과 같고, 입력으로 주어진 벡터와 비슷한 벡터를 메모리로부터 찾아내는 용도로 이용
  • 한편, 위치 기반 어텐션은 이전 시각에서 주목한 메모리의 위치를 기준으로 그 전후로 이동하는 용도로 사용
  • NTM은 긴 시계열을 기억하는 문제와 정렬 등의 문제를 보기 좋게 해결
  • 또한, 외부 메모리를 사용함으로써 알고리즘을 학습하는 능력을 얻음