개발자로 후회없는 삶 살기

NLP PART.Attention 메커니즘 본문

[AI]/[네이버 BoostCamp | 학습기록]

NLP PART.Attention 메커니즘

몽이장쥰 2022. 12. 6. 23:13

서론

※ 이 포스트는 다음 강의의 학습이 목표임을 밝힙니다.

https://www.youtube.com/@mcodeM/playlists

 

메타코드M

메타코드에서 SKY출신 / AI기업 현직자에게 무료로 코딩을 배우세요 서울대 , 카이스트, 고려대 + 현업 개발자들의 핵심 코딩/데이터 강의 [비지니스 협업은 메일로 연락주세요 : support@mcode.co.kr] -

www.youtube.com

 

본론

 

- 어텐션

rnn의 단점을 보완하기 위해 만든 것이 lstm이었습니다. 이들은 시간에 따라서 sequential 한 w가 전달되는 특징이 있었습니다. 여기서 파생된 것이 seq2seq였습니다. 이는 인-디코더를 가지고 many-to-many 구조를 띄고 있었고 이것의 문제점을 보완하기 위해 만들어진 것이 attention입니다.


> 번역을 한다고 하면 한국어를 인코더에 짚어 넣고 그게 context vector를 통해서 디코더로 들어가고 그것이 디코더에서 영어 문장을 만들어냅니다. 이 녀석의 문제점은 

 

1. context vector를 통해서만 디코더에서 문장을 만들어내는데 우리는 번역을 할 때 특정 단어 부분을 집중해서 볼 필요가 있습니다. (context vector는 전체 문장을 다룹니다.) 

2. 처음 단어가 잘 못 만들어지면 잘 못 만들어진 단어를 다음 셀의 입력으로 넣기 때문에 쭉 잘못된 출력이 나옵니다. 

=> 기계 번역

seq2seq의 many-to-many 구조입니다. 영어를 프랑스어로 바꾸는 예라면 입력 문장이 토큰화되어서 인코더로 들어갑니다. 이것이 인코더에서 context vector가 만들어집니다. 인코더의 아웃풋은 사용하지 않습니다. context vector가 디코더로 전달이 되면 bos를 넣고 첫 번째 단어가 만들어지고 이 첫 단어가 다시 디코더의 인풋으로 가서 쭉쭉 단어를 만드는 구조였습니다.

-> 문제점 : context vector가 들어온 게 영어 문장 정보의 전부입니다. 근데 사실 번역은 단어 단위로 1대1 대응이 있습니다. 위 예에서는 불어 'je'가 영어 'i'입니다. 근데 이런 1대1 대응 정보를 보지 않고 context vector만을 이용해서 번역을 할 때 아쉽습니다. 

 

1. 병목 현상

2. 원래 문장의 특정 단어 참고가 안되는 형상 > ∴ 참고를 하기 위해서  attention이 나왔습니다.

+ 정리

1. context vector에 모든 정보가 함축되어 있어서 그것만 쓰면 원래 있던 단어의 정보 손실이 일어납니다.
2. lstm이어도 seq한 구조는 기울기 소실과 폭발이 어쩔 수 없이 있습니다.
3. context vector가 전부입니다.

그래서 context vector + 원래 인코더 인풋을 사용했으면 좋겠다!라는 취지입니다.

- 어텐션 구조

알파가 A와 대응되는 것을 알기 위해서 어떻게 할까요? 알파와 ABCD 단어와의 유사도를 보면 좋겠습니다. > 다양한 종류의 유사도가 있다고 배웠습니다. > 유사도로 어느 부근에 집중할 것인지 찾아보자 유사도가 비슷한 부분에 집중하면 좋겠다는 것입니다.

 

=> attention 메커니즘(인코더 hidden state h, 디코더 hidden state s)

인코더 디코더 구조는 같습니다. > context vector는 그대로 전달이 됩니다. 디코더에 bos를 줍니다. 번역이 되어서 알파 베타 감마가 나오고(y가 나와서 dnn을 거쳐서 나오는 것입니다.)

 

