15차시에서 우리는 기계가 스스로 배우게 만들었습니다.
오늘은 물음을 하나 옆으로 옮깁니다 —
기계가 사진을 볼 때 도대체 무엇을 보는가.
3×3짜리 작은 창 하나를 그림 위로 밀면서, 곱하고 더하는 것만으로
'여기에 세로 선이 있다'를 알아내는 장면을 직접 만들어 봅니다.
성취기준 12인기02-06
합성곱필터특징지도풀링가중치 공유적대적 예제
🎯 학습 목표
이미지를 숫자 격자로 보고, 픽셀을 통째로 입력으로 쓰면 무엇이 무너지는지
가중치 개수와 위치 변화 두 가지로 설명할 수 있다.
3×3 필터를 직접 만들어 합성곱을 계산하고, 필터마다 반응하는 자리가 다르다는 것을
강한 반응 칸의 비율이라는 잣대로 재어 표로 적을 수 있다.
오늘 쓴 필터의 숫자를 사람이 정했다는 사실을 짚고,
진짜 합성곱 신경망이 그 숫자를 어떻게 얻는지 14차시의 역전파와 이어 설명할 수 있다.
🤔
여는 장면 — 사진에는 '선'이라는 항목이 없다
지난 15차시에 여러분은 급식 잔반 데이터를 신경망에 넣어 학습시켰습니다.
그때 입력은 기온 · 뜨거움 · 선호도 · 체육 여부 넷이었어요.
사람이 미리 골라 둔 이름 붙은 특성이었지요.
그런데 사진에는 그런 항목이 없습니다.
컴퓨터가 손글씨 사진 한 장에서 실제로 받는 것은 밝기 숫자가 줄줄이 늘어선 격자뿐이에요.
'여기에 세로 선이 있다'는 항목도, '여기가 모서리다'라는 항목도 어디에도 적혀 있지 않습니다.
그 사실을 숫자만 보고 계산으로 알아내야 합니다.
손글씨 숫자 데이터셋(MNIST)의 견본. 사람은 이것을 한눈에 '3'과 '5'로 읽지만,
컴퓨터가 받는 것은 한 장에 784개(28×28)씩 늘어선 밝기 숫자다.
같은 '3'이라도 사람마다 굵기와 기울기가 다르고, 종이 위에서 조금만 옮겨 써도
숫자 784개가 통째로 달라진다.출처: Josef Steppan, Wikimedia Commons (CC BY-SA 4.0)
오늘 우리가 다룰 그림은 훨씬 작습니다. 12칸 × 12칸짜리 격자에
손으로 찍은 숫자 7 한 장이에요. 획이 있는 칸은 1, 배경은 0입니다.
아래가 그 그림 전부입니다 — 이 144개의 0과 1이 오늘의 재료입니다.
이 '7'에는 획이 세 종류 들어 있습니다.
위쪽 두 줄의 가로획, 오른쪽 위에서 왼쪽 아래로 내려오는 대각획,
그리고 아래쪽의 짧은 세로획이에요.
사람은 이 셋을 한눈에 나눠 봅니다. 그런데 컴퓨터에게는 전부 그냥 1일 뿐입니다.
💭 오늘의 물음
0과 1이 늘어선 격자만 보고,
"여기는 세로획이고 저기는 가로획이다"를 곱셈과 덧셈만으로 알아낼 수 있는가?
그리고 그 계산에 쓰이는 숫자는 누가 정하는가?
답은 있다입니다. 필요한 것은 3×3짜리 작은 창 하나예요.
그 창을 그림 위로 한 칸씩 밀면서, 겹친 아홉 칸끼리 곱해서 더합니다.
그것뿐입니다. 그런데 이 단순한 계산이 오늘날 컴퓨터가 사진을 보는 방식의 뼈대입니다.
다만 오늘 정직하게 짚고 갈 것이 하나 있습니다.
오늘 우리가 쓸 창 안의 아홉 숫자는 사람이 손으로 정합니다.
진짜 합성곱 신경망은 그 아홉 숫자를 사람이 정하지 않고 데이터에서 배웁니다.
그 차이가 어디에서 벌어지는지도 오늘 숫자로 재 볼 거예요.
1
픽셀을 통째로 입력에 넣으면 두 가지가 무너진다
가장 단순한 방법부터 따져 봅시다.
13차시와 14차시에서 만든 신경망은 입력이 숫자 몇 개짜리였습니다.
그러면 12×12 그림의 144칸을 그냥 입력 144개로 넣으면 되지 않을까요?
실제로 그렇게 할 수 있습니다. 다만 두 가지가 곧바로 무너집니다.
① 가중치가 폭발한다
14차시에서 배웠듯이, 입력 하나가 은닉 노드 하나로 갈 때마다 가중치가 하나씩 필요합니다.
입력 144개를 은닉 노드 10개에 모두 연결하면 가중치는 144 × 10 = 1,440개예요.
12×12짜리 장난감 그림인데도 벌써 1,440개입니다.
실제 사진으로 옮겨 보면 규모가 달라집니다.
가로세로 224칸에 색이 3겹(빨강·초록·파랑)인 사진은 픽셀이 224 × 224 × 3 =
150,528개입니다. 이것을 은닉 노드 100개에 전부 연결하면
가중치가 15,052,800개가 돼요. 사진 한 장을 보기 위한 첫 층에서만 1,500만 개입니다.
가중치가 많다는 것은 두 가지 뜻입니다.
하나는 계산과 저장이 무겁다는 것이고, 다른 하나는 더 나쁩니다 —
11차시에서 본 과적합(overfitting)이
훨씬 쉽게 일어납니다. 조절할 손잡이가 1,500만 개인데 사진은 몇 만 장뿐이면,
기계는 규칙을 배우는 대신 사진을 외워 버립니다.
② 조금만 옮겨져도 완전히 다른 그림이 된다
이쪽이 더 심각합니다. 8×8 격자 한가운데 세로 막대가 서 있다고 합시다.
이 막대를 오른쪽으로 딱 한 칸 옮기면 어떻게 될까요?
사람에게는 같은 막대입니다. 그런데 픽셀을 통째로 쓰는 신경망에게는
64칸 중 16칸의 값이 달라진 완전히 새로운 입력이에요.
두 칸을 옮기면 32칸이 달라집니다 — 격자의 절반입니다.
막대가 놓일 수 있는 자리마다 신경망은 가중치를 새로 배워야 합니다.
왼쪽에 선 막대를 알아보는 법을 배웠어도, 오른쪽에 선 막대는 처음 보는 것이 되지요.
⚠️ 이것은 데이터를 더 모아서 풀 문제가 아니다
"막대를 여러 자리에 놓은 사진을 다 모아서 학습시키면 되지 않나?" —
그렇게 할 수도 있습니다. 그러나 그것은 같은 것을 자리마다 따로 외우는 방식이에요.
고양이가 사진의 왼쪽 위에 있을 때, 가운데 있을 때, 오른쪽 아래에 있을 때를
각각 배워야 한다면 배울 것이 자리 수만큼 늘어납니다.
필요한 것은 "어디에 있든 같은 것"이라고 볼 줄 아는 구조입니다.
정리하면, 픽셀을 통째로 넣는 방식은 수가 너무 많고,
위치가 바뀌면 못 알아봅니다.
합성곱은 이 두 문제를 한 가지 발상으로 동시에 해결합니다.
작은 창 하나를 만들어서, 그것을 그림 전체에 돌려 쓰는 것입니다.
2
합성곱 — 작은 창을 밀며 곱해서 더한다
합성곱(convolution)의
절차는 세 줄이면 끝납니다.
3×3짜리 숫자 판(필터 또는 커널)을 이미지의 왼쪽 위에 겹쳐 놓는다.
겹친 아홉 자리끼리 곱해서 전부 더한다. 그 값 하나를 적어 둔다.
필터를 오른쪽으로 한 칸 밀고 2번을 되풀이한다.
줄 끝에 닿으면 아래로 한 칸 내려가 다시 왼쪽부터.
이렇게 얻은 숫자들을 원래 자리대로 모으면 새 격자가 하나 나옵니다.
이것을 특징지도(feature map)라고 불러요.
"필터가 찾는 것이 어디에 얼마나 있는가"를 적어 둔 지도입니다.
왼쪽 붉은 격자가 입력 이미지, 가운데 0과 1이 적힌 작은 판이 3×3 필터, 오른쪽 푸른 격자가 특징지도다.
왼쪽 격자의 한 구역에서 뻗은 선이 가운데 필터로 모이고, 필터에서 나온 선은
오른쪽 특징지도의 칸 하나로 모인다 — 겹친 아홉 자리를 곱해 더한 값 하나가 그 칸에 적힌다는 뜻이다.
창을 한 칸씩 밀면서 이것을 되풀이하면 오른쪽 격자가 채워진다.
출처: Cecbur, Wikimedia Commons (CC BY-SA 4.0)
크기가 조금 줄어드는 데 주의하세요.
8×8 그림에 3×3 필터를 밀면 창을 놓을 수 있는 자리가 가로 6곳 · 세로 6곳이라
특징지도는 6×6이 됩니다.
12×12 그림이면 10×10이 되고요.
가장자리에서는 창이 그림 밖으로 나가 버려 놓을 자리가 없기 때문입니다.
일반적으로 n칸짜리 그림에 k칸짜리 필터를 밀면 (n − k + 1)칸이 나옵니다.
세로 경계 검출기를 밀어 본다
필터에 어떤 숫자를 넣어야 할까요? 아래 아홉 숫자를 봅시다.
세로 검출기 — 왼쪽 줄은 +1, 가운데는 0, 오른쪽 줄은 −11 0 -11 0 -11 0 -1
이 필터가 하는 일은 "창의 왼쪽 세 칸 합에서 오른쪽 세 칸 합을 뺀다"입니다.
왼쪽이 밝고 오른쪽이 어두우면 큰 양수, 반대면 큰 음수, 양쪽이 같으면 0이 나와요.
즉 좌우로 밝기가 갈리는 자리를 찾습니다. 그런 자리가 바로 세로로 뻗은 경계입니다.
8×8 격자 가운데(3·4열)에 세로 막대를 세우고 이 필터를 밀면
특징지도의 모든 줄이 이렇게 나옵니다.
세로 막대(8×8)에 세로 검출기를 밀었을 때 — 6×6 특징지도의 한 줄[0, -3, -3, 3, 3, 0]
읽어 봅시다. 막대의 왼쪽 가장자리에서 −3, 오른쪽 가장자리에서 +3이
나왔습니다. 그리고 막대 안쪽은 0이에요.
획이 진하게 칠해진 자리인데도 0입니다.
💡 검출기가 찾는 것은 획이 아니라 획의 '경계'다
막대 안쪽에서는 창의 왼쪽 세 칸도 1, 오른쪽 세 칸도 1이라 빼면 0입니다.
밝기가 변하지 않는 자리는 이 필터에게 아무것도 아니에요.
값이 크게 나오는 곳은 밝기가 갑자기 바뀌는 자리뿐입니다.
사람이 그림에서 물체를 알아볼 때도 안쪽 색보다 테두리를 먼저 보지요.
컴퓨터 비전의 첫 단계가 경계 검출인 까닭이 여기에 있습니다.
같은 격자에 가로 검출기를 밀면 어떻게 될까요?
가로 검출기는 위 줄이 +1, 가운데 0, 아래 줄이 −1인 필터입니다 — 위아래 밝기 차를 봅니다.
세로 막대에서는 위아래로 밝기가 변하는 자리가 없으므로 결과는 36칸 전부 0입니다.
세로 막대 + 세로 검출기0-3-33300-3-33300-3-33300-3-33300-3-33300-3-3330
이제 그림만 90도 돌려 봅시다. 필터는 한 글자도 고치지 않고, 격자에 가로 막대를 그립니다.
그러면 결과가 정확히 뒤바뀝니다 — 세로 검출기가 전부 0이 되고,
가로 검출기가 −3 두 줄과 +3 두 줄을 냅니다.
무엇을 찾는가는 필터의 아홉 숫자가 정합니다.
왜 필터 값의 합을 0으로 맞추는가
세로·가로 검출기의 아홉 숫자를 더해 보세요. 둘 다 0입니다. 우연이 아닙니다.
필터 값의 합이 0이면, 그림 전체의 밝기가 통째로 올라가도 결과가 하나도 바뀌지 않습니다.
배경 0을 1로, 획 1을 2로 바꿔 그림 전체를 한 칸 밝게 해 보면
특징지도의 모든 칸의 변화량이 0이에요.
반면 아홉 칸이 전부 1인 '흐리기 필터'(합 9)는 모든 칸이 정확히 +9씩 밀립니다.
사진은 조명에 따라 전체가 밝아지거나 어두워집니다.
경계를 찾는 일은 조명과 무관해야 하지요.
필터 값의 합을 0으로 두는 것이 그 성질을 만드는 방법입니다.
이것은 뒤의 실습에서 코드 두 줄로 직접 확인합니다.
3
필터마다 보는 것이 다르다 — 그런데 무엇으로 재는가
필터를 넉 장 준비했습니다. 아홉 숫자만 다를 뿐, 계산 절차는 넷 다 똑같습니다.
필터 넉 장 — 아홉 숫자를 사람이 손으로 정한 것이다.
넷 다 값의 합이 0이라, 그림 전체가 밝아져도 결과가 흔들리지 않는다.
이름
아홉 숫자
값의 합
낼 수 있는 가장 큰 값
무엇을 찾는가
세로 검출기
[[1,0,−1],[1,0,−1],[1,0,−1]]
0
3
좌우로 밝기가 갈리는 자리
가로 검출기
[[1,1,1],[0,0,0],[−1,−1,−1]]
0
3
위아래로 밝기가 갈리는 자리
대각 검출기
[[1,1,0],[1,0,−1],[0,−1,−1]]
0
3
왼쪽 위와 오른쪽 아래가 갈리는 자리
외곽 검출기
[[−1,−1,−1],[−1,8,−1],[−1,−1,−1]]
0
8
가운데만 주변과 다른 자리
이 넉 장을 앞에서 본 12×12 손글씨 7에 밀면 특징지도가 넉 장 나옵니다.
그중 두 장만 봅시다. 반응이 3 이상이면 #, 1~2면 +, 0이면 .,
−1~−2면 -, −3 이하면 =로 바꿔 그린 것입니다.
눈으로도 차이가 보입니다. 그런데 눈으로 보인다는 것으로는 부족해요.
"어느 필터가 크게 반응하는가"를 숫자로 재야 합니다.
그리고 여기가 오늘 수업에서 가장 조심해야 하는 자리입니다.
잣대를 잘못 고르면 답이 뒤집힌다
먼저 특징지도를 세 구간으로 나눕니다.
특징지도의 행 i는 원래 그림의 행 i부터 i+2까지를 본 결과이므로,
숫자 7의 세 획이 이렇게 대응됩니다.
가로획 자리 — 특징지도의 0~1행 (20칸)
대각획 자리 — 특징지도의 2~6행 (50칸)
세로획 자리 — 특징지도의 7~9행 (30칸)
이제 가장 그럴듯해 보이는 잣대부터 써 봅시다. 구간마다 반응 크기의 평균을 냅니다.
"얼마나 세게 반응했나"를 재는 것이지요. 결과는 이렇습니다.
구간별 반응 크기의 평균으로 잰 결과 — 넉 장 모두 가로획이 이긴다.
이 잣대로는 필터마다 보는 것이 다르다는 사실이 전혀 드러나지 않는다.
필터
가로획 자리
대각획 자리
세로획 자리
가장 큰 자리
세로 검출기
1.00
0.84
1.00
가로획
가로 검출기
2.10
1.00
0.33
가로획
대각 검출기
1.60
1.24
0.80
가로획
외곽 검출기
3.00
1.88
1.33
가로획
넉 장이 전부 가로획을 가리킵니다. 왜 그럴까요?
가로획에 잉크가 가장 많이 칠해져 있기 때문입니다.
획이 많은 자리는 어떤 필터를 들이대도 값이 크게 나와요.
이 잣대는 어디에 획이 많은가를 재고 있을 뿐, 어떤 모양인가를 재지 못합니다.
잣대를 바꿔 봅시다. 세기의 평균 대신,
필터가 최대로 반응한 칸이 몇 %인가를 셉니다.
ℹ️ 왜 하필 문턱이 3인가
세로·가로·대각 검출기는 값이 +1, 0, −1뿐이고 +1이 세 개 들어 있습니다.
그러므로 0과 1로 된 그림에서 이 필터들이 낼 수 있는 가장 큰 값이 정확히 3이에요.
반응의 크기가 3이라는 것은 "이 자리에서 필터가 최대로 반응했다"는 뜻입니다.
문턱 3은 아무렇게나 고른 값이 아니라 필터 자체가 정해 준 값입니다.
(외곽 검출기만 가운데가 8이라 최대 8까지 나옵니다. 그래서 같은 잣대에서 유독 많은 칸이 걸립니다.)
같은 자료를 반응의 크기가 3 이상인 칸의 비율로 다시 잰 결과.
잣대 하나를 바꾸었을 뿐인데 필터마다 다른 자리를 가리킨다.
⚠️ 이 표를 공책에 옮길 때는 잣대 문장을 반드시 함께 적어야 한다.
필터
가로획 자리
대각획 자리
세로획 자리
전체 100칸 중
가장 촘촘한 자리
세로 검출기
10%
2%
20%
9칸
세로획
가로 검출기
50%
6%
0%
13칸
가로획
대각 검출기
5%
18%
10%
13칸
대각획
외곽 검출기
75%
44%
30%
46칸
가로획(방향을 안 가림)
이제 보입니다. 세로 검출기는 세로획 자리에서, 가로 검출기는 가로획 자리에서,
대각 검출기는 대각획 자리에서 가장 촘촘하게 반응합니다.
특히 가로 검출기의 세로획 자리는 0%예요 —
세로획이 분명히 있는데도 단 한 칸도 최대로 반응하지 않습니다.
외곽 검출기만 셋과 다릅니다. 어느 자리에서나 크게 반응해요(75% · 44% · 30%).
방향을 가리지 않는 필터이기 때문입니다. 이것도 쓸모가 있습니다 —
"여기에 무언가 있다"는 알려 주지만 "어떤 모양인가"는 알려 주지 못하는 필터입니다.
⚠️ 잣대가 결론을 떠받친다
문턱을 3이 아닌 값으로 바꿔 보면 이 표가 통째로 무너집니다.
문턱 1에서는 세로 검출기가 대각획을 가리키고, 문턱 2에서는 가로획을 가리켜요.
문턱을 4 이상으로 올리면 세 방향 검출기가 전부 '해당 없음'이 됩니다
(최댓값이 3이라 4 이상이 아예 안 나오니까요).
"어느 필터가 크게 반응하나?"라는 물음만 던지면 사람마다 다른 답에 도달합니다.
재는 방법을 정하지 않은 물음은 답을 정할 수 없는 물음입니다.
4
같은 필터를 온 그림에 돌려 쓴다 — 두 문제가 한꺼번에 풀린다
개념 1에서 두 가지가 무너진다고 했지요. 합성곱은 그 둘을 한 가지 발상으로 풉니다.
바로 같은 필터를 그림 전체에 돌려 쓰는 것입니다.
이것을 가중치 공유(weight sharing)라고 부릅니다.
① 가중치가 줄어든다
12×12 그림을 예로 들어 세어 봅시다.
가중치 개수 비교. 3×3 필터는 자리가 몇 곳이든 가중치가 아홉 개뿐이다 —
같은 아홉 개를 100자리에 되풀이해서 쓰기 때문이다.
그림
픽셀을 통째로 (완전연결)
3×3 필터
차이
12×12 흑백 (오늘 실습)
입력 144 × 은닉 10 = 1,440개
필터 4장 = 36개
40배
224×224 컬러 (실제 사진)
입력 150,528 × 은닉 100 = 15,052,800개
필터 64장 = 1,728개
8,711배
1,500만 개가 1,728개가 됩니다. 8,711배예요.
게다가 필터를 64장이나 쓰고도 그렇습니다.
"이 층이 무엇을 볼 것인가"를 64가지나 두면서도 조절할 손잡이는 2천 개가 안 됩니다.
② 물체가 옮겨져도 같은 것을 찾는다
개념 1에서 막대를 한 칸 옮기면 픽셀 64칸 중 16칸이 달라진다고 했지요.
같은 실험을 합성곱으로 해 봅시다. 세로 검출기 한 장만 씁니다.
세로 막대(8×8)를 오른쪽으로 옮기며 잰 결과.
필터는 한 장뿐인데도 막대가 어디로 가든 똑같이 +3을 찾아낸다.
옮긴 칸
픽셀 64칸 중 달라진 칸
세로 검출기의 한 줄
최대 반응
2×2 풀링 뒤 9칸 중 같은 칸
0칸 (원래)
—
[0, −3, −3, 3, 3, 0]
+3
—
1칸
16칸
[0, 0, −3, −3, 3, 3]
+3
6개
2칸
32칸
[0, 0, 0, −3, −3, 3]
+3
6개
특징지도를 보세요. 값이 달라진 것이 아니라 그대로 오른쪽으로 밀렸을 뿐입니다.
1칸 옮기면 1칸 밀리고, 2칸 옮기면 2칸 밀립니다. 최대 반응값은 +3 그대로예요.
픽셀을 통째로 쓰는 신경망에게는 "완전히 다른 입력 두 개"였던 것이,
합성곱에게는 같은 것이 다른 자리에 있는 것이 됩니다.
이 성질을 위치 불변성이라고 부릅니다.
고양이를 알아보는 필터 한 장을 배우면, 고양이가 사진의 어디에 있어도 그 필터가 찾아냅니다.
자리마다 따로 배울 필요가 없어요.
가중치 공유와 위치 불변성은 같은 사실의 두 얼굴입니다.
5
풀링과 층 쌓기 — 줄이고, 다시 보고, 또 줄인다
합성곱을 한 번 하면 12×12가 10×10이 됩니다. 별로 줄지 않았지요.
그런데 필터를 넉 장 쓰면 특징지도도 넉 장이라 오히려 숫자가 늘어납니다(100 × 4 = 400개).
뒤에 올 층이 다뤄야 할 숫자를 줄여 줄 장치가 하나 더 필요합니다.
풀링 — 근처에서 가장 센 것만 남긴다
풀링(pooling)은
간단합니다. 특징지도를 2×2씩 겹치지 않게 나누고, 네 값 중 가장 큰 것 하나만 남깁니다.
이것을 최대 풀링이라고 해요. 10×10은 5×5가 됩니다.
세로 검출기의 특징지도(10×10)에 2×2 최대 풀링을 한 결과 (5×5)-2 0 0 0 3
0 0 0 13
0 0 121
0 131 0
0 33 0 0
칸 수를 따라가 보면 144칸 → 100칸 → 25칸입니다.
원래 그림에 견주어 5.8분의 1로 줄었어요.
그런데도 강한 반응이 어느 근처에 있었는지는 그대로 남아 있습니다 —
아래쪽 왼편(세로획 자리)에 3이 셋, 오른쪽 위(가로획 끝자리)에 3이 둘입니다.
정확한 자리는 버리고 '이 근처에 강한 반응이 있었다'만 남기는 것이 풀링입니다.
⚠️ 풀링이 위치를 '없애지'는 않는다
흔히 "풀링을 하면 위치 정보가 사라진다"고 말합니다. 정확하지 않아요.
앞의 표를 다시 보세요 — 막대를 1칸 옮겼을 때 2×2 풀링 뒤 9칸 중 같은 칸은 6개였습니다.
나머지 3칸은 여전히 달라집니다. 2칸을 옮겨도 마찬가지로 6개였고요.
위치가 흐려지는 것이지 사라지는 것이 아닙니다.
요약은 늘 무언가를 버리지만, 얼마나 버렸는지는 세어 봐야 압니다.
층을 쌓으면 보는 것이 달라진다
이제 마지막 발상입니다. 합성곱과 풀링을 한 번만 하지 않고 여러 번 되풀이합니다.
첫 층의 특징지도를 입력으로 삼아 그 위에 또 합성곱을 하는 것이지요.
합성곱 층을 네 겹 쌓은 신경망을 한 줄(1차원)로 그린 것이다.
맨 아래가 입력이고 위로 갈수록 깊은 층이다. 회색 점선 사이의 검은 화살표를 따라가 보면
맨 위의 칸 하나가 실제로 보고 있는 범위가 한 층 내려갈 때마다 넓어진다 —
3칸 → 5칸 → 7칸 → 9칸. 층을 지날 때마다 양옆으로 한 칸씩 늘어나는 셈이다.
우리 격자에서는 같은 일이 가로·세로 두 방향으로 한꺼번에 일어난다.
(그림에서는 층마다 칸 수가 같은데, 가장자리를 따로 채워 넣고 그렸기 때문이다.
우리 코드는 그렇게 하지 않아 12×12가 10×10으로 줄어든다.)
출처: Vicente Oyanedel M., Wikimedia Commons (CC BY-SA 4.0)
층이 깊어질수록 한 칸이 원래 그림에서 보는 범위가 넓어집니다.
첫 층의 한 칸은 원래 그림의 3×3만 봅니다.
그 위에 3×3을 또 밀면, 두 번째 층의 한 칸은 원래 그림의 5×5를 보게 되지요.
풀링까지 끼우면 범위가 더 빨리 넓어집니다.
넓게 볼 수 있게 되면 볼 수 있는 것의 종류가 달라집니다.
3×3 안에서는 '선'밖에 보이지 않지만, 20×20 안에서는 '눈'이 보이고,
100×100 안에서는 '얼굴'이 보입니다.
층이 깊어질수록 추상적인 것을 본다. 다만 이 그림은 사람이 붙인 이름이다 —
실제 신경망 안에는 "여기가 눈을 보는 층"이라는 표시가 어디에도 없다.
연구자들이 각 층의 필터가 무엇에 크게 반응하는지 거꾸로 조사해서 알아낸 것이다.
여기까지가 합성곱 신경망(CNN)의
뼈대입니다. 합성곱과 풀링을 몇 겹 지나 격자가 충분히 작아지면,
마지막에는 남은 숫자들을 한 줄로 쭉 펴서 14차시에서 만든 것과 같은
보통의 층에 넣고 답을 뽑습니다.
앞쪽은 '무엇이 어디에 있는지'를 뽑아내는 눈이고, 뒤쪽은 그 눈이 뽑아 준 것으로 판단하는 부분이에요.
이 구조로 컴퓨터는 사진을 분류하고(이 사진은 개인가 고양이인가),
물체를 찾아내고(사진의 어디에 사람이 있는가), 화면을 조각냅니다(어디부터 어디까지가 도로인가).
자율주행차의 카메라도, 병원의 영상 판독 보조 장치도, 휴대전화의 얼굴 잠금 해제도 같은 뼈대를 씁니다.
6
⚠️ 오늘 여기에는 학습이 없다 — 그 아홉 숫자는 누가 정하는가
여기서 오늘 수업의 가장 중요한 문장을 적습니다.
⚠️ 반드시 짚고 갈 것
오늘 우리가 쓴 필터 넉 장의 아홉 숫자는
사람이 손으로 정했습니다. 여기에는 학습이 없습니다.
오늘 만든 것은 합성곱 신경망이 아니라 합성곱 한 층이고, 그 층의 가중치를
기계가 아니라 우리가 적어 넣은 것입니다.
그러면 물음이 남습니다. 그 아홉 숫자는 원래 누가 정하나요?
"세로선을 찾으려면 왼쪽 +1 오른쪽 −1"은 사람이 생각해 낼 수 있습니다.
그런데 고양이 수염을 찾는 필터는요? 도로 표지판의 모서리를 찾는 필터는요?
사람이 하나하나 손으로 적을 수 있을까요?
무작위로 뽑으면 어떻게 되는지 세어 봤다
실험을 하나 해 봤습니다. 3×3 필터의 아홉 칸에 −1, 0, +1 중 하나를
아무렇게나 넣어 12장을 만들었어요. 그리고 각 필터가
숫자 7과 숫자 1을 얼마나 잘 가려내는지 쟀습니다.
재는 방법은 이렇습니다. 같은 필터로 7의 특징지도와 1의 특징지도를 각각 만들고,
강한 반응 칸 수의 차이를 봅니다.
차이가 크면 두 숫자를 가려낼 수 있고, 0에 가까우면 구별하지 못합니다.
아무리 세게 반응해도 둘 다 똑같이 세게 반응하면 쓸모가 없으니까요.
손으로 정한 넉 장 — 숫자 7과 숫자 1에서 강한 반응 칸 수(100칸 중).
세로 검출기의 차이가 가장 크다. 세로획 하나뿐인 숫자 1에 가로 검출기는 0칸 반응한다.
필터
숫자 7
숫자 1
차이
세로 검출기
9칸
32칸
23
가로 검출기
13칸
0칸
13
대각 검출기
13칸
2칸
11
외곽 검출기
46칸
36칸
10
손으로 정한 넉 장의 차이는 평균 14.2칸입니다.
무작위로 뽑은 12장은 어땠을까요?
12장의 차이 평균은 3.8칸입니다(가장 큰 것 7칸 · 가장 작은 것 0칸).
손으로 정한 넉 장의 3.7분의 1이에요.
12장 중 3장은 숫자 7에 강한 반응이 하나도 없습니다.
이 필터들은 아무것도 못 봅니다.
12장 중 10장은 아홉 숫자의 합이 0이 아닙니다.
이런 필터는 경계가 아니라 창 안에 획이 얼마나 들어 있나(잉크 양)에 반응해요.
반응이 있는 9장을 가장 촘촘한 자리로 나눠 세면 가로획 5장 · 대각획 1장 · 세로획 3장입니다.
어딘가에는 반응하지만, 내가 원하는 것을 골라 주지는 않습니다.
여기서 답이 나옵니다. 무작위로 뽑아서는 안 됩니다.
그렇다고 사람이 수천 장을 손으로 적을 수도 없습니다.
그러면 어떻게 할까요?
📖 14차시로 되돌아간다
14차시에서 우리는 신경망의 가중치를 어떻게 정했는지 떠올려 보세요.
무작위 숫자에서 시작해, 답이 틀린 만큼을 되돌려 보내며(역전파)
손실이 줄어드는 쪽으로 가중치를 조금씩 고쳤습니다.
진짜 합성곱 신경망도 똑같이 합니다. 필터의 아홉 숫자는 그냥 가중치이고,
기계는 그것을 역전파로 배웁니다.
오늘 우리가 손으로 한 일 — "세로선을 찾으려면 왼쪽 +1 오른쪽 −1" 같은 판단 —
을 데이터가 대신 해 주는 것입니다.
방금 본 무작위 12장이 바로 학습이 시작하는 자리예요.
학습은 그 3.8칸을 14.2칸 너머로 밀어 올리는 과정입니다.
그래서 앞의 층 그림에 붙인 이름 — 선 · 부품 · 물체 — 도 사람이 미리 정해 준 것이 아닙니다.
학습이 끝난 뒤 조사해 보니 그렇게 되어 있었다는 뜻이에요.
아무도 "1층은 선을 봐라"라고 시키지 않았는데도 그렇게 됩니다.
그래서 완벽한가 — 아주 작은 잡음이 결론을 흔든다
합성곱 신경망은 강력하지만 사람의 눈과 같은 방식으로 보지는 않습니다.
그 차이가 드러나는 유명한 현상이 적대적 예제(adversarial example)입니다.
사람 눈에는 달라진 것이 거의 없는 사진에 계산된 잡음을 살짝 얹으면,
판다 사진을 긴팔원숭이라고 답하게 만들 수 있다는 보고가 실제로 있었습니다.
가장 작은 형태는 우리 12×12 그림으로도 만들어 볼 수 있습니다.
그림의 몇 칸을 뒤집기만 하고(0을 1로, 1을 0으로) 세로 검출기의 결론이 흔들리는지 재 봤어요.
12×12 손글씨 7의 픽셀을 무작위로 뒤집었을 때. 각 줄은 20번 되풀이한 결과다.
'결론'은 개념 3의 잣대로 잰 가장 촘촘한 자리가 세로획이 아니게 된 경우를 말한다.
뒤집은 픽셀
144칸 중 비율
특징지도 100칸 중 달라진 칸
결론이 바뀐 경우
1칸
0.7%
4.2칸
0 / 20
3칸
2.1%
11.2칸
1 / 20
5칸
3.5%
20.2칸
4 / 20
10칸
6.9%
33.0칸
9 / 20
20칸
13.9%
48.6칸
11 / 20
144칸 중 20칸(13.9%)만 뒤집어도 특징지도의 절반 가까이가 달라지고,
결론은 20번 중 11번 흔들립니다.
그 정도로 지저분해진 그림도 사람 눈에는 여전히 7이에요.
사람이 보는 것과 필터가 보는 것이 같지 않다는 증거입니다.
이것이 왜 위험한지는 자율주행을 생각하면 분명합니다.
정지 표지판에 스티커 몇 장을 붙였을 뿐인데 인공지능이 다른 표지판으로 읽는다면,
그 오차는 사고가 됩니다.
성능이 좋다는 것과 믿을 수 있다는 것은 다른 말이에요.
이 물음은 3단원에서 다시 만납니다.
💻
손으로 ① — 필터 밀기 판, 아홉 숫자를 내가 정한다
여기까지 읽은 것을 손으로 확인할 차례입니다.
아래 판은 진짜로 계산합니다. 가운데 아홉 칸에 여러분이 숫자를 넣으면,
그 자리에서 왼쪽 그림 위로 창이 밀려가며 오른쪽 특징지도가 만들어집니다.
그리고 왼쪽 그림의 칸을 눌러 0과 1을 뒤집을 수 있습니다.
획을 지우거나 없던 자리에 점을 찍어 보세요.
이 기능으로 개념 6의 잡음 실험을 여러분 손으로 다시 할 수 있습니다.
🔍 필터 밀기 판 — 창을 밀며 곱해서 더한다INTERACTIVE
왼쪽이 그림, 가운데가 지금 창 안에서 벌어지는 곱셈 아홉 개,
오른쪽이 특징지도다. ▶ 창 밀기를 누르면 창이 한 칸씩 밀리며
특징지도가 왼쪽 위부터 채워진다. 노란 테두리가 지금 곱하고 있는 아홉 칸이다.
그림의 칸을 직접 눌러 0과 1을 뒤집을 수도 있다.
필터의 아홉 숫자 — 직접 고쳐 보세요 (−9부터 9까지의 정수)
미리 만들어 둔 필터 — 눌러서 아홉 칸을 채웁니다
창 위치 (행, 열)—
이 창의 합—
특징지도 크기10×10
강한 반응 칸 (3 이상)9
가장 촘촘한 자리세로획
필터 아홉 숫자의 합0
7과 1의 강한 칸 차이23
원래 그림과 다른 칸0
가로획 자리 (0~1행)10%
대각획 자리 (2~6행)2%
세로획 자리 (7~9행)20%
[안내] 손글씨 7 · 세로 검출기로 시작합니다.
▶ 창 밀기를 눌러 100칸이 채워지는 것을 보세요.
※ 이 판의 계산은 아래 파이썬 코드와 같은 알고리즘입니다 —
같은 그림에 같은 필터를 넣으면 두 곳의 숫자가 정확히 같습니다. 나란히 놓고 대조해 보세요.
※ 구간 이름(가로획·대각획·세로획)은 손글씨 7 그림을 기준으로 붙인 것이고,
다른 그림에서는 그냥 특징지도의 위·가운데·아래 구간을 뜻합니다.
※ 🎲 무작위는 −1·0·+1 중에서 아홉 칸을 아무렇게나 뽑습니다.
눌러 볼 때마다 다른 필터가 나오므로, 개념 6에 적힌 12장과는 다른 필터입니다.
과제 ① 표를 채운다 — 필터 넉 장을 겨루게 한다
그림을 손글씨 7로 두고, 프리셋 버튼 넉 장을 차례로 누르며 표를 채우세요.
개념 3의 표와 같은 숫자가 나오면 제대로 읽은 것입니다.
필터
가로획 자리
대각획 자리
세로획 자리
강한 반응 칸
가장 촘촘한 자리
세로 검출기
가로 검출기
대각 검출기
외곽 검출기
흐리기 필터
다섯째 줄의 흐리기 필터(아홉 칸 전부 1)를 눈여겨보세요.
아홉 숫자의 합이 9라 음수가 아예 나오지 않습니다.
이 필터는 경계를 찾는 것이 아니라 창 안에 획이 몇 칸 있는지를 셉니다.
"값이 크다"와 "경계를 찾았다"가 같은 말이 아니라는 것을 여기서 확인하세요.
과제 ② 반례를 만든다 — 특정 획에만 반응하는 필터
이제 여러분 차례입니다. 아홉 칸을 직접 채워 대각획 자리에서만 크게 반응하는 필터를
만들어 보세요. 목표는 이렇습니다.
그림을 손글씨 7로 둡니다.
아홉 칸을 고쳐 가며 대각획 자리의 비율이 가장 높아지도록 만듭니다.
대각 검출기의 18%를 넘겨 보세요.
동시에 아홉 숫자의 합은 0으로 유지합니다.
합이 0이 아니면 경계가 아니라 잉크 양을 세게 되니까요.
완성한 아홉 숫자와 세 구간의 비율을 공책에 적으세요.
확인 문제 3번에서 다시 묻습니다.
💡 막히면 이렇게 생각해 보세요
필터는 자기가 찾고 싶은 모양을 그대로 그려 놓은 것에 가깝습니다.
세로 검출기의 아홉 숫자를 그림으로 보면 왼쪽에 +, 오른쪽에 −인 세로줄이지요.
대각획은 오른쪽 위에서 왼쪽 아래로 내려갑니다.
그러면 그 방향과 직각으로 +와 −가 갈리게 놓아야 합니다.
대각 검출기 [[1,1,0],[1,0,−1],[0,−1,−1]]이 정확히 그 모양이에요.
여기서 값을 키우거나(예: 2로), 0의 자리를 옮기면 어떻게 되는지 재 보세요.
과제 ③ 문턱을 찾는다 — 몇 칸을 지워야 결론이 바뀌나
개념 6의 잡음 실험을 손으로 다시 해 봅니다.
그림을 손글씨 7, 필터를 세로 검출기로 두세요.
'가장 촘촘한 자리'가 세로획인 것을 확인합니다.
그림의 칸을 한 칸씩 눌러 뒤집습니다.
누를 때마다 '원래 그림과 다른 칸' 값이 하나씩 올라갑니다.
'가장 촘촘한 자리'가 세로획이 아니게 되는 순간을 찾으세요.
몇 칸 만에 바뀌었나요? 그때의 칸 수를 공책에 적습니다.
🔄 초기화 뒤 다른 자리를 골라 다시 해 보세요.
같은 칸 수에서 바뀌나요, 다른가요?
어느 자리를 건드리는가에 따라 결과가 크게 달라진다면, 그것이 바로
적대적 예제를 만드는 사람이 노리는 지점입니다.
💻
손으로 ② — 합성곱을 스무 줄로 직접 짠다
시뮬레이터는 누군가 미리 만들어 둔 것입니다. 이제 계산 자체를 짜 봅시다.
아래 프로그램에서 합성곱의 핵심은 딱 한 줄이고, 그 한 줄이 빈칸입니다.
⚠️ 빈칸은 두 곳입니다
?????가 두 군데 있습니다.
① convolve() 안 — 창 안에서 겹친 자리끼리
무엇을 해야 할까요? 힌트는 이미지 값과 필터 값을 곱해서 전부 더한다입니다.
이미지의 그 자리는 image[i + a][j + b], 필터의 그 자리는 kernel[a][b]예요.
② pool_max() 안 — 창 안에 있는
size × size개의 값 중 무엇만 남기나요? 힌트는 가장 큰 값 하나입니다.
채우지 않고 실행하면 SyntaxError가 납니다 — 정상입니다.
오류 메시지가 몇 번째 줄을 가리키는지 읽고 그 줄로 가세요.
제대로 채웠다면 【1】의 세로 검출기 한 줄이
[0, -3, -3, 3, 3, 0]으로 찍히고, 가로 검출기는 [0, 0, 0, 0, 0, 0]이 나옵니다.
계산은 순식간에 끝나요 — 12×12 격자에 3×3 필터를 미는 일은 곱셈 900번 정도입니다.
💡 출력이 아홉 토막입니다 — 오늘 반드시 볼 것은 【1】~【5】
출력이 길어 보이지만 겁먹지 마세요. 오늘 40분 안에 꼭 볼 것은 다섯 토막입니다.
【1】 8×8 세로 막대 — 두 필터를 밀어 본다
【2】 같은 코드, 그림만 가로 막대로 — 반응이 정확히 뒤바뀐다
【3】 12×12 손글씨 7 — 특징지도 넉 장
【4】 개념 3의 두 표(비율과 평균)가 그대로 찍힌다
【5】 풀링 — 144칸 → 100칸 → 25칸
【6】부터 【9】까지는 개념 4와 6에서 이야기한 실험들입니다.
시간이 남으면, 또는 집에서 이어서 읽어 보세요.
코드에서 확인할 세 자리
합성곱은 네 겹 반복이다. 바깥 두 겹(i·j)이
창을 어디에 놓을지를 정하고, 안쪽 두 겹(a·b)이
창 안의 아홉 칸을 훑습니다. 빈칸 ①은 가장 안쪽에 있습니다.
결과 크기는 range(n - k + 1)이 정한다.
이 한 줄 때문에 12×12가 10×10이 되고 8×8이 6×6이 됩니다.
STRONG = 3이 개념 3의 표를 떠받친다.
이 값을 2로 바꾸고 다시 돌려 보세요. 【4】의 결론이 통째로 달라집니다.
필터 값의 합이 왜 0이어야 하는가 — 한 줄만 바꿔 확인한다
개념 2 끝에서 말한 것을 직접 재 봅니다.
그림 전체를 한 칸 밝게 하면(배경 0을 1로, 획 1을 2로) 특징지도가 어떻게 달라질까요?
결과는 [0]과 [9]입니다.
합이 0인 필터는 변화량이 모든 칸에서 0이고,
합이 9인 흐리기 필터는 모든 칸이 정확히 +9씩 밀립니다.
경계 검출기의 아홉 숫자를 합 0으로 맞춰 두는 까닭이 이 두 줄에 다 들어 있어요.
더 부숴 볼 것 — 답을 미리 재 두었다
코드를 고쳐서 돌려 보고 싶은 것이 있을 겁니다. 아래는 실제로 돌려 본 결과입니다.
먼저 예측하고 나서 열어 보세요.
[[1,0,-1],...]를 [[-1,0,1],...]로 바꿔 봅니다.
결과는 부호만 뒤집히고 크기는 그대로입니다.
한 줄이 [0, -3, -3, 3, 3, 0]에서 [0, 3, 3, -3, -3, 0]이 되고,
강한 반응 칸 수는 9칸에서 9칸으로 그대로예요.
뜻으로 읽으면 이렇습니다 — 이 필터는 같은 것을 찾습니다.
'왼쪽이 밝다'와 '오른쪽이 밝다'가 서로 바뀔 뿐이지요.
그래서 강한 반응을 셀 때 절댓값을 쓰는 것입니다.
세 가지가 한꺼번에 달라집니다.
특징지도가 10×10에서 8×8로 줄고(12 − 5 + 1 = 8),
낼 수 있는 가장 큰 값이 +3에서 +8로 커지며,
가중치가 9개에서 25개로 늘어납니다.
한 번에 넓게 보는 대신 값이 비싸집니다.
그래서 오늘날의 합성곱 신경망은 큰 필터를 한 장 쓰기보다
3×3을 여러 층 쌓는 쪽을 고릅니다.
3×3을 두 번 쌓으면 보는 범위는 5×5와 같아지는데 가중치는 9 + 9 = 18개로 25개보다 적으니까요.
합성곱 뒤의 100칸이 이렇게 줄어듭니다.
2×2 풀링 한 번 → 5×5 = 25칸 3×3 풀링 한 번 → 3×3 = 9칸 2×2 풀링 두 번 → 2×2 = 4칸
(그 결과는 [[0, 1], [1, 3]]입니다)
100개의 숫자가 4개로 줄었습니다. 줄이는 것은 이렇게 쉬워요.
문제는 어디까지 줄여도 되느냐입니다.
4개만 남은 상태에서 7과 1을 가려낼 수 있을까요?
그것은 데이터로 재 봐야 하는 물음이고, 실제로 사람들이 그렇게 정합니다.
image[i+a][j+b] * kernel[a][b]를
image[i+a][j+b] * kernel[b][a]로 적으면 어떻게 될까요?
필터를 대각선으로 뒤집어 쓰는 셈입니다(행과 열이 자리를 바꿉니다).
오류는 나지 않습니다. 프로그램은 멀쩡히 끝까지 돕니다.
대각 검출기와 외곽 검출기는 한 칸도 안 바뀝니다.
두 필터는 대각선으로 뒤집어도 자기 자신이거든요
([[1,1,0],[1,0,−1],[0,−1,−1]]을 뒤집어 보세요).
강한 반응 칸은 13칸과 46칸 그대로이고, 세 구간 비율도 5/18/10%와 75/44/30% 그대로입니다.
그런데 세로 검출기를 뒤집으면 가로 검출기가 됩니다.[[1,0,−1],[1,0,−1],[1,0,−1]]을 대각선으로 뒤집으면
[[1,1,1],[0,0,0],[−1,−1,−1]]이니까요. 그래서 개념 3의 표에서
세로 줄과 가로 줄이 통째로 자리를 바꿉니다 — 세로 검출기가
10/2/20%·9칸 대신 50/6/0%·13칸을 내고,
'가장 촘촘한 자리'가 세로획에서 가로획으로 바뀝니다.
【1】의 한 줄도 [0, −3, −3, 3, 3, 0]에서
[0, 0, 0, 0, 0, 0]이 되고요.
여기서 배울 것은 이것입니다. 고친 곳이 영향을 줄 자리를 먼저 정하고 확인해야 합니다.
하필 대각 검출기와 외곽 검출기만 들여다봤다면 넷 중 둘이 멀쩡하니
아무 이상이 없다고 넘겼을 거예요.
"몇 개 찍어 봤는데 맞더라"는 확인이 아닙니다.
📖
정리 — 오늘 얻은 것
이미지는 숫자 격자다
사진에는 '선'이라는 항목이 없다. 밝기 숫자만 있다.
픽셀을 통째로 넣으면 가중치가 폭발하고(224×224 컬러에서 1,500만 개),
물체가 한 칸만 옮겨져도 완전히 다른 입력이 된다.
합성곱 = 곱해서 더하기
작은 창을 밀며 겹친 자리끼리 곱해 더한다.
그것뿐인데 '여기에 세로 경계가 있다'가 +3과 −3으로 나온다.
획의 안쪽은 0이다 — 검출기가 찾는 것은 획이 아니라 경계다.
같은 필터를 돌려 쓴다
가중치가 8,711배 줄고, 물체가 옮겨져도 같은 것을 찾는다.
특징지도는 값이 바뀌는 것이 아니라 그대로 평행이동한다.
한 가지 발상이 두 문제를 동시에 푼다.
재는 방법이 결론을 정한다
평균으로 재면 넉 장 모두 가로획이 이긴다.
'최대로 반응한 칸의 비율'로 재야 필터마다 다른 자리가 드러난다.
잣대를 적지 않은 표는 표가 아니다.
여기에는 학습이 없다
오늘 아홉 숫자는 사람이 정했다.
무작위로 뽑으면 판별력이 3.7분의 1이고, 12장 중 3장은 아무것도 못 본다.
진짜 CNN은 그 숫자를 14차시의 역전파로 배운다.
좋다는 것과 믿을 수 있다는 것
144칸 중 20칸만 뒤집어도 결론이 20번 중 11번 흔들린다.
사람 눈에는 여전히 7인데도 그렇다.
성능을 재는 일과 안전을 따지는 일은 서로 다른 일이다.
이 단원의 흐름을 다시 세워 봅시다.
2차시부터 12차시까지는 표로 된 데이터를 다뤘습니다.
13·14차시에서 신경망을 만들었고, 15차시에서 그 신경망에 진짜 데이터를 넣어 성능을 쟀지요.
오늘 16차시는 그 신경망 앞에 눈을 하나 달아 준 셈입니다 —
사진을 숫자 몇 개짜리 특징으로 바꿔 주는 장치입니다.
다음 17차시는 말을 다룹니다.
이미지가 격자였다면 말은 줄줄이 이어진 낱말이에요.
도구가 달라지지만 물음은 같습니다 —
사람이 규칙을 적어 주지 않고, 데이터에서 규칙을 찾게 하려면 무엇을 세어야 하는가.
✅
확인 문제
✍️ 문제마다 답을 쓰고 제출하기를 누르세요. 제출하면 모범 답안이 열리고, 제출한 답은 선생님께 전달됩니다.
1. 224×224 크기의 컬러 사진을 픽셀 그대로 신경망의 입력으로 넣으면
어떤 문제가 생기는가? 두 가지를 쓰고, 첫째 문제에 대해서는
가중치 개수를 실제로 계산해 보이시오.
📖 모범 답안
① 가중치가 폭발한다. 픽셀 수는 224 × 224 × 3 = 150,528개다.
이것을 은닉 노드 100개에 모두 연결하면 가중치는 150,528 × 100 =
15,052,800개가 된다. 첫 층에서만 1,500만 개다.
계산과 저장이 무거울 뿐 아니라, 조절할 손잡이가 이렇게 많으면
11차시에서 본 과적합이 쉽게 일어난다.
② 물체가 조금만 옮겨져도 완전히 다른 입력이 된다.
8×8 격자의 세로 막대를 한 칸만 옮겨도 64칸 중 16칸이 달라진다.
사람에게는 같은 막대인데 신경망에게는 새 그림이라, 자리마다 가중치를 따로 배워야 한다.
합성곱은 같은 필터를 그림 전체에 돌려 쓰는 것 하나로 두 문제를 동시에 푼다.
3×3 필터 64장이면 가중치가 1,728개이고(8,711배 적다),
막대가 옮겨져도 특징지도가 그만큼 평행이동할 뿐이다.
2. 합성곱의 한 걸음을 말로 설명하시오 —
무엇을 어디에 놓고, 무엇을 계산해, 어디에 적는가.
그리고 12×12 그림에 3×3 필터를 밀면 특징지도가 왜 10×10이 되는지 쓰시오.
📖 모범 답안
한 걸음 — 3×3 필터를 이미지의 어느 자리에 겹쳐 놓고,
겹친 아홉 자리끼리 이미지 값 × 필터 값을 계산해 아홉 개를 모두 더한다.
그 합 하나를 특징지도의 대응하는 칸에 적는다.
그리고 필터를 오른쪽으로 한 칸 밀어 같은 일을 되풀이한다.
크기 — 3×3 창의 왼쪽 위 모서리를 놓을 수 있는 자리가
가로로 12 − 3 + 1 = 10곳, 세로로도 10곳이기 때문이다.
창이 더 오른쪽으로 가면 이미지 밖으로 나가 버려 놓을 자리가 없다.
일반적으로 n − k + 1이다.
3.오늘 시뮬레이터에서 직접 잰 결과다.
손글씨 7에 필터 넉 장을 밀었을 때
세 구간의 강한 반응 비율과 '가장 촘촘한 자리'를 표로 적고,
가로 검출기의 세로획 자리가 0%인 까닭을 필터의 아홉 숫자로 설명하시오.
또 과제 ②에서 여러분이 만든 필터의 아홉 숫자와 세 비율도 함께 적으시오.
📖 모범 답안
표 (반응의 크기가 3 이상인 칸의 비율 · 가로획 / 대각획 / 세로획)
세로 검출기 10% / 2% / 20% → 세로획 (전체 9칸)
가로 검출기 50% / 6% / 0% → 가로획 (전체 13칸)
대각 검출기 5% / 18% / 10% → 대각획 (전체 13칸)
외곽 검출기 75% / 44% / 30% → 가로획 (전체 46칸, 방향을 안 가림)
가로 검출기가 세로획 자리에서 0%인 까닭 —
가로 검출기는 [[1,1,1],[0,0,0],[-1,-1,-1]]이라
창의 위 세 칸 합에서 아래 세 칸 합을 뺀다.
곧게 선 세로획의 몸통에서는 위 세 칸과 아래 세 칸이 똑같으므로 빼면 0이다.
세로획이 분명히 있는데도 이 필터는 그것을 보지 못한다.
필터는 자기가 찾도록 만들어진 방향만 본다.
과제 ②는 사람마다 답이 다르다.
대각 검출기의 18%를 넘겼다면 성공이다.
아홉 숫자의 합이 0인지 반드시 함께 확인할 것.
4.오늘 실행한 코드의 결과다.
12×12 그림에 3×3 필터를 밀고 2×2 최대 풀링을 했을 때
칸 수가 어떻게 줄었는지 세 숫자로 쓰고 몇 분의 1인지 계산하시오.
그리고 "풀링을 하면 위치 정보가 사라진다"는 설명이 왜 정확하지 않은지
오늘 잰 숫자를 근거로 반박하시오.
📖 모범 답안
칸 수 — 원본 144칸 → 합성곱 뒤 100칸
→ 2×2 풀링 뒤 25칸. 144 ÷ 25 = 5.8분의 1이다.
반박 — 사라지지 않는다. 흐려질 뿐이다.
8×8 세로 막대를 오른쪽으로 1칸 옮기고 2×2 풀링까지 거친 결과를 견주면,
9칸 중 같은 칸이 6개이고 3칸은 여전히 다르다.
2칸을 옮겼을 때도 마찬가지로 6개였다.
위치가 완전히 지워졌다면 두 결과가 9칸 모두 같아야 한다.
정확히 말하면 풀링은 정확한 자리를 버리고 '이 근처 어딘가'만 남긴다.
요약은 늘 무언가를 버리지만, 얼마를 버렸는지는 세어 봐야 알 수 있다.
5. 어떤 학생이 이렇게 주장했다.
"필터가 크게 반응하는 자리를 보면 그 필터가 무엇을 찾는지 알 수 있다.
우리 반은 구간별 반응 크기의 평균으로 재서 표를 만들었다."
이 주장의 무엇이 문제인지 오늘 얻은 숫자로 지적하고,
어떻게 재야 하는지 그 잣대가 왜 정당한지까지 쓰시오.
📖 모범 답안
문제 — 평균으로 재면 필터 넉 장이 모두 '가로획'을 가리킨다.
세로 검출기 1.00 / 0.84 / 1.00, 가로 검출기 2.10 / 1.00 / 0.33,
대각 검출기 1.60 / 1.24 / 0.80, 외곽 검출기 3.00 / 1.88 / 1.33이다.
이 잣대는 가로획에 잉크가 가장 많다는 사실을 재고 있을 뿐이라,
필터마다 보는 것이 다르다는 사실이 전혀 드러나지 않는다.
어떻게 재야 하나 — 반응의 크기가 3 이상인 칸이 몇 %인가로 잰다.
그러면 세로 검출기 10 / 2 / 20%, 가로 검출기 50 / 6 / 0%,
대각 검출기 5 / 18 / 10%로 갈린다.
왜 3이 정당한가 — 세 방향 검출기는 값이 +1, 0, −1뿐이고 +1이 세 개다.
그러므로 0과 1로 된 그림에서 낼 수 있는 최댓값이 정확히 3이다.
"|반응| = 3"은 임의로 고른 문턱이 아니라 이 필터가 최대로 반응했다는 뜻이다.
실제로 문턱을 1로 낮추면 세로 검출기가 대각획을, 2로 낮추면 가로획을 가리키고,
4 이상으로 올리면 세 검출기 모두 '해당 없음'이 된다.
표를 옮길 때는 잣대 문장을 반드시 함께 옮겨야 한다.
6. "오늘 합성곱 신경망(CNN)을 만들었다"는 말은
정확하지 않다. 무엇이 빠졌는지 한 문장으로 쓰고,
무작위 필터 12장의 실험 결과를 근거로 그것이 왜 중요한지 설명하시오.
그리고 그 빠진 부분을 어느 차시에서 배운 무엇이 채워 주는지 이름을 대시오.
📖 모범 답안
빠진 것 — 학습이 빠졌다.
오늘 필터 넉 장의 아홉 숫자는 사람이 손으로 정했다.
우리가 만든 것은 합성곱 신경망이 아니라 합성곱 한 층이고,
그 층의 가중치를 기계가 아니라 우리가 적어 넣었다.
왜 중요한가 — 아홉 칸에 −1·0·+1을 아무렇게나 넣은 필터 12장을 만들어 재 보니,
숫자 7과 1을 가려내는 힘(강한 반응 칸 수의 차이)이 평균 3.8칸이었다.
손으로 정한 넉 장은 14.2칸이므로 3.7배 차이다.
게다가 12장 중 3장은 7에 강한 반응이 하나도 없어 아무것도 못 보고,
10장은 아홉 숫자의 합이 0이 아니라 경계가 아닌 잉크 양에 반응한다.
쓸모 있는 필터는 우연히 나오지 않는다. 그래서 누군가는 그 숫자를 정해야 한다.
무엇이 채우나 — 14차시의 역전파다.
진짜 CNN은 방금 본 무작위 숫자에서 시작해, 손실이 줄어드는 쪽으로
필터의 아홉 숫자를 조금씩 고쳐 나간다. 필터는 결국 그냥 가중치이고,
오늘 우리가 손으로 한 판단을 데이터가 대신 해 주는 것이다.
🔁 되돌아보기 — 한 줄로
오늘 아홉 개의 숫자만으로 그림에서 방향을 찾아내는 것을
직접 만들어 보고, 같은 자료를 다른 잣대로 재면 결론이 뒤집히는 것까지 확인했습니다.
그중 가장 이해가 덜 된 대목 하나를 골라 한 줄로 적어 보세요.
(예: "왜 평균으로 재면 넉 장 다 가로획이 이기는지가 아직 어렴풋하다")
다음 시간에는 그림이 아니라 말을 다룹니다 —
낱말 하나 다음에 어떤 낱말이 올지 세어서 맞히는 기계를 만들어 봅니다.
🔎
더 알아보기
오늘 손으로 만든 필터의 진짜 이름, 그 발상의 뿌리, 그리고 그 눈이 속는 자리
원리 더 깊이
오늘의 세로 검출기에는 이름이 있다 — 프리윗과 소벨
오늘 손으로 정한 세로 검출기 [[1,0,−1],[1,0,−1],[1,0,−1]]은 수업을 위해 지어낸 숫자가 아닙니다.
1970년 주디스 프리윗(Judith Prewitt)이 정리한 프리윗 연산자와 같은 모양이에요
(+와 −를 어느 쪽에 두는지는 책마다 다릅니다).
그보다 조금 앞선 1968년, 스탠퍼드 인공지능 연구소의 어윈 소벨(Irwin Sobel)과 게리 펠드먼(Gary Feldman)은
가운데 줄에 2를 넣은 [[1,0,−1],[2,0,−2],[1,0,−1]]을 내놓았습니다.
창의 가운데 줄을 더 믿게 해서 잡음에 조금 덜 흔들리게 한 것이지요. 이것이 소벨 필터입니다.
사진은 증기기관의 밸브 부품을 찍은 사진에 소벨 필터를 민 결과입니다.
세로 방향과 가로 방향 필터를 각각 밀어 특징지도 두 장을 만든 뒤,
칸마다 두 값을 합쳐 방향과 상관없이 경계가 얼마나 센가를 밝기로 칠했어요.
까만 바탕은 반응이 0인 자리입니다 — 오늘 막대 안쪽이 0이었던 것처럼,
밝기가 고른 면은 모두 사라지고 테두리만 하얗게 남았습니다.
이런 필터는 수십 년 동안 컴퓨터 비전의 기본 도구였고, 지금도 사진 편집 프로그램의 윤곽선 효과나
공장의 검사 카메라 속에서 돌아갑니다. 개념 6과 이어지는 대목도 있어요.
합성곱 신경망을 사진 수백만 장으로 학습시킨 뒤 첫 층의 필터를 꺼내 보면,
상당수가 이런 방향별 경계 검출기와 닮은 모양으로 자라 있습니다.
사람이 손으로 찾아낸 필터를 데이터가 스스로 다시 찾아낸 셈입니다.
1959년, 존스홉킨스 대학의 데이비드 허블(David Hubel)과 토르스텐 비셀(Torsten Wiesel)은
마취한 고양이의 1차 시각 피질에 전극을 대고 화면에 여러 무늬를 비추었습니다.
점을 보여 줄 때는 잠잠하던 세포가, 슬라이드 유리판의 가장자리가 만든 기울어진 선이 화면을 지나가자
요란하게 신호를 냈어요. 그림처럼 어떤 세포는 정해진 방향의 선이 정해진 자리에 올 때만 반응했습니다.
오늘 만든 세로 검출기와 꼭 같은 성질이지요. 두 사람은 시각 연구로 1981년 노벨 생리의학상을 받았습니다.
두 사람은 선이 조금 옆으로 옮겨져도 계속 반응하는 세포도 찾았습니다.
1980년 일본의 후쿠시마 구니히코는 이 두 종류의 세포를 본떠 네오코그니트론을 만들었어요.
특징을 뽑는 S층과 위치 변화를 흡수하는 C층을 번갈아 쌓은 구조로, 오늘 배운 합성곱과 풀링의 짝과 같습니다.
다만 필터를 역전파로 배우지는 않았습니다.
1989년 벨 연구소의 얀 르쿤(Yann LeCun) 연구팀은 이 구조에 역전파를 붙여,
미국 우편물의 손글씨 우편번호를 읽는 필터를 데이터에서 배우게 했습니다.
그 후손은 1990년대 후반 은행 수표의 손글씨 숫자를 읽는 데 쓰였고요.
그리고 2012년, GPU로 훨씬 크게 키운 알렉스넷(AlexNet)이 이미지넷 사진 분류 대회에서
2위와 큰 차이로 우승하면서 합성곱 신경망은 컴퓨터 비전의 중심이 되었습니다.
오늘 격자 위에서 한 일이 바로 이 60년 줄기의 첫 마디입니다.
생각할 거리
사람에게는 여전히 '정지' — 스티커 몇 장에 속는 눈
사진은 우리나라 도로의 정지 표지판입니다. 빨간 팔각형에 흰 글씨 —
사람은 흙이 묻든 스티커가 붙든 한눈에 알아봅니다.
2018년 미국 대학 연구진(미시간대·워싱턴대·UC 버클리 등)은 실제 정지 표지판에
검고 흰 직사각형 스티커 몇 장을 붙여, 도로 표지판을 가려내도록 학습된 합성곱 신경망이
이것을 '속도 제한 45' 표지판으로 읽게 만들었습니다.
사람 눈에는 흔한 낙서처럼 보였지만, 스티커의 자리와 모양은 신경망의 약점을 겨냥해 계산된 것이었어요.
왜 이런 일이 일어날까요? 과제 ③을 떠올려 보세요. 144칸 중 몇 칸만 뒤집었는데 '가장 촘촘한 자리'가 바뀌었고,
어느 칸을 건드리느냐에 따라 필요한 칸 수가 달랐습니다.
필터는 사람이 보는 '모양 전체'가 아니라 작은 창 안의 곱셈과 덧셈을 볼 뿐이라,
그 계산이 크게 흔들리는 자리를 골라 건드리면 적은 변화로도 결론이 뒤집힙니다.
실제로 이미지넷으로 학습한 합성곱 신경망은 사람과 달리 모양보다 무늬(질감)에 더 기대어 판단하는 경향이 있다는 연구도 있습니다 —
고양이 윤곽에 코끼리 가죽 무늬를 입히면 코끼리라고 답하는 식이지요.
그래서 대책도 여러 겹입니다. 적대적 예제를 일부러 만들어 학습 데이터에 섞는 적대적 학습,
카메라 하나의 판단만 믿지 않고 지도나 다른 센서와 맞춰 보는 설계가 대표적이에요.
그래도 완전히 막는 방법은 아직 없습니다. '정확도 99%'는 평범한 사진에서 잰 값일 뿐,
누군가 속이려 드는 상황에서 잰 값이 아닙니다. 3단원에서 인공지능을 믿을 수 있는가를 따질 때 다시 꺼낼 물음입니다.
사진: 대한민국 정지 표지판 · 출처: Jhcbs1019, Wikimedia Commons (CC BY-SA 4.0)