사전 합성곱 신경망
개념

합성곱 신경망

gabury1고친 사람 github-actions[bot]

합성곱 신경망은 사진 속 무늬를 찾아 무엇이 찍혔는지 알아봅니다. 작은 창 하나를 사진 위로 옮겨 가며 가까이 붙은 점끼리만 계산합니다. 같은 창을 사진 곳곳에 쓰므로 물체가 어디에 있든 같은 무늬로 잡아냅니다.

쉽고 빠른 이해

무슨 일을 하는 물건인가 — 사진을 받아 무엇이 찍혔는지 답하는 계산입니다. 고양이 사진을 넣으면 「고양이」라는 답이 나옵니다.

왜 이렇게 하나 — 사진의 점마다 곱할 숫자를 따로 두면 가로세로 100점 사진만 해도 그 숫자가 천만 개로 불어납니다. 고양이가 왼쪽에 있을 때와 오른쪽에 있을 때를 따로 배워야 하기도 합니다. 작은 창 하나를 사진 전체에 돌려 쓰면 두 곤란이 함께 풀립니다.

어떻게 도나

  1. 가로세로 세 칸짜리 작은 창을 사진 위에 댑니다. 창 안의 점과 창에 적힌 숫자를 곱해 더하면 숫자 하나가 나옵니다
  2. 창을 한 칸씩 옮기며 같은 계산을 합니다. 결과를 모으면 「그 무늬가 사진 어디에 있나」를 적은 새 격자가 됩니다
  3. 이 일을 여러 번 쌓습니다. 앞에서는 선과 모서리를, 뒤에서는 눈이나 바퀴 같은 큰 무늬를 잡습니다. 맨 끝에서 무엇이 찍혔는지 답합니다

대가 — 답이 붙은 사진이 많이 있어야 합니다. 곱셈이 아주 많아 그래픽 카드로 돌립니다. 칸의 순서에 뜻이 없는 표 데이터에는 맞지 않습니다.

상세

숨은그림찾기 그림 위로 작은 돋보기를 한 칸씩 옮겨 가며 「이 칸에 우산 모양이 있나」만 봅니다. 돋보기는 하나뿐이라 그림 왼쪽 위를 볼 때나 오른쪽 아래를 볼 때나 같은 눈으로 봅니다.

합성곱 신경망이 사진을 보는 방식이 이와 같습니다. 사진 전체를 한꺼번에 보지 않습니다. 작은 창을 옮겨 대며 창 안의 이웃한 점끼리만 계산합니다. 창은 하나라서 사진 어디에서나 같은 계산을 합니다.

신경망은 예시를 보고 입력에서 답을 내는 법을 스스로 익히는 계산입니다. 곱셈과 덧셈을 여러 겹 이어 둡니다. 곱할 숫자는 예시에 맞춰 조금씩 고쳐 갑니다.

합성곱 신경망은 이 신경망을 사진처럼 점이 격자로 놓인 데이터에 맞게 고친 모양입니다. 영어 이름을 줄여 CNN(Convolutional Neural Network)이라고도 씁니다.

이 절은 보통 신경망이 사진에서 겪는 곤란부터 봅니다. 그 뒤 조각을 하나씩 쌓아 올립니다. 계산은 지어낸 작은 숫자로 따라갑니다.

모든 점을 잇는 신경망의 곤란

이 절은 가로세로 100점짜리 흑백 사진 한 장을 모든 점을 잇는 신경망에 넣어 봅니다. 그러면 세 가지가 곤란해집니다. 먼저 사진과 신경망이 무엇인지부터 짧게 짚습니다.

컴퓨터에게 사진은 숫자 격자입니다. 사진은 픽셀이라는 작은 점이 가로세로로 늘어서 만들어집니다. 흑백 사진이면 점마다 밝기를 나타내는 숫자가 하나씩 붙습니다.

