AI VIDEO BRIEFING

셀프 어텐션 수식 완전 해설: 값 벡터와 루트 d 스케일링, 순서 불변성과 행렬 표기

트랜스포머 강의가 셀프 어텐션의 완전한 방정식을 채워 넣는다. 가중 평균의 대상이 되는 값 벡터, 차원의 제곱근으로 나누는 스케일링, 단어 순서를 바꿔도 출력이 같은 순서 불변성, 그리고 간결한 행렬 표기까지 정리했다.

셀프 어텐션의 완전한 수식 — 값 벡터와 스케일링, 그리고 단어 순서를 모르는 층 영상 대표 이미지

핵심 메시지

  • 셀프 어텐션은 입력 임베딩이 아니라 값(value) 벡터를 가중 평균한다. 값 행렬을 따로 두면서 네트워크의 표현력이 더 커진다.
  • 키와 쿼리의 내적은 입력 벡터 차원의 제곱근으로 나눈다. 벡터 길이가 달라져도 값의 크기가 덜 흔들리게 하려는 조정이다.
  • 가중치는 쿼리 인덱스마다 z값들을 소프트맥스에 통과시켜 얻고, 그 가중치로 새 임베딩을 만든다.
  • 단어 순서를 바꿔도 각 단어의 출력 임베딩은 그대로다. 셀프 어텐션은 집합에서 집합으로 가는 함수에 가깝다.
  • 같은 계산을 행렬 표기로 쓰면 훨씬 간결해지고, 실제 구현에는 이 형태가 압도적으로 편하다.

쉽게 이해하기

이 강의는 트랜스포머 시리즈의 두 번째 편으로, 앞 편에서 개념만 소개하고 넘어갔던 셀프 어텐션의 완전한 방정식을 채워 넣는다. 문장 길이에 상관없이 성립하는 식을 쓰기 위해 단어 개수를 n, 임베딩 길이를 d로 두고 출발한다. 가장 먼저 하는 일은 모든 입력 단어에 대해 쿼리·키·값 벡터를 계산하는 것이다.

앞 편에서 빠져 있던 첫 번째 조각이 바로 값 벡터다. 쿼리와 키는 가중치를 계산하는 데 쓰이지만, 실제로 평균을 내는 대상은 입력 임베딩이 아니라 학습 가능한 행렬을 곱해 얻은 값 벡터다. 강의는 앞 편의 직관적 설명이 여전히 유효하다고 하면서도, 값 행렬을 따로 도입하면서 네트워크가 한층 유연해진다고 설명한다.

두 번째 조각은 스케일링이다. 키와 쿼리의 내적을 입력 벡터 차원의 제곱근으로 나누는데, 강의는 이를 기술적 세부사항이라고 부르면서도 왜 도움이 되는지 직관을 덧붙인다. 모든 성분이 1인 길이 d짜리 벡터를 제곱근 d로 나누면 벡터 길이와 무관하게 노름이 1이 되는 것처럼, 나눠 주면 값의 변동이 줄어든다는 것이다. 이렇게 얻은 z값들을 쿼리 인덱스별로 소프트맥스에 통과시켜 가중치를 만들고, 값 벡터들의 가중 평균으로 새 임베딩을 얻는다.

식이 완성되고 나면 흥미로운 성질이 드러난다. 입력 단어의 순서가 출력 벡터에 영향을 주지 않는다는 점이다. 강의는 세 단어짜리 예문을 두고 인덱스 대신 단어 자체를 첨자로 써서 이를 보인다. 'he'에 대한 새 임베딩을 계산할 때 쓰이는 쿼리는 항상 'he'의 것이고 키만 달라지므로, 단어를 어떻게 섞어 넣어도 'he'의 출력은 같다. 그래서 셀프 어텐션은 한 벡터 집합을 같은 크기의 다른 벡터 집합으로 옮기는 함수로 볼 수 있으며, 이 성질이 자연어 처리 바깥에서도 이 구조가 널리 쓰이는 이유가 된다. 다만 트랜스포머 전체가 순서를 무시하는 것은 아니고, 그 문제는 뒤 편에서 다시 다룬다고 예고한다.

마지막 절반은 같은 내용을 행렬 표기로 다시 쓰는 데 할애된다. 입력 벡터들을 열로 세운 행렬 X를 두면 모든 쿼리는 가중치 행렬과 X의 곱 하나로 얻어지고, z 행렬은 키 행렬의 전치와 쿼리 행렬을 곱해 제곱근 d로 나눈 형태가 된다. 가중치 행렬은 z의 각 열에 소프트맥스를 적용해 만들고, 출력은 값 행렬과 가중치 행렬의 곱으로 정리된다. 강의는 이 표기가 직관성은 조금 떨어져도 훨씬 압축적이며 구현할 때는 단연 이쪽이 낫다고 정리한다.

주요 인사이트

  • 값 벡터의 존재 이유는 역할 분리다. 쿼리와 키는 '어디를 볼지'를 정하고, 값은 '무엇을 가져올지'를 정한다.
  • 스케일링은 성능 향상을 위한 경험적 선택으로 소개되며, 강의는 이를 엄밀한 증명이 아니라 휴리스틱한 논거로 설명한다.
  • 순서 불변성은 결함이 아니라 성질이다. 집합을 집합으로 옮기는 함수라는 관점 덕분에 셀프 어텐션은 언어 밖의 데이터에도 자연스럽게 적용된다.
  • 행렬 표기로 넘어가는 과정을 벡터식과 하나씩 대조해 보이는 방식은, 라이브러리 코드에서 마주치는 압축된 수식을 읽어 내는 데 그대로 쓸모가 있다.

자주 묻는 질문

셀프 어텐션이 평균 내는 대상은 무엇인가요?

입력 단어 임베딩이 아니라 값 벡터입니다. 각 입력 임베딩에 학습 가능한 값 행렬을 곱해 값 벡터를 만들고, 쿼리와 키로 계산한 가중치를 이 값 벡터들에 적용해 새 임베딩을 만듭니다.

내적을 왜 차원의 제곱근으로 나누나요?

z값의 변동을 줄이기 위해서입니다. 강의는 이를 기술적 세부사항이라고 하면서, 성분이 모두 1인 길이 d 벡터를 제곱근 d로 나누면 길이와 무관하게 노름이 1이 되는 예를 휴리스틱한 근거로 듭니다.

단어 순서를 바꾸면 결과가 달라지나요?

셀프 어텐션 층만 놓고 보면 달라지지 않습니다. 'he is old'를 'old he is'로 섞어 넣어도 'he'에 대한 출력 임베딩은 같습니다. 다만 트랜스포머 전체가 순서를 완전히 무시하지는 않으며, 강의는 그 부분을 뒤에서 다룬다고 밝힙니다.

원문과 출처

이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.

YouTube 원본 영상 보기 ↗

관련 AI 소식