구현과 정리
셀프 어텐션은 코드로 몇 줄일까요?
답
여섯 줄입니다
q = x @ W_q쿼리k = x @ W_k키v = x @ W_v값scores = q @ k.T점수weights = softmax(scores / √dk)가중치context = weights @ v문맥 벡터
파이토치 코드를 읽기 쉽게 줄여 쓴 것입니다. 지금까지 본 내용이 한 줄씩 그대로 들어 있습니다.
묶으면
클래스 하나가 부품이 됩니다
넣는 것단어 벡터 여섯 개
↓
부품SelfAttention
↓
나오는 것문맥 벡터 여섯 개
LLM은 이런 부품을 여러 층으로 쌓아서 만듭니다.
구현 방식
W를 만드는 방법이 두 가지입니다
- v1
- nn.Parameter행렬을 직접 만들어서 곱한다
- v2
- nn.Linear파이토치의 선형 층에 맡긴다
하는 계산은 같습니다. 다만 nn.Linear는 처음 숫자를 훈련에 유리하게 채워 주기 때문에, 실제로는 v2 방식을 씁니다.
확인
두 버전의 출력이 다른 이유
계산이 달라서가 아니라 처음에 채운 숫자가 달라서입니다.
한쪽의 W를 다른 쪽에 그대로 옮겨 넣으면 두 출력이 똑같아집니다. 두 방식이 같은 계산이라는 것을 이렇게 확인합니다.
4강 정리
여기까지 온 길
- 메모 한 장의 한계긴 문장을 벡터 하나에 다 담지 못한다
- 어텐션필요한 곳을 비중을 두고 다시 본다
- 셀프 어텐션점수, 가중치, 문맥 벡터
- 쿼리, 키, 값어디를 볼지 훈련으로 배운다
- √dk가중치가 한쪽으로 쏠리지 않게 한다
다음 강의
아직 두 가지가 남았습니다
- 코잘
- 코잘 어텐션뒤에 올 단어를 가리고 본다
- 멀티
- 멀티 헤드 어텐션어텐션 여러 개를 동시에 돌린다