사전 신경망
개념

신경망

gabury1고친 사람 github-actions[bot]

신경망은 예시를 보고 입력에서 답을 내는 법을 스스로 익힙니다. 사람은 판정 규칙을 적지 않습니다. 답이 붙은 예시를 많이 보여 줄 뿐입니다. 사진 속 물체를 알아보는 일과 글의 뜻을 숫자로 옮기는 일이 이렇게 만들어집니다.

쉽고 빠른 이해

무슨 일을 하는 물건인가 — 예시를 보고 입력에서 답을 내는 법을 익히는 계산입니다. 고양이 사진마다 「고양이」라는 답을 붙여 아주 많이 보여 주면, 처음 보는 사진에서도 고양이를 알아봅니다.

왜 이렇게 하나 — 사진 속 고양이를 가리는 규칙은 조건문으로 적을 수가 없습니다. 조건을 아무리 늘려도 예외가 끝나지 않습니다. 규칙 대신 예시를 건네면 판정 기준은 신경망이 세웁니다.

어떻게 도나

  1. 입력 숫자마다 다른 숫자를 곱해 더하는 작은 계산을 여러 겹 잇습니다
  2. 곱할 숫자를 처음엔 아무렇게나 두고 답을 내 봅니다. 답이 얼마나 틀렸는지 잽니다
  3. 덜 틀리는 쪽으로 곱할 숫자를 조금 고칩니다. 이 일을 예시를 바꿔 가며 수없이 되풀이합니다

대가 — 예시가 많이 있어야 합니다. 학습에 계산이 많이 듭니다. 왜 그 답을 냈는지 사람에게 설명하기 어렵습니다. 그래서 규칙을 코드로 적을 수 있는 일에는 쓰지 않습니다.

상세

카페에 새로 온 직원이 단골손님의 커피를 탑니다. 처음에는 짐작으로 시럽과 우유를 넣습니다. 손님이 「조금 달아요」라고 하면 다음 잔에는 시럽을 살짝 줄입니다. 수백 잔을 타고 나면 조리법을 받아 적은 적이 없어도 그 손님 입맛에 맞는 잔이 나옵니다.

신경망이 배우는 방식이 이 직원과 같습니다. 규칙을 받아 적지 않고, 얼마나 틀렸는지 듣고 조금씩 고쳐 맞춥니다. 이처럼 판정 규칙을 사람이 코드로 적는 대신 예시 데이터에서 뽑아내는 방식이 머신러닝입니다. 신경망은 머신러닝의 한 방법입니다.

신경망은 뽑아낸 규칙을 곱셈과 덧셈을 여러 겹 이은 계산에 담습니다. 곱할 숫자들을 예시에 맞춰 고쳐 가는 일이 학습입니다.

이 절은 신경망을 여섯 조각으로 나눠 봅니다. 왜 필요한가, 가장 작은 계산 단위, 그 단위를 쌓은 구조, 숫자를 고쳐 가는 학습, 여러 모양, 쓰는 일과 안 쓰는 일입니다. 계산은 지어낸 작은 숫자로 따라가 봅니다.

규칙을 적을 수 없는 일

사진에 고양이가 있는지 가리는 코드를 짠다고 해 봅니다. 「귀가 뾰족하고 수염이 있으면 고양이」라고 조건문을 적습니다. 그런데 뒤돌아 앉은 고양이는 수염이 안 보입니다. 조건을 아무리 늘려도 예외가 끝나지 않습니다.

신경망은 규칙 대신 예시를 받습니다. 고양이 사진과 아닌 사진을 아주 많이 모아 사진마다 「고양이」·「아님」이라는 정답을 붙입니다.

이 정답을 레이블이라고 부릅니다. 정답이 붙어 있어야 신경망이 제 답이 맞았는지 알 수 있습니다.

컴퓨터에게 사진은 숫자 더미입니다. 사진은 픽셀이라는 작은 점이 모여 된 것입니다. 점마다 색을 나타내는 숫자가 붙습니다. 신경망은 이 숫자들을 입력으로 받습니다.

