AI VIDEO BRIEFING
트랜스포머 교차 어텐션 원리 정리: 디코더가 인코더 출력을 받아들이는 구조와 마스킹이 없는 이유
트랜스포머 디코더의 두 번째 어텐션 층인 인코더-디코더 어텐션이 두 개의 행렬을 어떻게 받아 번역 정보를 옮기는지, 쿼리와 키·값의 출처가 갈리는 이유와 마스킹이 필요 없는 까닭까지 차근차근 짚었다.

핵심 메시지
쉽게 이해하기
이 영상은 트랜스포머 아키텍처를 여러 편으로 나눠 설명해 온 강의 시리즈의 마지막 회차로, 디코더를 다루는 세 편 중 세 번째다. 주제는 인코더가 만든 정보를 디코더가 받아들이는 층, 즉 흔히 교차 어텐션(cross-attention)이라고도 불리는 인코더-디코더 어텐션이다. 이 층은 두 개의 행렬을 입력으로 받는다. 하나는 디코더의 앞선 층들이 넘겨준 행렬이고, 다른 하나는 인코더의 출력이다. 두 행렬의 열 벡터 개수는 같을 필요가 없다. 디코더 쪽 개수는 디코더에 들어온 토큰 수로 정해지고, 인코더 쪽 개수는 번역하려는 원문 길이로 정해지기 때문이다. 그럼에도 이 층의 출력은 디코더 쪽 입력과 똑같은 크기를 유지한다.
강의는 인코더에 세 단어가 들어가 세 개의 벡터가 나온 상황에서 디코더의 네 번째 단어 임베딩을 새로 계산하는 예로 원리를 보여 준다. 먼저 디코더의 네 번째 벡터에 가중치 행렬을 곱해 쿼리를 만들고, 인코더가 내놓은 세 벡터 각각에서 키와 값을 만든다. 이후는 평소와 같다. 키와 쿼리의 내적을 벡터 길이의 제곱근으로 나눈 뒤 소프트맥스를 거쳐 가중치를 얻고, 그 가중치로 값 벡터들의 가중 평균을 구한다.
여기서 강사가 강조하는 대목이 있다. 평균을 내는 대상인 값 벡터들이 전적으로 인코더 출력에서 나온다는 점이다. 디코더가 아무리 좋은 단어 임베딩을 갖고 있어도, 그 임베딩이 할 수 있는 일은 인코더 쪽 값들을 얼마만큼의 비중으로 섞을지 정하는 가중치에 영향을 주는 것뿐이다. 정보의 내용물 자체는 인코더에서 온다.
이 층에는 마스킹이 들어가지 않는다. 마스크가 없어도 i번째 출력이 i번째 디코더 벡터와 인코더 출력에만 의존하므로, 뒤에 올 입력을 미리 보는 일이 구조적으로 생기지 않기 때문이다. 여러 개의 헤드를 병렬로 돌린 뒤 결과를 이어 붙이고 출력 행렬을 곱하는 멀티헤드 구성 방식은 인코더와 동일하며, 쿼리는 디코더 행렬에서, 키와 값은 인코더 행렬에서 온다는 점만 다르다.
마지막으로 강의는 전체 그림을 정리한다. 디코더 블록 하나에는 두 개의 멀티헤드 어텐션 외에 피드포워드 층과 세 개의 잔차 연결 및 정규화가 들어 있고, 구조는 같지만 파라미터가 다른 블록이 여러 개 쌓여 디코더를 이룬다. 마지막 블록의 출력은 선형 층과 소프트맥스를 지나 출력 확률이 되며, 학습 시에는 모든 입력 단어에 대한 확률을 한꺼번에 계산할 수 있어 순환 신경망보다 병렬화와 속도 면에서 유리하다는 것이 시리즈의 마무리다.
주요 인사이트
- 번역 모델에서 '원문을 참고한다'는 추상적인 말이 실제로는 키와 값을 인코더 출력에서 가져온다는 한 줄의 설계 결정으로 구현된다.
- 출력 벡터 수가 쿼리 수와 같다는 사실은 입력 문장과 출력 문장의 길이가 달라도 되는 이유를 그대로 설명해 준다. 인코더 출력의 차원은 출력 크기에 영향을 주지 않는다.
- 마스킹은 무조건 붙이는 장치가 아니다. 이 층에서는 의존 구조상 미래 정보 누출이 애초에 일어나지 않으므로 마스크가 불필요하다.
- 디코더 임베딩의 역할이 '가중치에만 영향을 준다'는 정리는, 교차 어텐션에서 무엇이 정보의 원천이고 무엇이 선택 장치인지 명확히 구분해 준다.
- 학습 시 모든 단어의 확률을 동시에 계산할 수 있다는 점이 트랜스포머가 순환 신경망을 대체한 실질적인 이유로 제시된다.
자주 묻는 질문
인코더-디코더 어텐션은 일반 셀프 어텐션과 무엇이 다른가요?
쿼리와 키·값의 출처가 갈립니다. 쿼리는 디코더 쪽 행렬에서만 만들고, 키와 값은 인코더 출력에서 만듭니다. 그 뒤 내적과 스케일링, 소프트맥스, 가중 평균을 거치는 계산 절차 자체는 일반 셀프 어텐션과 같습니다.
입력 문장과 출력 문장의 길이가 다르면 어떻게 되나요?
문제가 없습니다. 인코더가 내놓는 벡터 수는 원문 길이로, 디코더 쪽 벡터 수는 디코더에 들어온 토큰 수로 각각 정해지며, 이 층의 출력 개수는 항상 쿼리 개수와 같아 디코더 입력과 동일한 크기를 유지합니다.
이 층에는 왜 마스킹을 쓰지 않나요?
i번째 출력이 i번째 디코더 벡터와 인코더 출력에만 의존하기 때문입니다. 마스크를 씌우지 않아도 뒤에 오는 디코더 입력에는 의존하지 않으므로, 미래 정보를 미리 보는 문제가 생기지 않습니다.
원문과 출처
이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.
YouTube 원본 영상 보기 ↗