단원 홈
2단원 · 1차시

규칙을 다 적을 수 있을까
스팸 필터를 짜 보고 포기하기

1단원에서 우리는 사람이 규칙을 적어 주면 컴퓨터가 그대로 따라가는 프로그램만 만들었습니다. 오늘은 그 방식을 끝까지 밀어붙여 봅니다. 메일 44건을 놓고 규칙을 하나씩 늘려 100%를 노려 보고, 왜 끝내 닿지 못하는지를 컴퓨터에게 직접 확인시킵니다.

성취기준 12인기02-01
규칙 기반기계학습 예시로 배우기맞바꿈 데이터 · 모델 · 손실천장 97.7%
🎯 학습 목표
  • 규칙을 적는 프로그래밍과 예시를 주는 기계학습에서 사람이 주는 것과 컴퓨터가 만드는 것이 어떻게 뒤바뀌는지 설명할 수 있다.
  • 규칙 기반 스팸 필터를 직접 고쳐 가며 정확도 · 잡은 스팸 · 잘못 잡은 정상을 재고, 규칙을 늘리는 일이 개선이 아니라 맞바꿈임을 실제 수치로 보일 수 있다.
  • 기계학습이 이기는 문제의 세 조건을 들고, 그 셋이 갖춰지지 않은 문제를 스스로 찾아 "규칙으로 푸는 편이 낫다"고 판단할 수 있다.
🤔

여는 장면 — 스팸함을 여러분이 만든다면

여러분이 쓰는 메일 서비스에는 스팸함이 있습니다. 누가 시키지 않아도 광고와 사기 메일이 알아서 그 폴더로 들어갑니다. 아래는 실제 메일 서비스의 스팸함 화면입니다.

프랑스어로 된 메일 서비스의 스팸함 화면. 경품 당첨·택배 도착·주문 확인을 흉내 낸 메일 15통이 목록에 들어와 있다.
프랑스어로 된 어떤 메일 서비스의 스팸함. 경품 당첨, 택배 도착, 주문 확인을 흉내 낸 메일 15통이 걸러져 있습니다. 제목을 자세히 보면 스팸이 규칙을 피하려고 쓰는 수법이 그대로 보입니다 — 글자 사이를 일부러 띄우고(M Y s t e r y), 비슷하게 생긴 다른 모양의 글자를 섞고(FACOM, DARTY), 철자를 조금씩 틀립니다(recvoir une recompse). 오늘 우리가 겪을 어려움이 이 화면 안에 다 들어 있습니다. 출처: Dadu, Wikimedia Commons (CC0)

이 폴더를 여러분이 직접 만든다고 해 봅시다. 방법은 1단원에서 배운 그대로입니다. 규칙을 적으면 됩니다. 제목에 '무료'가 들어 있으면 스팸. '당첨'이 들어 있으면 스팸. '대출'도, '클릭'도 스팸. 네 줄이면 꽤 그럴듯해 보입니다.

진짜로 되는지 재 보려면 답을 아는 메일이 있어야 합니다. 이 차시는 학교 메일함에서 가져왔다고 치고 44건을 준비했습니다. 스팸이 20건, 정상이 24건이고, 어느 것이 스팸인지는 이미 사람이 표시해 두었습니다. 그중 여덟 건만 먼저 봅시다.

스팸무료 쿠폰 드립니다 지금 클릭
스팸무 료 이벤트 참여하고 기프티콘 받기 '무료'를 '무 료'로 띄어 썼습니다. 사람 눈에는 같은 말인데 규칙은 못 알아봅니다.
스팸무료체험 신청하면 사은품 증정 이번에는 반대로 붙여 썼습니다.
스팸ID 확인 요청 드립니다 로그인 필요 우리가 적어 둔 네 단어가 하나도 없는 새 수법입니다.
스팸장학금 무료 특강 안내 학교 공지처럼 꾸민 스팸입니다. 이 한 줄이 오늘의 주인공이 됩니다.
정상무료 급식 안내입니다 3학년 대상 진짜 학교 공지인데 '무료'가 들어 있습니다.
정상장학금 무료 특강 안내드립니다 신청은 진로부로 위의 스팸 제목이 이 문장 안에 통째로 들어 있습니다. 4절에서 다시 봅니다.
정상기말고사 시간표 확인하세요

목록을 보면 벌써 마음이 불편해집니다. '무료'를 스팸의 표시로 삼는 순간 급식 안내와 장학금 특강 공지가 함께 끌려 들어갑니다. 그렇다고 '무료'를 빼면 무료 쿠폰 스팸을 놓칩니다. 어느 쪽을 택해야 할까요?

💭 오늘의 물음

규칙을 계속 늘리면 언젠가 100%가 될까?
안 된다면, 몇 %가 한계이고 왜 거기서 막히는가?

미리 말해 두겠습니다. 오늘 우리는 100%에 닿지 못합니다. 그런데 중요한 것은 실패했다는 사실이 아니라 실패의 정확한 원인입니다. 15분 동안 여러분은 규칙을 손으로 넣고 빼며 숫자가 어떻게 움직이는지 보고, 그다음 컴퓨터에게 가능한 조합을 전부 시켜 볼 것입니다. 컴퓨터도 못 넘는 벽이 있다면, 그 벽의 정체가 오늘의 답입니다.

1

자리가 뒤바뀐다 — 규칙이 입력에서 출력으로

1단원에서 우리가 만든 프로그램은 전부 같은 모양이었습니다. 미로를 푸는 프로그램에는 "벽이 아니면 갈 수 있다"는 규칙을 사람이 적어 넣었고, A* 는 "f 가 가장 작은 칸을 먼저 꺼낸다"는 규칙을 사람이 적어 넣었습니다. 컴퓨터는 그 규칙을 한 치의 어긋남 없이 수행했을 뿐입니다. 이런 방식을 규칙 기반 프로그래밍이라고 부릅니다.

여기서 사람이 준 것은 규칙이고, 컴퓨터가 만든 것은 답입니다. 기계학습은 이 두 자리를 통째로 맞바꿉니다. 사람은 답을 아는 예시를 잔뜩 줍니다. 그러면 컴퓨터가 그 예시들을 설명하는 규칙을 스스로 만들어 냅니다.

규칙 기반 프로그래밍 (1단원에서 한 것) 규칙 '무료'가 있으면 스팸 데이터 메일 제목 한 줄 컴퓨터 시키는 대로 답 스팸 / 정상 사람이 준 것 = 규칙 컴퓨터가 만든 것 = 답 기계학습 (2단원에서 할 것) 데이터 메일 제목 44줄 답(이름표) 스팸 20 · 정상 24 컴퓨터 스스로 찾아서 규칙 사람이 안 적은 규칙 사람이 준 것 = 데이터+답 컴퓨터가 만든 것 = 규칙 규칙이 자리를 옮긴다

그림 1. 두 방식에서 규칙 상자가 놓이는 자리가 다릅니다. 위에서는 사람이 넣는 입력이고, 아래에서는 컴퓨터가 내놓는 출력입니다. 2단원 열일곱 차시는 결국 아래쪽 화살표를 어떻게 그리느냐에 대한 이야기입니다.

규칙 기반이 잘하는 일

세금 계산, 요일 구하기, 원의 넓이. 답이 이미 공식으로 정해진 문제입니다. 여기서는 규칙 기반이 100%를 냅니다. 빠르고, 싸고, 왜 그런 답이 나왔는지도 한 줄로 설명됩니다.

규칙 기반이 못하는 일

스팸 판별, 사진 속 얼굴 찾기, 손글씨 읽기. 사람은 척 보면 아는데 그 앎을 문장으로 옮겨 적을 수가 없는 문제입니다. 오늘 우리가 부딪힐 벽이 여기 있습니다.

