네이버 부스트캠프/LEVEL-2

[부스트캠프][WK06 / Day28] Sequence to Sequence with Attention

1. 강의 내용

Sequence to Sequence with Attention (주재걸 교수님)

1) Sequence to Sequence

Sequence to Sequence는 RNN의 구조 중 many to many에 해당됩니다.


Sequence to Sequence는 Encoder와 Decoder로 구성되어 있는데, Encoder는 입력 문장을 읽어내는 RNN 모델이며, Decoder는 출력 문장을 순차적으로 단어 하나씩 생성하는 모델입니다. Encoder와 Decoder는 파라미터를 공유하지 않습니다. 여기서 Encoder의 마지막 time step의 hidden state vector는 Decoder의 $h_0$로 사용됩니다.

 

단어별로 문장을 생성하는 task에서 start token (<SOS>)을 Decoder time step의 첫 번째에 넣어주게 됩니다. end token (<EOS>)은 어디까지 단어를 생성할지에 대한 것으로 해당 토큰이 나오면 최종 출력으로 더 이상 단어가 생성되지 않습니다.

 

위와 같이 학습이 진행된다면 Encoder에서 나오는 hidden state vector에 고정된 차원에 모든 입력 단어들의 정보가 들어가야 하기 때문에 정보가 변질되거나 소실되게 됩니다. 이를 해결하기 위해 입력 문장의 순서를 뒤집어 입력을 역순으로 넣어주거나 attention을 활용하게 됩니다.

2) attention

attention은 Encoder의 각 time step에서 나온 hidden state vector들을 Decoder에 제공해주고 Decoder에서는 각 time step에서 단어를 생성할 때 필요한 Encoder hidden state vector를 선별적으로 활용하는 아이디어 입니다.

 


Encoder hidden state vector들을 Decoder의 hidden state vector와 내적하여 Attention score를 구해주고 그 값을 softmax에 넣어주어 Attention 분포를 만들어줍니다. 해당 분포(Attention vector)를 Encoder hidden state vector값과 가중평균하여 얻은 값을 Attention output(context vector)라 합니다.

 


앞에서 구한 Attention output vector와 Decoder의 hidden state vector를 concatenate 해주어 다음 나올 예측값을 구하는 방식으로 진행됩니다. 이러한 과정이 Decoder RNN의 time step 마다 진행됩니다.

 

이러한 과정에서 Decoder RNN의 hidden state vector의 역할은 해당 time step의 output layer의 입력으로 사용됨과 동시에 각 단어별 encoding vector 중 어떤 단어 벡터를 중점적으로 볼지 정하는 가중치의 역할을 수행합니다.

 

이러한 모델을 학습할 때 예측값을 다음 입력값으로 쓰지 않고 ground truth 값을 Decoder의 입력으로 넣어주는 teacher forcing 방법을 사용하기도 합니다. 이 방식을 적용하게 되면 학습이 더 빠르고 용이하지만 테스트 시의 환경과는 조금 다른 상황이 발생합니다. 이러한 점을 보완하기 위해 처음에는 teacher forcing 방식으로 학습을 진행하다가 어느정도 진행된 후에는 예측값을 다음 time step의 입력으로 주는 방식도 존재합니다.

 

위에서는 Encoder hidden state vector와 Decoder RNN의 hidden state vector의 유사도를 구할 때 내적을 사용했지만 유사도를 구하는 방식은 아래와 같이 다양하게 존재합니다.

 


general은 벡터와 벡터 내적 사이에 가중치를 포함할 수 있는 행렬 $W_a$을 추가하여 이 행렬을 학습시키는 방법입니다. concat은 두 벡터를 concat해 fully connected layer를 통과시켜 scalar 값으로 유사도를 나타내게 하는 방식으로, 수식을 보면 concat한 벡터를 $W_a$로 선형변환 한 후 tanh를 통과시켜 벡터 $v^T_a$를 곱해줘 scalar을 만들어 줍니다.

 

Attention은 기계번역 성능의 향상과 긴 문장의 번역이 잘 되지 않는 bottleneck problem을 해결했으며 긴 time step을 거치지 않고 Encoder의 특정 time step까지 gradient를 빠르고 큰 변형없이 전달 함으로써 vanishing gradient 문제를 해결했습니다. 또한 attention의 패턴이 어떤식으로 나왔는가를 확인하여 Decoder에서 예측 시 Encoder의 어떤 단어에 집중했는지 ground truth를 활용한 softmax loss를 통해 알 수 있어 해석에 용이합니다.


2. 과제 수행 과정 / 결과물 정리


3. 피어세션 정리

https://www.notion.so/9-9-5a30bf561f2946828163594696874d4b

  • 추가적으로 멘토링을 진행하며 각종 면접질문과 논문을 읽고 리뷰하는 법, CV 작성 방법에 대해 멘토님에게 설명을 듣고 질의응답을 진행하였습니다.

4. 학습 회고

금일의 마스터클래스가 정말 유익했습니다. 막연히 NLP를 공부한다고 했었지만 최근의 트렌드에 대해 무관심했던 면이 있었습니다. 이번 마스터 클래스를 통해 트렌드에 대해 여러가지 기법에 대한 설명을 들었고 최대한 자세히 알려주셔서 앞으로 프로젝트 주제를 선정하는데 도움이 되었습니다.

 

강의 내용에서는 attention을 배우기도 했고 활용해 프로젝트도 여러번 진행했지만 금일의 강의를 들으며 역시 제대로 알고 있지 않다는 사실을 깨달았습니다. 이제는 수식까지 모두 완전 세세하게 이해했다고는 말할 수 없지만 어떤 원리로 사용되고, 어떤 장점이 있으며 어떤 종류가 있는지에 대해 제대로 짚고 넘어갈 수 있었습니다.

 

데이콘 실습에서 eda를 하기 위해 서버에 mecab을 설치하는데 굉장히 애를 먹었습니다.