자연어처리를 위한 One-Hot Encoding


1. One-Hot Encoding

One-Hot Encoding은 Discrete Value를 벡터로 표현하는 방식입니다. 유한한 개수의 Discrete Value에 0부터 임의의 순서대로 일련번호를 부여한 후 벡터에 일련번호에 해당하는 부분만 1이고 나머지는 모두 0인 벡터입니다. Discrete Value의 예는 다음과 같습니다.

  • 분류 문제의 정답 class
  • Vocabulary의 일련번호
  • 기타
1.1. 문장의 감정분류 class (예)

문장의 감정분류는 문장의 내용을 보고 부정(0), 긍정(1) 중 하나의 class로 분류하는 문제입니다. Class의 개수가 2이므로 길이가 2인 One-hot 벡터로 표현이 가능합니다.

부정(0): [1, 0]
긍정(1): [0, 1]

위와 같이 0인 경우는 벡터의 첫 번째 값만 1이고 나머지는 0입니다. 1인 경우는 벡터의 두 번째 값만 1이고 나머지는 0입니다.

1.2. MNIST의 숫자 class (예)

MNIST는 손글씨 이미지를 보고 0부터 9까지 숫자 중 하나의 class로 분류하는 문제입니다. Class의 개수가 10이므로 길이가 10인 One-hot 벡터로 표현이 가능합니다.

0: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
2: [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
3: [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
4: [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
5: [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
6: [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
7: [0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
8: [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
9: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

위와 같이 자신의 위치에 해당하는 index 값만 1이고 나머지는 0인 벡터입니다.

1.3. Vocabulary의 일련번호 (예)

Vocabulary의 경우는 작은경우는 8,000개에서 많게는 500,000까지 크기가 다양합니다. 만일 8,000개의 Vocabulary를 One-hot 벡터로 표현한다면 길이가 8,000인 One-hot 벡터로 표현이 가능합니다. 이 경우에도 일련번호에 해당하는 index 값만 1이고 나머지는 0인 벡터입니다.

{
    "나는": 0,
    "학생": 1,
    "입니다": 2,
    "당신은": 3,
    "수학": 4,
    "선생님": 5,
    "만나서": 6,
    "대한민국": 7,
    ...
    "만세": 7999
}

위와 같은 개수가 8000개인 Vocabulary를 가정한다면 "나는 학생 입니다"라는 문장은 다음과 같이 표현할 수 있습니다.

# text
"나는 학생 입니다"

# index
[0, 1, 2]

# one-hot
[
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..., 0],  # 나는
    [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..., 0],  # 학생
    [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..., 0],  # 입니다
]


One-Hot Encoding 특징은 다음과 같습니다.

  • One-Hot 벡터 간의 내적은 0입니다. 즉 벡터 상호 간에 어떠한 의미도 표현하지 않습니다.
  • One-Hot 벡터는 하나만 1이고 나머지는 모두 0인 매우 sparse 하고 비 효율적인 벡터입니다. 특히 Vocabulary의 단어와 같이 class 개수가 많은 경우는 표현에 적합하지 않습니다.
  • One-Hot 벡터 확률 분포를 의미합니다. 정답을 의미하는 index는 1로 100%의 확률을 의미하고 나머지는 0으로 0%의 확률을 의미합니다.


2. One-Hot to Embedding

2.1. One-Hot 열벡터

자연어처리에서는 단어를 벡터로 표현합니다. One-Hot 열 벡터 $x$와 단어벡터를 가진 Embedding 벡터 $W$를 행렬곱을 해서 단어벡터를 구할 수 있습니다. 수식은 다음과 같습니다.

$$v=Wx$$

  • v: 단어벡터를 의미합니다. 차원은 (d_model) 입니다. d_model은 단어벡터의 차원 수 입니다.
  • W: Embedding 벡터를 의미합니다. 차원은 (d_model, n_vocab) 입니다. n_vocab은 Vocabulary의 단어개수 입니다.
  • x: One-hot 벡터를 의미합니다. 차원은 (n_vocab)입니다.

one-hot-01.png

수식을 그림으로 표현한 것입니다. 위 그림과 같이 행렬에 One-hot을 행렬곱 하게 되면 행렬의 하나의 만 뽑아올 수 있습니다.

2.2. One-Hot 행벡터

위 수식을 transpose 하면 One-hot 열 벡터를 행 벡터로 계산한 결과를 얻을 수 있습니다 수식은 다음과 같습니다.

$$v^T=x^TW^T$$

one-hot-02.png

수식을 그림으로 표현한 것입니다. 위 그림과 같이 One-hot에 행렬을 행렬곱 하게 되면 행렬의 하나의 만 뽑아올 수 있습니다.

2.3. Embedding 객체

위에서 언급되었듯이 One-hot벡터는 단어를 표현하기에는 매우 비효율적이기에 최근에는 잘 사용되지 않고 embedding 개체에 벡터가 아닌 index를 입력해서 단어벡터를 구하는 방법을 사용합니다.

자세한 내용은 다음을 참고하세요.