결정 트리나 선형 회귀 같은 다른 머신러닝 방법은 사람이 「귀 모양」 같은 특징을 먼저 숫자로 뽑아 건네야 하는 경우가 많습니다. 신경망은 점의 숫자를 받아 쓸모 있는 특징을 중간 계산에서 스스로 만듭니다. 신경망을 사진·소리·글에 많이 쓰는 까닭이 이것입니다.

뉴런 하나가 하는 계산

신경망을 이루는 가장 작은 계산 단위를 뉴런이라고 부릅니다. 뉴런은 숫자 몇 개를 받아 숫자 하나를 내놓습니다. 신경망이라는 이름도, 뉴런이라는 이름도 뇌의 신경세포에서 왔습니다. 신경세포 여럿이 신호를 주고받는 모습을 본떠 계산 단위를 잇기 때문입니다.

뉴런은 받은 입력마다 곱할 숫자를 하나씩 갖고 있습니다. 이 숫자를 가중치라고 부릅니다. 가중치가 크면 그 입력이 결과를 크게 움직입니다. 0 에 가까우면 그 입력은 결과에 거의 영향을 주지 못합니다.

뉴런은 입력과 가중치를 짝지어 곱한 뒤 모두 더합니다. 그 합에 숫자 하나를 더 더합니다. 이 숫자를 편향이라고 부릅니다. 편향이 있으면 입력이 전부 0 이어도 뉴런이 0 아닌 값을 낼 수 있습니다.

마지막으로 뉴런은 이 합을 그대로 내보내지 않고 함수 하나에 통과시킵니다. 이 함수가 활성화 함수입니다. 활성화 함수는 그래프로 그리면 곧은 직선이 아니라 꺾이거나 굽은 선이 되는 함수입니다.

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

활성화 함수로 꺾는 단계가 있는 까닭은 이렇습니다. 곱하고 더하는 계산은 몇 번을 이어도 곱하고 더하는 계산 한 번으로 줄어듭니다. 그러면 뉴런을 아무리 많이 이어도 입력과 답이 직선 관계인 문제밖에 못 풉니다. 중간중간 꺾어 줘야 굽은 관계도 그려 낼 수 있습니다.

아래는 입력 둘을 받는 뉴런 하나를 파이썬으로 적은 것입니다. 각 호출이 내는 값은 줄 오른쪽 주석에 적었습니다.

Python
w = [0.5, -1.0]   # 가중치 둘
b = 0.3           # 편향

def relu(s):
    return max(0.0, s)

def neuron(x):
    s = x[0]*w[0] + x[1]*w[1] + b
    return relu(s)

neuron([2.0, 1.0])   # 0.3
neuron([1.0, 2.0])   # 0.0 · 합은 -1.2

첫 호출은 곱해 더한 합이 0.3 으로 양수라서 ReLU 를 지나도 0.3 이 나옵니다. 둘째 호출은 합이 -1.2 로 음수라서 ReLU 가 0 으로 바꿉니다. 같은 뉴런이 입력에 따라 켜지기도 하고 꺼지기도 합니다.

레이어로 쌓은 구조

뉴런 여러 개를 나란히 놓은 묶음을 레이어라고 부릅니다. 한 레이어의 뉴런들은 같은 입력을 받습니다. 가중치가 저마다 달라서 내놓는 값도 다릅니다.

레이어는 차례로 이어집니다. 앞 레이어가 내놓은 숫자들이 다음 레이어의 입력이 됩니다. 맨 앞에서 입력을 받는 레이어가 입력 레이어입니다. 맨 끝에서 답을 내는 레이어가 출력 레이어입니다.

입력 레이어만은 뉴런이 아닙니다. 계산을 하지 않고 받은 숫자를 다음 레이어에 건네기만 합니다. 그래서 입력 레이어에는 가중치도 편향도 없습니다.

둘 사이의 레이어를 은닉 레이어라고 부릅니다. 은닉층이라고도 합니다. 밖에서는 입력과 답만 보이고 이 레이어가 낸 값은 안 보여서 「은닉」이라는 이름이 붙었습니다.

사진에서 쓸모 있는 특징을 스스로 만드는 중간 계산이 이 레이어에서 일어납니다. 사람이 「귀 모양」 같은 특징을 뽑아 건네지 않아도 되는 까닭이 이것입니다.

