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은 긴 시계열을 기억하는 문제와 정렬 등의 문제를 보기 좋게 해결
- 또한, 외부 메모리를 사용함으로써 알고리즘을 학습하는 능력을 얻음
'Study > DL' 카테고리의 다른 글
[Stanford cs231n] Lecture 11(Detection&Segmentation) (0) | 2024.06.16 |
---|---|
[Stanford cs231n] Lecture 10(Recurrent Neural Networks) (0) | 2024.06.16 |
[밑시딥2] Chapter 7. RNN을 사용한 문장 생성 (0) | 2024.02.02 |
[밑시딥2] Chapter 5~6. 순환신경망(RNN)& 게이트가 추가된 RNN (0) | 2024.01.25 |
[밑시딥2] Chapter 3~4. word2vec & 속도 개선 (0) | 2024.01.24 |