카테고리 없음 / / 2024. 7. 5. 09:59

[이론] 임베딩이란? (Embedding with BERT)

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, ...]

* 임베딩 벡터의 생성 방법

  1. Word2Vec: 단어를 벡터로 표현하는 가장 유명한 방법 중 하나입니다. Word2Vec은 두 가지 모델(CBOW, Skip-gram)을 사용하여 단어의 주변 문맥을 예측하거나, 주어진 단어로부터 문맥을 예측합니다.
  2. GloVe: 단어 동시 등장 행렬을 사용하여 임베딩 벡터를 생성합니다. 단어 간의 통계적 정보와 동시 등장 빈도를 활용합니다.
  3. FastText: Word2Vec과 유사하지만, 단어 자체를 n-그램으로 분해하여 더 나은 표현력을 가집니다. 이는 형태소 정보가 중요한 언어에서 유리합니다.
  4. BERT: 문장의 문맥을 고려하여 단어와 문장 임베딩을 생성합니다. BERT는 Transformer 아키텍처를 기반으로 하며, 입력 문장 전체의 정보를 고려하여 각 토큰의 벡터를 만듭니다.

임베딩 벡터는 고차원 공간에서 단어의 위치를 나타내므로, 이를 2차원 또는 3차원으로 시각화하면 단어 간의 관계를 쉽게 이해할 수 있습니다. 시각화 방법으로는 주로 t-SNE 또는 PCA를 사용합니다.

2D 임베딩 시각화 예:

     dog  *
               *
    cat    *  
 
            *       *
                    apple

위 예에서, "cat"과 "dog"은 가까운 위치에 있고, "apple"은 멀리 떨어져 있는 것을 볼 수 있습니다. 이는 "cat"과 "dog"이 유사한 의미를 가지고, "apple"과는 다른 의미를 가짐을 나타냅니다.

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유