신경망을 이루는 가장 작은 계산 단위는 뉴런입니다. 뉴런은 숫자를 여러 개 받아 숫자 하나를 내놓습니다. 신경망은 이 뉴런을 아주 많이 이어 만듭니다.

뉴런은 받은 숫자마다 곱할 숫자를 하나씩 갖고 있습니다. 이 곱할 숫자가 가중치입니다. 뉴런은 입력과 가중치를 짝지어 곱한 뒤 모두 더합니다. 학습이란 이 가중치를 고쳐 가는 일입니다.

뉴런을 나란히 놓은 묶음을 레이어라고 합니다. 신경망은 레이어를 여러 겹 쌓습니다. 앞 레이어가 낸 숫자를 다음 레이어가 받습니다.

가장 기본 모양의 신경망은 한 레이어의 뉴런이 다음 레이어의 모든 뉴런과 이어집니다. 이 모양이 다층 퍼셉트론입니다. 이 절 제목의 「모든 점을 잇는 신경망」이 이것입니다.

이 모양에 가로세로 100점짜리 흑백 사진을 넣는다고 해 봅니다. 입력이 만 개입니다. 다음 레이어에 뉴런을 천 개 두면 뉴런마다 입력 만 개에 가중치를 하나씩 붙입니다. 입력 바로 다음 레이어 하나에서 벌써 가중치가 천만 개입니다.

첫째 곤란은 이 숫자입니다. 가중치가 많으면 그 숫자를 다 맞추는 데 예시도 계산도 그만큼 많이 듭니다. 예시가 모자라면 신경망이 판정 기준을 세우지 못합니다. 그 대신 학습에 쓴 사진을 외워 버립니다. 이 현상이 과적합입니다.

둘째 곤란은 위치입니다. 고양이가 사진 왼쪽에 찍히면 왼쪽 점들이 고양이 모양의 숫자를 띱니다. 같은 고양이가 오른쪽으로 옮겨 가면 전혀 다른 점들이 그 숫자를 띱니다. 점마다 가중치가 따로인 신경망은 이 둘을 따로 배워야 합니다.

셋째 곤란은 이웃입니다. 이 신경망은 사진을 한 줄로 펴서 받습니다. 그러면 바로 위아래로 붙어 있던 두 점이 줄에서는 백 칸 떨어집니다.

사진의 무늬는 붙어 있는 점들이 만듭니다. 한 줄로 펴면 어느 점끼리 붙어 있었는지를 신경망이 다시 알아내야 합니다.

합성곱 신경망은 세 곤란을 작은 창 하나로 풉니다. 작은 창은 붙어 있는 점끼리만 봅니다. 그 창 하나를 사진 전체에 돌려 쓰므로 가중치가 적습니다. 위치가 달라도 같은 무늬를 같은 값으로 잡습니다.

합성곱 한 번의 계산

합성곱 신경망의 작은 창을 필터라고 합니다. 가로세로 세 칸처럼 작은 숫자 격자입니다. 필터의 숫자가 곧 가중치입니다. 어떤 무늬를 찾을지는 이 숫자들이 정합니다.

필터는 커널이라고도 부릅니다. 운영체제의 커널과는 다른 말입니다.

계산은 이렇습니다. 필터를 사진의 왼쪽 위 귀퉁이에 겹쳐 놓습니다. 겹친 칸끼리 숫자를 곱합니다. 곱한 값 아홉 개를 모두 더하면 숫자 하나가 나옵니다.

그다음 필터를 한 칸 옆으로 옮겨 같은 계산을 합니다. 오른쪽 끝에 닿으면 한 줄 내려가 다시 왼쪽부터 합니다. 이렇게 필터를 옮겨 가며 겹친 칸끼리 곱해 더하는 계산이 합성곱입니다. 이름은 두 대상을 겹쳐 곱해 더하는 수학 연산에서 빌려 왔습니다. 이 계산에서는 사진과 필터가 그 둘입니다.

