시퀀스 투 시퀀스 모델은 셀프 어텐션의 등장으로 요즘에 잘 사용하지 않지만
자연어 처리에서 중요한 개념을 내포하고 있고
Many to Many task에 대해서 자세히 알아볼 수 있다.
그리고 꼭 얻어가야 할 것은 시퀀스 투 시퀀스는 어떤 게 문제였고 현재는 그 문제를 어떻게 개선했는지에 대해서
반드시 알 필요가 있다.
먼저 시퀀스(Sequence)란 무엇일까?
시퀀스란 말은 영화에서 몇 개의 관련된 장면을 모아서 이루는 구성단위로도 쓰이고 전기 회로를 구성한 도면을 말하기도 한다.
이 처럼 여러 분야에서 각기 다르게 쓰이는데 자연어 처리에서는 단어들이 2개 이상 묶여있는 것으로 이해하면 된다.
[ i , am , a ,boy ]
시퀀스 투 시퀀스 모델(Sequence to Sequence model)
시퀀스가 들어가서 모델을 통과하면 다른 유형의 시퀀스를 반환하는 모델이다.
대표적으로 기계번역 , Q&A 모델이 시퀀스 투 시퀀스 모델이다.
시퀀스 투 시퀀스에서
인풋 시퀀스(Input Sequence)의 갯 수가 3개라고 해서
반드시 아웃풋 시퀀스(Output Sequence)가 3개일 필요는 없다.
* <EOS> end of sequence 토큰이 나올 때 끝 이남
시퀀스 투 시퀀스의 모델 구조(model structure)
인코더(Encoder)와 디코더(Decoder)가 있다.
인코더 : 입력된 정보를 어떻게 처리해서 저장할 것이냐( 취합 )
디코더 : 입력인코더로부터 압축된 정보들을 어떻게 풀어서 반환해 줄 것인가. ( 취합 된 정보로 출력/생성 )
인코더는 각각의 인풋 시퀀스(Input Sequence)들의 정보를 취합해서 하나의 문맥 벡터(Context Vactor)로 저장합니다.
디코더는 문맥 벡터(Context Vactor)를 인코더로 부터 받아서 아웃풋 시퀀스를 item by item으로 생성합니다.
그럼 여기서 "정보를 취합한다."에 대한 내용을 좀 더 풀어서 설명해보면
이전의 입력값을 가지고 다음을 예측하는 RNN 계열의 모델을 사용해서
아이템(단어)들을 순차적으로 처리하는 것이라고 볼 수 있다.
여기서 취합했다는 의미는 RNN 계열의 마지막 hidden state의 값을 의미하는데.
모든 정보가 포함되어있는 마지막 hidden state가 인풋 시퀀스의 취합된 정보
즉, 문맥 벡터(Context Vactor)가 되는 것이다.
디코더는 문맥 벡터(Context vactor)를 받아서 순차적으로 결과 단어를 하나씩 뱉어내게 되는 것이다.
실제로 코드로 구현할 때도 결과를 하나씩 리스트의 append 하는 과정이 이루어진다.
하지만 RNN 네트워크의 단점이 여기서도 드러난다.
바로 시퀀스가 길어지면(Long Sequence) 앞의 내용보다 뒷부분의 있는 내용이 훨씬 더 많은 영향을 미치는 단점.
이를 보완하기 위해 , 장기기억을 보존하는 LSTM과 GRU 등이 있지만
보완을 해줄 뿐 근본적인 문제를 해결할 수 없었다.
그래서 어텐션(Attention) 개념을 사용하게 된다.
Attention
어텐션은 모델이 각각의 인풋 시퀀스들 중에서
현재 아웃풋 아이템이 주목해야 하는 파트들을 직접 연결해준다.
해당하는 파트의 정보들을 잘 활용할 수 있도록 도와주는 역할.
어텐션 방법은 두 가지가 존재하는데.
1. Bahadanau attention ( Bahdanau et al., 2015 )
2. Luong attention ( Luong et al., 2015 )
차이점을 간단히 요약하면
Bahadanau는 어텐션 스코어 자체를 학습을 하는 뉴럴 네트워크(NN) 모델이 존재한다.
Luong 은 학습을 하지 않고 현재 current state 하고 기존의 과거 hidden state의 대한
유사도를 측정해서 어텐션 스코어를 매기게 된다.
뉴럴 네트워크 모델로 학습하는 Bahadanau가 성능이 더 높을 것 같지만
둘 사이의 성능이 크게 차이가 나지 않아서 연산량이 적은 Luong을 더 많이 사용한다.
어텐션이 적용된 시퀀스 투 시퀀스 모델은 무엇이 다를까?
1. 기존 인코더는 마지막 hidden state 만 디코더에게 전달했다면 어텐션이 적용되면
인코더의 모든 시점에서의 hidden state를 전부 넘겨주게 된다.
* 넘겨주는 정보량이 많으면 그만큼 정확도가 올라갈 수밖에 없다.
2. hidden state 들의 중요도(attention weight)를 계산(곱)해서 나온 결과를 사용하게 된다.
* 기존에는 중요도의 개념이 없었음
중요도는 어떻게 계산되는 가?
디코더(Decoder)가 인코더가 넘겨준 hidden state 들을 전달받습니다.
*여기서 넘겨받은 hidden state 들은 기본적으로 해당하는 단어의 시퀀스의 가장 많은 영향을 미친다.
나 자신에 대한 점수가 가장 높다. -> 내가 날 제일 잘 안다
각각의 hidden state의 영향을 점수(score)로 표현할 수 있고 점수(score)에 Softmax를 취한 것이 중요도가 된다.
"점수로 표현할 수 있다" -> Bahadanau , Luong 등을 사용해서 score가 구해짐
여기서 나온 디코더의 hidden state vactor와 context vector를
concatenate(옆으로 붙여서)해서 뉴럴 네트워크(NN)에 입력으로 다시 집어넣으면
Output vactor가 하나의 토큰(단어)으로 나오게 된다.
1. 인코더의 LSTM 위에 있는 초록색 점이 어텐션을 통해 나온 score 값
2. Softmax를 취해서 중요도가 나오고 중요도를 곱해서 합침. 이게 바로 context vactor
3. context vactor와 디코더 마지막에 있는 LSTM에서 나온 hidden state vactor와 concat 함.
4. concat 한 vector를 Dense Layer에 input으로 넣게 되면 결과적으로 가장 적합한 Token이 도출됨.
(end of sequence) 토큰이 나올 때까지 N 번 반복함.
여기까지 시퀀스 투 시퀀스의 기본 구조와 발전된 모델(attention)도 함께 살펴보았습니다.
끄으읏..
이미지 출처 : wikidocs.net/22893 , https://jalammar.github.io/
참고 영상 : https://www.youtube.com/watch?v=Yk1tV_cXMMU(고려대학교 산업경영공학과 강필성 교수님 강의)
'Machine learning > NLP' 카테고리의 다른 글
[NLP]. Transformer : Structure - part1 (0) | 2021.08.19 |
---|---|
[NLP] Sequence to Sequence(시퀀스 투 시퀀스) 코드 (0) | 2021.08.19 |
[NLP] 수능 영어지문을 풀어주는 인공지능 (WMD) (0) | 2021.01.30 |
[NLP] Word Encoding & Embedding (0) | 2021.01.13 |
[NLP] TF-IDF 를 활용한 제목별 추천 시스템. (0) | 2021.01.07 |