여기서 한 가지를 분명히 해 둡시다. 기계학습은 규칙 기반보다 더 좋은 방법이 아닙니다. 다른 방법입니다. 세금 계산에 기계학습을 쓰면 100%였던 정확도가 99%로 내려갑니다. 1%가 틀린 세금 고지서를 받는 사람이 생긴다는 뜻이지요. '쓸 수 있다'와 '써야 한다'는 다른 말입니다. 이 판단 기준은 5절에서 세 조건으로 정리하겠습니다.

2

규칙 넷을 적어 보았다 — 72.7%

말로만 하면 감이 오지 않습니다. 아까 떠올린 네 규칙 무료 · 당첨 · 대출 · 클릭을 메일 44건에 실제로 붙여 보겠습니다. 판정 방법은 아주 단순합니다 — 네 단어 중 하나라도 제목에 들어 있으면 스팸, 하나도 없으면 정상.

결과는 이렇습니다.

재는 것값뜻
정확도72.7% 44건 중 32건을 맞혔다
잡은 스팸11 / 20 절반 조금 넘게 잡았다
놓친 스팸9 그냥 받은편지함으로 들어간다
잘못 잡은 정상3 / 24 학교 공지가 스팸함에 처박혔다
규칙 4개(무료·당첨·대출·클릭)를 메일 44건에 붙인 결과입니다. 이 차시의 파이썬 코드를 그대로 돌려 나온 값이고, 뒤에서 여러분이 직접 확인합니다.

72.7%. 처음 해 본 것치고 나쁘지 않아 보입니다. 그런데 비교할 기준이 있어야 이 숫자가 좋은지 나쁜지 알 수 있습니다. 기준은 이렇게 잡습니다 — 아무 규칙도 없이 전부 '정상'이라고만 답하면 몇 %일까요? 정상이 24건이니 24/44 = 54.5% 입니다. 반대로 전부 '스팸'이라고 우기면 20/44 = 45.5% 고요.

그러니까 규칙 넷을 공들여 적은 대가는 54.5% → 72.7%, 18.2%p 였습니다. 의미 있는 상승입니다. 다만 규칙 하나('무료')만 있을 때가 이미 59.1%였으니, 나머지 셋이 벌어 준 것은 13.6%p 뿐입니다. 이 '점점 줄어드는 벌이'가 3절의 주제가 됩니다.

⚠️ 정확도 하나만 보면 속는다

"정확도 72.7%"라는 한 숫자에는 놓친 스팸 9건과 억울하게 걸린 정상 3건이 뭉뚱그려져 있습니다. 이 둘은 성질이 전혀 다릅니다. 스팸을 놓치면 사용자가 광고 하나를 더 봅니다. 정상을 잘못 잡으면 진짜 공지가 사라집니다. 같은 '한 건'인데 무게가 다르지요. 이 둘을 갈라서 세는 자를 12차시에서 네 칸(혼동행렬)이라는 이름으로 정식으로 배웁니다. 오늘은 그 예고편입니다.

놓친 스팸 9건은 어떤 것들이었나

실패를 뭉뚱그리지 말고 종류별로 갈라 봅시다. 놓친 아홉 건은 세 무리로 나뉩니다.

유형 ①무 료 이벤트 참여하고 기프티콘 받기 · 무료체험 신청하면 사은품 증정 규칙을 알고 피해 간 것. '무료'를 띄우거나 붙였습니다. 스팸을 보내는 쪽도 우리 규칙을 짐작합니다.
유형 ②ID 확인 요청 드립니다 로그인 필요 · 긴급 계정 잠김 비밀번호 재설정 · 카드 대금 미납 확인 요망 우리가 몰랐던 수법. 계정을 훔치려는 메일인데, 우리 네 단어와는 아무 상관이 없습니다.
유형 ③월 500 부업 문의 주세요 · 따끈한 정보 받고 수익 내세요 · 명절 특가 최대 90% 할인 쿠폰 · 해외 배송 대행 수수료 0원 이벤트 다른 말로 같은 짓. '부업' '수익' '특가' '0원' — 뜻은 '무료'와 이웃인데 글자가 다릅니다.

세 유형이 각각 다른 대책을 요구합니다. ①은 띄어쓰기를 지운 뒤 검사하면 잡힙니다. ②는 규칙을 새로 배워 와야 잡힙니다. ③은 단어를 계속 더해야 잡힙니다. 그리고 이 셋 다, 새 스팸이 오면 처음부터 다시 해야 합니다. 규칙을 적는 일이 끝나지 않는다는 말은 이런 뜻입니다.

잘못 잡은 정상 3건도 확인해 둡시다. 장학금 무료 특강 안내드립니다 신청은 진로부로, 무료 급식 안내입니다 3학년 대상, 졸업 앨범 무료 배송 예정입니다. 셋 다 '무료' 하나에 걸렸습니다. 학교에서 '무료'는 나쁜 말이 아니라 오히려 반가운 말인데 말이지요.

3

규칙을 늘리면 계속 오를까 — 오르다가 내려간다

72.7%가 마음에 들지 않으면 방법은 하나뿐입니다. 규칙을 더 적는 것. 놓친 스팸을 다시 읽어 보고 그 안에서 눈에 띄는 말을 골라 넣으면 됩니다. '이벤트'가 보이고, '지금'이 보이고, '할인'과 '확인'도 보입니다. 네 개를 순서대로 더해 여덟 개까지 늘려 봅시다. 규칙 하나를 더할 때마다 성적을 다시 쟀습니다.

규칙 수새로 넣은 말잡은 스팸 잘못 잡은 정상정확도
0개—0 / 200 / 2454.5%
1개무료5 / 203 / 2459.1%
2개당첨8 / 203 / 2465.9%
3개대출9 / 203 / 2468.2%
4개클릭11 / 203 / 2472.7%
5개이벤트13 / 204 / 2475.0%
6개지금14 / 204 / 2477.3%
7개할인15 / 206 / 2475.0% ↓
8개확인17 / 207 / 2477.3%
규칙을 왼쪽 순서대로 하나씩 더해 가며 잰 성적입니다. 7개째 '할인'을 넣는 순간 정확도가 77.3%에서 75.0%로 내려갑니다. 0개 줄(54.5%)은 아무 규칙 없이 전부 '정상'이라 답한 기준선입니다.

표에서 눈여겨볼 곳은 7개째 줄입니다. '할인'을 넣었더니 잡은 스팸이 14건에서 15건으로 하나 늘었습니다. 좋은 일이지요. 그런데 같은 줄에서 잘못 잡은 정상이 4건에서 6건으로 둘이나 늘었습니다. 하나를 얻고 둘을 잃었으니 전체 성적은 내려갑니다.

새로 잃은 정상 두 건이 무엇인지 보면 억울함이 분명해집니다 — 학생 할인 쿠폰 배부 안내, 교복 공동구매 할인 공지. 학교에서 '할인'은 오히려 좋은 소식입니다.

ℹ️ '규칙을 더한다'는 것의 진짜 뜻

규칙 하나를 더하면 그 말이 들어간 메일이 전부 스팸 쪽으로 옮겨 갑니다. 그중 진짜 스팸이 몇이고 애먼 정상이 몇인지는 넣어 보기 전에는 모릅니다.

그래서 규칙을 더하는 일은 개선이 아니라 맞바꿈입니다. "스팸 하나를 더 잡는 대신 정상 몇 건을 잃겠는가" — 표의 한 줄 한 줄이 이 거래의 영수증입니다. 12차시에서 이 거래를 정밀도와 재현율이라는 두 눈금으로 정식으로 재게 됩니다.

'무료'를 빼면 나아질까 — 숫자가 안 움직인다

가장 억울한 것은 무료 급식 안내입니다 3학년 대상이 스팸함에 들어간 일입니다. 원인은 분명합니다. 규칙 '무료' 때문이지요. 그러면 '무료'를 빼 봅시다. 규칙은 당첨 · 대출 · 클릭 셋만 남습니다.

