오늘 끝나면
Word Embeddings & BERT
- ✓Word Embeddings & BERT의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 Word이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
king−man+woman=queen — Word2Vec → BERT의 MLM 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
AI · Day 19 / 표현·멀티모달
의미를
숫자로
컴퓨터는 숫자만 다룸. 근데 "사랑"을 어떻게 숫자로 바꿈? 이 질문에 답하는 데 60년 걸림. 2013년 Word2Vec이 문 열고, 2018년 BERT가 채움.
단어를 숫자로, 50년의 투쟁
신경망은 실수 벡터위에서만 돎. 근데 단어는 이산적임. "사과", "Apple", "りんご"는 같은 뜻인데 문자열로는 완전히 다름.
첫 시도는 One-hot 인코딩임. 사전 5만 단어면 단어 하나가 5만 차원 벡터, 자기 칸만 1 나머지 0.
근데 치명적 문제 있음. king·queen 내적이 0, king·apple 내적도 0임. 모든 단어 쌍이 똑같이 무관해짐. 의미가 아니라 그냥 "번호표"임.
다음 시도 TF-IDF는 문서를 단어 빈도로 표현하는 것임. 구글 초기 검색과 Elasticsearch의 BM25가 이 계열 / 지금도 RAG 키워드 검색으로 씀. 근데 순서 모름 / "자동차"와 "승용차"를 다른 차원으로 봄. 의미는 끝까지 블랙박스였음.
자기 칸만 1 — king이 queen에서 apple만큼 멀다. 이게 재앙임
king − man + woman = queen
2013년, 구글 브레인 Mikolov의 Word2Vec 논문에 세상 뒤집은 표 하나 있었음. 단어에 사칙연산이 됨.
비결은 1957년 언어학자 Firth의 한 문장. "단어는 함께 등장하는 이웃으로 의미가 결정된다." "나는 ___을 마셨다" 빈칸에 들어갈 단어들(물·커피·맥주)은 서로 비슷함.
Word2Vec은 이 가설을 신경망으로 구현함. Skip-gram은 중심으로 주변을 맞추는 것 / CBOW는 주변으로 중심을 맞추는 것.
학습 끝나면 임베딩 공간에서 방향이 곧 의미 축이 됨. king − man은 "왕족 속성" 벡터 / woman에 더하면 queen 나옴. 한국어도 같음. 서울 − 한국 + 일본 ≈ 도쿄.
Q. 단어장이 10만 개면 softmax 한 번에 10만 번 계산해야 하는데, 어떻게 학습하나요?
Negative Sampling으로 바꿈. "전체 분포 예측" 대신 "이 단어 쌍이 진짜 이웃인가(positive), 랜덤 쌍인가(negative)" 이진 분류로 단순화함. negative를 5~20개만 뽑으면 계산량이 10만에서 k+1로 줄음. 수천 배 빨라짐.문맥을 담은 BERT
Word2Vec엔 큰 구멍 있음. "은행에서 돈을 찾았다"의 은행과 "강둑의 은행을 걸었다"의 은행에 같은 벡터를 줌. 다의어 구분 못 함.
2018년 구글의 BERT가 해결함. Transformer Encoder만 쌓아 양방향으로 문맥 봄.
근데 양방향으로 다음 단어 맞추게 하면 정답이 그냥 보임(컨닝). 그래서 Devlin은 발상을 뒤집음. 단어 15%를 가리고(MASK) 그걸 맞추게 함. 이게 MLM임.
진짜 혁신은 MLM이 아님. "한 번 Pre-train 해두고 다들 Fine-tune해서 써라"는 사고방식임. 예전엔 태스크마다 모델을 처음부터 짰음. 이제는 from_pretrained() 한 줄이면 됨. 오늘날 HuggingFace에 모델 50만 개가 올라온 이유임.
파이썬 코드 보기
from transformers import BertForSequenceClassification
# Pre-train 한 번, Fine-tune 한 줄
model = BertForSequenceClassification.from_pretrained(
"klue/bert-base", num_labels=2)
# 15% 단어를 [MASK] 처리:
# 80% [MASK] / 10% 랜덤 / 10% 원본 유지다음 단어 예측이 아니라 빈칸 채우기 — 양방향 컨닝 문제를 푼 발상임
검색은 키워드가 아니라 의미
그럼 BERT의 [CLS] 벡터를 문장 임베딩으로 쓰면 됨? 안 됨. 의미가 비슷한 두 문장의 cosine 유사도가 거의 랜덤으로 나옴.
2019년 Sentence-BERT가 답 냄. Siamese 구조로 fine-tune해서 "의미가 가까운 문장은 코사인 유사도가 높도록" 학습함. 1만 문장 검색이 65초에서 5초로 줄음. 비로소 실시간 의미 검색이 됨.
오른쪽 코드 봐라. "돈을 돌려받고 싶어요"라고 물으면 "환불"이란 글자가 한 번도 안 나왔는데 환불 FAQ를 찾아냄. 키워드 매칭은 절대 못 하는 일임. 이게 FAQ 챗봇과 RAG의 심장임. Day 21에서 본격적으로 다룸.
파이썬 코드 보기
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer("jhgan/ko-sroberta-multitask")
docs = ["환불은 구매 후 7일 이내 가능합니다.",
"배송은 평균 2~3일 소요됩니다.",
"결제는 카드, 계좌이체를 지원합니다."]
doc_emb = model.encode(docs, convert_to_tensor=True)
q = model.encode("돈을 돌려받고 싶어요")
hit = util.cos_sim(q, doc_emb)[0].argmax()
print(docs[hit]) # -> 환불 FAQ (글자 매칭 0 회)| 질문 | 찾은 FAQ |
|---|---|
| 돈 돌려받고싶어 | 환불 |
| 언제 도착해요? | 배송 |
| 카드 되나요? | 결제 |
의미로 연결함 — 키워드 매칭은 못 하는 일
기업은 임베딩으로 돈을 번다
한 문장으로 정리함. GPT는 소설가, BERT는 편집자임. GPT(Decoder)는 다음 단어를 생성하고, BERT(Encoder)는 문장을 이해해 벡터로 만듦.
현장에서 임베딩은 곧 매출임. 어떤 화장품 회사는 SBERT FAQ 챗봇으로 고객센터 문의의 35%를 자동 처리해 연 4억 절감함. 법무팀은 "을의 책임 면제 조항이 있나?" 같은 의미 검색으로 1명이 100건 보던 계약서를 300건으로 늘림. 권앤컴퍼니 AX 프로젝트의 60%가 이 임베딩 + 벡터DB + LLM 구조임.
기억해라. RAG에서 임베딩이 엉뚱한 문서를 끌어오면 LLM이 아무리 똑똑해도 헛소리함. 검색 품질이 RAG 품질의 60%를 결정함. "임베딩 없이 LLM 서비스 한다"는 말은 이제 웃음거리임.
Q. 민감한 법률·의료 문서 1만 건이면 OpenAI API와 로컬 SBERT 중 무엇을 써야 할까요?
로컬 SBERT임. 1만 건 미만은 로컬 모델로 무료에 가깝게 처리됨. 무엇보다 데이터가 외부 API로 안 나가 보안에 안전함. 10만 건 이상 + 다국어 + 최고 품질이 필요할 때만 OpenAI(text-embedding-3-large)나 Cohere로 넘어감. 정답은 품질과 비용·보안의 트레이드오프임.| GPT | BERT | |
|---|---|---|
| 블록 | Decoder | Encoder |
| 방향 | 단방향 | 양방향 |
| 학습 | 다음 단어 | MLM |
| 쓰임 | 생성 | 이해 |
| 비유 | 소설가 | 편집자 |
엔터프라이즈 AI 표준 구조 — 가운데 부품이 오늘 배운 임베딩임