심화세션 - NLP.week4-2
Oct 8, 2024
»
AI
Attention is all you need
Attention
- 초기 임베딩은 단순히 단어의 위치와 의미를 표현, 문맥적인 의미는 담고 있지 않음
- 특히 동음이의어의 경우, 문맥과 상관없이 임베딩을 동일
- 트랜스포머 모델은 주변 단어들의 임베딩을 바탕으로 단어의 의미를 더욱 구체화하고 문맥적 의미를 학습
- 잘 훈련된 어텐션 블록은 문맥 함수에 따라 일반 임베딩에 추가해야할 내용을 계산해 특정 방향 중 하나로 이동시킴
- 각 임베딩은 잘 훈련된 어텐션 블록을 통해 문맥 함수에 따라 특정 방향으로 업데이트되며, 단순히 단어의 의미를 세분화하는 것 이상으로 멀리 떨어진 단어 간의 정보 전달을 가능하게 함
- 벡터가 네트워크 통과 후 다음 토큰을 예측하기 위해 수행하는 계산, 즉 트랜스포머 모델에서 최종적으로 계산되는 벡터는 시퀀스의 마지막 벡터에 크게 의존
- 예시: 추리소설의 일부 내용, 마지막 문장(범인은 000이였다)
- 단어가 포함된 시퀀스의 마지막 벡터는 이전 모든 문장의 정보에 의해 업데이트되어 개별 단어보다 더욱 풍부한 정보를 담고 있어야 함
- 즉 개별 단어의 의미를 넘어서 전체 문맥을 인코딩하여 예측할 수 있어야 함
- 예시: “파란색 복실복실한 생물이 숲을 돌아다니고 있다”는 문장
- 명사는 주변 형용사에게 “내 앞에 형용사가 있나요?”라는 질문을 던짐 -> 이러한 질문이 쿼리(Query)로 인코딩
- 쿼리 백터는 인코딩 벡터보다 훨씬 작은 크기
- 형용사는 “나!”라고 대답하는 것이 키(Key) 역할을 함
- 키는 쿼리에 대한 잠재적 답변
- 키 행렬은 조정 가능한 매개변수로 가득 차있음
- 키는 쿼리가 서로 밀접하게 일치할 때 일치
- 명사는 주변 형용사에게 “내 앞에 형용사가 있나요?”라는 질문을 던짐 -> 이러한 질문이 쿼리(Query)로 인코딩
- 쿼리와 키는 각각 임베딩 벡터를 더 작은 차원 공간에 매핑
- 쿼리와 키의 내적을 계산하여, 얼마나 관련이 있는지 판단. 이 값이 클수록 쿼리와 키가 관련이 깊음
- 각 쿼리-키 쌍의 내적값(음의 무한대에서 무한대까지의 값)이 음수거나 엄청 작을 경우 단어끼리 서로 관련이 없다는 뜻
- 0과 1 사이의 확률 분포 값으로 정규화 = 소프트맥스(Softmax)
- 큰 점이 키와 쿼리가 정렬되는 위치
Masking
- 각 구절 초기 토큰 다음에 가능한 모든 다음 토큰을 동시에 예측하도록 하면 전체훈련이 훨씬 효율적
- 그러나 어텐션 패턴의 경우 뒤 단어가 앞 단어에 영향을 미치면 안 됨
- 이전 토큰에 영향을 미치는 이후 토큰 0이 되게 하기

- 그러나 이렇게 하면 열의 합이 더이상 1이 되지 않아 정규화되지 않음
- 따라서 이후 토큰이 이전 토큰에 영향을 주지 않도록, 소프트맥스를 적용하기 전에 이후 토큰 값을 음의 무한대로 설정 -> 마스킹

