- Attention을 이해하기 위해선 기존 seq2seq 메커니즘에 대해 이해하면 좋음
※ Seq2Seq : - 입력된 시퀀스 데이터로부터 다른 도메인의 시퀀스 데이터를 출력하고자 할 때 주로 사용
ex) 번역기, 이미지 캡셔닝 등
- 구조는 인코더-> 컨텍스트 벡터 -> 디코더를 갖는 구조로 되어있으며,
인코더 디코더에선 주로 RNN계열의 LSTM, GRU가 사용됨
[seq2seq 구조]
- Seq2Seq 에서 크게 2가지 단점때문에 이를 보완하고자 Attention이 대안으로 등장
※ 기존 Seq2Seq의 단점
(1) 정보 손실 : 인코더 -> 컨텍스트 벡터로 가면서 정보 함축됨. 이로 인한 정보 손실
(2) RNN을 사용하므로써 발생할 수 있는 문제 : 기울기 소실 - RNN의 고질적 문제,
가장 최근 단어를 기억하는데 특화 되어 문장이 길어지면 앞에 내용을 잃어버릴 수 있음
ㅁ Attention의 주요 아이디어
- Transformer(Attention is all you need) 의 기반이 되는 매커니즘
- Attention은 출력 단어를 예측할 때, 인코더에서 입력된 전체 문장을 참고하면서, 중요한 단어에 집중(Attention)함
ㅁ Attention 메커니즘
(현재 문제 가정)
- I am a student를 입력 ▶ je suis 는 이미 출력된 상태
- etudiant를 예측해야하는 상황
(1) 인코더에서 각 시점당 임베딩 벡터를 입력으로 받음
- 임베딩 벡터를 받는다는 것은 기존 어휘사전에 있는 다른 단어들과 연관성 정보를 입력 받는다는 의미로도 볼 수 있음
- LSTM에서 각 셀은 t-1(이전)시점의 은닉상태와,
t(현재시점)의 입력 벡터(ex.임베딩벡터) 를 입력으로 받아서 t(현재시점)의 은닉 상태 생성
(2) Attention Score를 구함
- 인코더의 모든 은닉상태와 디코더의 현재 은닉상태가 얼마나 유사한지 구하는 값
- 문맥적, 단어간 유사성을 판단할 수 있는 것 같음.
( 디코더 t시점의 단어(etudiant)를 예측에 필요한 점수이며,
인코더의 모든 은닉 상태 (i, am, a, student의 hidden state)가
현 시점의 은닉 상태 (suis를 입력 후 나온 hidden state)와 얼마나 유사한지 판단하는 값)
※ 유사도를 구하는 방법에 따라 어텐션 이름이 달라짐
디코더, t시점 은닉상태 X 인코더 각각의 은닉상태(를 내적하여 유사도 계산 → 닷-프로덕트 어텐션
- Attention Score를 구할 때 사용하는 값들을 지칭하는 용어가 있음
→ Query, Key, Value 임 (여기서 Key, Value는 일반 Dictionary 자료 구조 형태와 동일한 형태임)
※ Query : 한 마디로 "디코더의 현 시점 은닉상태(the current hidden state of the decorder)"라고 볼 수 있음.
※ Key : 인코더의 모든 시점의 은닉 상태
※ Value : 인코더의 모든 시점의 은닉 상태
(3) softmax함수를 통해 Attention 분포를 구함
(4) 인코더의 "어텐션 가중치"와 은닉 상태 가중합으로 어텐션 값 구함
→ Query, Key, Value는, 각 입력 벡터 시퀀스에 쿼리, 키, 밸류를 만들어주는 행렬(가중치 행렬)을 곱해서 나온 결과 값.
(5) 어텐션 값과 디코더 t (현재)시점의 은닉 상태를 Concate함
(6) 출력하기 전, Concate한 값을 한 번더 신경망에 보낸 후, 하이퍼볼릭 탄젠트를 통과
(7) (6)의 결과값을 출력층의 입력으로 사용한 뒤 , softmax를 씌워 예측 벡터를 얻음
https://ratsgo.github.io/nlpbook/docs/language_model/tr_self_attention/
https://d2l.ai/chapter_attention-mechanisms-and-transformers/attention-scoring-functions.html
'* [R_Python] 데이터분석 정리 > [Python] 딥러닝' 카테고리의 다른 글
Aanconda prompt 이용한 가상환경에 Tensorflow/주피터노트북 설치 (0) | 2021.04.19 |
---|---|
[핸즈온] 텐서플로 저수준 API 살펴보기 (0) | 2021.03.06 |
[핸즈온] 인공신경망 규제 사용 (0) | 2021.01.27 |
[핸즈온] 고속옵티마이저 : AdaGrad (0) | 2021.01.18 |
[핸즈온] 인공 신경망 소개 (0) | 2021.01.13 |