아래는 입력 둘, 은닉 레이어 하나에 뉴런 셋, 답 하나인 신경망입니다.

flowchart TD
    subgraph IN["입력 레이어"]
        X1["입력 1"]
        X2["입력 2"]
    end
    subgraph HID["은닉 레이어"]
        H1["뉴런"]
        H2["뉴런"]
        H3["뉴런"]
    end
    subgraph OUT["출력 레이어"]
        Y["뉴런(답)"]
    end
    X1 --> H1 & H2 & H3
    X2 --> H1 & H2 & H3
    H1 --> Y
    H2 --> Y
    H3 --> Y

선 하나마다 가중치가 하나씩 붙습니다. 이 그림에는 선이 아홉 개라서 가중치가 아홉 개입니다. 은닉 레이어의 뉴런 셋과 출력 레이어의 뉴런 하나가 편향을 하나씩 가지니 편향은 네 개입니다. 입력 레이어는 계산을 안 하므로 편향이 없습니다.

입력이 레이어를 차례로 지나 답이 되는 계산을 순전파라고 부릅니다. 입력 쪽에서 출력 쪽으로, 앞으로만 흘러가는 계산입니다.

학습을 마친 신경망에 새 입력을 넣어 답을 받는 일은 추론입니다. 추론 때 하는 계산은 순전파 한 번뿐입니다.

레이어 하나의 계산은 행렬 곱셈 한 번으로 적을 수 있습니다. 한 레이어의 가중치를 뉴런마다 한 줄씩 적으면 숫자를 가로세로로 늘어놓은 표가 됩니다. 이 표를 행렬이라고 하고, 입력 숫자들과 이 표를 한꺼번에 곱하는 계산이 행렬 곱셈입니다.

행렬 곱셈 안의 곱셈들은 서로를 기다리지 않고 따로따로 할 수 있습니다. 그래서 곱셈을 동시에 아주 많이 처리하는 GPU(Graphics Processing Unit)로 신경망을 돌립니다.

은닉 레이어를 여러 겹 쌓은 신경망을 깊다고 말합니다. 깊은 신경망을 쓰는 머신러닝을 딥러닝이라고 부릅니다. 겹이 많으면 앞 레이어가 만든 특징을 뒤 레이어가 다시 엮어 더 복잡한 특징을 만들 수 있습니다.

가중치를 고쳐 가는 학습

뉴런의 계산은 가중치와 편향이 정합니다. 이 소절은 그 숫자들을 어떻게 정하는지 봅니다. 사람이 정하지 않습니다. 신경망이 예시를 보며 조금씩 고쳐 갑니다.

처음에는 가중치와 편향을 작은 무작위 숫자로 채웁니다. 이 상태의 신경망은 아무 답이나 냅니다. 정답 「고양이」를 1 로, 「아님」을 0 으로 적기로 합니다. 고양이 사진을 넣었는데 신경망이 0.3 을 냈다고 해 봅니다.

얼마나 틀렸는지는 손실 함수가 잽니다. 손실 함수는 신경망의 답과 정답의 차이를 숫자 하나로 바꾸는 함수입니다. 틀린 정도가 숫자로 나와야 줄이는 방향을 정할 수 있습니다. 카페 직원에게 손님의 「조금 달아요」가 하던 일을 신경망에서는 손실 함수가 합니다.

정답이 1 인데 0.3 을 냈다면 차이는 0.7 입니다. 이 차이를 제곱한 0.49 를 손실로 쓰는 방식이 흔합니다. 손실이 0 에 가까울수록 잘 맞춘 것입니다.

다음은 가중치를 어느 쪽으로 고칠지 정하는 일입니다. 가중치 하나를 아주 조금 키웠을 때 손실이 늘어나는지 줄어드는지를 봅니다. 이 변화의 방향과 크기가 그 가중치의 기울기입니다. 기울기를 구하는 계산을 미분이라고 합니다.

기울기가 양수면 그 가중치를 키울수록 손실이 늘어난다는 뜻입니다. 그래서 가중치를 기울기의 반대쪽으로 조금 옮깁니다. 손실이 줄어드는 쪽으로 가중치를 조금씩 옮겨 가는 이 방법이 경사 하강법입니다.

