9차시에서 우리 모델이 어느 집단에서 무너지는지 보았습니다. 오늘은 고칩니다.
그런데 한꺼번에 다섯 가지를 바꾸면, 무엇 덕분에 좋아졌는지 아무도 말할 수 없습니다.
한 번에 하나만 바꾸고 한 줄씩 남기는 법, 그리고 그 결과를 남에게 넘기는 서식을 만듭니다.
성취기준 12인기04-04
실험 기록한 번에 하나만1등이 넷모델 카드책임 있는 AI재현
🎯 학습 목표
설정을 한 번에 하나만 바꾸고, 좋아진 줄과 나빠진 줄을 함께 남기는 실험 기록을 만들 수 있다.
정확도 1등과 최저 집단 1등이 서로 다를 때, 무엇을 고를지 팀이 정하고 그 까닭을 적을 수 있다.
우리 모델의 모델 카드를 여덟 칸으로 채우고, 한계 칸을 숫자와 함께 쓸 수 있다.
🤔
여는 장면 — “좋아졌어요!” 그런데 무엇 덕분에?
지난 시간에 세 팀이 같은 진단을 받았습니다. 전체는 그럴듯한데 한 집단에서 무너진다는 진단이었습니다.
일주일 뒤 세 팀이 각각 이렇게 말합니다.
😀
ㄱ팀
“정규화도 켜고, 특성도 세 개 더 넣고, k도 7로 올리고, 데이터도 스무 줄 더 모았어요.
68%가 85%가 됐습니다!”
😐
ㄴ팀
“여러 번 돌려 봤는데 잘 나온 것만 적었어요. 안 나온 건 지웠고요.
최고 기록은 88%입니다.”
🙃
ㄷ팀
“숫자를 계속 바꿔 보다가 89%가 나오는 걸 찾았어요.
무엇을 바꿨는지는… 기억이 안 납니다.”
세 팀 모두 숫자는 올라갔습니다. 그런데 셋 다 다음 질문에 답하지 못합니다.
⚠️ 답하지 못하면 그것은 개선이 아니다
무엇 덕분에 올라갔습니까? 정규화입니까, 특성입니까, k입니까, 데이터입니까?
그중 오히려 나쁘게 만든 것은 없었습니까?
가장 낮은 집단도 함께 올라갔습니까, 아니면 전체만 올라갔습니까?
다른 사람이 여러분 설명만 듣고 같은 숫자를 다시 낼 수 있습니까?
ㄱ팀은 네 가지를 한꺼번에 바꿨습니다. 넷 중 셋이 도움이 되고 하나가 해가 됐어도 결과는 그냥 좋아 보입니다.
해가 된 하나는 다음 프로젝트에도 그대로 따라갑니다.
ㄴ팀은 나빠진 줄을 지웠습니다. 지운 순간 남은 줄들이 서로 이어지지 않게 되어, 남은 줄까지 거짓말을 하게 됩니다.
ㄷ팀은 아예 기록이 없습니다. 89%는 다시 낼 수 없으니 없는 것과 같습니다.
오늘은 이 셋을 한꺼번에 막는 두 가지 도구를 만듭니다.
하나는 실험 기록이고, 다른 하나는 모델 카드입니다.
둘 다 코드가 아니라 표입니다. 그런데 이 두 표가 없으면 지난 아홉 시간이 통째로 증발합니다.
화면 옆에 공책이 함께 놓여 있는 이유 — 화면의 숫자는 다음 실행에 덮어써지고, 공책의 줄은 남는다.
오늘 22분 동안 여러분이 만들 것은 새 모델이 아니라 이 줄들이다.
출처: Shixart1985, Wikimedia Commons (CC BY 2.0)
1
한 줄에 무엇을 적나 — 실험 기록의 다섯 칸
실험 기록은 한 판 돌릴 때마다 한 줄이 쌓이는 표입니다. 한 줄에 다섯 칸이 들어갑니다.
칸
무엇을 적나
이 칸이 없으면
#
몇 번째 판인가
“그때 그거”라고 부르게 된다. 카드의 ②칸이 이 번호를 쓴다
설정
쓴 특성 · k · 정규화 · (씨앗을 바꿨다면 그것도)
다시 만들 수 없다
전체
테스트 48개 전체 정확도
비교할 기준이 사라진다
최저 집단
집단 이름 + 그 집단의 성능
전체만 보고 “좋아졌다”고 말하게 된다
메모
앞 줄과 견줘 무엇을 바꿨고 몇 %p 달라졌나
줄 사이의 인과가 끊긴다
네 번째 칸에 집단 이름을 함께 적으라고 한 데에는 까닭이 있습니다.
최저 집단은 설정마다 바뀝니다. 견본 데이터로 실제로 확인해 보면 이렇습니다.
특성 다섯 개를 다 쓴 판에서는 어두움이 가장 낮은데, 특성을 반사도·밝기 둘로 줄이면 밝음이 가장 낮아집니다.
이름을 빼고 숫자만 적으면 “최저 집단이 60.0%에서 67.9%로 좋아졌다”라고 읽히지만,
사실은 다른 집단의 숫자입니다. 표가 거짓말을 하는 것입니다.
ℹ️ 앞 단원에서 가져오는 것 — 오늘은 다시 설명하지 않는다
Ⅱ-11 기준선 — 늘 가장 흔한 이름표만 말하는 바보 모델. 견본에서는 60.4%입니다. 오늘 나오는 모든 숫자는 이것과 견줘서만 뜻이 있습니다.
Ⅱ-12 네 칸 — 정확도 98%짜리 쓸모없는 모델을 봤던 그 표. 오늘은 정밀도와 재현율이 서로 다른 설정을 고르게 만듭니다.
Ⅳ-9 집단별로 쪼개 재기 — 밝음 96.4% / 어두움 70.0%. 오늘 기록표의 네 번째 칸이 바로 그 숫자입니다.
Ⅱ-5 정규화 — 자는 훈련으로만 잰다. 오늘은 그것을 켜고 끄며 효과를 재는 쪽입니다.
기록의 규칙은 하나뿐입니다. 한 번에 하나만 바꾼다.
두 가지를 함께 바꾼 줄은 그 줄만으로는 아무것도 말해 주지 않습니다.
다만 어디쯤을 뒤져야 할지 감이 없을 때는, 먼저 넓게 한 번 훑어 지도를 그리고
그다음 그 지도를 따라 한 칸씩 옮기며 기록합니다. 오늘 코드가 정확히 그 순서로 되어 있습니다.
쓴 특성
k=1
k=5
k=7
특성 5개(전부)
70.8%
83.3%
85.4%
특성 2개(반사도·밝기)
72.9%
72.9%
70.8%
특성 1개(찌그러짐만)
50.0%
47.9%
47.9%
이 지도가 오늘의 함정을 그대로 보여 줍니다. k=1 칸만 보면 특성 2개(72.9%)가
특성 5개(70.8%)보다 높습니다. “특성을 늘렸더니 나빠졌다”로 읽힙니다.
그런데 k=7 칸에서는 뒤집힙니다 — 특성 2개 70.8%, 특성 5개 85.4%.
나쁜 것은 특성 수가 아니라 k=1이었습니다.
k=1은 가장 가까운 이웃 한 점에만 기대므로, 특성이 늘어 잡음이 함께 늘면 그 한 점이 더 자주 어긋납니다.
한 칸만 보고 원인을 정하면 틀립니다.
맨 아랫줄도 읽어 두십시오. 특성을 찌그러짐 하나로 줄인 세 판은 47.9%~50.0%로,
기준선 60.4%보다 낮습니다. 특성을 잘못 고르면 아무것도 안 한 것만 못합니다.
2
나빠진 줄을 지우면 무엇이 거짓이 되나
기록표에서 가장 지우고 싶어지는 줄은 내가 한 일이 성능을 떨어뜨린 줄입니다.
발표 자료에 넣기 부끄럽기 때문입니다. 그런데 그 줄을 지우면 무슨 일이 생기는지,
견본 데이터의 앞부분 네 줄로 실제로 보겠습니다.
😀 전부 남긴 기록
① 특성 2개 · k=1 · 정규화 X … 68.8%
② 정규화만 켰다 … 72.9% (+4.2%p)
③ 특성만 5개로 늘렸다 … 70.8%(−2.1%p ❌)
④ k만 3으로 키웠다 … 81.2% (+10.4%p)
VS
🙈 ③을 지운 기록
① 특성 2개 · k=1 · 정규화 X … 68.8%
② 정규화만 켰다 … 72.9% (+4.2%p)
③ 특성 5개 · k=3 … 81.2% (+8.3%p)
→ “특성을 늘려서 8.3%p 올랐다”로 읽힌다
오른쪽 기록에는 거짓말이 한 줄도 없습니다. 적힌 숫자는 전부 실제로 나온 값입니다.
그런데 세 번째 줄에서 두 가지가 함께 바뀌었습니다 — 특성이 2개에서 5개로, k가 1에서 3으로.
읽는 사람은 앞 줄과 견줘 원인을 짐작할 수밖에 없으니 “특성 덕분”이라고 읽습니다.
사실은 특성 때문에 2.1%p 내려갔고, k 때문에 10.4%p 올라간 것입니다.
한 줄을 지우면 두 걸음이 한 걸음으로 합쳐지고, 원인이 뒤바뀝니다.
그래서 오늘 만드는 실험 기록판에는 줄을 지우는 기능이 없습니다.
휴지통 단추가 있긴 하지만 누르면 지워지지 않고 안내만 뜹니다. 일부러 그렇게 만들었습니다.
11차시에서 “실패를 감추지 않은 발표가 더 좋은 발표”라고 말하려면, 감추지 않은 기록이 손에 있어야 합니다.
💡 나빠진 줄이 실제로 하는 일
견본 데이터로 만든 10줄짜리 기록에서 앞 줄보다 나빠진 줄이 4줄입니다.
거의 절반입니다. 그 네 줄이 각각 다음을 증명합니다.
③ 특성만 늘림 −2.1%p → “특성이 많을수록 좋다”가 거짓임을 보인다
⑦ k를 9로 −6.2%p → k에는 천장이 있고 넘어가면 뭉개진다는 것을 보인다
⑧ 특성 1개 −37.5%p(⑥번과 견줘) → 기준선 아래로 떨어질 수도 있음을 보인다
⑨ 정규화만 뺌 −2.1%p(⑥번과 견줘) → 정규화를 빼도 크게 안 망한다는 것을 보인다
마지막 줄은 특히 조심해서 읽어야 합니다. 정규화를 뺀 판은 전체가 2.1%p 내려가는데
어두움 집단은 70.0%에서 80.0%로 올라갑니다.
여기서 “그럼 정규화를 빼는 게 낫네?”라고 결론 내리기 쉽습니다. 그러나 어두움 집단은 테스트에 20개뿐이고,
70.0%와 80.0%의 차이는 20개 중 2개입니다. 두 개로 설정을 고르면 안 됩니다.
정규화의 목적은 애초에 정확도를 올리는 것이 아니라, 단위를 고르는 사람의 손을 떼는 것이었습니다(Ⅱ-8).
3
1등이 하나가 아니다 — 무엇을 고를지는 계산이 아니라 결정이다
기록이 쌓이면 “그래서 어느 것을 쓸 거냐”를 정해야 합니다.
가장 높은 줄을 고르면 될 것 같지만, ‘가장 높은’이 무엇을 뜻하는지부터 갈립니다.
견본 데이터의 세 판을 네 가지 잣대로 재 보면 이렇습니다.
설정
전체 정확도
전체 재현율
어두움 재현율
놓친 수(FN)
특성 5개 · k=5 · 정규화 O
83.3%
79.3%
69.2%
6개 / 29개
특성 5개 · k=7 · 정규화 O
85.4%
75.9%
53.8%
7개 / 29개
특성 5개 · k=7 · 정규화 X
83.3%
79.3%
84.6%
6개 / 29개
🥇
정확도 1등
특성 5개 · k=7 · 정규화 O 85.4%
🥇
최저 집단 1등
특성 5개 · k=7 · 정규화 X 어두움 80.0%
🥇
전체 재현율 1등
특성 5개 · k=5 · 정규화 O 79.3%
🥇
어두움 재현율 1등
특성 5개 · k=7 · 정규화 X 84.6%
네 개의 1등이 서로 다릅니다. 셋 중 어느 것도 네 잣대를 다 이기지 못합니다.
여기서부터는 계산이 아니라 결정입니다. 결정의 근거는 “우리 문제에서 무엇이 더 아픈가”입니다.
재활용 가능한 병을 놓치면(FN) 그만큼 그냥 버려집니다. 놓치는 것이 더 아프면 재현율을 봅니다.
불가능한 병을 가능이라 우기면(FP) 선별장에서 되돌아옵니다. 헛짚는 것이 더 아프면 정밀도를 봅니다.
어두운 사진에서만 자꾸 틀린다면, 그 조건에서 찍는 사람에게만 손해가 갑니다. 그것이 아프면 최저 집단을 봅니다.
⚠️ 표본이 작으면 1등도 흔들린다
‘최저 집단 1등’(어두움 80.0%)과 기준 판(어두움 70.0%)의 차이는
어두움 20개 중 2개입니다. 사진 두 장이 다르게 판정된 것이 10.0%p로 보이는 것입니다.
9차시에서 본 그대로, 표본이 작을수록 %는 크게 흔들립니다.
그러니 “2개 차이로 정규화를 껐다”는 좋은 결정이 아닙니다.
결정을 적을 때는 몇 개 차이인지를 함께 적으십시오.
정밀도 100.0%도 같은 종류의 함정입니다. 견본의 기준 판은 FP가 0이라 정밀도가 100.0%로 찍힙니다.
완벽해 보이지만, 이는 헛짚지 않는다는 뜻일 뿐 다 맞힌다는 뜻이 아닙니다.
같은 판에서 7개를 놓쳤고, 그래서 재현율은 75.9%입니다.
k를 5로 내리면 FP가 2개 생겨 정밀도가 92.0%로 내려가는 대신 재현율이 79.3%로 올라갑니다.
지표가 결정을 바꿉니다.
ℹ️ 씨앗을 바꿔 높은 숫자를 고르는 것은 개선이 아니다
기록표 마지막 줄은 다른 아홉 줄과 성격이 다릅니다.
모델을 하나도 안 고치고 분할 씨앗만 42에서 2로 바꾼 줄입니다. 결과는 85.4% → 70.8%입니다.
모델은 그대로인데 숫자만 달라진 것이니, 이것은 시험지를 바꾼 것입니다.
반대 방향도 마찬가지입니다. 씨앗 0부터 29까지 서른 개를 다 재 보면
가장 낮은 것이 60.4%(씨앗 24 · 기준선과 같다), 가장 높은 것이 83.3%(씨앗 28),
중앙값이 75.0%입니다. 그런데 이 교과서가 쓰는 씨앗 42는 85.4%로,
서른 개 중 어느 것보다 높습니다. 씨앗을 뒤져 가장 높은 값을 고르면 이런 숫자를 만들 수 있습니다.
씨앗은 처음에 한 번 정하고 끝냅니다.
4
모델 카드 — 남이 이것만 보고 우리 결과를 다시 낼 수 있나
모델 카드는 우리 반이 만든 양식이 아닙니다. 2019년에 발표된 논문
「Model Cards for Model Reporting」(Margaret Mitchell 외, FAT* 2019, arXiv:1810.03993)이
제안한 서식입니다. 그 논문의 핵심은 성능을 한 줄로 적지 말고
집단마다 나누어 보고하라는 것, 그리고 이 모델을 쓰도록 의도한 맥락을 함께 밝히라는 것입니다.
9차시에서 우리가 밝음과 어두움으로 쪼개어 잰 것, 그리고 오늘 카드의 ⑥칸에 집단별 성능을 적는 것은
편의로 정한 규칙이 아니라 그 서식의 본체입니다.
ℹ️ 데이터 쪽에도 같은 취지의 서식이 있다
「Datasheets for Datasets」(Timnit Gebru 외, arXiv:1803.09010)는 데이터셋에 대해
왜 만들었나(동기) · 무엇으로 이루어졌나(구성) · 어떻게 모았나(수집 과정) · 어디에 쓰라고 권하나(권장 용도)를
문서로 함께 내자고 제안합니다. 모델에는 모델 카드, 데이터에는 데이터시트인 셈입니다.
우리 카드의 ③칸(데이터)이 그 축소판입니다.
카드는 여덟 칸입니다. 칸마다 “비우면 무슨 일이 생기나”가 있습니다.
칸
무엇을 적나
비우면
① 하는 일
무엇을 무엇으로 나누는 모델인가 — 한 줄
첫 줄이 ‘무엇’이 아니면 아래가 안 읽힌다
② 만든 사람
누가 · 언제 · 몇 번째 판인가
어느 판의 숫자인지 모른다
③ 데이터
출처 · 크기 · 어떻게 · 언제 모았나
재현이 아예 불가능해진다
④ 전처리
빈칸 · 이상치 · 정규화 · 분할 씨앗과 비율
같은 데이터로도 다른 숫자가 나온다
⑤ 모델과 설정
알고리즘 · k · 쓴 특성 · 양성으로 둔 이름표 · 집단 열
정밀도와 재현율의 자리가 뒤집힌다
⑥ 성능
기준선 · 전체 · 집단마다 (n을 반드시 함께)
“85.4%”가 누구의 85.4%인지 감춰진다
⑦ 한계
언제 틀리나 · 어디에 쓰면 안 되나
카드가 아니라 자랑이 된다
⑧ 다시 만드는 법
남이 이것만 보고 같은 표를 낼 수 있나
11차시의 재현 시험을 통과하지 못한다
④에 씨앗과 비율을, ⑤에 양성으로 둔 이름표를 굳이 못 박은 것은 빈말이 아닙니다.
씨앗을 안 적으면 같은 코드·같은 데이터로도 다른 숫자가 나오고,
양성을 안 적으면 정확도와 F1은 그대로인 채 정밀도와 재현율만 자리가 바뀝니다.
오류가 나지 않으므로 아무도 눈치채지 못합니다.
⑦칸은 가장 자주 비는 칸이고, 그래서 오늘 코드는 여덟 칸 중 하나라도 비면 카드를 아예 찍지 않습니다.
“한계 없음”이라고 쓰고 싶어지겠지만, 한계가 없는 모델은 없습니다.
견본 카드의 한계 칸에는 이런 것이 들어갑니다 — 어두움 조건에서는 70.0%뿐이고 그 집단 기준선보다 +5.0%p에 지나지 않는다,
놓친 것이 7개다, 테스트가 48개뿐이라 1개가 2.1%p라서 소수점 아래를 믿을 수 없다.
숫자가 없는 한계는 한계가 아닙니다.
⚠️ 코드가 못 잡는 것 — 여기서 상호평가가 필요해진다
한계 칸을 빈 문자열·공백 한 칸·줄바꿈으로 두면 코드가 거절합니다.
그런데 “없음”이나 “-”라고 한 글자만 적으면 카드가 그대로 찍힙니다.
코드가 잡을 수 있는 것은 여기까지입니다.
그래서 11차시 상호평가에 ‘한계를 밝혔는가’ 항목이 따로 있습니다.
기계가 세는 것과 사람이 읽는 것은 끝까지 다릅니다.
카드 옆에는 표 하나가 더 붙습니다. 책임 있는 AI 다섯 점검입니다.
성능표만 있으면 ‘잘 만든 AI’이고, 이 표가 함께 있어야 ‘좋은 AI’입니다.
점검
물음
견본 팀의 답
편향
어느 집단에서 더 못하나. 그 집단이 사람이라면 무슨 일이 생기나
어두움 집단이 70.0%로 가장 낮다 — 그 조건의 사진은 이 모델에 넣지 않는다
개인정보
사람을 알아볼 수 있는 것이 데이터에 들어 있나. 동의는 받았나
페트병만 찍었고, 사람이 함께 찍힌 사진은 쓰지 않고 지웠다
안전·오용
이 모델을 나쁘게 쓰면 어떻게 쓸 수 있나
‘불가’ 판정을 학생 개인 점수나 벌점으로 쓰면 안 된다 — 안내에만 쓴다
투명성
왜 그렇게 답했는지 설명할 수 있나. 무엇으로 배웠는지 밝혔나
이 모델 카드를 분리수거장 안내판 옆에 함께 붙인다
사람의 최종 확인
누가 마지막으로 사람이 보나. 틀렸을 때 되돌릴 수 있나
최종 분류는 사람이 한다. 모델은 ‘한 번 더 보라’고 알려 주기만 한다
‘안전·오용’과 ‘사람의 최종 확인’ 두 칸은 3단원에서 이미 다룬 이야기입니다.
3단원에서는 남의 사례를 놓고 물었지만, 오늘은 우리가 만든 것에 대고 묻습니다.
답이 “딱히 없는데요”가 나온다면, 그 답 자체를 카드에 적으십시오. 빈칸으로 두는 것보다 훨씬 낫습니다.
💡 이 다섯은 국가 윤리기준의 7대 원칙이 아니다
「대한민국 인공지능 윤리원칙」은 7대 원칙으로 되어 있습니다(과학기술정보통신부·KISDI).
위의 다섯 점검은 그 7대 원칙 자체가 아니라, 학교 프로젝트에서 40분 안에 물을 수 있게 줄인 묶음입니다.
발표 자료에 “국가 윤리기준 다섯 가지”라고 적으면 사실과 어긋납니다.
💻
손으로 — 기록을 쌓고, 고르고, 카드를 찍는다
오늘 22분은 셋으로 나뉩니다. ①은 화면에서 손으로, ②는 파이썬으로, ③은 다시 화면에서 손으로 합니다.
③의 산출물이 다음 시간에 다른 팀에게 넘길 인쇄물입니다.
1
기록 쌓기 (10분)
실험 기록판에서 설정을 하나씩만 바꿔 가며 최소 여섯 줄을 만든다
2
코드로 확인 (7분)
빈칸 다섯을 채워 같은 표를 파이썬으로 다시 뽑는다
3
카드 찍기 (5분)
고른 줄로 모델 카드 여덟 칸을 채우고 인쇄한다
① 실험 기록판 — 한 줄씩 쌓는다
아래 기록판은 지금 이 화면에서 실제로 계산합니다. 미리 적어 둔 표를 여는 것이 아닙니다.
견본 데이터 158행을 씨앗 42로 훈련 110 · 테스트 48로 가르고, 여러분이 고른 특성과 k로 k-NN을 돌린 뒤,
전체와 집단별 성능을 그 자리에서 잽니다. 그래서 파이썬 실행기에서 나오는 값과 소수점까지 같습니다.
자기 팀 데이터가 아직 없어도, 이 견본으로 오늘 차시를 끝까지 할 수 있습니다.
🧪 실험 기록판 — 한 번에 하나만 바꾸고 한 줄 남긴다INTERACTIVE
특성을 켜고 끄고, k를 움직이고, 정규화와 씨앗을 바꾼 뒤 ▶ 이 설정으로 돌린다를 누르세요.
누를 때마다 아래 표에 한 줄이 쌓이고, 그래프에 막대 두 개가 자랍니다.
왼쪽(하늘색)이 전체, 오른쪽(주황색)이 가장 낮은 집단입니다.
분홍 점선은 기준선입니다 — 씨앗 42에서는 60.4%입니다.
씨앗을 바꾸면 시험지가 통째로 달라지므로 기준선도 함께 움직입니다. 점선 옆에 늘 지금 씨앗의 기준선이 적힙니다.
쓸 특성 (거리를 잴 때 쓰는 열)
이웃 수 k — 홀수만
1
정규화 · 분할 씨앗
씨앗
#
설정
전체
최저 집단
전체 재현율
앞 줄과
아직 아무것도 안 돌렸습니다. 먼저 첫 판 설정(반사도·밝기 두 개 · k=1 · 정규화 끔)으로 한 번 돌려 보세요.
[안내] 설정을 하나만 바꾸고 다시 돌리세요. 두 개를 함께 바꾼 줄은 아무것도 말해 주지 않습니다.
✍️ 공책에 옮겨 적을 것 — 세 가지 과제
표 채우기. 아래 다섯 판을 차례로 돌려 (전체 %, 최저 집단 이름, 최저 집단 %) 세 값을 공책에 적으십시오.
㉠ 반사도·밝기 · k=1 · 정규화 끔 → ㉡ 같은 설정에 정규화만 켬 → ㉢ 특성만 다섯 개로
→ ㉣ k만 3으로 → ㉤ k만 7로.
㉢에서 숫자가 내려가는지 확인하고, 내려갔다면 그 줄에 ❌를 치십시오.
반례 만들기.전체는 올라가는데 최저 집단은 내려가는 설정 한 쌍을 찾아 두 줄로 남기십시오.
(힌트: 특성 다섯 개 · k=7로 두고 정규화만 껐다가 켜 보세요. 전체는 올라가는데 어두움은 내려갑니다.)
최저 집단 이름이 바뀌는 자리 찾기. 최저 집단이 ‘어두움’이 아니라 ‘밝음’으로 바뀌는 설정을 찾으십시오.
찾았으면 그 설정을 적고, 왜 이름을 함께 적어야 하는지 한 문장으로 쓰십시오.
실험실에서는 실험하는 일과 적는 일이 한 몸이다. 기록판의 줄은 페이지를 새로 고치면 사라지지만, 공책에 옮긴 줄은 남는다.
출처: Popart87, Wikimedia Commons (CC BY-SA 4.0)서버를 운영하는 현장의 모니터링 판(Grafana 데모 화면). 요청 수·메모리·CPU·로그인 수를 한 화면에 나란히 띄운다 —
숫자 하나로는 상태를 말할 수 없기 때문이다. 모델을 고를 때 1등이 하나가 아닌 것도 같은 까닭이다.
출처: Joel Kennedy, Wikimedia Commons (Public domain)
② 같은 표를 파이썬으로 — 빈칸 다섯
아래 코드는 6차시에서 만든 골격을 그대로 다시 실은 것입니다.
브라우저의 파이썬은 차시가 바뀌면 새로 시작하므로, 앞 차시에서 정의한 함수는 남아 있지 않습니다.
그래서 매번 다시 싣습니다. 함수는 한 글자도 고치지 마십시오 — 6·7·8·9·10차시가 나란히 놓고 보는 같은 함수입니다.
💡 코드 지도 — 어디에 무엇이 있나
코드 상자는 스크롤됩니다. 위에서부터 이렇게 되어 있습니다.
【0】 우리 팀 데이터와 설정 — DATA와 다섯 줄(NAMES · FEATURES · LABEL · GROUP · POSITIVE).
자기 팀 데이터로 바꿀 때 여기만 갈아 끼웁니다.
【2】 오늘 새로 하는 일 — 지도 훑기 → 기록 → 1등 넷 → 다섯 점검 → 모델 카드.
빈칸 다섯은 모두 여기에 있습니다.
코드 상자 안을 한 번 누른 뒤 Ctrl+End(맥은 Cmd+↓)를 누르면 맨 아래로 갑니다.
?????를 찾을 때는 브라우저 찾기(Ctrl+F)가 아니라 이 방법을 쓰십시오.
빈칸
어디에
무엇을 묻나
①
for k, (cname, cols) in ?????:
두 목록의 모든 짝을 만드는 도구는? (맨 위에서 itertools를 불러 두었다)
②
scores(...)[?????]
scores()가 돌려주는 넷(정확도·정밀도·재현율·F1) 중 재현율은 몇 번째인가 — Ⅱ-12
③
max(LOG, key=lambda r: r[?????])
기록 한 줄은 (#, 설정, 전체, 집단이름, 집단정확도, 메모). 최저 집단이 가장 높은 줄을 고르려면?
④
"사람의 최종 확인": "?????"
다섯째 점검을 우리 팀 말로. 비우면 코드가 경고를 찍는다
⑤
CARD["한계"] = ?????
우리 모델의 한계를 숫자와 함께. 비우면 카드가 아예 안 찍힌다
④와 ⑤는 정답이 하나가 아닙니다. 팀이 쓰는 문장입니다.
대신 ⑤를 비운 채로 돌리면 카드가 안 찍히는 것이 곧 채점입니다.
문자열이므로 따옴표 안에 넣어야 하고, 줄을 나누려면 \n을 씁니다.
⚠️ 여기서 조용히 틀린다 — 실제로 돌려 본 것들
짝수 k를 넣으면 오류는 안 나고 표가 거짓말을 합니다. k=2가 k=1과 똑같이 나오고, k=4가 k=3보다, k=6이 k=5보다 높게 나옵니다.
동점일 때 max가 먼저 들어간 이름표를 돌려주기 때문입니다. K_LIST는 홀수만 두십시오.
특성 조합을 빈 ()로 두면 오류가 날 것 같은데 안 납니다. 모든 거리가 0이 되어
훈련 앞쪽 k개가 늘 이웃이 되고, 그 다수결이 48개 전부의 답이 됩니다. 결과는 39.6%.
유일한 단서는 기준선보다 낮다는 것뿐입니다.
특성을 하나 더 붙였는데 ALL = (0,1,2,3,4)를 안 고치면 아무 표시 없이 그대로 85.4%가 나옵니다.
“늘렸는데 그대로네”라고 결론 내리게 됩니다. ALL = tuple(range(len(FEATURES)))로 쓰십시오.
없는 특성 번호를 넣으면 IndexError로 시끄럽게 죽습니다. 이건 다행인 쪽입니다.
값이 모두 같은 열을 특성에 넣으면 정규화를 켠 판은 ZeroDivisionError로 죽고,
정규화를 끈 판은 조용히 돌아갑니다(83.3%). “상수 열은 죽는다”는 반쪽만 맞는 말입니다.
이름표를 셋으로 늘리면 돌아가긴 합니다(75.0%). 그런데 to01()이 셋째 이름표를 통째로 음성으로 접어 넣어
네 칸이 뜻을 잃습니다. 오류가 안 나므로 아무도 모릅니다. 이름표는 두 가지여야 합니다.
③ 모델 카드 편집기 — 여덟 칸을 채우고 인쇄한다
기록판에서 쓸 줄을 고른 다음, 그 줄의 숫자를 손으로 옮겨 적지 말고 단추로 꽂으십시오.
손으로 옮기면 설정을 바꿨을 때 카드가 따라오지 않아, 카드가 거짓말을 하게 됩니다.
🪪 모델 카드 편집기 — 한 칸이라도 비면 찍지 않는다INTERACTIVE
위 기록판에서 돌린 줄이 아래 목록에 나타납니다. 하나를 고르고 ④⑤⑥칸에 꽂기를 누르면
전처리·설정·성능이 계산된 값 그대로 들어갑니다. 나머지 칸은 팀이 씁니다.
⑦칸(한계)이 비어 있으면 완성 표시가 뜨지 않고 인쇄도 되지 않습니다.
빈 칸 8개 — 아직 카드를 찍을 수 없습니다.
[안내] ⑦칸(한계)에는 숫자가 들어가야 합니다. “없음”은 카드를 통과하지만 사람은 통과시키지 않습니다.
🖨 인쇄용 모델 카드
이 상자를 인쇄해 11차시에 가져가십시오. 카드와 실험 기록이 함께 들어 있습니다.
그래도 이것만으로는 부족합니다 — 데이터 표(견본이면 158행)를 함께 주지 않으면
다른 팀이 우리 숫자를 다시 낼 수 없습니다.
📋 카드가 완성됐는지 스스로 재는 점검표
⑥칸에 집단마다의 n이 적혀 있는가? (“어두움 70.0%”가 아니라 “어두움 n=20 · 70.0%”)
⑥칸에 기준선이 함께 있는가? 기준선 없는 정확도는 읽을 수 없다.
④칸에 씨앗과 비율이 있는가? 없으면 다른 사람이 다른 숫자를 얻는다.
⑤칸에 양성으로 둔 이름표가 있는가? 없으면 정밀도와 재현율이 뒤집혀도 아무도 모른다.
⑦칸에 숫자가 하나라도 들어 있는가? “어두운 곳에서 약함”은 한계가 아니라 인상이다.
⑧칸을 옆 팀에게 읽히고 “이걸로 다시 만들 수 있겠어?”라고 물었는가?
📖
정리 — 오늘 나가야 할 산출물
오늘 팀에서 나가야 할 것은 인쇄물 세 장입니다 — 실험 기록 한 장, 모델 카드 한 장,
그리고 카드와 반드시 함께 가는 데이터 표 한 장입니다.
다음 시간에는 다른 팀이 이것만 보고 여러분의 숫자를 다시 내 봅니다.
카드만 주고 데이터 표를 빼면 재현이 아예 불가능합니다 — 성능 숫자만으로는 아무것도 확인되지 않기 때문입니다.
산출물
최소 조건
어디에 쓰이나
실험 기록 (1장)
여섯 줄 이상 · 나빠진 줄 최소 하나 · 줄마다 최저 집단 이름
11차시 발표에서 “무엇 덕분에 좋아졌나”를 말하는 근거
모델 카드 (1장)
여덟 칸 전부 · ⑦칸에 숫자 하나 이상
11차시 상호평가와 재현 시험의 대상
데이터 표 (1장)
카드와 함께 넘긴다 · 견본이면 158행 그대로
표가 없으면 재현이 아예 불가능하다
💡 여기까지 못 했으면 이렇게 하세요
자기 팀 데이터가 아직 없다면 — 코드 상자의 DATA를 그대로 두고 견본(페트병 사진 158행)으로 오늘을 끝내십시오.
기록판도 견본으로 돕니다. 카드의 ③칸에 “견본 데이터로 연습한 판”이라고 밝히면 그것으로 충분합니다.
기록을 여섯 줄까지 못 쌓았다면 — 위 과제 ㉠~㉤ 다섯 판만 돌리십시오. 그 다섯 줄이 오늘의 최소선입니다.
파이썬 빈칸을 못 채웠다면 — ①②③만 채워 실행하고, ④⑤는 카드 편집기에서 문장으로 쓰십시오.
④⑤는 코드가 아니라 팀의 문장이라 화면에서 채워도 같은 것을 한 것입니다.
집단 열이 없어 최저 집단이 안 나온다면 — 오늘은 견본으로 하고, 다음 시간까지 자기 데이터에 집단 열을 하나 정해 오십시오.
촬영 조건 · 요일 · 수집한 사람 무엇이든 좋으나, 한 집단에 15개 이상이어야 %를 성능이라 부를 수 있습니다.
카드를 다 못 채웠다면 — ①⑥⑦ 세 칸을 먼저 채우십시오. 하는 일 · 성능 · 한계, 이 셋이 없으면 나머지가 읽히지 않습니다.
⚠️ 다음 시간까지 하지 말아야 할 것
숫자를 더 올려 보겠다고 씨앗을 이리저리 바꾸지 마십시오.
씨앗 서른 개 중에 85.4%보다 높은 것이 하나도 없다는 것을 오늘 보았습니다.
운 좋은 시험지를 고르는 일에 다음 시간을 쓰면, 발표할 때 그 줄을 설명할 수 없습니다.
다음 시간은 공유회입니다. 다른 팀의 카드를 받아 그것만으로 결과를 다시 내 보고,
서로의 카드를 ‘한계를 밝혔는가’로 평가합니다. 오늘 ⑦칸에 “없음”이라고 쓴 팀은 그 자리에서 걸립니다.
✅
확인 문제
✍️ 문제마다 답을 쓰고 제출하기를 누르세요. 제출하면 모범 답안이 열리고, 제출한 답은 선생님께 전달됩니다.
1. 실험 기록에서 “한 번에 하나만 바꾼다”를 지키지 않고, 성능이 내려간 줄 하나를 지웠다고 하자.
남은 줄의 숫자는 모두 실제로 나온 값인데도 기록이 거짓을 말하게 되는 까닭을 설명하시오.
📖 모범 답안
한 줄을 지우면 두 걸음이 한 걸음으로 합쳐지기 때문이다.
견본에서 ①68.8% → ②72.9%(정규화) → ③70.8%(특성 5개) → ④81.2%(k=3) 중 ③을 지우면
②에서 ④로 바로 이어져, 특성과 k가 함께 바뀐 한 줄이 된다.
읽는 사람은 앞 줄과 견줘 원인을 짐작하므로 “특성을 늘려서 8.3%p 올랐다”로 읽는다.
사실은 특성 때문에 2.1%p 내려갔고 k 때문에 10.4%p 올라간 것이다.
적힌 숫자가 모두 참이어도 줄 사이의 인과가 거짓이 된다.
2.(오늘 돌린 결과) 실험 기록판에서 ‘반사도·밝기 두 개 · k=1 · 정규화 끔’으로 한 판,
정규화만 켜서 한 판을 돌렸다. 전체 정확도는 각각 얼마이고 몇 %p 달라졌는가?
그리고 최저 집단의 이름에 무슨 일이 일어났는지 쓰시오.
📖 모범 답안
68.8% → 72.9%로 +4.2%p 좋아졌다.
그런데 최저 집단의 이름이 어두움(60.0%)에서 밝음(67.9%)으로 바뀌었다.
숫자만 보면 “최저 집단이 60.0%에서 67.9%로 올랐다”처럼 보이지만 서로 다른 집단의 숫자다.
그래서 기록표의 네 번째 칸에는 반드시 집단 이름을 함께 적어야 한다.
3.(오늘 돌린 결과) 정규화를 켠 채 k=1로 두고 특성을 두 개에서 다섯 개로 늘렸더니
72.9%가 70.8%로 내려갔다. 무엇이 원인이며, 처방은 무엇인가?
k=7에서 같은 두 판을 돌려 본 결과를 근거로 답하시오.
📖 모범 답안
원인은 특성 수가 아니라 k=1이다. k=1은 가장 가까운 이웃 한 점에만 기대므로,
특성이 늘어 잡음이 함께 늘면 그 한 점이 더 자주 어긋난다.
근거: k=7에서 같은 두 판을 돌리면 특성 2개 70.8%, 특성 5개 85.4%로 뒤집힌다(+14.6%p).
처방은 정규화가 아니라 k를 키우는 것이다. 정규화는 이 두 판에서 이미 켜져 있었다.
한 칸(k=1)만 보고 원인을 정했다면 “특성을 줄여야 한다”는 정반대의 처방을 내렸을 것이다.
4. 어떤 팀이 “전체 정확도 1등(85.4%)이 아니라 최저 집단 1등(어두움 80.0%)을 고르겠다”고 한다.
이 결정이 타당해지려면 무엇을 함께 밝혀야 하는가? 견본 데이터의 수치를 들어 설명하시오.
📖 모범 답안
첫째, 왜 최저 집단을 우선하는지를 밝혀야 한다. “어두운 곳에서 찍는 사람에게만 손해가 가는 것을 막겠다”처럼
우리 문제에서 무엇이 더 아픈지를 말해야 한다. 이것은 계산이 아니라 팀의 결정이다.
둘째, 그 차이가 몇 개인지를 함께 적어야 한다. 어두움은 테스트에 20개뿐이고
70.0%와 80.0%의 차이는 20개 중 2개다. 사진 두 장으로 설정을 고른 셈이므로,
그 사실을 밝히지 않으면 “숫자를 골라 썼다”는 말을 들어도 할 말이 없다.
덧붙여, 그 판은 전체가 83.3%로 2.1%p 낮다는 것도 카드 ⑥칸에 그대로 남겨야 한다.
5. 모델 카드의 ⑦칸(한계와 쓰면 안 되는 곳)에 “없음”이라고 적으면 코드는 카드를 찍어 준다.
그런데도 이 카드가 통과되면 안 되는 까닭은 무엇이며, 무엇이 그것을 걸러 내는가?
📖 모범 답안
코드는 strip()으로 빈 문자열·공백·줄바꿈만 걸러 낸다. “없음”이나 “-”는 글자가 있으므로 통과한다.
그러나 한계가 없는 모델은 없다. 견본 모델만 해도 어두움 조건에서 70.0%뿐이고,
7개를 놓쳤으며, 테스트가 48개라 1개가 2.1%p다.
이 셋을 적지 않은 카드는 카드가 아니라 자랑이다.
걸러 내는 것은 코드가 아니라 사람이다. 11차시 상호평가의 ‘한계를 밝혔는가’ 항목이 그 자리다.
기계가 세는 것과 사람이 읽는 것은 끝까지 다르다는 것이 이 칸의 교훈이다.
6. 오늘 고른 설정으로 분리수거장에 모델을 걸어 두었다고 하자.
드리프트가 무엇이며,
우리 실습의 어떤 경험이 그것을 짐작하게 하는지 설명하시오.
📖 모범 답안
드리프트는 모델은 그대로인데 들어오는 데이터가 달라져서 성능이 시간이 갈수록 떨어지는 일이다.
분리수거장이라면 계절에 따라 낮 길이가 달라져 사진의 밝기 분포가 바뀌고, 음료 병 모양이나 라벨이 바뀌기도 한다.
우리 모델은 ‘밝음’ 사진으로 96.4%를 냈지만, 겨울에 ‘어두움’ 사진의 비율이 늘면 전체 성능은 70.0% 쪽으로 끌려간다.
짐작하게 하는 경험은 씨앗을 바꿔 본 줄이다. 모델을 하나도 안 고치고 분할 씨앗만 42에서 2로 바꿨을 뿐인데
85.4%가 70.8%가 됐다. 시험지가 달라지면 숫자가 달라진다는 사실을 그 줄이 보여 준다.
드리프트는 그 일이 시간에 따라 저절로 일어나는 것이다.
그래서 카드 ⑧칸과 ⑦칸에 “언제 다시 재야 하는가”를 적어 둘 필요가 있다.
단, 우리 데이터는 한 시점에 모은 158행뿐이라 드리프트를 실제로 재 보지는 못했다. 그것도 한계다.
🔁 되돌아보기
오늘 설정을 한 번에 하나만 바꿔 기록을 쌓았고, 나빠진 줄을 남긴 채 하나를 골랐으며,
그 결정을 모델 카드 여덟 칸에 적었다. 다음 시간에는 다른 팀이 이 카드만 보고 우리 숫자를 다시 내 본다.
그때 걸리는 칸이 바로 오늘 대충 채운 칸이다.
🔎
더 알아보기
기록을 남긴다는 일의 뿌리, 모델 카드의 원래 모양, 그리고 가장 높은 한 판만 보고하는 버릇
역사
1876년 3월 10일의 한 쪽 — 전화기의 첫 성공도 실험 노트에 남았다
사진은 알렉산더 그레이엄 벨의 실험 노트 40~41쪽입니다. 맨 위에 1876년 3월 10일이라는 날짜가 있고,
왼쪽 위에는 그날 쓴 송신 장치와 받는 장치를 전선으로 이은 그림이 있습니다. 그림 아래에는 부품마다 붙인 글자의 뜻을 적어 두었어요 —
P는 황동관, W는 백금선, M은 입을 대는 곳, S는 받는 장치의 전기자라는 식입니다.
"오늘 아침에 만들어 저녁에 시험했다"는 문장도 있습니다. 오늘 우리가 기록표의 #와 설정 칸에 적는 것과 같은 일입니다.
이어서 조건과 결과가 나옵니다. 왓슨은 받는 장치와 함께 다른 방에 있었고 두 방의 문은 닫혀 있었다고 적었습니다.
벨이 외친 문장("왓슨 씨, 이리 와요. 보고 싶어요")을 왓슨이 알아들었다는 성공 바로 뒤에,
자리를 바꿔 벨이 들어 보니 소리는 컸지만 흐릿하고 뭉개졌다는 것도 그대로 적었습니다.
전화기가 처음 말을 전한 날의 기록인데도 잘 안 된 부분을 지우지 않은 것이지요.
날짜 · 장치 · 조건 · 결과 · 아쉬운 점이 한 쪽에 모여 있어서, 150년이 지난 지금 읽어도 무엇을 어떻게 했는지 따라갈 수 있습니다.
실험 노트가 '나중의 나'와 '다른 사람'을 위한 글이라는 점에서, 오늘 만드는 실험 기록과 모델 카드는 이 쪽과 뿌리가 같습니다.
사진: 벨의 실험 노트 40~41쪽(1876년 3월 10일) · 출처: Alexander Graham Bell, Wikimedia Commons (Public domain)
원리 더 깊이
모델 카드의 원래 모양 — 논문의 9개 절과 우리 카드 8칸
2019년 논문 「Model Cards for Model Reporting」이 제안한 모델 카드는 아홉 개의 절로 되어 있습니다.
모델 세부 사항 · 의도한 쓰임 · 요인 · 지표 · 평가 데이터 · 학습 데이터 · 정량 분석 · 윤리적 고려 · 주의와 권고입니다.
우리 카드 여덟 칸은 이것을 학교 프로젝트 크기로 묶은 것이라, 그림처럼 거의 한 줄씩 짝이 맞습니다.
눈여겨볼 절은 요인(factors)입니다. 성능이 달라질 수 있는 조건 — 사람의 집단, 측정 도구, 주변 환경 — 을 먼저 적어 두고,
정량 분석 절에서 그 요인마다 성능을 나누어 보고하라는 것입니다.
논문에 실린 예시 카드 하나는 사진 속 웃는 얼굴을 찾는 모델인데, 성능을 나이와 성별로 나눈 집단마다 따로 적었습니다.
우리 견본의 '촬영조건'(밝음 · 어두움)이 바로 환경 요인이고, ⑥칸에 집단마다 n과 함께 적는 것이 정량 분석에 해당합니다.
논문에 따로 없는 칸은 ⑧ '다시 만드는 법'입니다. 11차시의 재현 시험을 위해 우리가 덧붙인 칸이지요.
모델 카드는 논문 속 제안에 머물지 않고, 지금은 Hugging Face 같은 모델 공유 사이트에 모델을 올릴 때 함께 쓰는 설명서로 자리를 잡았습니다.
생각할 거리
씨앗 서른 개의 시험지 — 가장 높은 한 판만 보고하면
그림의 회색 점 하나는 분할 씨앗 하나입니다. 특성 5개 · k=7 · 정규화 O라는 같은 모델을 같은 158행에 대고,
씨앗만 0부터 29까지 바꿔 가며 전체 정확도를 쟀습니다.
가장 낮은 60.4%(씨앗 24)부터 가장 높은 83.3%(씨앗 28)까지, 모델은 하나인데 숫자는 22.9%p나 벌어집니다. 가운데 값은 75.0%입니다.
오늘 내내 써 온 씨앗 42는 85.4%로, 서른 점 어느 것보다도 오른쪽에 있습니다. 결과만 놓고 보면 운 좋은 시험지였던 셈이지요.
그래서 "우리 모델은 85.4%"라고만 적기보다 "씨앗에 따라 60.4~83.3%, 가운데 75.0%"처럼 폭을 함께 밝히는 편이 정직합니다.
테스트가 적을수록 이 폭은 넓어지는데, 우리 테스트는 48개뿐입니다.
여러 번 시도하고 가장 좋은 판만 보고하는 버릇은 연구 현장에서도 오래된 문제입니다. 같은 테스트 데이터를 보고 또 보며 설정을 고르면,
좋아지는 것은 모델이 아니라 그 시험지에 맞춘 선택입니다.
그래서 데이터 경진대회 Kaggle은 대회 중에는 테스트 데이터의 일부로 매긴 순위(공개 순위표)만 보여 주고,
최종 순위는 참가자가 볼 수 없던 나머지 테스트 데이터(비공개 순위표)로 매깁니다. 공개 순위표에만 맞춰 설정을 고른 팀은 마지막에 순위가 크게 내려앉기도 합니다.