새소식

반응형
컴퓨터공학 (Computer Science)/자연어처리 | Natural Language Processing

One-hot encoding (원 핫 인코딩)

  • -
반응형

1. Introduction

원 핫 인코딩은 아래와 같이 데이터 벡터를 벡터의 각 값을 column labeling하고 해당 값을 1로 표시하는 방식의 행렬로 인코딩하는 방법이다. 당연히 해당 값 외의 다른 column에 대해서는 해당하지 않으므로 0으로 채워진다.

웃긴것은 N 크기의 벡터N x N의 크기의 행렬로 인코딩한다는 것이다.

이게 뭔...

혼란스러운가? 필자도 그렇다. 처음 배울때 이게 대체 뭐하는 짓인가 싶었다. 차원의 저주라는 말도 있듯, 사소한 차원 증가가 엄청난 시간적 손해를 가져올 수 있다. 근데 이걸 N배로 늘린다고??

하지만 이 방식은 겉으로 느껴지는 시간, 공간적인 복잡도를 포기하는 대신의 또 다른 편의성을 가져다 준다. 이는 특히, 거대한 단어 집합을 표현할 때 특히 편한데, 사전 (previously)에 원 핫 인코딩한 단어 사전 (Dictionary) 하나만 있으면 어떤 문서 (Document)에 대해서 사전에 포함된 단어의 분포가 어떻게 되는지 벡터 하나(!)만으로 쉽게 알아 낼 수 있다.

심지어 서로 다른 문서에 대해서도 이 벡터의 크기는 항상 N으로 동일하기 때문에 Jaccard 유사도 같은 연산도 매우 쉽게 적용할 수 있다.

2. Approach

접근법이라고 할 것도 없다. 그냥 벡터에 대해서 0, 1 체크만 하면 끝이니까... 아래의 그림은 Red, Yellow, Green이라는 데이터에 대한 원 핫 인코딩을 보여준다.

아래 코드는 원 핫 인코딩의 구현이다. Pandas 라이브러리는 get_dummies 메서드를 통해 손 쉽게 원 핫 인코딩을 구현할 수 있다.

import pandas as pd

text = 'To be or not to be'

items = text.lower().split()
df = pd.DataFrame({'item' : items })
print(df)
pd.get_dummies(df)

실행 결과

 

3. Discussion

앞에서도 설명하겠지만 시간적, 공간적으로 원 핫 인코딩의 효율성은 똥이다. 차원 확대도 모자라서 데이터의 대부분은 0으로 채워지는 것은 물론이요, 1로 채워지는 위치도 예측할 수 없어 locality도 없다. 이렇다 보니 당연히 희소행렬로 저장된다.

게다가 단어끼리의 연관성도 보장되지 않는다. 위의 그림에서 Red와 Yellow의 관계를 기계는 이해할 수 없다. 이런 문제를 해결하기 위해, 단어의 잠재적인 의미를 반영하는 기법들이 있는데 이는 다음과 같다.

  • 카운트 기반의 벡터화 방법 : LSA, HAL
  • 예측 기반의 벡터화 방법 : NNLM, RNNLM, FastText, 그리고 쥰내 메이저한 기법인 Word2Vec
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.