> 감마를 해서 델타를 예측할 차례라고 해보겠습니다. 이때 어떤 일이 일어나냐면 감마가 올라와서 y가 나오는데 이 y와 인코더의 모든 y와 내적을 합니다. 디코더의 hidden state를 인코더의 모든 cell의 hidden state와 내적을 합니다.

 

> 내적을 하는 것은 유사도를 보는 것입니다. cosine 유사도를 볼 때 두 벡터의 내적은 두 벡터의 길이와 각도의 cosine 값을 곱한 것이었습니다. > ★따라서 유사도가 높을수록 벡터의 내적 값이 큽니다. 따라서 디코더의 hidden state과 인코더의 hidden state이 얼마나 유사하냐를 벡터의 내적으로 봅니다.★

> 내적을 취하면 그 내적 값을 attention 스코어로 쓰는 것입니다. (h1(T전치)s) 근데 그러면 벡터의 길이가 달라서 정규화를 취할 필요가 있습니다. (가중 합계를 위해서입니다.) 그래서 스코어에 softmax를 붙여서 확률값으로 바꿔줍니다. 모든 스코어의 합이 1이 되게 합니다.

 

> 여기에 나온 단어 4개의 어텐션 값의 softmax 확률 값을 디코더의 출력을 정할 때 입력의 어디에 집중해야 하는지의 가중치로 씁니다.

 

> 입력의 히든 1234가 있고 가중치가 붙은 스코어를 알파 1234가 있습니다. > 그러면 알파 x hidden state을 해서 다 더합니다. 그 더한 것들을 갖고 히든이 4개였고 번역 전 단어의 특징을 나타내고 있습니다. > 이 특징들을 스코어와 weighted sum을 합니다. 그래서 각각 가중치를 곱해서 더해서 fnn에 넣고 이게 원래 디코더 hidden state과 합쳐집니다.

> 어텐션이 적용되기 전엔는 디코더 hidden state만 fnn에 넣어서 단어를 예측했었습니다. 그런데 어텐션을 한 경우에는 디코더 hidden state에 스코어가 더해진 인코더 hidden state을 함께 가져옵니다. > 그래서 둘이 합쳐서 벡터의 길이가 두 배가 되어서 fnn의 인풋이 두 배가 되는 것입니다. 얘네를 dnn 거쳐서 최종 예측을 합니다. > 여하튼 sum 해진 것에서 어디에 집중해야 하는지를 정할 수 있습니다. 이 가중치를 봐서 정할 수 있습니다!

 

> 만약  알파 1이 234보다 높으면 감마를 디코더의 입력으로 넣었을 때 나올 단어는 "알파 1이 높으니 인코더 입력 1에 좀 더 주의 집중을 하는구나"라고 생각을 할 수 있습니다. > 이런 식으로 순, 역전파 시키면 attention을 시킬 수 있습니다.

※ 용어 정리

Query : 지금 해석할 것이라고 요청을 한 것(디코더의 hidden state)

key : Query의 비교 대상(인코더 히든)

value : sum한 것(인코더 히든)


-> seq2seq에 attention에만 적용되는 내용으로 bert의 attention과는 차이가 있을 수 있습니다.

 

=> 어텐션 스코어를 구하는 유사도 

※ 인코더 hidden state : h, 디코더 hidden state : s

 

1. dot product(내적) : hTs
2. scaled(가중치) dot product : 내적은 맞는데 가중치를 두는 것 (루트d)
3. weighted dot product : 내적을 할 때마다 w를 같이 주는 것 hTws

> 보통은 1번을 쓰는데 2, 3번을 쓰는 경우도 있습니다.(2번이 트랜스포머에서 쓰던 것이었습니다. 모두 유사도 구하는 방식입니다.)

 

 

'[AI] > [네이버 BoostCamp | 학습기록]' 카테고리의 다른 글

NLP PART.텍스트 전처리  (0) 2022.12.14
NLP PART.BERT, GPT  (0) 2022.12.09
NLP PART.RNN, Seq2Seq 구조  (0) 2022.12.03
NLP PART.텍스트 마이닝 이론  (0) 2022.12.01
NLP PART.텍스트 전처리 이론  (0) 2022.12.01
Comments