좋다. sigmoid 빼고, 숫자만 넣어서 설명해볼게.
실제 Word2Vec은 sigmoid/softmax를 쓰지만, 원리는 아래 예제와 거의 같다.
핵심은 이것이다.
“학교”와 “선생님”의 점수가 목표보다 낮으면,
“학교” 벡터의 각 숫자를 얼마나 바꿔야 점수가 올라가는지 계산한다.
1. 64차원은 복잡하니까 2차원으로 줄여보자
실제로는 64차원이라면:
학교 = [w1, w2, w3, ..., w64]
선생님 = [t1, t2, t3, ..., t64]
인데, 설명을 위해 2차원만 쓰자.
학교 = [0.20, -0.10]
선생님 = [0.50, 0.30]
두 단어가 얼마나 가까운지는 일단 내적 점수로 계산한다고 하자.
점수 = 학교 · 선생님
계산하면:
점수 = 0.20 × 0.50 + (-0.10) × 0.30
= 0.10 + (-0.03)
= 0.07
현재 “학교-선생님” 점수는 0.07이다.
그런데 학습 데이터에서 “학교” 주변에 “선생님”이 자주 나왔다고 하자.
그러면 우리는 이 점수가 높아지길 원한다.
목표 점수를 임의로 이렇게 잡자.
목표 점수 = 1.00
현재 점수 = 0.07
차이는:
부족한 점수 = 1.00 - 0.07 = 0.93
즉, 현재 모델은 “학교와 선생님은 가까워야 한다”는 걸 충분히 반영하지 못하고 있다.
2. 그러면 학교 벡터의 어느 값을 바꿔야 하나?
학교 벡터는 두 숫자로 되어 있다.
학교 = [0.20, -0.10]
↑ ↑
1번값 2번값
점수 계산식은 이거였다.
점수 = 학교1 × 선생님1 + 학교2 × 선생님2
값을 넣으면:
점수 = 학교1 × 0.50 + 학교2 × 0.30
즉:
점수 = 0.50 × 학교1 + 0.30 × 학교2
여기서 바로 알 수 있다.
학교1을 1만큼 올리면 점수는 0.50 올라간다.
학교2를 1만큼 올리면 점수는 0.30 올라간다.
왜냐하면 선생님 벡터가:
선생님 = [0.50, 0.30]
이기 때문이다.
즉, 학교의 각 차원을 얼마나 바꿔야 하는지는 상대 단어인 선생님의 해당 차원 값에 의해 결정된다.
3. 학습률을 정하자
한 번에 너무 많이 바꾸면 위험하니까 조금만 바꾼다.
학습률 = 0.1
그리고 부족한 점수는:
부족한 점수 = 0.93
그러면 학교 벡터를 이렇게 바꾼다.
학교 변경량 = 학습률 × 부족한 점수 × 선생님 벡터
값을 넣으면:
학교 변경량 = 0.1 × 0.93 × [0.50, 0.30]
먼저:
0.1 × 0.93 = 0.093
그러면:
학교 변경량 = 0.093 × [0.50, 0.30]
각 차원별로 계산하면:
1번 차원 변경량 = 0.093 × 0.50 = 0.0465
2번 차원 변경량 = 0.093 × 0.30 = 0.0279
따라서 학교 벡터는 이렇게 바뀐다.
기존 학교 = [0.20, -0.10]
변경량 = [0.0465, 0.0279]
새 학교 = [0.20 + 0.0465, -0.10 + 0.0279]
= [0.2465, -0.0721]
학교 벡터가 바뀌었다.
학교: [0.20, -0.10]
↓
학교: [0.2465, -0.0721]
4. 정말 점수가 올라갔는지 확인해보자
변경 전 점수는:
학교 = [0.20, -0.10]
선생님 = [0.50, 0.30]
점수 = 0.20 × 0.50 + (-0.10) × 0.30
= 0.10 - 0.03
= 0.07
변경 후 학교 벡터는:
새 학교 = [0.2465, -0.0721]
선생님 = [0.50, 0.30]
다시 점수를 계산하면:
점수 = 0.2465 × 0.50 + (-0.0721) × 0.30
각각 계산하면:
0.2465 × 0.50 = 0.12325
-0.0721 × 0.30 = -0.02163
더하면:
새 점수 = 0.12325 - 0.02163
= 0.10162
즉:
기존 점수 = 0.07000
새 점수 = 0.10162
올라갔다.
아직 목표 1.00에는 한참 못 미치지만, 한 번 학습했을 때 조금 가까워진 것이다.
이걸 수백만, 수억 번 반복하면 벡터 구조가 점점 잡힌다.
5. 선생님 벡터도 같이 바꾼다
방금은 학교 벡터만 바꿨다.
실제로는 선생님 벡터도 같이 바꾼다.
선생님 벡터를 바꿀 때는 반대로 학교 벡터 방향으로 움직인다.
기존 값:
학교 = [0.20, -0.10]
선생님 = [0.50, 0.30]
선생님 변경량은:
선생님 변경량 = 학습률 × 부족한 점수 × 학교 벡터
값을 넣으면:
선생님 변경량 = 0.1 × 0.93 × [0.20, -0.10]
먼저:
0.1 × 0.93 = 0.093
그러면:
선생님 변경량 = 0.093 × [0.20, -0.10]
각 차원별 계산:
1번 차원 변경량 = 0.093 × 0.20 = 0.0186
2번 차원 변경량 = 0.093 × (-0.10) = -0.0093
그래서 선생님 벡터는:
기존 선생님 = [0.50, 0.30]
변경량 = [0.0186, -0.0093]
새 선생님 = [0.50 + 0.0186, 0.30 - 0.0093]
= [0.5186, 0.2907]
즉:
선생님: [0.50, 0.30]
↓
선생님: [0.5186, 0.2907]
6. 둘 다 바꾼 뒤 점수를 다시 계산해보자
새 값은:
새 학교 = [0.2465, -0.0721]
새 선생님 = [0.5186, 0.2907]
점수:
점수 = 0.2465 × 0.5186 + (-0.0721) × 0.2907
각각 계산하면:
0.2465 × 0.5186 = 0.1278349
-0.0721 × 0.2907 = -0.02095647
더하면:
새 점수 = 0.1278349 - 0.02095647
= 0.10687843
정리하면:
처음 점수 = 0.07000
학교만 업데이트 후 = 0.10162
학교와 선생님 둘 다 업데이트 후 = 0.10688
점수가 더 올라갔다.
즉, “학교”와 “선생님”은 더 가까워졌다.
7. 그럼 64개 중 뭘 업데이트하는지 다시 보자
2차원에서는 이렇게 했다.
학교 = [0.20, -0.10]
선생님 = [0.50, 0.30]
학교의 1번 차원 변경량:
0.1 × 0.93 × 0.50 = 0.0465
학교의 2번 차원 변경량:
0.1 × 0.93 × 0.30 = 0.0279
왜 1번 차원이 더 많이 바뀌었을까?
선생님 벡터의 1번 값이 더 컸기 때문이다.
선생님 1번 값 = 0.50
선생님 2번 값 = 0.30
그래서 학교의 1번 값이 더 크게 움직였다.
즉:
상대 단어의 해당 차원 값이 크면 → 더 많이 업데이트
상대 단어의 해당 차원 값이 작으면 → 덜 업데이트
상대 단어의 해당 차원 값이 음수면 → 반대 방향으로 업데이트
8. 음수 값이 있으면 어떻게 되냐?
이번에는 선생님 벡터가 이렇게 생겼다고 해보자.
학교 = [0.20, -0.10]
선생님 = [0.50, -0.40]
현재 점수:
점수 = 0.20 × 0.50 + (-0.10) × (-0.40)
= 0.10 + 0.04
= 0.14
목표는 1.00이라고 하자.
부족한 점수 = 1.00 - 0.14 = 0.86
학습률 = 0.1
학교 변경량:
학교 변경량 = 0.1 × 0.86 × [0.50, -0.40]
먼저:
0.1 × 0.86 = 0.086
각 차원별 계산:
1번 차원 변경량 = 0.086 × 0.50 = 0.043
2번 차원 변경량 = 0.086 × (-0.40) = -0.0344
새 학교 벡터:
기존 학교 = [0.20, -0.10]
변경량 = [0.043, -0.0344]
새 학교 = [0.243, -0.1344]
여기서 2번 값은 더 작아졌다.
왜?
선생님의 2번 값이 음수였기 때문이다.
선생님 2번 값 = -0.40
그 방향으로 가까워지려면 학교의 2번 값도 음수 방향으로 가는 게 점수를 올리는 데 유리하다.
확인해보자.
변경 전 점수:
0.20 × 0.50 + (-0.10) × (-0.40)
= 0.10 + 0.04
= 0.14
변경 후 점수:
0.243 × 0.50 + (-0.1344) × (-0.40)
= 0.1215 + 0.05376
= 0.17526
점수가 올라갔다.
0.14 → 0.17526
즉, 어떤 차원은 커지고, 어떤 차원은 작아질 수 있다.
그 결정은 수학적으로 계산된다.
9. 이번에는 멀어져야 하는 단어를 보자
“학교”와 “선생님”은 가까워져야 한다.
하지만 “학교”와 “자동차”는 가까워지면 안 된다.
자동차 벡터를 이렇게 두자.
학교 = [0.20, -0.10]
자동차 = [0.40, -0.60]
현재 점수:
점수 = 0.20 × 0.40 + (-0.10) × (-0.60)
= 0.08 + 0.06
= 0.14
그런데 “학교-자동차”는 가까운 쌍이 아니라고 하자.
그러면 목표 점수를 낮게 잡는다.
목표 점수 = 0.00
현재 점수 = 0.14
현재 점수가 너무 높다.
그래서 줄여야 한다.
줄여야 할 점수 = 현재 점수 - 목표 점수
= 0.14 - 0.00
= 0.14
이번에는 자동차 방향으로 가까워지면 안 되니까, 학교 벡터를 자동차 반대 방향으로 움직인다.
학교 변경량 = - 학습률 × 줄여야 할 점수 × 자동차 벡터
값을 넣자.
학습률 = 0.1
줄여야 할 점수 = 0.14
자동차 = [0.40, -0.60]
학교 변경량 = - 0.1 × 0.14 × [0.40, -0.60]
먼저:
0.1 × 0.14 = 0.014
그럼:
학교 변경량 = - 0.014 × [0.40, -0.60]
각 차원별 계산:
0.014 × 0.40 = 0.0056
0.014 × (-0.60) = -0.0084
앞에 마이너스가 있으니까:
학교 변경량 = [-0.0056, +0.0084]
새 학교 벡터:
기존 학교 = [0.20, -0.10]
변경량 = [-0.0056, +0.0084]
새 학교 = [0.1944, -0.0916]
점수가 정말 줄었는지 보자.
변경 전:
학교 = [0.20, -0.10]
자동차 = [0.40, -0.60]
점수 = 0.20 × 0.40 + (-0.10) × (-0.60)
= 0.08 + 0.06
= 0.14
변경 후:
새 학교 = [0.1944, -0.0916]
자동차 = [0.40, -0.60]
점수 = 0.1944 × 0.40 + (-0.0916) × (-0.60)
각각 계산:
0.1944 × 0.40 = 0.07776
-0.0916 × -0.60 = 0.05496
더하면:
새 점수 = 0.07776 + 0.05496
= 0.13272
점수가 줄었다.
0.14000 → 0.13272
즉, “학교”는 “자동차”에서 조금 멀어졌다.
10. 한 번의 학습에서 실제로는 이런 일이 동시에 일어난다
학습 데이터에서 이런 쌍이 나왔다고 하자.
긍정 쌍: 학교 - 선생님
부정 쌍: 학교 - 자동차
그러면 모델은 동시에 이런 방향으로 움직인다.
학교는 선생님 쪽으로 이동
학교는 자동차 반대쪽으로 이동
숫자로 보면:
1단계: 학교-선생님 가까워지기
학교 = [0.20, -0.10]
선생님 = [0.50, 0.30]
점수 = 0.07
목표 = 1.00
부족 = 0.93
학습률 = 0.1
학교 변경량 = 0.1 × 0.93 × [0.50, 0.30]
= [0.0465, 0.0279]
학교는:
[0.20, -0.10] + [0.0465, 0.0279]
= [0.2465, -0.0721]
2단계: 학교-자동차 멀어지기
자동차가:
자동차 = [0.40, -0.60]
라고 하자.
현재 학교는 1단계 이후:
학교 = [0.2465, -0.0721]
학교-자동차 점수:
점수 = 0.2465 × 0.40 + (-0.0721) × (-0.60)
= 0.0986 + 0.04326
= 0.14186
목표는 0이라고 하자.
목표 = 0.00
현재 = 0.14186
줄여야 할 점수 = 0.14186
학교 변경량:
학교 변경량 = -0.1 × 0.14186 × [0.40, -0.60]
먼저:
0.1 × 0.14186 = 0.014186
각 차원 계산:
0.014186 × 0.40 = 0.0056744
0.014186 × (-0.60) = -0.0085116
반대 방향으로 가야 하니까:
학교 변경량 = [-0.0056744, +0.0085116]
최종 학교 벡터:
1단계 후 학교 = [0.2465, -0.0721]
2단계 변경량 = [-0.0056744, +0.0085116]
최종 학교 = [0.2408256, -0.0635884]
처음 학교는:
처음 학교 = [0.20, -0.10]
최종 학교는:
최종 학교 = [0.2408256, -0.0635884]
이 한 번의 학습으로 학교 벡터가 이렇게 움직인 것이다.
학교는 선생님 쪽으로 당겨지고,
자동차 쪽에서는 밀려났다.
11. 이걸 64차원으로 바꾸면?
2차원에서는 이렇게 했다.
학교 = [0.20, -0.10]
선생님 = [0.50, 0.30]
64차원이면 그냥 숫자가 64개다.
학교 = [
w1, w2, w3, w4, ..., w64
]
선생님 = [
t1, t2, t3, t4, ..., t64
]
점수는:
점수 =
w1×t1 +
w2×t2 +
w3×t3 +
...
w64×t64
목표 점수와 현재 점수의 차이를 구한다.
부족한 점수 = 목표 점수 - 현재 점수
그리고 학교의 각 차원을 이렇게 업데이트한다.
w1 변경량 = 학습률 × 부족한 점수 × t1
w2 변경량 = 학습률 × 부족한 점수 × t2
w3 변경량 = 학습률 × 부족한 점수 × t3
...
w64 변경량 = 학습률 × 부족한 점수 × t64
즉, 64개 중 하나를 고르는 게 아니다.
64개 전부를 계산한다.
다만 각 차원의 변경량이 다르다.
어떤 차원은 많이 바뀌고, 어떤 차원은 조금 바뀌고, 어떤 차원은 반대 방향으로 바뀐다.
12. “뭘 업데이트해야 가까워지는지”를 어떻게 아는가?
아주 직관적으로 말하면 이렇다.
점수 계산식이:
점수 = 학교1×선생님1 + 학교2×선생님2
라고 하자.
선생님1이 0.50이면, 학교1을 올릴 때 점수가 꽤 올라간다.
학교1을 0.01 올리면
점수는 0.01 × 0.50 = 0.005 올라감
선생님2가 0.30이면, 학교2를 올릴 때 점수가 조금 덜 올라간다.
학교2를 0.01 올리면
점수는 0.01 × 0.30 = 0.003 올라감
선생님2가 -0.40이면, 학교2를 올리면 오히려 점수가 내려간다.
학교2를 0.01 올리면
점수는 0.01 × (-0.40) = -0.004 내려감
그러면 모델은 알 수 있다.
이 차원은 올려야 점수가 올라가는구나.
이 차원은 내려야 점수가 올라가는구나.
이 차원은 많이 움직여야 하는구나.
이 차원은 조금만 움직여야 하는구나.
이걸 모든 차원에 대해 계산하는 것이 미분이고, 경사하강법이다.
13. 더 쉽게 비유하면
학교 벡터가 이런 조절 버튼 64개라고 생각하면 된다.
학교 = [버튼1, 버튼2, 버튼3, ..., 버튼64]
선생님 벡터는 각 버튼의 영향력이다.
선생님 = [0.50, 0.30, -0.20, ..., 0.05]
그러면:
버튼1을 올리면 점수가 0.50만큼 잘 올라감
버튼2를 올리면 점수가 0.30만큼 올라감
버튼3을 올리면 점수가 -0.20만큼 내려감
그래서 모델은 이렇게 한다.
점수를 올리고 싶다?
→ 영향력이 양수인 차원은 올린다.
→ 영향력이 음수인 차원은 내린다.
점수를 내리고 싶다?
→ 영향력이 양수인 차원은 내린다.
→ 영향력이 음수인 차원은 올린다.
14. 핵심 정리
너의 질문:
“64개의 가중치 중 뭘 업데이트해야 가까워지는지 수학적으로 어떻게 계산하냐?”
답:
현재 점수와 목표 점수의 차이를 구하고,
그 차이에 상대 단어 벡터의 각 차원 값을 곱해서
각 차원의 변경량을 계산한다.
숫자로는 이런 식이다.
학교 = [0.20, -0.10]
선생님 = [0.50, 0.30]
현재 점수 = 0.07
목표 점수 = 1.00
부족한 점수 = 0.93
학습률 = 0.1
학교 변경량 =
0.1 × 0.93 × [0.50, 0.30]
= [0.0465, 0.0279]
새 학교 =
[0.20, -0.10] + [0.0465, 0.0279]
= [0.2465, -0.0721]
이게 핵심이다.
각 차원을 얼마나 바꿀지는 “예측이 얼마나 틀렸는지”와 “상대 단어의 해당 차원 값”으로 자동 계산된다.
'AI > 수학' 카테고리의 다른 글
| [AI]행렬곱의 근원 (0) | 2026.06.28 |
|---|---|
| [AI] 수학 (0) | 2025.11.30 |