규칙잡은 스팸잘못 잡은 정상정확도
무료 · 당첨 · 대출 · 클릭11 / 20 3 / 2472.7%
당첨 · 대출 · 클릭 ('무료' 뺌)8 / 20 0 / 2472.7%
'무료'를 빼도 정확도는 소수점 아래까지 똑같습니다. 되찾은 정상 3건과 새로 놓친 스팸 3건이 정확히 상쇄됐습니다.

결과를 보고 잠깐 멈춰 봅시다. 고쳤는데 숫자가 하나도 안 변했습니다. 그럼 이 수정은 헛수고였을까요? 그렇지 않습니다. 바뀐 것이 분명히 있습니다 — 손해를 보는 사람이 바뀌었습니다.

'무료'를 넣었을 때

학교 공지 3건이 스팸함으로 갑니다. 급식 안내를 못 본 학생이 생깁니다. 대신 무료 쿠폰·무료체험 스팸 3건은 걸러집니다.

'무료'를 뺐을 때

학교 공지는 모두 무사합니다. 대신 장학금 무료 특강 안내 같은 스팸 3건이 받은편지함으로 들어옵니다.

어느 쪽이 옳은가는 정확도가 정해 주지 않습니다. 학교 메일함이라면 공지를 잃는 쪽이 훨씬 나쁘니 '무료'를 빼는 편이 맞습니다. 하지만 광고 메일이 하루 300통씩 오는 회사 메일함이라면 반대일 수 있습니다. 같은 숫자를 놓고도 답이 달라진다는 것, 그래서 성능 지표 하나로는 결정을 대신할 수 없다는 것이 여기서 얻는 교훈입니다.

4

사람이 못 하면 컴퓨터에게 시킨다 — 그래도 안 된다

여기서 이런 반론이 나올 만합니다. "규칙을 잘못 고른 것 아닌가요? 더 좋은 조합이 있을 텐데 사람이 못 찾은 것 아닐까요?"

맞는 말입니다. 그러니 사람 대신 컴퓨터에게 전부 시켜 봅시다. 메일 44건에 자주 나오는 낱말 16개를 후보로 놓습니다 — 무료 당첨 대출 클릭 쿠폰 할인 이벤트 지금 확인 안내 신청 특강 장학금 현금 배송 긴급. 이 16개에서 몇 개를 고르는 방법은 각 낱말을 넣거나 빼는 두 갈래이므로 216 = 65,536가지입니다. 전부 돌려 보면 됩니다. 사람은 못 하지만 컴퓨터에게는 한순간입니다.

누가 고른 규칙규칙 수잡은 스팸 잘못 잡은 정상정확도
사람 — 처음 넷411 / 20 3 / 2472.7%
사람 — 여덟까지 늘림817 / 20 7 / 2477.3%
컴퓨터 — 65,536가지 전수7 14 / 202 / 2481.8%
컴퓨터가 찾아낸 최고는 36/44 = 81.8%입니다. 같은 81.8%를 내는 조합이 96가지나 있어서, 그중 규칙 수가 가장 적은 7개짜리를 실었습니다.

컴퓨터가 찾은 일곱 개는 당첨 · 대출 · 클릭 · 이벤트 · 지금 · 확인 · 긴급입니다. 여기서 놀랄 만한 대목이 하나 있습니다. '무료'가 없습니다. 우리가 가장 먼저 떠올렸고 가장 스팸다워 보였던 그 낱말이, 전수 조사에서는 넣으면 손해인 짐이었습니다. 학교 메일함에서 '무료'는 스팸 5건을 잡는 대신 공지 3건을 잃게 만드는 낱말이었으니까요.

💡 사람의 직관은 왜 빗나갔나

우리는 '무료'를 스팸 메일을 떠올리며 골랐습니다. 그러나 규칙의 값어치는 스팸 쪽만 봐서는 정해지지 않습니다. 같은 낱말이 정상 메일에 얼마나 자주 나오는지를 함께 세어야 합니다. 컴퓨터는 65,536가지를 다 세어 보고 판단했고, 우리는 한쪽만 보고 판단했습니다. 오늘 실습의 파이썬 코드에서 이 '양쪽을 다 세는 식'을 여러분이 직접 채워 넣을 것입니다.

그러면 낱말 말고 아무 글자 조각이나 쓰게 해 주면?

아직 만족스럽지 않습니다. 규칙을 사전에 있는 낱말로만 쓰라는 법은 없으니까요. 제목에서 아무 데나 오려 낸 2~6글자 조각을 전부 규칙 후보로 풀어 줍시다. "금 무", "면 ", "90" 같은 말도 안 되는 조각까지 전부요. 44건에서 오려 낼 수 있는 조각은 2,497개입니다.

여기에 원하는 만큼 골라 쓰게 하고, 정확도를 최대로 만들어 보라고 시켰습니다. 결과는 —

허락한 조건잡은 스팸잃은 정상최고 정확도
정상은 한 건도 잃으면 안 됨19 / 20 097.7%
정상 1건까지는 잃어도 됨20 / 20 197.7%
정상 2건까지는 잃어도 됨20 / 20 295.5%
조각 2,497개를 마음대로 오려 붙여도 최고는 43/44 = 97.7%입니다. 스팸을 20건 다 잡으려면 반드시 정상 1건을 내놓아야 하고, 그래도 점수는 같습니다. 두 건을 내놓으면 오히려 손해입니다.

2,497개 조각을 자유롭게 쓰고도 44건 중 43건이 한계였습니다. 마지막 한 건은 무슨 수를 써도 틀립니다. 여기가 천장입니다. 그리고 그 천장을 만드는 것은 데이터 44건 전체가 아니라 딱 한 쌍입니다.

스팸 (잡아야 할 것) 장학금 무료 특강 안내 정상 (지켜야 할 것) 장학금 무료 특강 안내 드립니다 신청은 진로부로 스팸 제목이 정상 제목 안에 통째로 들어 있다 그래서 길은 둘뿐이다 ① 이 스팸을 포기한다 공지는 무사하다 · 스팸 19/20 · 43/44 ② 이 공지를 내준다 스팸 20/20 · 공지 하나를 잃는다 · 43/44

그림 2. 스팸 제목이 정상 제목의 앞부분과 글자 하나까지 같습니다. 그러면 스팸에서 오려 낸 조각은 무엇이든 정상 안에도 반드시 있습니다. 스팸을 잡는 규칙은 공지도 함께 잡을 수밖에 없지요. 규칙을 몇 개 쓰든, 얼마나 영리하게 쓰든 이 선택은 사라지지 않습니다. 천장 43/44는 여기서 나옵니다.

이것이 오늘의 답입니다. 규칙 기반이 100%에 닿지 못한 까닭은 우리가 게을러서가 아니라, 제목 글자만 보고는 두 메일을 구별할 방법이 원리적으로 없기 때문입니다. 사람이라면 구별합니다. '진로부'라는 말이 학교 부서 이름이라는 것을 알고, 장학금 특강을 학교가 실제로 연다는 사실을 알기 때문이지요. 그 앎은 제목 글자 안에 들어 있지 않습니다.

⚠️ 한 글자로 확인해 볼 수 있다

천장의 원인이 정말 저 한 쌍인지 의심된다면, 스팸 제목 뒤에 느낌표 하나만 붙여 보세요 — 장학금 무료 특강 안내!. 이제 스팸 제목은 정상 제목 안에 들어 있지 않습니다. 다시 재면 천장이 43/44에서 44/44 = 100.0%로 올라갑니다. 글자 하나가 '불가능'을 '가능'으로 바꿉니다. 뒤의 실습에서 직접 해 보세요.

97.7%짜리 규칙을 새 메일에 붙여 보면