숫자로 따라가 봅니다. 아래 사진은 세 줄 여섯 칸입니다. 왼쪽 세 칸은 어두운 0 입니다. 오른쪽 세 칸은 밝은 1 입니다.

필터는 왼쪽 열에 -1, 오른쪽 열에 1 을 둔 3×3 격자입니다. 필터가 덮은 범위에서 오른쪽이 왼쪽보다 밝을수록 큰 값이 나옵니다.

Python
img = [[0, 0, 0, 1, 1, 1],
       [0, 0, 0, 1, 1, 1],
       [0, 0, 0, 1, 1, 1]]

f = [[-1, 0, 1],
     [-1, 0, 1],
     [-1, 0, 1]]

def conv_at(c):
    return sum(img[i][c + j] * f[i][j]
               for i in range(3)
               for j in range(3))

conv_at(0)   # 0 · 어두운 곳만 겹침
conv_at(1)   # 3 · 경계에 걸침
conv_at(2)   # 3 · 경계에 걸침
conv_at(3)   # 0 · 밝은 곳만 겹침

conv_at(c) 는 필터의 왼쪽 끝을 사진의 c 번째 열에 맞춰 겹쳤을 때의 합을 돌려줍니다. 필터가 평평한 곳에 놓이면 0 이 나옵니다. 필터가 덮은 왼쪽 열과 오른쪽 열의 밝기가 같아서 -1 을 곱한 값과 1 을 곱한 값이 서로 지워지기 때문입니다.

필터가 어두운 곳과 밝은 곳의 경계에 걸치면 3 이 나옵니다. 오른쪽 열만 밝아서 지워지지 않고 남습니다. 이 필터는 세로로 난 경계를 찾는 필터입니다.

사진의 세 줄은 모두 같으므로 한 줄만 떼어 그리면 아래와 같습니다. 위 칸은 필터가 놓인 네 곳과 그때 덮은 세 칸의 값입니다. 아래 칸은 저마다 나온 합입니다.

flowchart TD
    subgraph IMG["사진 한 줄 · 0 0 0 1 1 1"]
        W0["c = 0 · 0 0 0"]
        W1["c = 1 · 0 0 1"]
        W2["c = 2 · 0 1 1"]
        W3["c = 3 · 1 1 1"]
    end
    subgraph FM["특성 맵"]
        F0["0"]
        F1["3"]
        F2["3"]
        F3["0"]
    end
    W0 --> F0
    W1 --> F1
    W2 --> F2
    W3 --> F3

결과 네 칸을 모은 격자를 특성 맵이라고 합니다. 「이 필터가 찾는 무늬가 사진 어디에 있나」를 적은 지도입니다. 값이 큰 칸에 그 무늬가 있습니다.

사진은 여섯 칸인데 특성 맵은 네 칸으로 줄었습니다. 세 칸짜리 필터가 사진 밖으로 나가지 않고 놓일 수 있는 곳이 c = 0 부터 3 까지 네 군데뿐이라서입니다.

가중치 공유

방금 계산에서 필터는 네 군데에 놓였습니다. 숫자는 처음 것을 바꾸지 않았습니다. 사진 어디에 대든 같은 아홉 개 숫자를 씁니다. 이처럼 한 필터의 가중치를 사진 곳곳이 함께 쓰는 것을 가중치 공유라고 합니다.

그래서 가중치 수가 사진 크기와 상관없습니다. 3×3 필터 한 장의 가중치는 아홉 개입니다. 가로세로 100점 사진이든 1000점 사진이든 아홉 개입니다.

모든 점을 잇는 신경망은 가로세로 100점 사진에서 입력 바로 다음 레이어에만 가중치 천만 개를 썼습니다. 같은 사진에 3×3 필터 한 장을 대면 가중치는 아홉 개로 끝납니다.

가중치 공유는 위치 곤란도 풉니다. 같은 필터가 사진 곳곳에서 같은 계산을 합니다. 고양이 귀가 왼쪽에 있든 오른쪽에 있든 같은 값이 나옵니다. 달라지는 것은 그 값이 특성 맵의 어느 칸에 적히느냐뿐입니다.

