트랜스포머 (Transformer)
; Transformer는 자연어 처리 (NLP)분야에서 혁신을 가져온 모델
- 기존의 순환 신경망(RNN)과 LSTM, GRU 등은 시퀀스 데이터를 처리하는데 강력한 도구였지만, 긴 시퀀스를 처리할 때 효율성과 성능문제가 발생하곤 했다.
- Transformer는 이러한 문제를 해결하기 위해 설계되었으며, RNN을 사용하지 않고도 시퀀스 데이터를 병렬로 처리할 수 있다.
어텐션 메커니즘 (Attention Mechanism)
: Transformer의 핵심. 시퀀스의 각 요소가 다른 요소와 얼마나 관련이 있는지를 계산(셀프 어텐션)하여 중요한 정보를 집중할 수 있게 한다. 이로 인해 모델은 긴 시퀀스를 효과적으로 처리할 수 있다.
셀프 어텐션 메커니즘 (Self- Attention Mechanism)
- Attention Score 계산 : Self-Attention은 입력 시퀀스의 각 단어가 다른 단어와 얼마나 관련이 있는지를 계산. 이 과정에서 Query, Key, Value 벡터가 계산됨
Query : 현재 단어에 대한 쿼리 벡터
Key : 다른 모든 단어에 대한 키 벡터
Value : 다른 모든 단어에 대한 값 벡터
- Scaled Dot-Product Attention : Attention Score는 Query와 Key의 점곱(dot-product)을 통해 계산. 이 값을 키(Key) 벡터의 차원수로 스케일링하고 소프트맥스(softmax)함수를 적용하여 가중치를 얻게 됨. 이 가중치를 value 벡터에 곱하여 최종 Attention값을 계산
- Multi-Head Attention : 단일 Attention 메커니즘만으로는 단어 간의 복잡한 관계를 포착하기 어려운부분이 있음. Multi-Head Attention은 여러 개의 Self-Attention Layer를 병렬로 사용하여 다양한 시각에서 관계를 파악. 이를 통해 모델은 다양한 차원에서 단어간의 관계를 파악할 수 있음
self-attention 아래 내용을 참고 ❗
2024.07.09 - [Natural Language Processing] - [Goorm] 딥러닝을 이용한 자연어 처리 8 (Attention 메커니즘)
[Goorm] 딥러닝을 이용한 자연어 처리 8 (Attention 메커니즘)
지금까지는 seq2seq모델이 RNN 기반의 LSTM모델보다 더 좋은 성능을 낸다는 것을 알 수 있었다. 하지만, 텍스트의 길이가 길어질수록 정확도가 0%에 가까워졌다. Seq2Seq의 문제점 고정된 길이의 컨
data-yun.tistory.com
인코더 (Encoder)
: 입력 시퀀스를 처리하여 인코딩 벡터를 생성한다. 하나의 인코더는 여러 개의 레이어로 구성되어 있으며, 각 레이어는 두 개의 서브 레이어로 이루어져 있다.
- Self - Attention Layer : 입력 시퀀스의 모든 단어가 서로 어떻게 관련되는지 계산→ 모든 단어가 서로 참조하여 문장의 문맥 파악 용이
- Feed - Forward Neural Network (FFN) : Self - Attention Layer의 출력을 입력으로 받아 추가적인 변환을 수행. 비선형 변환을 통해 모델의 표현력을 높임.

> 인코더 내에는 여러 레이어들이 쌓여있고, 각 레이어 내에는 입력-어텐션-residual-정규화-FFN-residual-정규화 등으로 구성
(Residual Learning 은 Resnet과 같은 네트워크에서 사용되는 기법으로, 레이어를 거치면서 반복적으로 단순하게 갱신하는 게 아니라, 특정 레이어를 건너뛰어서 복사된 값을 그대로 넣어주는 기법이다.)
디코더 (Decoder)
: 디코더는 인코딩 벡터를 각 레이어의 입력으로 받아 출력 시퀀스를 생성한다. 인코더와 유사하게 여러 개의 레이어로 구성되어 있으며, 각 레이어는 세개의 서브 레이어로 이루어져 있다.
- Masked Self - Attention Layer : 이전 디코딩 단계의 출력을 사용하여 현재 단어를 예측. 처음에는 이전 디코딩 단계가 없으므로 시작토큰을 입력으로 사용. (masking: 현재 시점까지의 단어들만 참조o, 이후 단어 참조 x → 순차적 예측을 위함)
- Encoder - Decoder Attention Layer : 인코더의 출력(인코더에서 얻은 문맥정보)과 디코더의 이전 단계 출력을 결합하여 중요한 정보를 추출 → 앞 레이어에서 예측한 각 단어가 맨 처음 입력 문장의 어떤 단어와 연관이 있는가 (ex. 번역)
입력 시퀀스에서의 각 단어의 중요도를 평가한 인코더의 출력을 기반으로, 출력 시퀀스에서 어떤 부분을 강조할지를 결정 (인코더의 어텐션과 유사) - Feed - Forward Neural Network (FFN) : 최종 출력을 생성. 이 또한 비선형 변환을 통해 모델의 표현력을 높임

