One-hot Encoding이란?
좋습니다, 간단하고 확실하게 정리해드릴게요!
🎯 One-hot Encoding이란?
One-hot Encoding은
범주형 데이터(categorical data)를 수치형 벡터로 변환하는 기법입니다.
특징:
- 각 범주(category)는 고유한 벡터로 표현됩니다.
- 이 벡터는 대부분 0이고, 해당하는 범주 위치만 1입니다.
예시
예를 들어, “과일” 데이터가 있다고 해볼게요:
과일 | |
---|---|
사과 | |
바나나 | |
포도 |
이를 one-hot encoding하면:
과일 | One-hot Encoding |
---|---|
사과 | [1, 0, 0] |
바나나 | [0, 1, 0] |
포도 | [0, 0, 1] |
- 사과는 첫 번째 칸만 1
- 바나나는 두 번째 칸만 1
- 포도는 세 번째 칸만 1
왜 필요한가요?
- 모델(특히 신경망) 은 수치 입력만 처리할 수 있습니다.
- 범주형 데이터를 고유 숫자로 변환하면 모델이 **“수치 간 크기 비교”**를 할 수 있다고 잘못 해석할 수 있습니다.
- One-hot은 이런 왜곡 없이 범주 간 평등한 거리를 유지시켜줍니다.
PyTorch / TensorFlow 코드 예시
Python 코드 (간단하게)
from sklearn.preprocessing import OneHotEncoder
import numpy as np
fruits = np.array(["사과", "바나나", "포도"]).reshape(-1, 1)
encoder = OneHotEncoder(sparse_output=False) # sparse_output=True면 희소행렬 반환
one_hot = encoder.fit_transform(fruits)
print(one_hot)
출력:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
한 줄 요약
One-hot Encoding은 범주형 데이터를 “대부분 0이고 하나만 1인” 벡터로 변환하는 방법이며, 머신러닝 모델이 범주형 입력을 제대로 처리할 수 있게 도와준다.
추가
- 단점: 범주가 매우 많으면 벡터가 너무 커지는 문제가 있음 → Embedding 같은 기법으로 대체하기도 함.
- 대안: Label Encoding, Word Embedding, Hashing Trick 등이 있음.
혹시
- One-hot과 Embedding 차이
- One-hot을 직접 numpy로 구현
- One-hot이 LLM에서 어떻게 사용되는지
도 궁금하신가요? 🎯
(필요하면 이어서 설명 드릴게요!) 🚀
좋습니다!
“One-hot"과 “Embedding"의 차이를 확실하고 쉽게 정리해드릴게요.
🎯 One-hot vs Embedding
구분 | One-hot Encoding | Embedding |
---|---|---|
정의 | 범주를 [0, 0, …, 1, …, 0]처럼 고정된 벡터로 표현 | 범주를 학습된 연속 벡터(dense vector)로 표현 |
차원 수 | 범주의 개수(vocab_size)만큼 큼 | 원하는 저차원(예: 128, 768)으로 설정 가능 |
메모리 효율 | 매우 비효율적 (대부분 0) | 매우 효율적 (Dense, 필요한 정보만 저장) |
의미성 | 벡터끼리 아무런 의미 관계 없음 | 비슷한 의미를 가진 항목끼리 비슷한 방향에 위치 |
학습 가능성 | 학습 불가능 (고정) | 학습을 통해 의미를 조정 가능 |
사용 예시 | 단순 모델 (Logistic Regression 등) | 딥러닝 모델 (BERT, GPT, etc.) |
🔥 조금 더 쉽게 풀어서
One-hot | Embedding |
---|---|
“그냥 표시만” 하는 느낌 | “진짜 의미를 가진 숫자"로 바꾸는 느낌 |
서로 전혀 관련 없는 벡터 | 비슷한 것끼리 비슷한 벡터로 배치 |
매우 고차원 (예: 단어 수가 50,000개 → 50,000차원) | 저차원 (예: 300차원, 768차원) |
0과 1밖에 없음 | 다양한 실수값 (float) 사용 |
🎯 그림으로 감각 잡기
One-hot:
"사과" -> [1, 0, 0, 0, 0]
"바나나" -> [0, 1, 0, 0, 0]
"포도" -> [0, 0, 1, 0, 0]
(→ 서로 완전히 다른 방향, 관계 없음)
Embedding:
"사과" -> [0.12, 0.88, -0.33, ...] (과일의 특징이 반영된 실수 벡터)
"바나나" -> [0.10, 0.85, -0.30, ...] (비슷한 과일끼리 가까운 값)
"컴퓨터" -> [-0.7, 0.3, 1.0, ...] (완전 다른 개념)
→ Embedding에서는
“사과"와 “바나나"는 비슷한 방향,
“사과"와 “컴퓨터"는 먼 방향에 위치합니다.
📦 요약
One-hot은 “존재만 표시"하는 방식이고,
Embedding은 “의미까지 반영"해서 저차원 실수 벡터로 표현하는 방식입니다.
🧠 기억해야 할 한 문장
One-hot은 단순 구분,
Embedding은 의미 있는 수치 표현이다.
추가로 원하시면:
- Word2Vec, FastText 같은 Embedding 학습 방법
- One-hot과 Embedding 사이의 수학적 변환
- PyTorch로 Embedding Layer 직접 만들기
도 이어서 설명해드릴게요! 🚀
혹시, “Embedding이 실제로 어떻게 학습되는지” 도 궁금하세요? (ex. Skip-gram, BERT pretraining 방식 등) 🎯
필요하면 바로 이어서 알려드릴게요! 🔥