마지막으로 한 가지만 더 확인합시다. 컴퓨터가 조각 2,497개를 뒤져 찾아낸 97.7%짜리 규칙 열 개는 이렇게 생겼습니다 — 클릭, " 주", "면 ", " 당", " 요", " 비", "고 ", 90, 해외, 진행. 앞뒤 공백까지 규칙의 일부입니다. 사람이 보기에는 아무 뜻도 없는 조각들이지요.

이 규칙들을 처음 보는 새 메일 12건(스팸 6 · 정상 6)에 그대로 붙여 보았습니다.

규칙옛 메일 44건새 메일 12건낙차
사람 — 처음 넷72.7%58.3% −14.4%p
사람 — 여덟77.3%50.0% −27.3%p
컴퓨터 — 조각 열 개97.7% 66.7%−31.0%p
가장 높은 점수를 냈던 규칙이 가장 크게 무너졌습니다. 새 메일 12건은 44건에 없던 문장입니다.

97.7%였던 규칙이 새 메일 앞에서 66.7%가 되었습니다. 까닭은 간단합니다. 그 조각들은 스팸이 무엇인지 이해한 것이 아니라 이 44건을 외운 것이기 때문입니다. " 요"가 스팸의 표시일 리 없습니다. 다만 이 44건 안에서는 우연히 잘 들어맞았을 뿐이지요.

가진 데이터에만 딱 들어맞고 새 데이터에서 무너지는 이 현상에는 이름이 있습니다 — 과적합(overfitting)입니다. 11차시에서 정면으로 다룹니다. 기억해 둘 것은 하나입니다 — 지금 가진 데이터에서의 점수는 실력이 아닐 수 있다.

5

그럼 언제 기계학습을 쓰는가 — 세 조건과 반례

오늘 우리는 규칙 기반의 한계를 보았습니다. 그렇다고 "이제부터 다 기계학습"은 아닙니다. 1단원 2차시에서 사례 여섯 장을 놓고 AI 적합도를 매겼던 것을 기억하나요? 그때 세운 기준을 오늘의 경험 위에 다시 세워 봅시다. 조건은 셋입니다.

  1. 규칙을 말로 적기 어렵다. 사람은 척 보면 아는데 그 앎을 문장으로 옮길 수가 없다. 오늘 스팸 44건이 그랬습니다. '무료가 있으면 스팸'이라고 적는 순간 급식 공지가 걸렸지요.
  2. 예시가 충분히 많다. 컴퓨터가 규칙을 찾아내려면 정답이 붙은 예시가 있어야 합니다. 오늘은 44건뿐이었습니다. 실제 스팸 필터는 수백만 건을 씁니다.
  3. 조금 틀려도 되는 문제다. 스팸 필터가 100건 중 3건을 틀려도 세상은 돌아갑니다. 비행기 조종 신호나 은행 잔액 계산이라면 이야기가 다르지요.

셋 중 하나라도 없으면 규칙 기반이 이깁니다. 더 정확하고, 더 빠르고, 더 쌉니다. 게다가 왜 그런 답이 나왔는지 한 줄로 설명됩니다. 반례를 셋만 들어 봅시다.

문제없는 조건규칙 기반기계학습을 쓰면
원의 넓이 구하기①100% 공식이 있는데 근사값을 낸다
날짜로 요일 알아내기①100% 달력 규칙이 이미 완전하다
정해진 세율의 세금 계산① ③100% 1%만 틀려도 고지서가 잘못 나간다
이 셋은 규칙이 이미 완전하게 알려져 있는 문제입니다. 기계학습을 쓰면 100%를 99%로 내리는 셈이 됩니다.

반대로 X선 사진에서 병변 찾기는 세 조건이 다 맞습니다. 의사도 "이러이러한 모양이면 병변"이라고 딱 잘라 적지 못하고(①), 병원에는 판독이 끝난 사진이 수십만 장 쌓여 있고(②), 최종 판단은 사람 의사가 다시 하므로 기계가 조금 틀려도 됩니다(③).

ℹ️ '쓸 수 있다'와 '써야 한다'

요일 구하기에도 기계학습을 쓸 수는 있습니다. 날짜와 요일 10만 쌍을 주면 컴퓨터가 규칙 비슷한 것을 찾아낼 겁니다. 정확도는 99.8% 정도가 나오겠지요. 그런데 공식으로 하면 100%입니다. 새로운 기술이라는 이유로 원래 완전하던 답을 흔드는 것 — 이것이 실제 현장에서 가장 흔한 실수입니다. 3단원에서 이 판단을 다시 다룹니다.

2단원 열일곱 차시의 뼈대 — 데이터 · 모델 · 손실

내일부터 우리가 할 일은 이름을 붙이면 딱 세 조각입니다. 오늘 겪은 실패도 이 셋으로 다시 설명됩니다.

데이터 무엇을 보여 줄 것인가 오늘: 메일 44건과 이름표 2~6차시가 여기를 판다 모델 어떤 모양의 규칙인가 오늘: 낱말 목록 하나 8~17차시가 여기를 판다 손실 얼마나 틀렸는지 재는 자 오늘: 틀린 건수 12건 9·11·12차시가 여기를 판다 앞으로 무엇이 바뀌든, 바뀌는 것은 늘 이 셋 중 하나다.

그림 3. 오늘의 스팸 필터에도 이 셋이 다 있었습니다. 데이터는 메일 44건, 모델은 '낱말 목록'이라는 아주 단순한 모양, 손실은 틀린 건수였지요. 다른 점은 하나뿐입니다 — 오늘은 모델의 내용(어떤 낱말을 넣을지)을 사람이 손으로 정했습니다. 내일부터는 그 자리를 컴퓨터가 맡습니다.

이 세 조각으로 오늘의 실패를 다시 말하면 이렇게 됩니다. 우리 모델이 너무 단순했습니다. '낱말이 들어 있나 없나'만 볼 수 있었으니까요. 그리고 우리 데이터는 제목 글자밖에 없었습니다. 보낸 사람도, 본문도, 링크 주소도 없었지요. 마지막으로 우리 손실은 스팸을 놓친 것과 공지를 잃은 것을 같은 무게로 셌습니다. 셋 다 바꿀 수 있고, 2단원은 그 셋을 하나씩 바꿔 나가는 이야기입니다.

💻

손으로 ① — 규칙을 직접 넣고 빼며 숫자를 움직인다

이제 여러분 차례입니다. 아래 편집기에는 메일 44건이 그대로 들어 있습니다. 낱말을 넣으면 그 자리에서 44건을 다시 판정해 성적을 매깁니다. 낱말은 아래 단추로 골라도 되고, 칸에 직접 쳐 넣어도 됩니다. 무 료처럼 띄어 써도 되고 면 처럼 공백을 포함해도 됩니다.

✉️ 규칙 편집기 — 메일 44건 INTERACTIVE

규칙 낱말이 하나라도 제목에 들어 있으면 스팸으로 판정합니다. 위 격자의 칸 하나가 메일 한 통이고, 아래 그래프는 규칙을 왼쪽부터 하나씩 더해 갈 때 정확도가 어떻게 움직이는지를 보여 줍니다. ▶ 단추를 누르면 그 과정이 한 걸음씩 재생됩니다.

규칙 수0
잡은 스팸0/20
놓친 스팸20
잘못 잡은 정상0/24
맞힌 건수24/44
정확도54.5%
내 최고 기록54.5%
[안내] 규칙이 하나도 없습니다. 전부 '정상'이라고 답한 상태이고, 이것이 기준선 54.5%입니다.

이 편집기의 판정은 오늘 실습할 파이썬 코드와 글자 하나까지 같은 방식입니다 (낱말이 제목 안에 들어 있으면 스팸, 정확도는 맞힌 건수 ÷ 44 × 100). 그러니 화면의 숫자와 파이썬 출력이 다르면 둘 중 하나가 틀린 것입니다 — 꼭 대조해 보세요.

과제 ① 표를 채워라 (공책에 옮겨 적는다)

네 가지 설정을 차례로 만들어 보고 값을 적으세요. 🔄 초기화를 누르고 시작하면 편합니다.