한 번에 얼마나 옮길지는 학습률이라는 숫자가 정합니다. 카페 직원이 다음 잔에서 시럽을 얼마나 줄일지가 이 숫자에 해당합니다.

아래는 가중치 하나를 한 번 고치는 계산입니다.

Python
w  = 0.5       # 지금 가중치
g  = 0.8       # 기울기 · 양수
lr = 0.1       # 학습률

w - lr * g     # 0.42

기울기가 양수라서 가중치를 줄였습니다. 줄어든 폭은 학습률 0.1 에 기울기 0.8 을 곱한 0.08 입니다.

학습률이 너무 크면 손실이 가장 작은 곳을 지나쳐 버립니다. 너무 작으면 학습이 오래 걸립니다. 그래서 학습률은 사람이 몇 번 바꿔 가며 맞춥니다.

남은 문제는 기울기를 구하는 비용입니다. 가중치가 수백만 개라면 하나씩 조금 움직여 손실을 다시 재는 방법은 너무 느립니다. 역전파는 모든 가중치의 기울기를 한 번의 계산으로 구합니다. 출력 레이어에서 잰 손실에서 출발해 입력 쪽으로 레이어를 거꾸로 되짚어 갑니다.

되짚어 갈 때 쓰는 규칙이 연쇄 법칙입니다. 계산이 여러 단계로 이어져 있을 때, 앞 단계 숫자를 조금 움직이면 맨 끝 결과가 얼마나 변하는지는 단계마다의 변화 비율을 곱해서 얻는다는 규칙입니다.

그래서 출력 레이어에 가까운 가중치부터 기울기를 구합니다. 바로 앞 레이어의 가중치는 이때 구해 둔 변화 비율에 자기 단계의 비율을 곱해 기울기를 얻습니다. 이렇게 입력 쪽으로 한 레이어씩 넘어가면 모든 가중치의 기울기가 나옵니다.

예시는 하나씩 넣지 않고 여러 개를 묶어 넣습니다. 이 묶음을 미니배치라고 부릅니다. 묶음 전체의 손실을 평균 내어 고치므로 예시 하나에 휘둘리지 않습니다. GPU 가 묶음을 한꺼번에 계산하니 빠르기도 합니다.

한 바퀴를 그리면 아래와 같습니다.

flowchart TD
    A["미니배치를 넣는다"] --> B["순전파 · 답을 낸다"]
    B --> C["손실 함수 · 틀린 정도를 잰다"]
    C --> D["역전파 · 가중치마다 기울기를 구한다"]
    D --> E["경사 하강법 · 가중치를 조금 고친다"]
    E -->|다음 미니배치| A

학습은 이 바퀴를 수없이 되풀이하는 일입니다. 학습에 쓰는 예시 모음을 훈련 데이터라고 합니다. 훈련 데이터를 한 번씩 다 보는 것이 에포크 한 번입니다. 학습은 보통 에포크를 여러 번 돕니다.

신경망의 여러 모양

지금까지 본 모양은 한 레이어의 뉴런이 다음 레이어의 모든 뉴런과 이어진 것입니다. 이 가장 기본 모양을 다층 퍼셉트론이라고 부릅니다.

입력의 생김새에 맞춰 잇는 방식을 바꾼 모양도 있습니다. 대표적인 셋은 무엇을 바꿨는지로 가를 수 있습니다.

모양 주로 받는 입력 바꾼 것
합성곱 신경망 사진 모든 점을 다 잇지 않고, 작은 창을 옮겨 가며 이웃한 점끼리만 계산한다
순환 신경망 음성·주가처럼 차례가 있는 데이터 앞 차례에서 낸 값을 다음 차례 계산에 다시 넣는다
트랜스포머 글 낱말마다 다른 낱말과 얼마나 관련 있는지 계산해 그만큼 섞는다

글을 넣으면 숫자 목록 하나를 내놓는 신경망도 있습니다. 이 숫자 목록을 임베딩이라고 부릅니다. 뜻이 비슷한 글끼리 가까운 숫자 목록이 나오도록 학습합니다. 이렇게 임베딩을 만드는 신경망이 임베딩 모델입니다.

