일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 9020
- 15649
- 손실함수
- Mac
- streamlit
- 백준
- 1002
- 신경망 학습
- 파이썬
- 4948
- 설정
- BOJ
- Python
- n과 m
- N-Queen
- 1101
- 백트래킹
- end to end
- 가상환경
- 재귀
- 경사하강법
- 파이싼
- 그리디 알고리즘
- 밑바닥부터 시작하는 딥러닝
- 기계학습
- 실버
- pyenv
- 개발환경
- Today
- Total
파이톨치
[BoostCamp AI Tech] Transformer 본문
Attention 복습
과거에는 LSTM과 같은 순환 신경망(RNN) 구조를 사용할 때 입력 시퀀스의 정보를 처리하는 데 한계가 있었습니다. LSTM은 입력 시퀀스를 하나의 요약 벡터로 압축한 뒤, 그 정보를 디코더가 활용해 출력을 생성했습니다. 그러나 이 방식은 정보의 양을 압축하는 과정에서 손실이 발생할 수 있으며, 시퀀스의 길이가 길어질수록 유용한 정보를 충분히 전달하기 어려웠습니다. 이는 모델이 한 번에 처리할 수 있는 정보의 "창"이 매우 제한적이었음을 의미합니다.
하지만 어텐션 메커니즘을 사용하면, 입력 시퀀스의 모든 요소에 언제든 접근할 수 있습니다. 즉, 정보를 제한된 요약 벡터에 압축할 필요 없이, 입력 시퀀스의 각 부분에서 필요한 정보를 직접 가져올 수 있습니다. 이로 인해 정보 창이 사실상 무제한이 되며, 모델이 시퀀스의 모든 부분을 고려할 수 있어 훨씬 더 풍부한 정보를 활용할 수 있게 됩니다. 다만, 이는 하드웨어 성능에 따라 처리 능력이 제한될 수 있습니다.
어텐션(attention) 메커니즘이 처음 등장했을 때, 주로 기계 번역과 같은 시퀀스-투-시퀀스(sequence-to-sequence) 작업에서 사용되었습니다. 여기서 어텐션은 입력 시퀀스(예: 문장의 단어들)와 출력 시퀀스(번역된 문장의 단어들) 사이의 관계를 학습하는 데 사용되었습니다. 이 방식은 입력과 출력 사이에만 어텐션을 적용했기 때문에 "인코더-디코더 어텐션"이라고도 불렸습니다.
하지만 이 어텐션 메커니즘은 시퀀스 내에서 모든 요소들이 서로의 관계를 고려하는 능력이 부족했습니다. 예를 들어, 한 문장의 단어들이 서로 어떻게 관련되어 있는지를 잘 이해하지 못할 수 있었습니다. 이를 해결하기 위해 "셀프 어텐션(Self-Attention)"이 등장했습니다.
Self-Attention의 등장 배경과 필요성
- 시퀀스 내 요소들 간의 관계 학습:
- 셀프 어텐션은 입력 시퀀스 내의 각 요소가 동일한 시퀀스 내의 다른 모든 요소들과 상호작용할 수 있도록 합니다. 예를 들어, 문장의 한 단어가 다른 모든 단어들과 관계를 형성할 수 있습니다. 이를 통해 시퀀스의 모든 부분이 서로 어떻게 연결되어 있는지 학습할 수 있습니다.
- 병렬 처리 가능:
- RNN 기반 모델들은 시퀀스를 순차적으로 처리하기 때문에 병렬 처리에 한계가 있었습니다. 반면, 셀프 어텐션은 시퀀스의 모든 요소들을 동시에 처리할 수 있기 때문에 병렬화가 가능합니다. 이는 모델의 학습 속도를 크게 향상시켰습니다.
- 장기 의존성 문제 해결:
- RNN과 같은 모델들은 긴 시퀀스에서 정보가 손실되거나 희석되는 문제가 있었습니다(장기 의존성 문제). 셀프 어텐션은 시퀀스 내의 먼 요소들 간에도 직접적인 상호작용을 가능하게 함으로써, 이 문제를 해결합니다.
Self-Attention의 핵심 아이디어
셀프 어텐션은 입력 시퀀스의 각 요소가 다른 모든 요소들과 얼마나 관련이 있는지를 학습하여, 각 요소가 시퀀스 내의 모든 다른 요소들로부터 정보를 집합적으로 고려할 수 있게 합니다. 예를 들어, 문장의 특정 단어가 다른 단어들과 얼마나 강하게 연결되어 있는지를 계산하고, 이를 바탕으로 해당 단어의 표현을 강화하거나 조정합니다.
결론
어텐션 메커니즘이 입력과 출력 시퀀스 사이의 관계를 이해하는 데 중점을 두었다면, 셀프 어텐션은 입력 시퀀스 내의 각 요소들이 서로 어떻게 연관되어 있는지를 이해하는 데 중점을 둡니다. 이로 인해 모델이 더 깊이 있는 이해를 통해 더 정교한 예측을 할 수 있게 되었습니다. 셀프 어텐션은 특히 Transformer와 같은 현대적 딥러닝 모델의 핵심 구성 요소로, 자연어 처리뿐만 아니라 다양한 다른 분야에서도 폭넓게 사용되고 있습니다.
Self-Attention의 구조
셀프 어텐션의 작동 방식
셀프 어텐션에서는 쿼리(Query), 키(Key), 값(Value)가 모두 입력 문장의 단어 벡터들입니다. 다음은 셀프 어텐션의 단계별 과정입니다:
- 쿼리, 키, 값 계산:
- 입력 문장의 각 단어 벡터를 쿼리, 키, 값 벡터로 변환합니다. 이를 위해 각각의 벡터를 학습 가능한 가중치 행렬에 곱해줍니다.
- 유사도 계산:
- 쿼리 벡터와 모든 키 벡터 간의 유사도를 계산하여 주의(attention) 점수를 얻습니다. 이 점수는 쿼리와 각 키의 관련성을 나타냅니다.
- 가중치 적용:
- 계산된 유사도 점수를 소프트맥스(softmax) 함수에 통과시켜, 각 값 벡터에 얼마나 집중할지를 결정하는 가중치로 변환합니다.
- 가중합:
- 이 가중치를 사용하여 값 벡터들을 가중합합니다. 이렇게 하면, 입력 문장 내의 각 단어가 다른 단어들로부터 정보를 얼마나 반영할지를 결정합니다.
Encoder에서 I am a student라는 문장이 들어 갔을 때의 예시이다. 전통적인 Attention 구조와 비슷하다.
다만 Q, K, V를 뽑을 때 자기 자신만을 사용한다는 것이다!
이제 attention value를 FNN 층에 넣어주면 최종적인 출력을 얻을 수 있습니다.
행렬 연산으로 변환
셀프 어텐션에서 행렬 연산을 사용하는 이유와 방법을 쉽게 설명해볼게요.
개념 이해: 벡터 vs. 행렬 연산
처음에 셀프 어텐션을 설명할 때는 각 단어마다 '쿼리(Query)', '키(Key)', '값(Value)' 벡터를 따로 계산했습니다. 이렇게 각 단어마다 따로따로 연산을 하는 방식은 이해하기 쉽지만, 실제로는 행렬 연산을 사용해서 한꺼번에 처리하는 게 훨씬 효율적이에요.
행렬 연산에서는 여러 단어의 벡터들을 모아서 큰 행렬(matrix)로 만들어놓고, 한 번에 연산을 처리합니다. 예를 들어, 문장 내 모든 단어에 대해 '쿼리', '키', '값' 벡터를 각각 구하는 대신, 모든 단어들을 하나의 행렬로 묶어서 연산합니다.
단계별로 이해해보자
쿼리(Q), 키(K), 값(V) 행렬 생성:
- 문장에 있는 모든 단어 벡터를 모아서 하나의 큰 행렬을 만듭니다. 이 행렬에 가중치 행렬을 곱해주면, 각각의 '쿼리', '키', '값' 행렬(Q, K, V)이 만들어집니다. 즉, 단어 하나하나 따로 계산하지 않고, 한꺼번에 처리하는 거죠.
어텐션 스코어 계산:
- '쿼리' 행렬(Q)와 '키' 행렬(K)을 곱해줍니다. 그런데 K는 그대로 곱하는 게 아니라, 전치(transpose)라고 해서 행과 열을 뒤바꿔서 곱합니다. 이렇게 하면, 각 단어의 '쿼리' 벡터가 다른 모든 단어들의 '키' 벡터와 내적(dot product)되어, 어텐션 스코어를 담은 행렬이 만들어집니다.
- 이 어텐션 스코어는 각 단어가 다른 단어와 얼마나 연관이 있는지를 나타내요.
어텐션 스코어 정규화:
- 계산된 어텐션 스코어 행렬의 값을 전체적으로 조정하기 위해서, 이 값을 나누고 소프트맥스(softmax) 함수를 적용합니다. 이 단계는 모든 스코어를 0과 1 사이의 확률값으로 변환하는 과정이에요.
어텐션 값 계산:
- 마지막으로, 이 정규화된 어텐션 스코어 행렬에 '값(Value)' 행렬(V)을 곱해줍니다. 이 과정은 각 단어가 다른 단어와 얼마나 관련이 있는지를 고려해서, 최종적으로 조정된 벡터를 계산하는 거예요.
멀티 헤드 어텐션
기본 어텐션에서, 입력된 단어 벡터의 차원이 클 때(예: 512차원), 이를 작게 나눠서(예: 64차원으로 나눔) 처리하면 더 효율적으로 계산할 수 있습니다. 트랜스포머에서는 이 방법을 사용해서 여러 개의 어텐션 헤드를 동시에 사용합니다. 각 어텐션 헤드는 입력 데이터를 조금씩 다르게 해석하도록 학습됩니다. 1번 헤드는 문장 구조를, 2번 헤드는 단어간 의미를 해석하는 식으로 말입니다.
멀티 헤드 어텐션의 장점은 다양한 시각에서 데이터를 분석할 수 있다는 것입니다. 예를 들어, 하나의 어텐션 헤드는 "그것(it)"이 "동물(animal)"과 관련이 있다는 것을 강조할 수 있고, 다른 어텐션 헤드는 "그것(it)"이 "피곤하다(tired)"와 더 관련이 있다는 것을 강조할 수 있습니다. 이렇게 각각의 헤드가 다른 특성을 학습하기 때문에, 모델은 입력 문장을 더 깊이 이해할 수 있습니다.
병렬 처리와 결합
모든 어텐션 헤드를 사용해 병렬로 계산한 후, 그 결과를 다시 하나로 결합(concatenate)합니다. 이렇게 결합된 결과를 최종적으로 가중치 행렬과 곱해서 멀티 헤드 어텐션의 결과물을 얻습니다. 이 과정에서 입력의 크기는 처음과 동일하게 유지됩니다.
'AI&ML > BoostCamp AI Tech' 카테고리의 다른 글
[BoostCamp AI Tech] 이미지 데이터 전처리 (0) | 2024.08.22 |
---|---|
[BoostCamp AI Tech] 데이터 분석 (0) | 2024.08.20 |
[BoostCamp AI Tech] RNN & LSTM & Attention (0) | 2024.08.14 |
[BoostCamp AI Tech] 머신러닝 (1) | 2024.08.12 |
[BoostCamp AI Tech] 선형 회귀 모델 (0) | 2024.08.09 |