시험에서 틀린 문제부터 다시 — Word2Vec, 단어를 숫자로 바꾸는 일
오늘 간단한 시험을 봤는데 한 문제를 틀렸다. Word2Vec이었다. 이름은 여러 번 들어봤는데 “그게 정확히 뭘 하는 건지”를 한 문장으로 꺼내지 못했다.
틀린 문제를 맨 앞에 놓고, 거기서 갈라져 나오는 개념들을 같이 정리해둔다.
틀린 문제 — Word2Vec
Word2Vec(Word to Vector) 은 단어(Word)를 컴퓨터가 계산하고 이해할 수 있는 숫자 형태의 벡터(Vector)로 바꿔주는 대표적인 자연어 처리 알고리즘이다.
이름 자체가 정의다. Word를 Vector로. 이걸 먼저 붙잡았어야 했다.
왜 이게 필요한가
컴퓨터는 “사과”라는 글자를 이해하지 못한다. 계산할 수 있는 건 숫자뿐이다. 그런데 단어에 그냥 번호를 매기면(사과=1, 바나나=2, 자동차=3) 숫자끼리의 거리가 의미와 아무 상관이 없어진다. 사과와 바나나가 사과와 자동차보다 가깝다는 걸 번호만으로는 알 수 없다.
Word2Vec은 의미가 비슷한 단어끼리 가까운 위치에 놓이도록 좌표를 찍는다. 단어를 지도 위의 점으로 만드는 일에 가깝다.
어떻게 그 좌표를 알아내나
핵심 아이디어는 “비슷한 문맥에 등장하는 단어는 비슷한 뜻을 가진다” 는 가정이다.
“오늘 ___를 먹었다”의 빈칸에는 사과·빵·라면이 들어가고 자동차는 잘 들어가지 않는다. 같은 자리에 자주 등장하는 단어들을 가깝게 배치하면, 뜻을 직접 알려주지 않아도 의미가 비슷한 단어들이 저절로 모인다.
학습 방식은 두 가지다.
| 방식 | 하는 일 |
|---|---|
| CBOW | 주변 단어들을 보고 가운데 단어를 맞힌다 |
| Skip-gram | 가운데 단어를 보고 주변 단어들을 맞힌다 |
빈칸 맞히기를 수없이 반복시키면서, 맞힐 때마다 각 단어의 좌표를 조금씩 옮긴다. 그 결과로 남는 좌표값이 우리가 쓰는 단어 벡터다.
벡터가 되면 생기는 일
숫자가 되고 나면 단어를 계산할 수 있다. 유명한 예가 이것이다.
1
왕 - 남자 + 여자 ≈ 여왕
“왕에서 남자다움을 빼고 여자다움을 더하면 여왕”이라는 관계가 좌표 위의 덧셈·뺄셈으로 나온다. 의미를 가르쳐준 적이 없는데 위치 관계로 드러나는 것이다.
그리고 이게 한계에 부딪힌다
Word2Vec은 단어 하나에 벡터 하나를 고정으로 준다. 그래서 문맥에 따라 뜻이 달라지는 단어를 구분하지 못한다.
“배가 아프다” / “배를 타고 간다” / “배를 깎아 먹었다”
셋 다 같은 벡터를 받는다. 문맥을 봐야 뜻이 갈리는데, Word2Vec에는 문맥을 볼 장치가 없다. 문맥에 따라 단어의 표현이 달라져야 한다 — 이 요구가 뒤에 나올 어텐션과 트랜스포머로 이어진다.
같이 나온 문제 — seq2seq의 병목
Q. seq2seq의 어떤 한계가 어텐션을 불러왔는지 설명하시오.
A. 원문 전체를 벡터 하나로 압축하기 때문에 긴 문장에서 정보가 손실된다. 어텐션은 매 출력 단어마다 원문 전체를 되돌아봐서 이 병목을 제거한다.
핵심 단어는 병목이다. seq2seq은 입력 문장을 끝까지 읽은 뒤 고정 크기 벡터 하나에 밀어 넣고, 디코더는 그 벡터 하나만 보고 번역을 시작한다. 문장이 길어질수록 그 벡터 하나가 감당해야 할 정보가 늘어나고, 앞쪽 내용부터 흐려진다.
비유하자면 긴 논문을 읽고 포스트잇 한 장에 요약한 다음, 논문은 덮어버리고 포스트잇만 보며 발표문을 쓰는 것과 같다. 어텐션은 발표문을 한 문장 쓸 때마다 논문을 다시 펼쳐 필요한 쪽을 찾아보게 해준 것이다.
그리고 여기서 트랜스포머가 나온다
원래 어텐션은 순서대로 읽는 RNN을 돕는 보조 장치로 개발됐다. 그런데 써보니 성능을 끌어올린 진짜 주역이 어텐션이었다. 그래서 나온 질문이 “그러면 RNN을 빼고 어텐션만 남기면 어떨까”였고, 그 답이 트랜스포머다.
어텐션 — 훑어보고 골라내는 계산
어텐션은 지금 이 단어가 다른 단어들 중 누구를 얼마나 참고할지 정하는 계산이다.
| 이름 | 비유 | 실제 역할 |
|---|---|---|
| Query (Q) | 내가 든 질문 카드 | 지금 단어가 묻는 것 |
| Key (K) | 책 표지에 붙은 색인표 | 다른 단어가 내미는 단서 |
| Value (V) | 실제 책 내용 | 참고하기로 한 단어에서 가져올 정보 |
질문 카드(Q)를 들고 서가를 돌며 색인표(K)와 맞춰보고, 잘 맞는 책에서 내용(V)을 꺼내오는 흐름이다.
트랜스포머 — 순서대로 읽기를 버린 구조
트랜스포머는 문장을 순서대로 읽지 않고, 모든 단어가 서로를 동시에 쳐다보게 만든 구조다. “순서대로 읽기”를 버리고 “서로 참고하기”를 택했다.
원래 기계 번역을 위해 나온 모델이라, 영어를 한국어로 번역하는 상황으로 보면 역할 분담이 선명하다.
인코더 — 이해하는 독해 전문가
- 역할: 입력 데이터의 의미 추출 및 요약
- 입력 문장을 읽고 문맥과 의미를 파악해 기계가 다룰 수 있는 벡터로 압축한다
- 셀프 어텐션으로 문장 안 단어들의 관계를 문장 전체를 보며 한 번에 파악한다 (예: ‘그’가 가리키는 게 철수인지 영수인지)
디코더 — 생성하는 작문 전문가
- 역할: 파악된 의미를 바탕으로 새 데이터 생성
- 인코더가 넘겨준 압축된 문맥을 받아 새 문장을 한 단어씩 순서대로 만든다
- 인코더가 준 정보뿐 아니라 자기가 방금 만들어낸 단어들도 함께 보고 다음 단어를 예측한다
얻은 것과 치른 대가
| 내용 | |
|---|---|
| 얻은 것 | 병렬 계산 가능 — GPU를 늘린 만큼 빨라진다. 지금의 대형 모델이 가능해진 진짜 이유 |
| 치른 대가 | 모든 단어가 서로를 보느라, 우리가 토큰과 컨텍스트 길이를 신경 쓰게 됐다 |
RNN은 앞 단어 계산이 끝나야 다음 단어를 계산할 수 있어서 GPU를 아무리 늘려도 줄 서서 기다린다. 트랜스포머는 그 줄을 없앴다.
CNN
이미지와 영상 인식에 특화된 딥러닝 모델. 픽셀의 국소 패턴을 층층이 쌓아 올린다는 표현이 핵심이다. 사람이 사물을 볼 때 점 하나하나가 아니라 선 · 윤곽 · 질감 같은 덩어리로 인식하듯, CNN도 돋보기(필터)를 대고 이미지를 작은 조각으로 쪼개 훑는다.
과적합 (Overfitting)
기계가 학습 데이터를 너무 완벽하게 암기해버린 나머지, 처음 보는 데이터에서는 정답을 맞히지 못하는 현상.
기출문제 답만 통째로 외운 학생이 실제 시험에서 틀리는 것과 같다. 오늘 내가 틀린 것도 비슷하다 — 이름은 외웠는데 무엇을 하는 건지를 못 꺼냈으니까.
| 방법 | 하는 일 |
|---|---|
| 데이터 늘리기 | 더 많고 다양한 데이터를 줘서 억지 암기를 막는다 |
| 모델 단순화 | 파라미터 수 등 복잡도를 줄여 쓸데없는 디테일까지 학습하지 않게 한다 |
| 조기 종료 | 새 데이터에 대한 오차가 다시 커지기 시작하는 순간에 학습을 멈춘다 |
| 드롭아웃 | 학습 중 신경망 일부를 무작위로 꺼서 특정 데이터에 과도하게 의존하지 않게 한다 |
| 가중치 규제 | 가중치가 너무 커지지 않도록 벌점을 둬서 일반화 성능을 높인다 |
한 줄로 다시
- Word2Vec → 단어를 숫자 벡터로 바꾸는 알고리즘. 비슷한 문맥에 나오는 단어를 가까운 좌표에 놓는다
- Word2Vec의 한계 → 단어 하나에 벡터 하나 고정 → 문맥에 따라 뜻이 바뀌는 단어를 구분 못 함
- seq2seq의 한계 → 원문 전체를 벡터 하나로 압축 → 긴 문장에서 정보 손실
- 어텐션 → 매 출력 단어마다 원문 전체를 되돌아봄 → 병목 제거
- 트랜스포머 → 보조 장치였던 어텐션만 남기고 RNN을 뺌 → 병렬 계산 가능
- 과적합 → 암기는 됐는데 응용이 안 되는 상태
다음에 Word2Vec이 나오면 이름 그대로 “단어(Word)를 벡터(Vector)로 바꾸는 것” 부터 꺼내기로 한다.