필터 여러 장과 채널

필터 하나는 무늬 하나를 찾습니다. 세로 경계, 가로 경계, 비스듬한 경계를 다 찾으려면 필터가 여러 장 있어야 합니다. 필터 여러 장으로 합성곱을 하는 레이어를 합성곱 레이어라고 합니다. 한 합성곱 레이어에는 필터를 흔히 수십 장 둡니다.

필터마다 특성 맵이 하나씩 나옵니다. 필터가 열여섯 장이면 특성 맵도 열여섯 장입니다. 이 열여섯 장을 겹겹이 포갠 묶음이 다음 레이어의 입력이 됩니다.

포갠 격자 한 장 한 장을 채널이라고 합니다. 컬러 사진은 처음부터 채널이 셋입니다. 같은 크기의 격자 세 장이 빨강·초록·파랑의 밝기를 하나씩 맡습니다.

입력에 채널이 여럿이면 필터도 그 수만큼 두께를 가집니다. 채널이 셋인 사진에 쓰는 3×3 필터는 3×3 격자 세 장을 포갠 모양입니다. 가중치가 스물일곱 개입니다.

이 필터는 세 장에서 나온 곱셈 결과를 모두 더해 숫자 하나를 냅니다. 그래서 필터 하나는 입력 채널이 몇 개든 특성 맵을 한 장만 냅니다. 필터의 두께와 필터의 장 수는 서로 다른 축입니다.

flowchart TD
    subgraph IN["입력 · 채널 3"]
        R["빨강 격자"]
        G["초록 격자"]
        B["파랑 격자"]
    end
    S1["필터 1 · 두께 3 · 세 장에서 곱한 값을 모두 더한다"]
    S2["필터 2 … 필터 16 · 저마다 같은 계산"]
    subgraph OUT["포갠 특성 맵 · 다음 입력 · 채널 16"]
        M1["특성 맵 1장"]
        M2["특성 맵 15장"]
    end
    R --> S1
    G --> S1
    B --> S1
    IN --> S2
    S1 --> M1
    S2 --> M2

그림에서 필터의 두께는 입력 채널 수 3 을 따릅니다. 필터의 장 수 16 은 다음 입력의 채널 수가 됩니다.

가중치를 세어 봅니다. 컬러 사진에 3×3 필터 열여섯 장을 쓰면 가중치가 432 개입니다. 흑백 사진이면 필터 두께가 1 이라 144 개입니다. 모든 점을 잇는 신경망의 천만 개와 견주면 아주 적습니다.

필터에는 가중치 말고 숫자가 하나 더 붙습니다. 곱해 더한 합에 마지막으로 더하는 편향입니다. 합 전체를 조금 올리거나 내려 필터가 큰 값을 내는 문턱을 옮깁니다. 앞의 손계산은 편향을 0 으로 두어 보이지 않았을 뿐입니다.

스트라이드와 패딩

필터를 어떻게 옮기고 사진 가장자리를 어떻게 다룰지는 두 설정이 정합니다. 둘 다 특성 맵의 크기를 바꿉니다.

스트라이드는 필터를 한 번에 몇 칸씩 옮기느냐입니다. 지금까지는 한 칸씩 옮겼으니 스트라이드가 1 이었습니다. 두 칸씩 옮기면 필터가 놓이는 곳이 줄어 특성 맵의 가로세로가 대략 절반이 됩니다.

패딩은 사진 테두리에 0 을 덧대는 일입니다. 패딩이 없으면 3×3 필터를 지날 때마다 가로세로가 두 칸씩 줄어듭니다. 레이어를 여럿 쌓으면 격자가 금방 쪼그라듭니다.

앞 절의 사진 한 줄로 셈해 봅니다. 여섯 칸 양 끝에 0 을 한 칸씩 덧대면 여덟 칸이 됩니다. 세 칸짜리 필터가 여덟 칸 위에 놓일 곳은 여섯 군데입니다. 특성 맵도 여섯 칸이라 크기가 줄지 않습니다.