설정규칙 수잡은 스팸잘못 잡은 정상정확도
'무료' 하나만
무료·당첨·대출·클릭
거기에 이벤트·지금·할인 추가
🏁 컴퓨터가 찾은 최고
세 번째 줄과 네 번째 줄은 둘 다 규칙 7개입니다. 그런데 정확도가 갈립니다 — 몇 개를 넣었느냐가 아니라 어느 낱말을 골랐느냐가 성적을 정한다는 뜻이지요.

과제 ② 반례를 만들어라

  • 넣으면 오히려 떨어지는 낱말을 찾아라. 규칙 여섯 개(무료·당첨·대출·클릭·이벤트·지금)를 만들어 77.3%를 확인한 다음, 낱말을 하나씩 더해 보세요. 정확도가 내려가는 낱말이 적어도 하나 있습니다. 찾으면 그 낱말이 어느 정상 메일을 잡았는지 아래 보라색 칸에서 확인하세요.
  • 잘못 잡은 정상을 0으로 만들어라. 노란 칸이 하나도 없게 하면서 스팸은 최대한 많이 잡아 보세요. 몇 %까지 갔나요? 그때 놓친 스팸은 몇 건인가요?
  • 100%에 도전하라. 낱말을 몇 개까지 넣어도 좋습니다. 다만 100%가 되면 반드시 화면을 다시 보세요 — 정말 44칸이 다 초록·파랑인가요?
💡 막힐 때 볼 힌트

낱말 단추 16개를 전부 눌러 보세요. 잡은 스팸이 18/20까지 오르는데 잘못 잡은 정상도 14/24가 되어 정확도는 63.6%에 그칩니다. 규칙을 많이 넣는다고 좋아지지 않습니다.

더 극단으로 밀어 다 한 글자만 넣어 보세요. 정상 메일 16건이 한꺼번에 걸려 정확도가 27.3%까지 떨어집니다 — 규칙이 하나도 없을 때(54.5%)보다 훨씬 나쁩니다. 거기에 낱말 16개를 마저 넣으면 44건 중 40건을 스팸이라 우기게 되어 45.5%가 됩니다. 이것이 전부 스팸이라고 답하는 것과 거의 같은 상태입니다.

과제를 마쳤으면 마지막으로 🏁 단추를 누르세요. 65,536가지를 전부 돌려 본 컴퓨터의 답이 그 자리에 들어옵니다. 여러분의 최고 기록과 견주어 보세요. 그리고 그 답조차 81.8%라는 것을 확인하세요.

💻

손으로 ② — 같은 일을 파이썬으로 짠다

편집기에서 본 숫자가 어디서 나왔는지 코드로 확인합시다. 아래 상자에는 메일 44건과 판정기가 들어 있고, 여러분이 채울 자리가 두 곳 있습니다. 채우고 ▶ 실행을 누르면 앞에서 본 표들이 그대로 찍힙니다.

  • 빈칸 ① — judge() 안입니다. "규칙 낱말이 제목 안에 들어 있는가?"를 파이썬으로 어떻게 묻나요? 힌트: 파이썬에서 '들어 있다'는 in 으로 묻습니다. 채우지 않으면 아무 규칙도 안 걸려 전부 '정상'이 되고, 정확도가 54.5%에서 얼어붙습니다.
  • 빈칸 ② — 정확도 계산입니다. 맞힌 건수를 전체로 나누고 100을 곱하세요. 100을 빼먹으면 값이 0~1 로 나와 표가 통째로 어긋납니다.
ℹ️ 코드에서 눈여겨볼 세 줄

def judge(title, rules) — 이것이 오늘의 모델입니다. 규칙 목록을 받아 0이나 1을 내놓는 아주 단순한 모양이지요. 2단원 뒤쪽에서 이 자리에 이웃 찾기(8차시)와 신경망(14차시)이 들어옵니다.

def score(rules) — 이것이 오늘의 손실입니다. 맞힌 건수만 세는 게 아니라 tp(잡은 스팸)와 fp(잘못 잡은 정상)를 따로 세는 것에 주목하세요. 12차시 네 칸의 절반이 여기 이미 있습니다.

MAILS — 이것이 오늘의 데이터입니다. 제목과 이름표(0/1) 두 칸뿐입니다.

채웠으면 세 가지를 확인하세요

  1. 【1】의 정확도가 72.7%인가? 앞의 편집기에서 무료 · 당첨 · 대출 · 클릭 넷을 넣었을 때와 같은 숫자여야 합니다. 다르면 빈칸을 잘못 채운 것입니다.
  2. 【2】의 7개째 줄에 화살표가 붙었는가? <- 오히려 떨어졌다! 라는 표시는 코드가 붙인 것입니다. 앞줄보다 맞힌 건수가 줄었을 때만 나오게 되어 있습니다.
  3. 【3】의 두 줄에서 정확도가 같은가? '무료'를 넣은 것과 뺀 것이 둘 다 72.7%입니다. 바뀐 것은 잡은스팸과 잘못잡은정상 두 칸뿐이지요.
💡 부수어 보기

ORDER 목록 뒤에 낱말을 더 넣어 보세요. 아홉 개, 열 개로 늘려도 77.3%를 크게 넘지 못합니다. 그리고 '할인'처럼 넣으면 떨어지는 낱말이 반드시 또 나옵니다.

BASE 에서 "무료" 를 지워 보세요. 【1】의 정확도가 72.7% 그대로인데 잘못 잡은 정상만 3에서 0으로 바뀝니다. "고쳤는데 점수가 안 움직인다"는 경험을 꼭 해 두세요 — 점수 하나로 판단하면 안 되는 이유가 이 한 줄에 다 있습니다.

💻

손으로 ③ — 컴퓨터에게 65,536가지를 다 시켜 본다

이번에는 규칙 고르기를 통째로 컴퓨터에게 넘깁니다. 후보 낱말 16개를 넣거나 빼는 65,536가지를 전부 돌려 최고를 찾고, 그다음 글자 조각 2,497개까지 풀어 주고 천장을 잽니다. 마지막으로 그렇게 찾은 규칙을 처음 보는 새 메일 12건에 붙여 봅니다.

⚠️ 이 상자는 처음부터 다시 시작한다

파이썬 실행기는 상자마다 새로 시작합니다. 앞 상자에서 만든 MAILS나 judge는 여기서 쓸 수 없습니다. 그래서 이 상자는 맨 위에 실습 ①의 데이터와 판정기를 글자 그대로 다시 싣습니다. # ───── 실습 ①에서 가져온 부분 — 고치지 않는다 ───── 로 표시해 두었습니다. 같은 표시를 2단원 내내 보게 됩니다. 앞 차시에서 만든 부품을 이어 쓸 때마다 이렇게 다시 싣습니다.

  • 빈칸 ③ — 오늘 가장 중요한 한 줄입니다. 어떤 규칙 조합이 몇 건을 맞혔는지 세는 식이지요. 맞힌 건수 = 잡은 스팸 + (정상 전체 − 잘못 잡은 정상) 입니다. 힌트: c & SPAM_MASK 는 그 조합이 걸어 낸 스팸의 자국이고, count1() 이 그 개수를 셉니다. 정상 쪽도 HAM_MASK 로 같은 일을 한 뒤 빼세요.
  • 빈칸 ④ — 스팸 제목이 정상 제목 안에 통째로 들어 있는지 묻는 자리입니다. 빈칸 ①에서 쓴 것과 똑같은 물음입니다.
⚠️ 빈칸 ③을 틀리면 100%가 나온다

잘못 잡은 정상을 빼지 않고 count1(c & SPAM_MASK) 만 세면 어떻게 될까요? 낱말을 전부 넣는 조합이 1등이 됩니다. 모든 메일을 스팸이라고 우기면 스팸 20건을 다 잡으니까요. 그러면 화면에는 "최고 성적 20/44"가 아니라 훨씬 좋아 보이는 값이 찍힙니다. 손실을 잘못 정의하면 엉뚱한 것이 1등이 된다 — 이것이 12차시의 주제입니다.