벡터 검색은 이 숫자 목록끼리의 가까움으로 글을 찾습니다. 「차량」으로 검색해도 「자동차」가 적힌 글이 걸리는 것이 이 덕분입니다.

신경망을 쓰는 일과 안 쓰는 일

신경망이 맞는 일과 맞지 않는 일은 기준 하나로 가를 수 있습니다. 판정 규칙을 사람이 코드로 적을 수 있는가입니다. 맞는 일에 쓰더라도 치르는 대가가 있습니다.

일 신경망 까닭
사진 속 물체 알아보기 쓴다 판정 규칙을 조건문으로 못 적는다
글의 뜻이 비슷한지 가리기 쓴다 같은 뜻도 글자가 제각각이다
주문 금액에 할인 적용하기 안 쓴다 규칙이 이미 정해져 있다
대출 거절 이유 설명하기 피하기도 한다 답의 이유를 사람에게 대야 한다

규칙이 정해진 일은 조건문으로 적는 편이 빠르고 틀리지 않습니다. 신경망은 규칙을 말로 못 적는 일에서 제 몫을 합니다. 그 대신 아래 대가를 치릅니다.

첫째 대가는 예시가 많이 든다는 것입니다. 예시가 적으면 신경망은 판정 기준을 세우는 대신 훈련 데이터를 외워 버립니다. 그러면 외운 예시에는 잘 맞고 처음 보는 데이터에는 틀립니다. 이 현상을 과적합이라고 부릅니다.

둘째 대가는 계산량입니다. 가중치와 편향을 합쳐 파라미터라고 부릅니다. 큰 신경망은 파라미터가 수억 개를 넘기도 합니다. 학습은 이 숫자 전부를 수없이 고쳐야 해서 GPU 를 오래 씁니다.

셋째 대가는 추론도 가볍지 않다는 것입니다. 추론은 순전파 한 번이라 학습보다 훨씬 가볍습니다. 그래도 요청 하나마다 모든 파라미터를 곱하고 더해야 합니다. 신경망을 서버에서 돌리면 요청 하나가 무거운 계산이 됩니다.

넷째 대가는 이유를 대기 어렵다는 것입니다. 학습을 마친 신경망에 남는 것은 숫자 더미입니다. 어느 가중치가 왜 그 값인지 사람이 읽을 수 있는 뜻이 없습니다. 그래서 대출 심사처럼 이유를 대야 하는 일에서는 결정 트리처럼 판정 경로를 보여 주는 방법을 고르기도 합니다.

관련 항목

신경망이 속하는 상위 분류

머신러닝 · 딥러닝 · 인공지능 · 지도 학습 · 모델

신경망을 이루는 구성 요소

뉴런 · 가중치 · 편향 · 파라미터 · 활성화 함수 · ReLU · 시그모이드 · 소프트맥스 · 입력 레이어 · 은닉 레이어 · 출력 레이어

신경망 학습이 거치는 처리 단계와 설정값

순전파 · 손실 함수 · 기울기 · 경사 하강법 · 역전파 · 미분 · 연쇄 법칙 · 학습률 · 미니배치 · 에포크 · 하이퍼파라미터 · 훈련 데이터 · 레이블

신경망의 하위 종류

퍼셉트론 · 다층 퍼셉트론 · 합성곱 신경망 · 순환 신경망 · LSTM · 트랜스포머 · 어텐션

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

과적합 · 과소적합 · 기울기 소실 · 드롭아웃 · 배치 정규화 · 조기 종료

신경망으로 만든 모델과 그 쓰임

임베딩 모델 · 임베딩 · 언어 모델 · 대규모 언어 모델 · 벡터 검색 · 추론

신경망 계산을 받치는 하드웨어와 도구

GPU · 행렬 곱셈 · 텐서 · PyTorch · TensorFlow · 양자화

신경망과 맞세워지는 다른 학습 방법

결정 트리 · 랜덤 포레스트 · 서포트 벡터 머신 · 선형 회귀 · 로지스틱 회귀 · 최근접 이웃

다른 이름: neural network · 인공 신경망 · artificial neural network · 뉴럴 네트워크