이때 필터의 첫 위치는 덧댄 0 에서 시작합니다. 그래서 필터의 가운데 칸이 사진의 첫 점 위에 옵니다. 덧대기 전에는 필터 가운데에 한 번도 못 오던 가장자리 점도 이제 한 번씩 가운데에 옵니다.

특성 맵의 크기는 넷으로 정해집니다. 아래 함수에서 n 은 사진의 가로 칸 수, k 는 필터의 가로 칸 수, p 는 덧댄 줄 수, s 는 스트라이드입니다. 오른쪽 주석이 결과입니다.

Python
def out_size(n, k, p, s):
    return (n + 2*p - k) // s + 1

out_size(32, 3, 0, 1)   # 30 · 패딩 없음
out_size(32, 3, 1, 1)   # 32 · 크기 유지
out_size(32, 3, 1, 2)   # 16 · 절반

가로세로 32점 사진에 3×3 필터를 쓰면 패딩이 없을 때 30 으로 줄어듭니다. 한 줄 덧대면 32 로 남습니다. 거기에 스트라이드를 2 로 두면 16 이 됩니다.

풀링

풀링은 특성 맵을 작게 줄이는 단계입니다. 가중치가 없습니다. 정해진 규칙대로 몇 칸을 한 칸으로 합칩니다.

흔한 규칙은 가로세로 두 칸씩 묶어 네 칸 가운데 가장 큰 값 하나만 남기는 것입니다. 이 방식이 최대 풀링입니다. 아래 4×4 특성 맵을 두 칸씩 묶으면 네 묶음이 나옵니다.

Python
fm = [[1, 3, 0, 2],
      [4, 2, 1, 0],
      [0, 1, 5, 6],
      [2, 0, 7, 1]]

max(1, 3, 4, 2)   # 4 · 왼쪽 위 묶음
max(0, 2, 1, 0)   # 2 · 오른쪽 위 묶음
max(0, 1, 2, 0)   # 2 · 왼쪽 아래 묶음
max(5, 6, 7, 1)   # 7 · 오른쪽 아래 묶음

묶음마다 가장 큰 값을 남겼더니 4×4 격자가 2×2 격자로 줄었습니다. 남은 값은 위 줄이 4 와 2, 아래 줄이 2 와 7 입니다.

줄이는 까닭은 둘입니다. 하나는 계산입니다. 가로세로가 절반이 되면 칸 수는 4분의 1 이 됩니다. 다음 레이어가 할 곱셈도 그만큼 줄어듭니다.

다른 하나는 작은 어긋남에 덜 흔들리는 것입니다. 무늬가 한 칸 옆으로 밀려도 같은 묶음 안에 있으면 최대 풀링의 결과는 같습니다. 물체가 조금 움직여도 답이 쉽게 바뀌지 않습니다.

레이어를 쌓은 전체 모양

이제 조각들을 이어 붙입니다. 합성곱 신경망은 크게 두 부분으로 나뉩니다. 앞부분은 사진에서 무늬를 뽑아냅니다. 뒷부분은 뽑아낸 무늬로 답을 고릅니다.

앞부분은 합성곱 레이어와 풀링을 번갈아 쌓습니다. 합성곱 레이어를 지난 값은 바로 활성화 함수를 거칩니다. 활성화 함수는 숫자 하나를 받아 정해진 규칙대로 바꿔 내보내는 함수입니다.

흔히 쓰는 활성화 함수는 ReLU(Rectified Linear Unit)입니다. ReLU 는 음수를 0 으로 바꿉니다. 양수는 손대지 않고 내보냅니다. 그래프로 그리면 0 에서 한 번 꺾인 선입니다.