⭐ 반드시 해 볼 실험 — 느낌표 하나

【6】이 천장의 원인을 장학금 무료 특강 안내와 장학금 무료 특강 안내드립니다 신청은 진로부로 한 쌍으로 지목했습니다. 정말 그 한 쌍 때문인지 한 글자로 증명할 수 있습니다.

  1. MAILS 목록에서 스팸 "장학금 무료 특강 안내" 를 찾으세요. (바로 아래 정상 메일 "장학금 무료 특강 안내드립니다 …" 는 건드리지 않습니다.)
  2. 뒤에 느낌표 하나를 붙여 "장학금 무료 특강 안내!" 로 고칩니다.
  3. 다시 실행하고 【5】의 천장을 보세요. 43/44 = 97.7% 가 44/44 = 100.0% 로 올라갑니다. 희생 0건으로도 스팸 20건을 다 잡게 되지요.
  4. 【6】은 spam_txt 라는 별도의 문장 하나를 따로 적어 두고 견주는 자리라 MAILS 만 고쳐서는 바뀌지 않습니다. 【6】의 spam_txt = "장학금 무료 특강 안내" 도 똑같이 느낌표를 붙여 고치세요. 그러면 마지막 줄이 True 에서 False 로 바뀝니다.

글자 하나가 '불가능'을 '가능'으로 바꾸었습니다. 이것이 뜻하는 바는 분명합니다 — 규칙 기반의 한계는 막연히 어려워서가 아니라 데이터 안의 아주 구체적인 한 자리 때문이었습니다. 원인을 이렇게 정확히 짚을 수 있으면, 고칠 방법도 정확해집니다.

💡 더 부수어 보기 — 후보를 늘리면 천장이 올라갈까

POOL 에 낱말을 더 넣어 보세요. 실제로 재 본 값입니다.

후보 낱말 수돌려 보는 조합 수최고 성적
16개 (지금 코드)65,53636/44 = 81.8%
19개 (부업·수익·계정 추가)524,28838/44 = 86.4%
22개 (해외·특가·즉시 더 추가)4,194,30439/44 = 88.6%
올라가긴 합니다. 그런데 100%에는 못 갑니다. 그리고 22개는 조합이 400만 가지라 브라우저가 멈춥니다 — POOL 은 19개를 넘기지 마세요.

조각의 길이 범위 range(2, 7) 도 바꿔 보세요. 1~6, 2~4, 2~10, 3~6 — 무엇을 해도 천장은 43/44 로 같습니다. 길이는 천장과 아무 상관이 없습니다. 천장을 만드는 것은 오직 그 한 쌍입니다.

📖

정리 — 규칙을 다 적을 수는 없었다

오늘 한 시간 동안 우리가 실제로 얻은 숫자를 한자리에 모읍니다. 전부 메일 44건(스팸 20 · 정상 24)에서 나온 값입니다.

무엇을 했나정확도무엇을 알게 되었나
아무 규칙도 없음54.5% 기준선. 전부 '정상'이라고만 답한 값
규칙 4개를 손으로72.7% 꽤 오르지만 공지 3건이 스팸함으로 갔다
규칙 6개까지 늘림77.3% 오름세가 눈에 띄게 느려진다
규칙 7개('할인' 추가)75.0% 내려간다. 규칙 추가는 개선이 아니라 맞바꿈
'무료'를 뺌72.7% 점수는 그대로. 피해자만 바뀐다
컴퓨터가 65,536가지 전수81.8% 사람보다 낫다. 그런데 그 답에 '무료'가 없다
조각 2,497개까지 풀어 줌97.7% 천장. 무슨 수를 써도 44건 중 43건이 최대
그 규칙을 새 메일 12건에66.7% 외운 것은 실력이 아니다 (11차시 과적합)
맨 아래 두 줄이 오늘의 핵심입니다. 최고 점수를 낸 규칙이 새 데이터에서 가장 크게 무너졌습니다.

오늘 배운 것을 세 문장으로 줄이면 이렇습니다.

  1. 규칙 기반은 규칙을 사람이 적는다. 기계학습은 예시를 사람이 주고 규칙을 컴퓨터가 만든다. 입력과 출력의 자리가 통째로 바뀐다.
  2. 규칙을 늘리는 일은 맞바꿈이다. 스팸 하나를 더 잡으려면 정상 몇 건을 내주어야 한다. 어느 쪽이 나은지는 정확도가 정해 주지 않는다.
  3. 천장이 있다. 제목 글자만으로는 구별할 수 없는 한 쌍이 있으면, 규칙을 몇 개 쓰든 100%는 불가능하다. 넘으려면 다른 것을 봐야 한다.
ℹ️ 그러면 진짜 스팸 필터는 어떻게 하나

오늘 우리가 못 넘은 벽을 실제 서비스는 두 가지로 넘습니다. 첫째, 보는 것을 늘립니다. 제목만이 아니라 보낸 사람 주소, 서버 경로, 본문, 링크가 가리키는 곳, 이미지 유무까지 봅니다. 오늘 우리가 못 본 정보 안에 장학금 무료 특강 안내 두 통을 가르는 단서가 있습니다.

둘째, 사람들이 누른 '스팸 신고'를 예시로 삼아 계속 배웁니다. 규칙을 개발자가 고쳐 적는 것이 아니라, 사용자가 매일 붙여 주는 이름표로 규칙이 저절로 갱신되는 것이지요. 오늘 우리가 손으로 한 일을 수백만 건 규모로, 매일 하는 셈입니다. 그 방법을 다음 차시부터 하나씩 배웁니다.

다음 시간에는

오늘 우리 데이터에는 제목 글자밖에 없었습니다. 그래서 두 메일을 가를 수가 없었지요. 그렇다면 물음은 이렇게 바뀝니다 — 무엇을 데이터로 삼을 것인가?

2차시에서는 우리 학교 급식 잔반 60일치를 놓고 "오늘 잔반이 몇 kg 남을까"를 맞혀 봅니다. 요일, 메뉴, 기온, 시험 기간, 급식 인원, 만족도 — 이 중 무엇을 보아야 하고 무엇을 보면 안 되는지를 가릅니다. 그중 하나는 잔반과 가장 강하게 맞물려 있는데도 쓰면 반칙입니다. 급식이 끝난 뒤에야 알 수 있는 값이거든요.

칸이 나뉜 스테인리스 식판에 담긴 한국 학교 급식 — 배추김치, 양파를 넣은 매콤한 고기 볶음, 채소 무침, 옥수수를 섞은 밥, 잎채소가 든 국
한국 학교 급식 한 판 — 배추김치, 매콤한 고기 볶음, 채소 무침, 옥수수를 섞은 밥, 잎채소국. 오늘의 메일 제목처럼, 이 한 판도 무엇을 적어 두느냐에 따라 데이터가 달라집니다. 메뉴 이름을 적을 수도 있고, 국이 몇 그릇 나갔는지, 식판에 무엇이 얼마나 남았는지를 잴 수도 있지요. 다음 차시는 그 고르기에서 시작합니다. 출처: 570cjk, Wikimedia Commons (CC BY-SA 3.0)
✅

확인 문제

✍️ 문제마다 답을 쓰고 제출하기를 누르세요. 제출하면 모범 답안이 열리고, 제출한 답은 선생님께 전달됩니다.

1. 아래 표의 빈칸 넷을 채우세요. 같은 스팸 문제를 두 방식으로 풀 때, 사람이 주는 것과 컴퓨터가 만드는 것은 각각 무엇입니까?
📖 모범 답안

