Topic. 임베딩에 대해 알아봅니다.
* 임베딩이란?
임베딩(Embedding)은 텍스트 데이터를 수치 벡터로 변환하는 과정입니다. BERT 모델에서는 토큰 임베딩, 세그먼트 임베딩, 위치 임베딩의 세 가지 임베딩이 결합되어 최종 입력 임베딩을 만듭니다. BERT의 임베딩 과정을 단계별로 설명하겠습니다.
1. 토큰 임베딩(Token Embedding)
토큰 임베딩은 각 단어(또는 토큰)를 고정된 길이의 벡터로 변환하는 과정입니다. BERT는 WordPiece 토크나이저를 사용하여 단어를 더 작은 조각으로 나누기도 합니다.
- 예를 들어, 문장 "I love you"는 "[CLS] I love you [SEP]"로 변환됩니다.
- 각 토큰은 미리 학습된 임베딩 벡터로 변환됩니다. 임베딩 벡터에 대한 설명은 맨 아래쪽에서 설명합니다.
[CLS] -> [0.1, 0.2, 0.3, ...]
I -> [0.2, 0.1, 0.4, ...]
love -> [0.5, 0.3, 0.2, ...]
you -> [0.3, 0.7, 0.4, ...]
[SEP] -> [0.6, 0.1, 0.2, ...]
2. 세그먼트 임베딩(Segment Embedding)
BERT는 문장 쌍을 입력받을 수 있습니다. 이 경우 두 문장을 구분하기 위해 세그먼트 임베딩을 추가합니다. 첫 번째 문장은 세그먼트 A, 두 번째 문장은 세그먼트 B로 구분됩니다.
- 예를 들어, "[CLS] I love you [SEP] He loves me [SEP]"라는 입력이 있을 때:
- 첫 번째 문장: 세그먼트 A
- 두 번째 문장: 세그먼트 B
각 토큰에 대해 세그먼트 임베딩이 추가됩니다.
[CLS] -> [0.1, 0.1, 0.1, ...]
I -> [0.1, 0.1, 0.1, ...]
love -> [0.1, 0.1, 0.1, ...]
you -> [0.1, 0.1, 0.1, ...]
[SEP] -> [0.1, 0.1, 0.1, ...]
He -> [0.2, 0.2, 0.2, ...]
loves-> [0.2, 0.2, 0.2, ...]
me -> [0.2, 0.2, 0.2, ...]
[SEP] -> [0.2, 0.2, 0.2, ...]
3. 위치 임베딩(Position Embedding)
위치 임베딩은 토큰의 순서를 나타내기 위해 각 위치에 대한 임베딩 벡터를 추가합니다. 이는 문장 내에서 각 토큰의 상대적인 위치 정보를 제공합니다.
- 예를 들어, "[CLS] I love you [SEP]"라는 입력의 경우:
- 위치 0: [CLS]
- 위치 1: I
- 위치 2: love
- 위치 3: you
- 위치 4: [SEP]
각 위치에 대해 고유한 위치 임베딩이 추가됩니다.
위치 0 -> [0.01, 0.02, 0.03, ...]
위치 1 -> [0.02, 0.03, 0.04, ...]
위치 2 -> [0.03, 0.04, 0.05, ...]
위치 3 -> [0.04, 0.05, 0.06, ...]
위치 4 -> [0.05, 0.06, 0.07, ...]
4. 최종 임베딩 벡터 계산
각 토큰의 최종 임베딩 벡터는 위의 세 가지 임베딩을 모두 더하여 계산됩니다.
예를 들어, "I" 토큰의 최종 임베딩 벡터는 다음과 같이 계산됩니다.
I의 최종 임베딩 = [0.2, 0.1, 0.4, ...] (토큰 임베딩)
+ [0.1, 0.1, 0.1, ...] (세그먼트 임베딩)
+ [0.02, 0.03, 0.04, ...] (위치 임베딩)
= [0.32, 0.23, 0.54, ...]
* 시각적 표현
입력 문장: "I love you"
1. 토큰화:
[CLS] I love you [SEP]
2. 토큰 임베딩:
[CLS] -> [0.1, 0.2, 0.3, ...]
I -> [0.2, 0.1, 0.4, ...]
love -> [0.5, 0.3, 0.2, ...]
you -> [0.3, 0.7, 0.4, ...]
[SEP] -> [0.6, 0.1, 0.2, ...]
3. 세그먼트 임베딩:
[CLS] -> [0.1, 0.1, 0.1, ...]
I -> [0.1, 0.1, 0.1, ...]
love -> [0.1, 0.1, 0.1, ...]
you -> [0.1, 0.1, 0.1, ...]
[SEP] -> [0.1, 0.1, 0.1, ...]
4. 위치 임베딩:
위치 0 -> [0.01, 0.02, 0.03, ...]
위치 1 -> [0.02, 0.03, 0.04, ...]
위치 2 -> [0.03, 0.04, 0.05, ...]
위치 3 -> [0.04, 0.05, 0.06, ...]
위치 4 -> [0.05, 0.06, 0.07, ...]
5. 최종 임베딩:
I의 최종 임베딩 = 토큰 임베딩 + 세그먼트 임베딩 + 위치 임베딩
= [0.2, 0.1, 0.4, ...]
+ [0.1, 0.1, 0.1, ...]
+ [0.02, 0.03, 0.04, ...]
= [0.32, 0.23, 0.54, ...]
* 임베딩 벡터의 생성 방법
- Word2Vec: 단어를 벡터로 표현하는 가장 유명한 방법 중 하나입니다. Word2Vec은 두 가지 모델(CBOW, Skip-gram)을 사용하여 단어의 주변 문맥을 예측하거나, 주어진 단어로부터 문맥을 예측합니다.
- GloVe: 단어 동시 등장 행렬을 사용하여 임베딩 벡터를 생성합니다. 단어 간의 통계적 정보와 동시 등장 빈도를 활용합니다.
- FastText: Word2Vec과 유사하지만, 단어 자체를 n-그램으로 분해하여 더 나은 표현력을 가집니다. 이는 형태소 정보가 중요한 언어에서 유리합니다.
- BERT: 문장의 문맥을 고려하여 단어와 문장 임베딩을 생성합니다. BERT는 Transformer 아키텍처를 기반으로 하며, 입력 문장 전체의 정보를 고려하여 각 토큰의 벡터를 만듭니다.
임베딩 벡터는 고차원 공간에서 단어의 위치를 나타내므로, 이를 2차원 또는 3차원으로 시각화하면 단어 간의 관계를 쉽게 이해할 수 있습니다. 시각화 방법으로는 주로 t-SNE 또는 PCA를 사용합니다.
2D 임베딩 시각화 예:
dog *
*
cat *
* *
apple
위 예에서, "cat"과 "dog"은 가까운 위치에 있고, "apple"은 멀리 떨어져 있는 것을 볼 수 있습니다. 이는 "cat"과 "dog"이 유사한 의미를 가지고, "apple"과는 다른 의미를 가짐을 나타냅니다.