> 디코더는 단어 정보를 인코더로부터 받은 후, 입력 시퀀스 내 각 단어의 상대적인 위치 정보를 알려주기 위해 positional encoding값을 추가하여 디코딩을 진행한다.
(Positional Encoding은 데이터를 순차적으로 처리하지 않는 Tranformer에 단어의 순서정보를 추가로 제공하기 위해, 각 단어의 위치정보를 인코딩하여 입력에 추가한다. positional encoding은 주기적인 사인함수와 코사인 함수를 사용하여 단어의 위치정보를 벡터로 변환한다.)


- 인코더와 디코더는 여러 개의 레이어를 중첩해서 사용하기 때문에, 입력과 출력의 차원이 같다.
일반적으로 인코더와 디코더의 레이어 개수는 동일하게 맞춰준다. - 병렬처리 : RNN과 달리 시퀀스를 병렬로 처리할 수 있어 학습속도가 빠르다.
- 긴 시퀀스 처리 능력 : Self-Attention 메커니즘 덕분에 긴 시퀀스에서도 중요한 정보를 잘 유지할 수 있다.
- 유연성 : 다양한 NLP작업에 적용할 수 있으며, 성능이 우수하다.
>> RNN과 LSTM의 한계를 극복하고, 병렬처리와 Self-Attention을 통해 성능을 크게 향상시켰다. 이를 기반으로 GPT와 BERT가 만들어졌다.

트랜스 포머도 인코더-디코더 구조를 따르지만, 'RNN'을 사용하지 않고 인코더와 디코더를 중첩해서 '다수' 사용한다
- 인코딩할 때 원래 RNN/LSTM 에서는, RNN/LSTM 을 고정된 크기로 사용하고, 입력 단어가 들어오면 단어마다 다 따로 입력 단어의 개수만큼 인코더 레이어를 반복적으로 거쳐서 매번 hidden state 를 만들었음
- 트랜스포머에서는 입력 단어 자체가 하나로 쭉 연결되어서(시퀀스) 한번에 입력이 되고, 한번에 그에 대한 어텐션 값을 구함
- RNN 과는 다르게, 위치에 대한 정보를 한꺼번에 넣어줌
- 트랜스포머는 인코더와 디코더 중간에 context vector 로 압축하는 과정이 완전히 생략되어 있음
여기서 의문점 ❗
1. attention과 self-attention은 구체적으로 어떻게 다른가
> attention은 인코더-디코더(시퀀스-투-시퀀스) 구조에서 사용. 디코더의 각 출력 타임스텝에서 입력 시퀀스 내 요소들과 비교하여 어떤 출력을 내보낼 것인지 결정함. 즉, 인코더의 출력과 디코더의 상태를 비교하여 중요한 정보를 선택 → 입력 시퀀스의 특정 부분에 집중(attention)하여 더 정확한 출력 생성
> self-attention 은 transformer 구조에서 사용. 입력 시퀀스 내에서 각 요소끼리 유사도를 계산/비교하여 각 요소간의 관계를 학습. 즉, 입력시퀀스 자체의 중요한 부분의 문맥이해도를 높임
2. seq2seq에서의 attention의 역할과 필요성 vs 트랜스포머 인코더 및 디코더 에서의 attention의 역할과 필요성
> seq2seq에서의 attention
: 인코더의 출력으로 컨텍스트 벡터가 만들어지는데, 컨텍스트벡터는 길이가 고정되어 있기 때문에 입력시퀀스의 모든 정보를 고루 담기 어렵다. 특히 긴 시퀀스의 경우는 더더욱. 따라서 여기서의 attention은 이를 보완하는 역할로써, 입력 시퀀스의 모든 정보를 활용(동적으로 참조)하여 긴 시퀀스에서도 정보 손실을 방지하고 디코딩의 정확도를 향상시킨다.
> Transformer에서의 attention
: transformer에서 attention은 self-attention, multi-head attention, encoder-decoder attention 등이 있다. 이는 입력 시퀀스 내 각 단어가 다른 모든 단어와의 관계를 학습하여, 입력 시퀀스 자체의 문맥을 더 잘 이해하게 한다. 또한 각 attention의 head가 서로 다른 부분에 집중할 수 있도록 병렬 처리연산을 사용하므로, 학습과 추론 속도를 향상시키면서 입력시퀀스의 다양한 관점을 학습할 수 있다.
'Natural Language Processing' 카테고리의 다른 글
| [Goorm] 딥러닝을 이용한 자연어 처리 10 (BERT vs GPT) (1) | 2024.08.06 |
|---|---|
| [SeSac] LangChain 6 - RAG(Retrieval-Augmented Generation) (0) | 2024.07.15 |
| [SeSac] LangChain 5 - Output Parser (0) | 2024.07.14 |
| [SeSac] LangChain 4 - 모델 파라미터 (0) | 2024.07.14 |
| [SeSac] LangChain 3 - LLM, ChatModel 모델 클래스 (0) | 2024.07.14 |