이런 함수를 끼우는 까닭은 곱하고 더하기만 이으면 아무리 쌓아도 한 번으로 줄기 때문입니다. x 에 2 를 곱하고 1 을 더한 뒤, 그 결과에 3 을 곱하고 4 를 더해 봅니다. 결과는 6x + 7 이라 곱하기 한 번과 더하기 한 번으로 끝나는 계산과 같습니다.

중간에 ReLU 처럼 꺾는 단계가 끼면 이렇게 하나로 합쳐지지 않습니다. 그래야 레이어를 쌓은 만큼 더 복잡한 무늬를 잡습니다.

뒷부분은 마지막 특성 맵들을 한 줄로 폅니다. 편 숫자들을 모든 뉴런과 잇는 레이어에 넣습니다. 이 레이어를 완전 연결 레이어라고 합니다. 앞에서 본 다층 퍼셉트론과 같은 모양입니다.

맨 끝에서는 소프트맥스가 숫자들을 종류별 확률로 바꿉니다. 열 가지 종류를 가린다면 확률 열 개가 나옵니다. 열 개를 더하면 1 입니다. 가장 큰 확률이 붙은 종류가 답입니다.

가로세로 32점 컬러 사진을 열 가지 종류로 가리는 작은 합성곱 신경망을 그리면 아래와 같습니다. 칸마다 그 단계를 지난 데이터의 크기를 가로×세로×채널로 적었습니다.

flowchart TD
    IN["사진 · 32×32×3"]
    subgraph FEAT["앞부분 · 무늬를 뽑아낸다"]
        C1["합성곱 레이어 + ReLU · 필터 16장 · 32×32×16"]
        P1["최대 풀링 · 16×16×16"]
        C2["합성곱 레이어 + ReLU · 필터 32장 · 16×16×32"]
        P2["최대 풀링 · 8×8×32"]
    end
    subgraph HEAD["뒷부분 · 답을 고른다"]
        FL["한 줄로 펴기 · 숫자 2048개"]
        FC["완전 연결 레이어 · 숫자 10개"]
        SM["소프트맥스 · 확률 10개"]
    end
    IN --> C1 --> P1 --> C2 --> P2 --> FL --> FC --> SM

두 합성곱 레이어는 패딩을 한 줄 덧대 가로세로를 지킵니다. 풀링을 지날 때마다 가로세로가 절반이 됩니다. 그 대신 채널은 16 에서 32 로 늘어납니다. 격자 크기를 줄여 아낀 계산을 무늬 가짓수에 쓰는 셈입니다.

레이어마다 넓어지는 시야

뒤 레이어로 갈수록 특성 맵 한 칸이 보는 사진 범위가 넓어집니다. 가로 한 줄만 떼어 따라가 봅니다. 둘째 합성곱 레이어의 한 칸은 첫 특성 맵의 이웃한 세 칸을 봅니다.

첫 특성 맵의 그 세 칸은 저마다 사진의 세 칸을 봤습니다. 이웃한 칸끼리는 필터가 한 칸씩 어긋나 놓였으므로 보는 범위가 서로 겹칩니다. 그래서 합치면 아홉 칸이 아니라 3 + 1 + 1, 다섯 칸입니다.

flowchart TD
    subgraph L2["둘째 레이어"]
        T["한 칸"]
    end
    subgraph L1["첫 특성 맵"]
        A["c-1"]
        B["c"]
        C["c+1"]
    end
    subgraph IMG["사진"]
        P1["c-2"]
        P2["c-1"]
        P3["c"]
        P4["c+1"]
        P5["c+2"]
    end
    T --> A & B & C
    A --> P1 & P2 & P3
    B --> P2 & P3 & P4
    C --> P3 & P4 & P5

그림의 c 는 가운데 칸의 열 번호입니다. c-1 은 그 왼쪽 칸, c+1 은 오른쪽 칸입니다. 첫 특성 맵의 세 칸에서 내려간 화살표가 사진의 다섯 칸에 겹쳐 닿습니다. 가로도 세로도 같으므로 둘째 레이어 한 칸 뒤에는 사진 5×5 가 있습니다.