규칙 기반 — 사람이 주는 것: 규칙(그리고 판정할 메일 하나) · 컴퓨터가 만드는 것: 답(스팸이냐 정상이냐). 오늘 실습에서는 BASE = ["무료", "당첨", "대출", "클릭"] 이 사람이 적은 규칙이었고, judge() 가 내놓은 0과 1이 컴퓨터가 만든 답이었습니다.

기계학습 — 사람이 주는 것: 데이터와 이름표(메일 44건과 스팸/정상 표시) · 컴퓨터가 만드는 것: 규칙. 실습 ②의 【4】가 딱 이 모양이었습니다. 우리는 44건과 이름표만 주었고, 당첨 대출 클릭 이벤트 지금 확인 긴급 이라는 규칙은 컴퓨터가 65,536가지를 뒤져 만들었습니다. 다만 그것은 아직 '고를 후보를 사람이 정해 준' 아주 초보적인 형태입니다.

2. 다음 다섯 가운데 기계학습이 적합한 것을 모두 고르고, 나머지는 왜 규칙 기반이 나은지 한 줄씩 적으세요.
① 원의 넓이 계산  ② 스팸 판별  ③ 입력한 날짜의 요일 구하기  ④ X선 사진에서 병변 찾기  ⑤ 정해진 세율의 세금 계산
📖 모범 답안

기계학습이 적합한 것: ② 스팸 판별, ④ X선 사진의 병변 찾기. 둘 다 세 조건을 모두 채웁니다. 규칙을 말로 적기 어렵고(오늘 44건으로 직접 겪었습니다), 정답이 붙은 예시가 많이 쌓여 있고, 조금 틀려도 뒤에서 사람이 걸러 줄 수 있습니다.

① 원의 넓이 — 조건 ①이 없습니다. π r² 이라는 완전한 규칙이 이미 있습니다. 기계학습을 쓰면 100%를 근사값으로 떨어뜨립니다.

③ 요일 구하기 — 조건 ①이 없습니다. 달력 규칙은 예외까지 전부 알려져 있습니다.

⑤ 세금 계산 — 조건 ①과 ③이 둘 다 없습니다. 세율이 법으로 정해져 있고, 게다가 1%만 틀려도 잘못된 고지서가 나갑니다. '조금 틀려도 되는' 문제가 아닙니다.

3. (오늘 손으로 한 것) 규칙 편집기에서 무료·당첨·대출·클릭·이벤트·지금 여섯 개를 넣었을 때 정확도는 얼마였습니까? 거기에 할인을 하나 더 넣으면 어떻게 되고, 왜 그렇게 됩니까? 그렇다면 규칙을 계속 늘리면 언젠가 100%가 될까요?
📖 모범 답안

여섯 개일 때 77.3%(잡은 스팸 14/20, 잘못 잡은 정상 4/24)입니다. '할인'을 더하면 75.0%로 내려갑니다.

까닭은 맞바꿈입니다. '할인'이 스팸 명절 특가 최대 90% 할인 쿠폰 한 건을 새로 잡아 주지만, 같은 낱말이 정상 메일 학생 할인 쿠폰 배부 안내와 교복 공동구매 할인 공지 두 건도 함께 끌고 갑니다. 하나를 얻고 둘을 잃으니 전체 성적이 내려갑니다.

100%는 되지 않습니다. 낱말 16개의 65,536가지를 전부 돌려도 최고가 81.8%였고, 아무 글자 조각이나 써도 되게 풀어 준 뒤에도 43/44 = 97.7%가 천장이었습니다. 그 마지막 한 건은 어떤 규칙으로도 맞힐 수 없습니다(4번 문제에서 이어집니다).

4. (오늘 손으로 한 것) 실습 ②의 【4】에서 컴퓨터가 65,536가지를 전부 돌려 찾아낸 최고 성적은 몇 %이고 규칙은 몇 개였습니까? 그 조합에 '무료'가 들어 있지 않은 까닭을 설명하세요.
📖 모범 답안

36/44 = 81.8%이고, 그 성적을 내는 조합이 96가지나 되는데 그중 가장 짧은 것이 7개였습니다 — 당첨 대출 클릭 이벤트 지금 확인 긴급. 그때 잡은 스팸은 14/20, 잘못 잡은 정상은 2/24입니다.

'무료'가 없는 까닭: 이 데이터에서 '무료'는 스팸 5건을 잡아 주는 대신 정상 3건(장학금 무료 특강 안내드립니다… · 무료 급식 안내입니다… · 졸업 앨범 무료 배송 예정입니다)을 함께 잡습니다. +5 와 −3 을 견주면 남는 것이 +2 뿐인데, 다른 낱말들과 겹쳐 세면 그 +2 마저 사라집니다. 사람은 '무료'를 스팸 메일만 떠올리며 골랐고, 컴퓨터는 정상 메일에 몇 번 나오는지까지 세어 판단했습니다. 규칙의 값어치는 한쪽만 봐서는 정해지지 않습니다.

5. 다음 두 가지에 답하세요.
(1) 스팸 무 료 이벤트 참여하고 기프티콘 받기가 규칙 '무료'를 피해 간 까닭은 무엇입니까? 기계학습이라면 이 상황을 어떻게 다룰지 예상해 보세요.
(2) 정상 메일 무료 급식 안내입니다 3학년 대상이 스팸함에 들어간 것은 어떤 종류의 잘못입니까? 스팸을 놓친 것과 정상을 스팸이라 한 것 중 학교 메일함에서는 무엇이 더 나쁩니까? 까닭을 대세요.
📖 모범 답안

(1) 규칙은 글자가 정확히 이어져 있는지만 봅니다. 사람에게 '무 료'와 '무료'는 같은 말이지만, 컴퓨터에게는 가운데 공백 하나가 들어간 전혀 다른 글자열입니다. 그래서 "무료" in "무 료 이벤트…" 가 거짓이 됩니다.

기계학습이라면 이 문제를 두 가지로 다룹니다. 하나는 데이터를 손질해 공백을 지운 뒤 비교하는 것이고(4차시 전처리), 다른 하나는 낱말이 아니라 글자 조각 단위로 세어 '무'와 '료'가 가까이 있는 정도를 특성으로 삼는 것입니다(17차시에서 낱말을 쪼개 다루는 방법을 봅니다). 어느 쪽이든 사람이 새 규칙을 적는 것이 아니라 예시에서 알아서 드러나게 만드는 것이 핵심입니다.

(2) 정상을 스팸이라 한 잘못입니다. 오늘 표에서 '잘못 잡은 정상' 칸에 세었고, 12차시에서 이 칸에 거짓 양성이라는 이름을 붙입니다.

학교 메일함에서는 정상을 잘못 잡는 쪽이 훨씬 나쁩니다. 스팸을 놓치면 학생이 광고 한 통을 더 보고 지우면 그만입니다. 그런데 급식 안내나 체험학습 신청서 공지가 스팸함으로 가면 아무도 그것을 못 보고 마감이 지나갑니다. 둘 다 '한 건'이지만 뒤따르는 피해의 크기가 다릅니다. 그래서 실제 필터는 정확도를 조금 낮추더라도 정상을 잘못 잡는 쪽을 더 강하게 억제합니다.

6. 기계학습을 쓰면 오히려 손해인 문제를 스스로 하나 들고, 세 조건(① 규칙을 말로 적기 어렵다 ② 예시가 충분히 많다 ③ 조금 틀려도 된다) 가운데 무엇이 없는지 밝히세요. 그리고 그 문제를 규칙 기반으로 풀면 정확도가 얼마일지도 적으세요.
📖 모범 답안

답은 여럿입니다. 아래는 예시입니다.

학생 성적 등급 매기기(90점 이상 A, 80점 이상 B…) — 조건 ①이 없습니다. 기준이 학칙에 정확히 적혀 있으니 if 몇 줄이면 100%입니다. 기계학습을 쓰면 89.9점을 A로 매기는 일이 생기고, 그 학생에게 설명할 방법도 없습니다.

