임베딩이란?
컴퓨터는 자연어를 직접적으로 처리할 수 없다. 컴퓨터는 수치 연산만 가능하기 때문에 자연어를 숫자나 벡터 형태로 변환할 필요가 있다. 이런 일련의 과정을 자연어 처리 분야에서는 임베딩(embedding)이라고 한다. 즉, 임베딩은 단어나 문장을 수치화해 벡터 공간으로 표현하는 과정을 의미한다. 따라서 다른 딥러닝 모델의 입력값으로 많이 사용된다.
임베딩은 말뭉치의 의미에 따라 벡터화하기 때문에 문법적인 정보가 포함되어 있다. 따라서 임베딩 품질이 좋다면 단순한 모델로도 훌륭한 결과를 얻을 수 있다.
임베딩 기법에는 문장 임베딩과 단어 임베딩이 있다. 문장 임베딩은 문장 전체를 벡터로 표현하는 방법이며, 단어 임베딩은 개별 단어를 벡터로 표현하는 방법이다. 문장 임베딩의 경우 전체 문장의 흐름을 파악해 벡터로 변환하기 때문에 문맥적 의미를 지니는 장점이 있다. 그런 이유로 단어 임베딩에 비해 품질이 좋으며, 상용 시스템에 많이 사용된다. 하지만 임베딩하기 위해 많은 문장 데이터가 필요하며 학습하는 데 비용이 많이 들어 간다. 단어 임베딩은 동음이의어에 대한 구분을 하지 않기 때문에 의미가 다르더라도 단어의 형태가 같다면 동일한 벡터값으로 표현되는 단점이 있다. 하지만 문장 임베딩에 비해 학습 방법이 간단해 여전히 실무에서 많이 사용한다.
임베딩 기법
| 문장 임베딩 | 단어 임베딩 |
| - 문장 전체를 벡터로 표현하는 방법 - 전체 문장의 흐름을 잘 파악해 벡터로 변환하기 때문에 문맥적 의미를 지니는 장점이 있음 - 단어 임베딩에 비해 품질이 좋으며, 상용 시스템에 많이 사용됨 - 임베딩을 하기 위해 많은 문장 데이터가 필요하며, 학습하는 데 비용이 많이 들어감 |
- 개별 단어를 벡터로 표현하는 방법 - 동음이의어에 대한 구분을 하지 않기 때문에 의미가 다르더라도 단어의 형태가 같다면 동일한 벡터값으로 표현되는 단점이 있음 - 문장 임베딩에 비해 학습 방법이 간단해 여전히 실무에서 많이 사용됨 |
단어 임베딩
단어 임베딩은 말뭉치에서 각각의 단어를 벡터로 변환하는 기법을 의미한다. 단어 임베딩은 의미와 문법적 정보를 지니고 있으며, 단어를 표현하는 방법에 따라 다양한 모델이 존재한다.
1. 원-핫 인코딩
원-핫 인코딩(one-hot encoding)은 단어를 숫자 벡터로 변환하는 가장 기본적인 방법이다. 명칭에서도 알 수 있듯 요소들 중 단 하나의 값만 1이고 나머지 요솟값은 0인 인코딩을 의미한다. 원-핫 인코딩으로 나온 결과를 원-핫 벡터라고 하며, 전체 요소 중 단 하나의 값만 1이기 때문에 희소(sparse) 벡터라고 한다.

원-핫 인코딩을 하기 위해서는 단어 집합이라 불리는 사전을 먼저 만들어야 한다. 여기서 사전은 말뭉치에서 나오는 서로 다른 모든 단어의 집합을 의미한다. 말뭉치에 존재하는 모든 단어의 수가 원-핫 벡터의 차원을 결정한다. 예를 들어 100개의 단어가 존재한다면 원-핫 벡터의 크기는 100차원이 된다. 사전이 구축되었다면 사전 내 단어 순서대로 고유한 인덱스 번호를 부여한다. 단어의 인덱스 번호가 원-핫 인코딩에서 1의 값을 가지는 요소의 위치가 된다.

- Komoran 형태소 분석기를 통해 '오늘 날씨는 구름이 많아요.' 문장에서 '오늘', '날씨', '구름'이라는 명사가 리스트로 추출된다.
- 형태소 분석기에서 추출된 각 명사에 인덱스를 부여하여 딕셔너리의 key(단어)와 value(인덱스)에 저장합니다. 원-핫 인코딩은 동일한 단어에 서로 다른 원-핫 벡터값을 가지면 안 되기 때문에 이미 저장된 단어는 다시 사전에 저장되지 않는다.
- nb_classes = len(dics) --> 원-핫 벡터 차원의 크기를 결정한다. 단어 사전의 크기가 원 핫 벡터의 크기이다.
- 넘파이의 원-핫 인코딩 기능을 사용하기 위해 딕셔너리 타입으로 되어 있는 단어 사전을 리스트 형태로 변환해야 한다. 이때 단어별 인덱스값이 필요하기 때문에 딕셔너리의 values() 함수를 이용해 value값만 리스트로 변환한다.
- 원-핫 벡터를 만들기 위해서는 넘파이의 eye() 함수를 이용한다.
eye() 함수
- 단위 행렬을 만드는 함수
- np.eye(n) 형태로 쓰임
- n * n 사이즈(n은 정수)의 단위 행렬을 생성

원-핫 인코딩의 경우 간단한 구현 방법에 비해 좋은 성능을 가지기 때문에 많은 사람이 사용하고 있다. 하지만 원-핫 벡터의 경우 단순히 단어의 숫서에 의한 인덱스값을 기반으로 인코딩된 값이기 때문에 단어의 의미나 유사한 단어와의 관계를 담고 있지 않다. 또한 단어 사전의 크기가 커짐에 따라 원-핫 벡터의 차원도 커지는데 이때 메모리 낭비와 계산의 복잡도가 커진다. 원-핫 벡터는 대부분의 요소가 0의 값을 가지고 있으므로 비효율적이다.
원-핫 인코딩의 장점과 단점
| 장점 | 단점 |
| - 간단한 구현 방법에 비해 좋은 성능을 가짐 | - 단순히 단어의 순서에 의한 인덱스값을 기반으로 인코딩된 값이기 때문에 단어의 의미나 유사한 단어와의 관계를 담고 있지 않음 - 단어 사전의 크기가 커짐에 따라 원-핫 벡터의 차원도 커짐 - 메모리 낭비와 계산의 복잡도가 커짐 - 원-핫 벡터는 대부분의 요소가 0값을 가지고 있으므로 비효율적임 |
| 참고 조경래(2020), 처음 배우는 딥러닝 로봇, 한빛미디어(주),115-118. |
'나의 전공 노트' 카테고리의 다른 글
| 번역 / 'respond'의 번역 (0) | 2022.10.27 |
|---|---|
| 파이썬 / 희소 표현과 분산 표현 (0) | 2022.10.27 |
| 파이썬 / 넘파이(NumPy): 데이터 분석을 위한 필수 라이브러리 (0) | 2022.10.27 |
| Kkma 모듈의 함수 설명 / 꼬꼬마 형태소 분석기 사용 연습 (0) | 2022.10.27 |
| 파이썬 | 외부 라이브러리 설치와 확인 (0) | 2022.03.25 |