특성 맵의 한 칸이 사진에서 보는 범위를 수용 영역이라고 합니다. 3×3 합성곱을 하나 더 쌓을 때마다 수용 영역은 가로세로 두 칸씩 넓어집니다. 풀링을 지나면 한 칸이 앞의 두 칸을 대신하므로 더 빨리 넓어집니다.

3×3 합성곱을 쌓은 수 한 칸이 보는 사진 범위
1 3×3
2 5×5
3 7×7

시야가 넓어지니 잡는 무늬도 커집니다. 학습을 마친 합성곱 신경망을 들여다보면 앞 레이어의 필터는 선과 모서리에 반응합니다. 가운데 레이어는 선을 엮은 눈이나 바퀴 같은 부분에 반응합니다. 뒤 레이어는 얼굴이나 자동차 같은 물체 전체에 반응합니다.

필터 숫자를 정하는 학습

앞에서 본 세로 경계 필터는 사람이 숫자를 골라 적었습니다. 합성곱 신경망에서는 필터 숫자를 사람이 적지 않습니다. 처음에는 무작위 숫자로 채웁니다. 예시를 보며 고쳐 갑니다.

고치는 방법은 다른 신경망과 같습니다. 세 단계를 여러 번 되풀이합니다.

먼저 틀린 정도를 잽니다. 답이 붙은 사진을 넣습니다. 신경망의 답이 얼마나 틀렸는지는 손실 함수로 잽니다. 손실 함수는 틀릴수록 큰 숫자를 내는 함수입니다.

그 숫자를 줄이려면 가중치마다 어느 쪽으로 움직여야 하는지 알아야 합니다. 이 방향을 구하는 계산이 역전파입니다. 출력 쪽에서 입력 쪽으로 거슬러 가며 가중치 하나하나의 방향을 셈합니다.

방향을 알았으면 가중치를 그쪽으로 조금 옮깁니다. 이 단계가 경사 하강법입니다. 한 번에 크게 옮기지 않고 조금씩 옮기며 세 단계를 다시 돕니다.

가중치 공유는 학습에도 걸립니다. 한 필터의 숫자는 사진 곳곳에서 쓰였습니다. 그래서 곳곳에서 나온 고칠 방향을 모두 더해 그 숫자 하나를 고칩니다.

이렇게 학습을 마치면 앞 레이어에서 세로 경계 필터와 닮은 필터가 저절로 나타나곤 합니다. 사람이 경계를 찾으라고 시킨 적이 없는데도 그렇습니다. 경계가 사진을 가리는 데 쓸모 있는 무늬이기 때문입니다.

쓰는 일과 안 쓰는 일

합성곱 신경망이 맞는 일은 기준 하나로 가를 수 있습니다. 입력에서 붙어 있는 칸끼리 뜻을 만드는가입니다. 사진은 붙어 있는 점들이 무늬를 만듭니다.

일 합성곱 신경망 까닭
사진 속 물체 알아보기 쓴다 붙어 있는 점들이 무늬를 만든다
사진 속 물체의 위치 찾기 쓴다 특성 맵이 무늬의 위치를 함께 담는다
시간과 높낮이를 가로세로로 펼친 소리 그림 분류하기 쓴다 소리가 격자가 되어 이웃 칸끼리 뜻을 만든다
회원 정보 표로 탈퇴할 회원 짐작하기 안 쓴다 열 순서를 바꿔도 뜻이 같다

표 데이터에서는 나이 열 옆에 가입일 열이 오든 지역 열이 오든 뜻이 같습니다. 붙어 있다는 것이 아무것도 알려 주지 않습니다. 필터로 이웃을 훑을 까닭이 없습니다. 이런 데이터에는 결정 트리 같은 다른 방법을 많이 씁니다.

맞는 일에 쓰더라도 치르는 대가가 넷 있습니다.

