AI VIDEO BRIEFING
셀프 어텐션 원리 쉽게 이해하기: 가중평균에서 쿼리·키 행렬까지 짚은 트랜스포머 입문 강의
트랜스포머 강의 시리즈의 첫 편이 셀프 어텐션을 가중평균이라는 한 가지 개념으로 풀어낸다. 단어 벡터에 문맥 정보를 더하는 과정과 쿼리·키 행렬이 왜 필요한지를 짧은 예문 하나로 차근차근 따라가며 설명한다.

핵심 메시지
쉽게 이해하기
이 영상은 트랜스포머 구조를 다루는 강의 시리즈의 첫 편으로, 셀프 어텐션 하나에 집중한다. 강의자는 먼저 트랜스포머가 원래 번역을 위해 제안된 모델이며, 입력 문장을 특징으로 바꾸는 인코더와 새로운 문장을 만드는 디코더로 이루어진 전형적인 시퀀스-투-시퀀스 구조라고 짚는다. 디코더는 인코더의 출력과 지금까지 번역한 부분을 함께 받아 다음 단어의 확률분포를 계산하고, 문장 끝을 뜻하는 신호가 나올 때까지 이 과정을 반복한다. 구조 자체는 기존 기계번역과 다르지 않고, 새로운 것은 그 인코더와 디코더를 셀프 어텐션으로 만들었다는 점이다.
셀프 어텐션의 정체는 의외로 단순하다. 가중평균을 구하는 연산이다. 강의자는 잡음이 섞인 1차원 데이터를 부드럽게 만드는 예에서 출발한다. 관심 지점 주변에 종 모양 곡선을 씌워 가까운 점에 큰 가중치를 주고, 그 값들을 합이 1이 되도록 정규화한 뒤 평균을 낸다. 음수가 아닌 값으로 바꾼 뒤 합을 1로 맞춘다는 점에서 소프트맥스와 성격이 비슷하다는 설명이 이어진다.
이 아이디어를 문장에 옮기려면 단어를 수백 차원의 벡터로 바꿔야 한다. 예문 'Emma hates games, but she's a great friend'에서 'friend'의 새로운 벡터를 만든다고 하면, 문장 속 아홉 개 단어 벡터에 각각 가중치를 곱해 더하면 된다. 문제는 그 가중치를 어떻게 정하느냐다. 위치가 가까운 단어에 큰 값을 주는 방식은 여기서 잘 맞지 않는다. 오히려 'friend'가 누구를 가리키는지 알려면 'Emma'와 'she'에 큰 가중치가 붙어야 한다. 그래야 어떤 맥락에서든 통하는 일반적인 단어 벡터가, 이 문장에 맞춰진 벡터로 바뀐다.
가장 단순한 자동화는 원래 단어 벡터끼리 내적을 구하고 소프트맥스를 씌우는 것이다. 실제로 쓰이기도 하지만 두 가지가 걸린다. 벡터가 비슷한 단어에 큰 가중치를 주는 것이 늘 옳다는 보장이 없고, 조정할 파라미터가 하나도 없다는 점이다. 셀프 어텐션은 여기에 쿼리 행렬과 키 행렬을 끼워 넣어, 내적을 계산하기 전에 벡터를 먼저 변환한다. 'friend'에서 쿼리 벡터를 만들고 모든 단어에서 키 벡터를 만든 뒤 내적을 구해 소프트맥스를 통과시키면 가중치가 된다.
강의자는 이 구조가 원하는 결과를 낼 수 있는지 직관적으로 따져 본다. 임베딩 공간에서는 의미가 가까운 단어들이 뭉치는 경향이 있으므로, 키 행렬을 항등행렬로 두고 쿼리 행렬이 'friend'의 벡터를 'Emma·she' 쪽으로 향하게 만들면 두 단어의 내적이 커진다. 즉 새로 들인 행렬들이 원하는 가중치를 만들어 낼 여지가 있다는 이야기다. 이어서 같은 두 행렬을 문장의 모든 단어에 그대로 재사용하되 단어마다 쿼리만 달라진다는 점, 그래서 단어마다 다른 가중치와 다른 결과 벡터가 나온다는 점을 정리하며 다음 편을 예고한다.
주요 인사이트
- 어텐션을 배우는 첫 관문은 수식이 아니라 '가중평균'이라는 익숙한 개념이다. 1차원 데이터 평활화와 문장 속 단어 결합이 같은 연산이라는 점을 짚어 주는 설명 방식이 이해를 크게 앞당긴다.
- 단어 임베딩은 어떤 문맥에서도 통하도록 일반적으로 만들어진 반면, 셀프 어텐션을 거친 벡터는 지금 이 문장에 맞춰 조정된 표현이다. 이 차이가 어텐션이 필요한 이유를 압축해 보여 준다.
- 쿼리·키 행렬의 존재 이유는 성능 향상 이전에 '학습할 파라미터가 생긴다'는 데 있다. 파라미터가 없는 단순 내적 방식은 개선의 여지 자체가 없다.
- 행렬을 도입하면 유연해지는 대신 무슨 일이 일어나는지 해석하기는 더 어려워진다. 강의자가 항등행렬 같은 특수한 경우를 가정해 직관을 세우는 것도 그 때문이다.
자주 묻는 질문
셀프 어텐션이 계산하는 것은 정확히 무엇인가요?
문장 속 단어 벡터들의 가중평균입니다. 특정 단어의 새 벡터는 문장에 있는 모든 단어 벡터에 가중치를 곱해 더한 값이며, 그 가중치는 단어마다 다르게 계산됩니다.
쿼리 행렬과 키 행렬은 왜 필요한가요?
원래 단어 벡터끼리 바로 내적을 구하면 비슷한 단어에만 큰 가중치가 가고 조정할 파라미터도 없습니다. 두 행렬은 내적 전에 벡터를 변환해 학습으로 가중치를 다듬을 수 있게 해 줍니다.
번역에 관심이 없어도 트랜스포머를 알아야 하나요?
강의자는 그렇다고 말합니다. 여러 자연어 처리 과제가 인코더나 디코더 한쪽만 떼어 쓰고 있고, 자연어 밖의 분야에서도 같은 구조가 활발히 시도되고 있기 때문입니다.
원문과 출처
이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.
YouTube 원본 영상 보기 ↗