어텐션
: 입력값 간의 관계를 찾기위해 등장.
1. 인코더에서 만들어진 은닉노드의 출력값 가져오기
--> 인코더의 입력노드별 은닉노드의 출력값
2. 디코더에서 만들어진 은닉노드의 출력값 곱하기
--> 디코더의 은닉노드는 1개씩만 가져올 수 있음
(순차대로 데이터 입력하니까 당연...)
--> 곱하기
--> 인코더의 은닉노드별(= 입력노드별) 가중치 생성
--> 가중치를 확률로 변환
3. 인코더의 은닉노드*확률의 합 구하기
--> 맥락벡터 완성(context vector; attention value)
--> 현재 디코더 입력값과 가장 연관성있는 인코더 정보를 담고 있다.
4. 주어진 정보 concat하기
-->디코더의 현시점 은닉정보St와 맥락정보(어텐션 밸류At)를 concat하기
--> MLP의 입력값으로 사용함
끝!
기존 RNN은 디코더의 은닉노드만 사용했다면,
Attention은 인코더의 은닉정보도 압축버전으로 사용함.
문제점 인식
1.압축버전(정보손실)말고 모든 정보사용하고 싶다.
2.입력단위를 길게해서 더 많은 정보를 학습하고 싶다.
--> Transformer 등장
: RNN대체버전 = Self attention
RNN을 어텐션으로 대체하면서 다양한 이름이 붙은 어텐션이 등장함
즉, 어텐션의 종류(?)가 다양해졌다.
기존 입력노드에 대한 이름도 다양해짐. QKV등장.. 새로운 용어는 언제나 어색함.
여러가지 어텐션 소개
인식하는 단위!에 따라 학습능력이 달라짐
단어단위의 관계파악
Self Attention은 같은 문장 내 모든 단어 쌍 사이의 의미적, 문법적 관계를 포착해내는 중요한 역할을 하게된다! RNN처럼 은닉노드 만들지 않는다
단어(+문장)단위의 관계파악
문단>문장>단어; 단어는 짧다. 문장은 길다.
더 많은 길이의 데이터, 내부에 더 많은 패턴/관계를 가진 데이터를 학습하기 위해
은닉벡터(QKV)로 축소시키고, 이 복사본(그룹)을 여러개 만들어서 병렬로 연산하자.
--> 각 그룹을 HEAD라고 표현
--> Multi HEAD Attention
각 그룹마다 Attention value를 연산하는 부분
--> Scaled dot product Attetion
단, 학습시, 특정부분 학습못하게 막기 위해서 데이터에 Masking을 함.
예를 들면, 디코더에서는 미래의 정보를 활용하지 못하게 막아놓음
그래야 이전 정보와 현재정보만으로 학습함.
--> Masked Multi-head attention
가중치 계산 방식에 따른 어텐션의 종류
; 인코더에서 사용하는 어텐션의 종류
--> Hard Attention : 인코더의 모든 은닉노드를 참조한다.
--> Soft Attention : 인코더의 랜덤 은닉노드만 참조한다.
;디코더에서 사용하는 어텐션의 종류
--> Global Attention : 인코더의 전체 은닉노드를 참조한다.
--> Local Attention : 인코더의 부분 은닉노드만 참조한다. (어떻게 부분을 찾나? 순서대로 선택 or 예측모델로 위치선택 )
입력값을 가공처리하는 방식
QKV는 원리상 기존 어텐션이랑 다른게 없음.
다이내믹 컴푸팅(저장해놓고 연산하기)을 통해 연산속도를 개선하려고 만들어진 입력값이다.
기존 seq2seq는 디코더가 1개씩 context vector를 만듦.
여러개 디코더의 context vector를 한꺼번에 생성하자 (=context matrix: QKV)
1. 입력값 가공하기
--> 단어의 임베딩 벡터만들기
--> 가중치행렬곱하기
--> QKV 만들기(차원축소효과, 은닉벡터 생성효과)
2. 여러개 다양한 버전의 QKV 만들기(멀티헤드)
3. 각 헤드별로 어텐션값 구하기
1) 어텐션점수를 찾기 위해 "(단어)은닉행렬*(단어)은닉행렬" 구하기.
--> QUERY * KEY
2) 각 단어별 맥락벡터를 담은 맥락행렬을 찾기 위해 "어텐션점수*(단어)은닉행렬"함.
--> ATENTION * VALUE = Context
Q. 왜 가중치행렬을 곱해서 "차원축소"시킨 은닉행렬을 "여러개" 사용할까?
원래 데이터 임베딩 크기로 한번에 학습하면 안되나?
된다. 그러나 차원축소시킨 만큼 여러개의 은닉행렬을 만들면 장점이 있기 때문에 사용함.
--> 모든 쌍의 데이터가 연관성이 높은 게 아님. 모든 차원을 그대로 쓰는 것은 Sparse feature matrix를 만든다. (자원낭비)
--> 데이터 속 연관성은 여러가지가 있을 수 있음. 벡터 하나에 모든 정보를 담으면, 정보손실이 발생한다.
--> 멀티헤드로 "병렬 어텐션"을 만들면, 복합적인 관계를 담은 정보를 헤드개수만큼 가져갈 수 있고, 병렬연산처리까지 가능함.
'DataMining > Deeplearning' 카테고리의 다른 글
책 - 밑바닥부터 시작하는 딥러닝3 (0) | 2022.05.15 |
---|---|
DL - 기초; RNN ; LSTM, GRU (0) | 2021.03.03 |
DL - 기초; 배치 정규화 (0) | 2021.02.27 |
DL - 기초; 초기화 (0) | 2021.02.27 |
DL - 기초; 신경망소개/CNN/RNN (0) | 2021.02.27 |