먼저 준비운동입니다. 아까 손으로 계산한 세 점을 코드로 확인해 봅시다.
여러분이 종이에 쓴 값과 같은지 보십시오.
손실 6.06과 14.86, 기울기 6.1333과 1.7333, 한 걸음 뒤 손실 5.7043.
표에 적힌 값과 같았습니까? 같았다면 여러분의 손계산과 컴퓨터의 계산이 같은 일을 한 것입니다.
본 실습 — 빈칸 여섯 곳을 채운다
이제 스물네 개의 점으로 갑니다. 아래 코드에는 ?????로 비워 둔 자리가 여섯 곳 있습니다.
그 여섯 자리가 오늘 배운 전부입니다. 나머지는 결과를 보여 주는 부분입니다.
| 빈칸 | 어디 | 무엇을 채우나 |
| ① | mse() | 오차를 제곱해 더한다 |
| ② | predict() | 직선의 식 — 이 한 줄이 '모델' 전부다 |
| ③ | dw | 오차에 그 점의 x를 곱해 평균낸다 |
| ④ | db | 오차만 평균낸다 (x를 곱하지 않는다) |
| ⑤ | train() | 기울기의 반대쪽으로 한 걸음 (두 줄) |
| ⑥ | w_ls | 최소제곱 공식 |
③이 이 차시에서 가장 조용한 함정이다. x를 빠뜨려도 오류가 나지 않는다.
다만 w와 b가 둘 다 16.68120에서 굳고 손실이 122.34458에서 더 안 내려간다.
더 무서운 것은 그 다음이다 — 학습률을 0.001에서 0.05까지 어떤 값으로 바꿔도 답이 똑같다.
"학습률을 바꿔도 결과가 안 변한다"면 lr이 아니라 기울기 식을 의심하라.
💡 채우기 전에 실행하면
그대로 실행하면 SyntaxError가 납니다. ?????는 파이썬이 모르는 글자이기 때문입니다.
이것은 정상입니다. 오류 메시지에 몇 번째 줄인지 나오니, 그 줄부터 채우면 됩니다.
다 채웠는데도 이상하면 ↺ 처음 코드로를 눌러 되돌릴 수 있습니다.
도전 — 숫자 하나만 바꿔서 부숴 본다
빈칸을 다 채워 돌아가면, 이제 망가뜨릴 차례입니다.
성공한 코드만 보면 배우는 것이 없습니다. 아래 여섯 가지를 하나씩 해 보고
무엇이 어떻게 달라졌는지 공책에 적으십시오.
| 바꿀 것 | 어떻게 | 무엇을 볼 것인가 |
| ① 학습률을 크게 | lr = 0.1 |
몇 회에서 멈추는가? 그때 손실은? |
| ② 학습률을 작게 | lr = 0.0001 |
2000회로 도착하는가? 그때 b는 얼마인가? |
| ③ 부호를 뒤집기 | w -= 를 w += 로 |
⚠️ lr = 0.01이면 40걸음에 발산한다.
그런데 lr = 0.0001로 하면 발산 판정에 안 걸리고
2000회를 다 돌면서 손실 2.808 × 10⁸, w −4367이 된다.
죽지도 않으면서 완전히 틀린 상태 — 상한만으로는 못 잡는다 |
| ④ 이상한 점 하나 추가 | X 뒤에 5.0, Y 뒤에 20 추가 |
w가 8.96994 → 6.73916으로 끌려간다.
7시간 예측도 104.9 → 94.1점. 한 사람이 스물네 명을 이긴다 |
| ⑤ 단위 바꾸기 | X 를 분 단위로 (x × 60) |
lr 0.01·0.0001·0.00003 전부 발산한다.
0.00002에서야 돈다 — 문턱이 3600배 작아졌다 |
| ⑥ 앞의 2를 지우기 | dw·db 의 2 × 를 삭제 |
2000회 뒤 w 9.52271, 손실 8.08792.
그 뒤 lr을 0.02로 올리면 원래와 소수 다섯째 자리까지 같아진다 |
전부 실제로 돌려서 나온 값이다. 여러분의 화면에도 같은 숫자가 나와야 한다.
다르면 어딘가를 잘못 고친 것이다.