첫째 대가는 계산량입니다. 가중치는 적어도 곱셈은 많습니다. 필터 하나가 사진의 모든 위치에 놓이기 때문입니다.

앞 그림의 첫 합성곱 레이어만 해도 위치 1024 곳에서 필터 열여섯 장이 저마다 곱셈 스물일곱 번을 합니다. 곱셈이 44만 번이 넘습니다.

그래서 합성곱 신경망은 곱셈을 동시에 아주 많이 처리하는 GPU(Graphics Processing Unit)로 돌립니다. 위치마다의 곱셈은 서로를 기다리지 않아 한꺼번에 할 수 있습니다.

둘째 대가는 예시입니다. 가중치가 적어졌어도 답이 붙은 사진이 많이 있어야 합니다. 사진이 적으면 과적합에 빠집니다.

가진 사진을 뒤집거나 잘라 예시 수를 늘립니다. 이 방법이 데이터 증강입니다.

예시를 아끼는 방법이 하나 더 있습니다. 큰 사진 모음으로 미리 학습한 합성곱 신경망을 가져와 뒷부분만 새 일에 맞게 고쳐 씁니다. 이렇게 쓰는 것을 전이 학습이라고 부릅니다. 앞부분이 뽑는 선과 모서리 같은 무늬는 어느 사진에서나 쓸모 있기 때문입니다.

셋째 대가는 멀리 떨어진 것끼리의 관계입니다. 필터는 이웃만 봅니다. 사진 양 끝의 관계는 레이어를 많이 쌓아 수용 영역이 넓어진 뒤에야 잡힙니다. 사진을 조각내 조각끼리 한 번에 견주는 비전 트랜스포머가 이 점을 겨냥한 다른 모양입니다.

넷째 대가는 이유를 대기 어렵다는 것입니다. 앞 레이어 필터는 선과 모서리처럼 사람이 들여다볼 수 있습니다. 뒤로 갈수록 필터 숫자에서 사람이 읽을 뜻이 흐려집니다. 왜 그 답을 냈는지 설명해야 하는 일에서는 이 점이 걸림돌이 됩니다.

관련 항목

합성곱 신경망이 속하는 상위 분류

신경망 · 딥러닝 · 머신러닝 · 지도학습 · 컴퓨터 비전

합성곱 신경망을 이루는 구성 요소

합성곱 · 합성곱 필터 · 합성곱 레이어 · 특성 맵 · 풀링 · 최대 풀링 · 평균 풀링 · 활성화 함수 · ReLU · 완전 연결 레이어 · 소프트맥스

합성곱 계산을 정하는 성질과 설정값

가중치 공유 · 수용 영역 · 스트라이드 · 패딩 · 가중치 · 편향 · 하이퍼파라미터

합성곱 신경망 학습이 거치는 처리 단계

순전파 · 손실 함수 · 역전파 · 경사 하강법 · 미니배치 · 레이블링

합성곱 신경망 학습에서 터지는 문제와 처방

과적합 · 데이터 증강 · 전이 학습 · 드롭아웃 · 배치 정규화 · 기울기 소실

합성곱 신경망으로 지은 대표 모델

LeNet · AlexNet · VGGNet · ResNet · U-Net · YOLO

합성곱 신경망이 맡는 작업

이미지 분류 · 객체 탐지 · 이미지 분할 · 얼굴 인식 · 광학 문자 인식 · 음성 인식

합성곱 신경망이 받는 입력 데이터

이미지 · 픽셀 · 스펙트로그램 · 텐서

합성곱 신경망과 맞세워지는 다른 신경망 모양

다층 퍼셉트론 · 순환 신경망 · 트랜스포머 · 비전 트랜스포머 · 어텐션

합성곱 계산을 받치는 하드웨어와 도구

GPU · 행렬 곱셈 · PyTorch · TensorFlow

다른 이름: convolutional neural network · CNN · ConvNet · 컨볼루션 신경망 · 콘볼루션 신경망 · 컨브넷