Value
- value matrix를 첫 번째 단어의 임베딩에 곱함 -> value vector -> 두 번째 단어의 임베딩에 곱함
- value matrix의 각 열에 대해 해당하는 가중치를 곱함
- value 행렬은 키-쿼리 관계가 얼마나 잘 맞는지에 따라 업데이트되며, 이 값을 기반으로 컨텍스트에 따라 임베딩을 업데이트
Parameter Computation
- value params = query params + key params가 되게 하는 게 효율적임
- 쿼리, 키, 밸류 행렬을 계산할 때, 이를 작은 차원 공간으로 매핑한 후 다시 큰 공간으로 변환
- 큰 임베딩 벡터를 더 작은 공간에 매핑
- value down matrix
- 이후 다시 임베딩 공간으로 매핑해 실제 업데이트에 사용하는 벡터 생성
- value up matrix
- 큰 임베딩 벡터를 더 작은 공간에 매핑
Cross Attention
- 언어를 다른 언어로 변환하거나 텍스트와 음성처럼 서로 다른 데이터 타입을 처리할 때 사용
- 키 맵과 쿼리 맵이 서로 다른 데이터 세트에서 작동
- 마스킹 x (이후 단어가 이전 단어에 영향을 미칠 수 있음)
Multi-head Attention
- 트랜스포머의 핵심 기능 멀티 헤드 어텐션(Multi-head Attention)
- 여러 개의 어텐션 작업을 병렬로 수행
- 각 어텐션 헤드는 고유한 쿼리, 키, 밸류 매트릭스를 생성
- 서로 다른 어텐션 패턴을 생성
- 서로 다른 밸류 행렬을 가짐
- 해당하는 어텐션 패턴을 가중치로 사용해 합산
- 컨텍스트의 각 위치 각 토큰에 대해 모든 헤드가 해당 위치의 임베딩에 추가할 변경 사항 생성
- 모든 변경사항 합산해서 그 결과를 해당 위치의 원래 임베딩에 추가

Deeper
- 최종적으로 여러 어텐션 헤드의 결과를 종합하여 출력 임베딩을 생성
- 이 임베딩은 이후 모델 내의 멀티레이어 퍼셉트론(MLP)을 거침
- 트랜스포머 모델은 여러 층(layer)으로 이루어져 있음
- 각 층은 어텐션 메커니즘과 MLP를 반복적으로 수행 -> 점진적으로 더 복잡한 의미를 학습
- 이 반복 과정은 최종적으로 더 복합적인 문맥 정보를 담는 임베딩을 생성하게 됨
Query, Key, Value?
- 쿼리(Query)
- 특정 단어(토큰)가 다른 단어와 연관된 정보를 찾으려는 질문
- 키(Key)
- 각 단어(토큰)에 대한 정보(정답 후보)
- 쿼리가 “너와 관련된 정보는?”이라고 물을 때, 키는 “이게 나의 정보야”라고 대답하는 역할
- 밸류(Value)
- 실제로 전달할 정보의 내용
- 쿼리가 어떤 키에 얼마나 일치하는지 계산된 결과(유사도 점수)를 통해 밸류 값을 가져옴
- 이 값이 최종적으로 문맥에 따라 업데이트
- 쿼리와 키 사이의 유사도 계산
- 쿼리와 키의 내적값으로 계산
- 쿼리가 키와 얼마나 관련이 있는지를 수치화하는 것
- 예를 들어, 쿼리와 키가 매우 관련이 있다면, 내적값이 커짐
- 내적값이 크다는 것은 그만큼 밸류(Value)에 더 많은 가중치가 부여된다는 뜻
- 가중치 계산
- 쿼리와 키 사이의 내적값을 바탕으로 소프트맥스(Softmax) 함수를 사용해 각 내적값을 0과 1 사이의 확률 값으로 변환
- 이를 통해 모델은 어떤 키와 더 밀접한 관련이 있는지를 알 수 있고, 해당 키와 연결된 밸류에 가중치를 부여
- Value 행렬 생성
- 각 밸류(Value)는 쿼리와 키의 유사도(내적값)에 비례하여 가중치가 곱해짐
- 쿼리와 더 잘 맞는 키에 해당하는 밸류는 더 큰 비중으로 반영되고, 덜 관련된 키는 작은 비중으로 반영
- 쉽게 말하면, 쿼리와 키의 내적값을 통해 키가 쿼리와 얼마나 관련이 있는지를 확인하고, 그 결과로 밸류에 가중치를 부여하여 최종적으로 Value 행렬이 생성