오늘 끝나면
Seq2Seq와 Attention
- ✓Seq2Seq와 Attention의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 Seq2Seq와이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
2014 바다나우 — 번역의 병목을 푼 ‘주목’ 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
AI · Day 9 / 지도학습 · 생성 DL
한 벡터에
담을 수 없는
번역기는 문장 전체를 벡터 하나에 욱여넣는다.
짧으면 괜찮다. 길면 무너진다.
영화 한 편을 한 단어로 요약하는 꼴이다.
Attention이 이 병목을 깬다.
문장을 문장으로, Seq2Seq의 등장
2014년, 구글과 몬트리올 대학이 거의 동시에 같은 걸 내놓았다.
RNN 두 개를 마주 보게 붙인 구조다.
앞 RNN(Encoder)이 "I love you"를 한 단어씩 읽는다.
그리고 마지막에 요약 벡터 하나를 만든다.
뒤 RNN(Decoder)은 그 벡터만 받아 "나는 너를 사랑해"를 한 단어씩 뱉는다.
이게 Sequence-to-Sequence, 줄여서 Seq2Seq다.
입력 길이와 출력 길이가 달라도 된다.
번역과 요약, 챗봇의 공통 골격이 여기서 처음 생겼다.
Encoder가 만든 요약 벡터 하나로 Decoder가 새 문장을 푼다
병목, 한 벡터의 저주
그런데 치명적인 약점이 있었다.
Decoder가 받는 건 오직 마지막 hidden state 하나다.
5단어든 50단어든 같은 크기의 벡터 하나에 압축된다.
앞부분 정보는 뒤로 밀려 희미해진다.
Decoder는 흐릿한 요약본만 보고 문장을 다시 써야 한다.
실제로 그랬다.
20~30단어를 넘어가면 BLEU 점수가 급락했다.
정보는 많은데 통로가 하나뿐이라 무너진다.
모든 의미가 벡터 하나를 통과한다. 문장이 길수록 무너진다.
해법, 매 순간 돌아보기
2015년, Bahdanau 연구팀의 발상은 단순했다.
요약 벡터 하나에 매달리지 말자는 것이다.
Decoder가 단어를 낼 때마다 입력 전체를 다시 보게 하자는 발상이다.
사람이 번역하는 장면을 떠올려 보자.
"사랑해"를 쓸 때 원문의 "love" 근처를 한 번 더 본다.
Attention은 이 행동을 모델에 그대로 넣은 것이다.
Decoder는 출력 단어마다 인코더의 모든 hidden state를 훑는다.
지금 필요한 곳에 더 큰 가중치를 준다.
통로 하나가 입력 전체로 뚫린 직통 회선들로 바뀐 셈이다.
출력 단어마다 입력 전체를 보고, 필요한 곳에 가중치를 몰아준다
세 단계로 끝나는 Attention
Attention은 의외로 간단하다.
매 출력 스텝마다 딱 세 가지만 한다.
- 점수(score)는 지금 Decoder 상태 sₜ가 각 입력 hidden hᵢ와 얼마나 맞는지 잰다
- 가중치는 점수를 softmax로 합이 1인 확률로 만든다
- 맥락 벡터는 hᵢ들을 가중치로 섞어 cₜ를 만든다
파이썬 코드 보기
# 출력 스텝 t에서 (numpy 직관)
for i in range(N): # 입력 모든 위치
score[i] = align(s_t, h[i]) # 얼마나 맞나
a = softmax(score) # 합이 1인 가중치
c_t = sum(a[i] * h[i] for i in N) # 맥락 벡터
y_t = decoder(s_t, c_t) # 다음 단어 예측핵심은 c_t = Σ aᵢ·hᵢ 한 줄이다.
고정된 요약 벡터 대신 단어마다 새로 조립한 맥락을 쓴다.
이게 긴 문장의 저주를 푼다.
정렬 행렬, 그리고 다음 혁명
Attention의 또 다른 선물은 설명 가능성이다.
가중치를 히트맵으로 그리면, 모델이 어느 입력을 보고 어느 출력을 냈는지 한눈에 보인다.
비즈니스에선 이게 크다.
모델이 "왜 그렇게 답했는지" 근거를 가리킬 수 있다.
의료와 법률, 금융에선 도입을 결정짓는 신뢰의 문제다.
Attention은 블랙박스에 작은 창을 낸다.
다만 Attention은 여전히 RNN 위에 붙인 보조 장치였다.
RNN은 단어를 하나씩 순차로 처리하니 느리다.
RNN을 빼고 Attention만으로 모델을 짜면 Transformer가 된다.
Q. Attention이 Seq2Seq의 정보 병목을 어떻게 없앴나?
기존 Seq2Seq는 입력 전체를 마지막 hidden state 하나에 압축해 Decoder에 넘긴다.Attention은 이 단일 통로를 버린다.
Decoder가 출력 단어마다 인코더의 모든 hidden state를 다시 참조하게 한다.
매 스텝 필요한 곳에 가중치를 몰아 맥락 벡터 cₜ를 새로 만든다.
그래서 긴 문장에서도 앞부분 정보가 사라지지 않는다.
가중치를 히트맵으로 그리면 모델이 무엇을 보고 답했는지 드러난다