우리 학교 학생 수 세기 — 조건 ①이 없습니다. 세면 됩니다.

비행기 착륙 장치를 내리는 판단 — 조건 ③이 없습니다. 1만 번에 한 번 틀려도 안 되는 문제라, 검증된 규칙으로 못박아 두어야 합니다.

새로 만든 앱의 사용자 이탈 예측 — 조건 ②가 없습니다. 규칙을 적기는 어렵지만 예시가 아직 스무 명치뿐이라면, 기계학습은 그 스무 명을 외워 버릴 뿐입니다. 오늘 【7】에서 97.7%가 66.7%로 무너진 것과 같은 일이 벌어집니다.

답을 적을 때 "세 조건 중 무엇이 없는가"를 반드시 짚으세요. "어려워 보여서"나 "데이터가 없을 것 같아서" 같은 막연한 이유는 근거가 되지 않습니다.

🔁 되돌아보기

오늘 규칙을 손으로 여덟 개까지 적어 보고, 컴퓨터에게 65,536가지를 다 시켜 보고도 97.7%라는 천장을 만났다. 규칙을 적는 쪽은 여기까지다. 다음 시간부터는 규칙을 적는 대신 무엇을 보여 줄 것인가를 고른다 — 급식 잔반 60일치를 놓고 어떤 열이 쓸모 있고 어떤 열이 반칙인지 가른다.

🔎

더 알아보기

스팸은 언제 시작됐고, 실제 필터는 오늘 우리가 부딪힌 벽을 어떻게 넘어 왔나

박물관 전시실에 줄지어 선 DECSYSTEM-20 컴퓨터 본체 캐비닛과, 그 앞 검은 받침대 위의 단말기 화면과 키보드, 빈 의자
역사

1978년의 첫 스팸 — 광고한 물건이 바로 이 컴퓨터였다

1978년 5월, 컴퓨터 회사 DEC의 영업 담당자 게리 튀르크(Gary Thuerk)는 인터넷의 전신인 ARPANET 사용자 약 400명에게 같은 메일을 한꺼번에 보냈습니다. 새로 나온 DECSYSTEM-20 계열 컴퓨터의 제품 설명회에 오라는 초대장이었지요. 받는 사람이 청하지도 않은 광고를 여러 사람에게 한꺼번에 뿌린 것 — 오늘날 스팸이라 부르는 것의 첫 사례로 꼽히는 메일입니다. 사진이 바로 그 계열의 컴퓨터입니다.

반응은 싸늘했습니다. 받은 사람들의 항의가 쏟아졌고, 네트워크를 관리하던 쪽에서도 경고가 나왔어요. 사용자가 많지 않던 시절이라 사람이 사람을 꾸짖는 것으로 충분했습니다. '스팸'이라는 이름은 나중에 붙었습니다. 영국 코미디 「몬티 파이선의 날아다니는 서커스」에서 식당 메뉴마다 통조림 햄 '스팸'이 끼어들고, 끝내 '스팸' 합창이 대화를 덮어 버리는 장면에서 따 왔지요. 원하지 않는 것이 끝없이 끼어들어 정작 할 말을 묻어 버린다는 뜻입니다.

메일을 쓰는 사람이 수십억 명으로 늘자 꾸짖기로도, 사람이 손으로 적은 규칙으로도 감당할 수 없게 되었습니다. 오늘 우리가 메일 44건으로 겪은 '규칙을 적어도 끝이 없다'는 경험을, 메일 서비스들은 훨씬 큰 규모로 먼저 겪은 셈입니다.

사진: DECSYSTEM-20 본체와 단말기(Living Computer Museum, 시애틀) · 출처: Joe Mabel, Wikimedia Commons (CC BY-SA 3.0)

메일 44건에서 낱말을 양쪽으로 세면 ← 스팸 20건에서 정상 24건에서 → 클릭 4 0 확인 4 1 무료 5 3 할인 1 2 안내 2 7 한쪽으로 쏠린 낱말은 증거가 되고, '무료'처럼 양쪽에 다 나오는 낱말은 증거가 약하다
원리 더 깊이

양쪽을 다 세면 — 규칙을 적는 대신 낱말의 무게를 센다

컴퓨터가 '무료'를 뺀 까닭은 정상 메일에 몇 번 나오는지까지 셌기 때문이었습니다. 그림은 오늘의 메일 44건에서 낱말 다섯이 스팸과 정상에 각각 몇 번 나오는지 센 것입니다. '클릭'은 스팸에만 4번 나오고, '안내'는 정상 쪽에 7번으로 훨씬 많습니다. '무료'는 5 대 3이라 어느 한쪽의 표시라고 하기 어렵지요.

2002년 프로그래머 폴 그레이엄(Paul Graham)은 「스팸을 막는 계획(A Plan for Spam)」이라는 글에서 이 세기를 규칙 대신 쓰자고 제안했습니다. 스팸과 정상으로 나눠 둔 메일에서 낱말마다 나온 횟수를 세어 '이 낱말이 들어 있으면 스팸일 확률'을 구하고, 새 메일이 오면 가장 뚜렷한 낱말들의 확률을 합쳐 판정합니다. 계산에 베이즈 정리를 쓰기 때문에 흔히 베이즈 스팸 필터라고 부릅니다.

그는 정상 메일 쪽 횟수를 두 배로 쳐서, 정상을 스팸으로 잘못 잡는 일을 더 조심하게 만들었습니다. 확인 문제 5번의 '두 잘못은 무게가 다르다'를 셈 속에 직접 넣은 것이지요. 무엇보다 사용자가 메일을 새로 스팸으로 분류할 때마다 횟수만 다시 세면 필터가 새 수법을 따라잡습니다. 사람이 규칙을 고쳐 적는 대신 이름표 붙은 예시가 규칙을 만든다 — 오늘 그림 1의 아래 줄이 바로 이것입니다.

걸린 규칙의 점수를 더해 5점을 넘으면 스팸 무료 쿠폰 드립니다 지금 클릭 무료 +1.2 지금 +1.5 클릭 +2.0 처음 보는 보낸이 +1.1 5.8 → 스팸 학생 할인 쿠폰 배부 안내 할인 +1.0 쿠폰 +1.3 학교 주소에서 옴 −2.0 0.3 → 정상 ↑ 기준선 5점 규칙 이름과 점수는 설명을 위해 지어낸 예시
오해 바로잡기

기계학습이 나오자 규칙은 사라졌다? — 규칙은 남고, 무게를 데이터가 정한다

기계학습 필터가 나왔다고 사람이 적은 규칙이 사라진 것은 아닙니다. 널리 쓰이는 공개 스팸 필터 스팸어새신(SpamAssassin)은 지금도 사람이 적은 규칙 수백 개를 씁니다. 다만 규칙 하나가 판결을 내리지 않아요. 규칙마다 점수가 붙어 있고, 걸린 규칙들의 점수를 모두 더해 기준(기본값 5점)을 넘을 때만 스팸으로 봅니다.

오늘 우리 필터는 '하나라도 걸리면 스팸'이었습니다. 그래서 '할인' 하나에 교복 공동구매 공지가 끌려갔지요. 점수제에서는 약한 증거 하나로는 선을 넘지 못하고, 그림의 '학교 주소에서 옴'처럼 정상 쪽 증거가 점수를 깎을 수도 있습니다. 판정이 여러 증거의 합으로 바뀐 것입니다.

그리고 그 점수는 사람이 감으로 정하지 않습니다. 스팸·정상 이름표가 붙은 많은 메일에 대 보며 가장 잘 맞도록 컴퓨터가 맞춥니다. 무엇을 볼지는 사람이, 얼마나 믿을지는 데이터가 정하는 셈이지요. 앞으로 2단원에서 만날 모델들도 대개 이 뼈대입니다 — 데이터의 어느 칸을 볼지 고르는 일과, 그 칸에 무게를 매기는 일이 따로 있습니다.