퍼셉트론과 다층 퍼셉트론

학습 목표
  • 퍼셉트론의 구성요소(입력노드, 가중치, 편향, 합, 활성화 함수, 출력노드)를 그림에서 짚을 수 있다
  • 주어진 가중치로 퍼셉트론의 출력을 직접 계산할 수 있다
  • 활성화 함수의 선택에 따라 퍼셉트론이 회귀와 분류를 모두 표현함을 안다
  • 단일 퍼셉트론의 한계(XOR)를 설명할 수 있다
  • 퍼셉트론 여러 개를 연결한 다층 퍼셉트론의 계산을 단계별로 할 수 있다
  • 비선형 활성화 함수(Sigmoid, Tanh, ReLU)의 역할과 특성을 비교할 수 있다
  • 인공신경망의 구조(입력층, 은닉층, 출력층)를 알고 가중치 개수를 셀 수 있다

퍼셉트론: 인공신경망의 기본단위

앞 장 끝에서 딥러닝을 다층 퍼셉트론(인공신경망) 구조를 쓰는 모형이라고 했다. 이 장에서는 그 구조를 가장 작은 단위부터 쌓아 올린다.

뇌의 신경처리 방식

사람의 뇌는 매우 많은 수의 뉴런이 서로 연결되어 있고, 인간의 생각과 행동은 뉴런 사이의 전기적 신호 처리로 이루어진다. 뉴런 하나는 여러 뉴런에서 신호를 받아 합치고, 그 결과를 다음 뉴런으로 내보낸다. 인공신경망은 이 “신호를 받아 합치고 내보내는” 처리를 수학으로 흉내 내려는 시도이고, 그 최소 단위가 퍼셉트론이다.

퍼셉트론 (Perceptron)

퍼셉트론 (Perceptron)

딥러닝을 구성하는 기본요소. 하는 일은 입력값을 출력값으로 변환하는 것이다.

아무리 복잡한 딥러닝 모델도 결국 퍼셉트론의 조합으로 이루어진다.

퍼셉트론은 다음 그림으로 나타낸다. 왼쪽에서 오른쪽으로 입력노드 → 가중치 → 합 → 활성화 함수 → 출력노드 순서로 데이터가 흐른다.

1 편향 x₁ x₂ w₀ w₁ w₂ Σ z g ŷ 입력노드 가중치 합 활성화 함수 출력노드

그림의 요소를 왼쪽부터 하나씩 정의한다.

노드

노드 (Node)

퍼셉트론의 입출력 단위. 그림의 동그라미(파란색 입력노드, 보라색 출력노드)가 노드이고, 퍼셉트론이 처리하는 데이터 값 하나를 뜻한다. 노드와 노드를 잇는 화살표를 아크(arc) 또는 연결이라 부른다.

입력노드

입력노드 (Input Node) \(x_1, x_2, \ldots, x_m\)

퍼셉트론에 입력되는 데이터. 데이터가 가진 특성(변수) 하나씩이 입력노드 하나에 대응된다. 변수가 \(m\)개면 입력노드도 \(m\)개다.

가중치

가중치 (Weight) \(w_1, w_2, \ldots, w_m\)

입력노드 하나당 곱해지는 계수. 입력노드에서 합으로 가는 아크 위에 적는다. 가중치가 클수록 그 입력노드가 출력에 미치는 영향이 크다.

편향

편향 (Bias)

데이터 특성에 의해 주어지는 입력노드 외에, 항상 1의 값을 갖는 기본 노드. 그림의 초록색 노드다. 이 노드에 곱해지는 가중치를 \(w_0\)로 쓴다. 입력값과 무관하게 합에 더해지는 기준값 역할을 한다.

합

합 (Sum) \(z\)

입력노드와 그에 해당하는 가중치를 곱해서 모두 더한 값. 편향 노드(값 1)에 \(w_0\)를 곱한 것도 함께 더한다.

\[z = w_0 \cdot 1 + w_1 x_1 + w_2 x_2 + \cdots + w_m x_m = w_0 + \sum_{i=1}^{m} w_i x_i\]

활성화 함수

활성화 함수 (Activation Function) \(g\)

합 \(z\)를 출력노드의 값으로 바꾸는 데 사용되는 함수.

\[g(z) = g\left(w_0 + \sum_{i=1}^{m} w_i x_i\right)\]

어떤 함수를 쓰는지는 문제에 따라 달라진다. 바로 다음 절에서 두 가지를 보고, 뒤에서 더 다룬다.

출력노드

출력노드 (Output Node) \(\hat{y}\)

입력노드에서 시작해 가중치, 합, 활성화 함수를 거쳐 최종 출력되는 하나의 값.

\[\hat{y} = g(z) = g\left(w_0 + \sum_{i=1}^{m} w_i x_i\right)\]

정리하면, 퍼셉트론 하나의 계산은 두 단계다. 입력노드에 가중치를 곱해 더하고(\(z\)), 활성화 함수에 통과시킨다(\(\hat{y} = g(z)\)).


퍼셉트론을 이용한 회귀작업

활성화 함수의 선택에 따라 퍼셉트론 하나로 회귀와 분류 문제를 모두 표현할 수 있다. 먼저 회귀, 즉 예측하고자 하는 값이 실수일 때다.

다음 데이터와 퍼셉트론이 있다고 하자. 입력노드는 \(x_1, x_2\) 두 개이고, 각각 0 또는 1의 값을 가진다.

\(x_1\) \(x_2\)
0 0
1 0
0 1
1 1
1 편향 x₁ x₂ −0.3 0.5 0.5 Σ z g ŷ 입력노드 가중치 합 활성화 함수 출력노드

활성화 함수: \(g(z) = z\) (들어온 값을 그대로 내보내는 항등 함수)

가중치는 \(w_0 = -0.3,\ w_1 = 0.5,\ w_2 = 0.5\)다. 데이터 네 줄을 차례로 넣어 계산해 보자.

코드
import pandas as pd

rows = []
for x1, x2 in [(0, 0), (1, 0), (0, 1), (1, 1)]:
    z = -0.3 + 0.5 * x1 + 0.5 * x2
    rows.append({
        '$x_1$': x1, '$x_2$': x2,
        '$z = -0.3 + 0.5x_1 + 0.5x_2$': f'{z:+.1f}',
        'ŷ = g(z) = z': f'{z:+.1f}',
    })

pd.DataFrame(rows).to_html(index=False, border=0, escape=False)
표 1: 퍼셉트론 회귀 출력 — g(z) = z
\(x_1\) \(x_2\) \(z = -0.3 + 0.5x_1 + 0.5x_2\) ŷ = g(z) = z
0 0 -0.3 -0.3
1 0 +0.2 +0.2
0 1 +0.2 +0.2
1 1 +0.7 +0.7

예를 들어 두 번째 줄 \((x_1, x_2) = (1, 0)\)은 \(z = -0.3 + 0.5 \times 1 + 0.5 \times 0 = 0.2\)이고, 항등 함수이므로 \(\hat{y} = 0.2\)다. 출력이 실수이므로 이 퍼셉트론은 회귀 모형이다.


퍼셉트론을 이용한 분류작업

분류는 예측하고자 하는 값이 범주형인 문제다. 서로 다른 범주에 숫자를 부여해(\(\{0, 1\}\), \(\{0, 1, 2\}\), …) 출력으로 삼는다. 가중치는 그대로 두고 활성화 함수만 바꾸면 퍼셉트론이 분류 문제를 표현한다.

\[g(z) = \begin{cases} 1 & \text{if } z \ge 0 \\ 0 & \text{if } z < 0 \end{cases}\]

이 함수를 계단 함수(step function)라 한다. 합이 0 이상이면 1, 아니면 0을 낸다.

코드
import pandas as pd

rows = []
for x1, x2 in [(0, 0), (1, 0), (0, 1), (1, 1)]:
    z = -0.3 + 0.5 * x1 + 0.5 * x2
    y_hat = 1 if z >= 0 else 0
    rows.append({
        '$x_1$': x1, '$x_2$': x2,
        '$z$': f'{z:+.1f}',
        'ŷ = g(z)': y_hat,
        '판정': '클래스 1' if y_hat == 1 else '클래스 0',
    })

pd.DataFrame(rows).to_html(index=False, border=0, escape=False)
표 2: 퍼셉트론 분류 출력 — 계단 함수
\(x_1\) \(x_2\) \(z\) ŷ = g(z) 판정
0 0 -0.3 0 클래스 0
1 0 +0.2 1 클래스 1
0 1 +0.2 1 클래스 1
1 1 +0.7 1 클래스 1

합 \(z\)는 앞 절과 똑같고, 계단 함수가 그것을 0과 1로 바꿔 주었다. 같은 퍼셉트론이 활성화 함수 하나로 회귀도 되고 분류도 된다. 이것이 활성화 함수를 따로 두는 이유다.

연습을 더 하려면: 도장 2주차의 유형 A가 이 계산이다. 학번을 넣으면 본인만의 문제가 무한히 나온다.


단일 퍼셉트론의 한계

단일 퍼셉트론은 직선이다

계단 함수 퍼셉트론의 출력 패턴을 다시 보자. 입력 \((0,0), (1,0), (0,1), (1,1)\)에 대해 출력은 \((0, 1, 1, 1)\)이었다. “둘 중 하나라도 1이면 1”이라는 OR 게이트와 같다.

이것이 왜 가능했는지 보면 한계도 같이 보인다. 합 \(z = w_0 + w_1 x_1 + w_2 x_2\)는 선형회귀식과 똑같은 모양이고, 선형회귀식은 직선으로 패턴을 표현한다. 계단 함수는 \(z \ge 0\)이면 1, \(z < 0\)이면 0을 내므로, 출력이 갈리는 곳은 정확히 \(z = 0\)인 지점이다.

\[-0.3 + 0.5 x_1 + 0.5 x_2 = 0 \quad\Longleftrightarrow\quad x_1 + x_2 = 0.6\]

\((x_1, x_2)\) 평면 위의 직선 하나다. 직선 위쪽은 출력 1, 아래쪽은 출력 0이다. 이렇게 출력이 바뀌는 경계를 결정 경계(decision boundary)라 한다. OR 데이터는 \((0,0)\)만 0이고 나머지가 1이므로, \((0,0)\) 한 점을 직선으로 떼어낼 수 있어 퍼셉트론 하나로 풀렸다.

가중치 \(w_0, w_1, w_2\)를 바꾸면 직선의 위치와 기울기가 바뀐다. 아래 보드에서 확인해 보자.

인터랙티브 — 퍼셉트론의 가중치를 조절하며 결정 경계를 확인해 보세요

\(w_0\) (편향), \(w_1\), \(w_2\)를 조절하면 오른쪽 그림의 결정 경계(색이 바뀌는 선)와 네 점의 출력이 함께 바뀝니다. 계단 함수에서 출력 패턴이 OR, AND가 되는 가중치를 찾아보세요.

시도해 보세요: \(w_0=-0.7, w_1=0.5, w_2=0.5\)로 설정하면 \((1,1)\)만 1인 AND 게이트가 됩니다. 도장 2주차 유형 D가 “이 가중치는 어떤 게이트인가”를 묻는 문제입니다.

가능한가? — XOR

다음과 같이 입력노드와 그에 대응하는 출력노드의 값이 주어져 있다. 퍼셉트론 한 개가 이 데이터를 표현하도록 가중치를 조절해 보자. 가능한가?

XOR 문제

\(x_1\)과 \(x_2\)가 다를 때 1, 같을 때 0을 출력하는 문제.

\(x_1\) \(x_2\) \(y\)
0 0 0
1 0 1
0 1 1
1 1 0

네 점을 평면에 찍어 보면 답이 보인다.

1인 점 두 개가 한 대각선에, 0인 점 두 개가 다른 대각선에 있다. 어떤 직선을 그어도 한쪽에 초록과 빨강이 섞인다. 위 보드에서 가중치를 아무리 움직여도 패턴 \((0, 1, 1, 0)\)이 나오지 않는 이유가 이것이다.

결론: 퍼셉트론 하나는 직선 하나만 그을 수 있고, XOR은 직선 하나로 나눌 수 없다. 이것이 단일 퍼셉트론의 한계다.


퍼셉트론의 축약 표현

퍼셉트론을 여러 개 그리기 시작하면 합(\(\Sigma\))과 활성화 함수(\(g\)) 노드를 매번 그리는 것이 번거롭다. 편의상 앞으로는 다음과 같이 줄여서 표현한다. 입력노드에서 출력노드로 바로 아크를 긋고, 가중치를 아크 위에 적는다.

1 x₁ x₂ −0.3 0.5 0.5 Σ g ŷ 퍼셉트론 (전체 표현)
=
−0.30.50.51편향x₁x₂ŷ퍼셉트론 (축약 표현)

축약해도 계산은 같다. 출력노드 하나는 “들어오는 아크의 가중치를 곱해 더하고, 활성화 함수를 통과시킨다”는 뜻이다.


다중 퍼셉트론

두 개의 퍼셉트론

퍼셉트론 하나로 안 되면 두 개를 쓰자. 같은 입력노드 \(x_1, x_2\)를 받는 퍼셉트론 두 개 \(s_1, s_2\)를 나란히 구성한다. 가중치는 다음과 같다. 활성화 함수는 둘 다 계단 함수다.

−0.30.70.5−0.50.5−0.51편향x₁x₂s₁s₂입력퍼셉트론 2개
  • \(s_1\)로 들어가는 아크(빨강): \(w_0 = -0.3,\ w_1 = 0.5,\ w_2 = 0.5\). 앞에서 본 OR 게이트다
  • \(s_2\)로 들어가는 아크(파랑): \(w_0 = 0.7,\ w_1 = -0.5,\ w_2 = -0.5\)

네 입력에 대해 \(s_1\)과 \(s_2\)를 각각 계산한다.

코드
import pandas as pd

rows = []
for x1, x2 in [(0, 0), (1, 0), (0, 1), (1, 1)]:
    z1 = -0.3 + 0.5*x1 + 0.5*x2
    s1 = 1 if z1 >= 0 else 0
    z2 = 0.7 - 0.5*x1 - 0.5*x2
    s2 = 1 if z2 >= 0 else 0
    rows.append({
        '$x_1$': x1, '$x_2$': x2,
        '$z_1$': f'{z1:+.1f}', '$s_1$': s1,
        '$z_2$': f'{z2:+.1f}', '$s_2$': s2,
    })

pd.DataFrame(rows).to_html(index=False, border=0, escape=False)
표 3: 퍼셉트론 두 개의 출력 s₁, s₂
\(x_1\) \(x_2\) \(z_1\) \(s_1\) \(z_2\) \(s_2\)
0 0 -0.3 0 +0.7 1
1 0 +0.2 1 +0.2 1
0 1 +0.2 1 +0.2 1
1 1 +0.7 1 -0.3 0

\(s_1\)은 \((0,1,1,1)\), \(s_2\)는 \((1,1,1,0)\)이다. \(s_2\)는 “둘 다 1일 때만 0”인 NAND 게이트다. XOR 정답 \((0,1,1,0)\)은 \(s_1\)과 \(s_2\)가 둘 다 1인 곳에서만 1이다.

퍼셉트론 하나를 더 얹기

\(s_1, s_2\)는 숫자이므로 다시 다른 퍼셉트론의 입력노드가 될 수 있다. \(s_1, s_2\)를 입력으로 받는 퍼셉트론 \(y\)를 하나 더 얹자. 가중치는 \(w_0 = -0.7,\ w_1 = 0.5,\ w_2 = 0.5\)(둘 다 1일 때만 1이 되는 AND 게이트)다.

−0.70.50.51편향x₁x₂1편향s₁s₂ŷ입력출력
코드
import pandas as pd

rows = []
for x1, x2 in [(0, 0), (1, 0), (0, 1), (1, 1)]:
    z1 = -0.3 + 0.5*x1 + 0.5*x2
    s1 = 1 if z1 >= 0 else 0
    z2 = 0.7 - 0.5*x1 - 0.5*x2
    s2 = 1 if z2 >= 0 else 0
    z3 = -0.7 + 0.5*s1 + 0.5*s2
    y_hat = 1 if z3 >= 0 else 0
    xor_target = x1 ^ x2
    rows.append({
        '$x_1$': x1, '$x_2$': x2,
        '$s_1$': s1, '$s_2$': s2,
        '$z_3 = -0.7 + 0.5 s_1 + 0.5 s_2$': f'{z3:+.1f}',
        'ŷ': y_hat,
        'XOR 정답': xor_target,
        '일치': '✓' if y_hat == xor_target else '✗',
    })

pd.DataFrame(rows).to_html(index=False, border=0, escape=False)
표 4: 퍼셉트론 3개로 XOR 풀기 — 단계별 계산
\(x_1\) \(x_2\) \(s_1\) \(s_2\) \(z_3 = -0.7 + 0.5 s_1 + 0.5 s_2\) ŷ XOR 정답 일치
0 0 0 1 -0.2 0 0 ✓
1 0 1 1 +0.3 1 1 ✓
0 1 1 1 +0.3 1 1 ✓
1 1 1 0 -0.2 0 0 ✓

네 경우 모두 정답과 일치한다. 퍼셉트론 하나로 불가능했던 XOR을 퍼셉트론 3개로 풀었다. 계산은 언제나 왼쪽 층부터: 입력노드에서 \(s_1, s_2\)를 먼저 구하고, 그 값을 다음 퍼셉트론에 넣는다.

결정 경계로 보면

무슨 일이 일어난 것인지 \((x_1, x_2)\) 평면에서 보자. 퍼셉트론 하나는 직선 하나를 긋는다고 했다. \(s_1\)은 \(z_1 = 0\)인 직선 \(x_1 + x_2 = 0.6\)을, \(s_2\)는 \(z_2 = 0\)인 직선 \(x_1 + x_2 = 1.4\)를 긋는다. 출력 퍼셉트론은 \(s_1 = 1\)이면서 \(s_2 = 1\)인 곳, 즉 두 직선 사이의 띠만 1로 골라낸다.

직선 하나로는 초록 점 두 개와 빨간 점 두 개를 가를 수 없었지만, 직선 두 개 사이로는 가를 수 있다. 퍼셉트론을 쌓는다는 것은 이렇게 직선을 여러 개 긋고 그것을 조합한다는 뜻이다.

인터랙티브 — 퍼셉트론 3개의 XOR 계산을 단계별로 확인하세요

입력값 \((x_1, x_2)\)를 선택하면, \(s_1, s_2, \hat{y}\)가 차례로 계산되는 과정을 추적할 수 있습니다.

연습을 더 하려면: 도장 2주차의 다층 퍼셉트론 문제가 이 계산과 같은 구조다.


다층 퍼셉트론의 비선형 경계선 표현

방금 한 일을 정리하자. 퍼셉트론 하나는 직선 하나였다. 퍼셉트론 \(s_1, s_2\)가 직선을 하나씩 긋고, 그 위에 얹은 퍼셉트론 \(y\)가 두 직선 사이의 띠만 골라냈다. 이렇게 퍼셉트론을 층을 거듭 쌓으면 직선으로는 안 되던 비선형적 표현이 가능해지고, 복잡한 패턴을 표현할 수 있다.

보편 근사 정리 (Universal Approximation Theorem)

충분한 수의 퍼셉트론과 비선형 활성화 함수를 가진 다층 퍼셉트론은 임의의 연속 함수를 원하는 정밀도로 근사할 수 있다. 이론상으로 컴퓨터가 수행하는 처리도 모두 표현 가능하다.

딥러닝은 이 다층 퍼셉트론을 활용하여 정보를 처리하는 장치다. 사진 분류, 음성 인식, 자연어 처리가 모두 이 위에서 이루어진다.


비선형 활성화 함수 (Activation Function)

왜 비선형이어야 하는가

앞 절에서 “비선형 활성화 함수”라는 조건이 붙었다. 왜 비선형이어야 하는지는 그 반대 경우를 따져 보면 분명해진다.

활성화 함수 가운데 가장 단순한 것은 회귀작업에서 쓴 항등 함수 \(g(z) = z\)다. 항등 함수처럼 그래프가 직선인 함수를 선형 함수(linear function)라 하고, 그렇지 않은 함수를 비선형 함수(nonlinear function)라 한다.

이제 은닉노드 \(s_1, s_2\)와 출력노드 \(\hat{y}\)로 된 다층 퍼셉트론에서 활성화 함수를 전부 항등 함수로 두어 보자. 가중치는 어떤 값이든 좋다. 은닉노드는 합을 그대로 내보내므로

\[s_1 = a_1 + b_1 x_1 + c_1 x_2, \qquad s_2 = a_2 + b_2 x_1 + c_2 x_2\]

이고, 출력노드도 마찬가지로

\[\hat{y} = w_0 + w_1 s_1 + w_2 s_2\]

이다. 여기에 \(s_1, s_2\)를 대입해 \(x_1, x_2\)에 대해 정리하면

\[\hat{y} = \underbrace{(w_0 + w_1 a_1 + w_2 a_2)}_{A} + \underbrace{(w_1 b_1 + w_2 b_2)}_{B}\, x_1 + \underbrace{(w_1 c_1 + w_2 c_2)}_{C}\, x_2\]

가 된다. 결과는 \(A + B x_1 + C x_2\), 즉 퍼셉트론 하나의 합과 똑같은 모양이다. 은닉노드를 몇 개 두든, 층을 몇 개 쌓든 이 정리는 되풀이되어 마지막에는 항상 같은 꼴로 돌아온다.

선형 함수만 쌓으면, 아무리 크고 깊은 신경망도 퍼셉트론 하나와 같다. 결정 경계는 여전히 직선 하나다.

비선형 함수를 쓰면 위의 대입과 정리가 되지 않는다. 예를 들어 \(s_1 = \sigma(a_1 + b_1 x_1 + c_1 x_2)\)는 \(x_1, x_2\)의 직선식으로 풀어쓸 수 없다. 은닉노드 하나하나가 입력 공간을 구부리고, 그 구부러진 결과를 다음 층이 다시 합치기 때문에, 층을 쌓을수록 직선으로는 만들 수 없는 경계가 생긴다. 앞 절에서 “층을 거듭 쌓으면 비선형적 표현이 가능하다”고 한 것은 활성화 함수가 비선형일 때만 성립하는 말이다.

활성화 함수의 조건

퍼셉트론의 활성화 함수는 보통 미분 가능한 비선형 함수를 사용한다.

  • 비선형: 층을 쌓았을 때 비선형 패턴을 표현하기 위해 (위에서 확인)
  • 미분 가능: 다음 장에서 배울 학습(경사하강법)이 기울기를 필요로 하기 때문. 계단 함수는 비선형이지만 기울기가 0 아니면 무한대여서 학습에 쓸 수 없다

활성화 함수의 종류

자주 사용되는 비선형 활성화 함수는 다음 세 가지다.

함수 수식 출력 범위 특징
Sigmoid \(\sigma(z) = \dfrac{1}{1+e^{-z}}\) \((-\infty, \infty) \to (0, 1)\) 출력을 확률로 읽을 수 있다. 분류의 출력노드에 쓴다
Hyperbolic Tangent \(\tanh(z) = \dfrac{e^z - e^{-z}}{e^z + e^{-z}}\) \((-\infty, \infty) \to (-1, 1)\) 0을 중심으로 대칭
ReLU \(\max(0, z)\) \((-\infty, \infty) \to [0, \infty)\) 계산이 단순하다. 현재 가장 많이 쓴다
코드
import numpy as np
import pandas as pd

rows = []
for z in [-4, -2, -0.5, 0, 0.5, 2, 4]:
    rows.append({
        '$z$': z,
        'Sigmoid': f'{1/(1+np.exp(-z)):.3f}',
        'Tanh': f'{np.tanh(z):.3f}',
        'ReLU': max(0, z),
    })

pd.DataFrame(rows).to_html(index=False, border=0, escape=False)
표 5: 같은 z에 대한 활성화 함수별 출력
\(z\) Sigmoid Tanh ReLU
-4.0 0.018 -0.999 0.0
-2.0 0.119 -0.964 0.0
-0.5 0.378 -0.462 0.0
0.0 0.500 0.000 0.0
0.5 0.622 0.462 0.5
2.0 0.881 0.964 2.0
4.0 0.982 0.999 4.0
인터랙티브 — 활성화 함수의 형태를 비교해 보세요

활성화 함수를 선택하면 \(g(z)\)의 그래프(붉은 실선)와 그 기울기 \(g'(z)\)(파란 점선)를 확인할 수 있습니다. Sigmoid는 \(z\)가 0에서 멀어지면 기울기가 0에 가까워지고, ReLU는 \(z > 0\)에서 기울기가 항상 1입니다. 이 차이가 왜 중요한지는 다음 장에서 학습을 배우며 드러납니다.

✍️ 손으로 따라 계산하기 — Sigmoid 퍼셉트론

앞의 퍼셉트론(\(w_0 = -0.3,\ w_1 = 0.5,\ w_2 = 0.5\))에서 활성화 함수를 Sigmoid로 바꾸고 \((x_1, x_2) = (1, 1)\)을 넣어 보자.

단계 1 — 합. \(z = -0.3 + 0.5 \times 1 + 0.5 \times 1 = 0.7\)

단계 2 — 활성화. \(\hat{y} = \sigma(0.7) = \dfrac{1}{1 + e^{-0.7}} = \dfrac{1}{1 + 0.497} = 0.668\)

계단 함수였다면 1이 나왔을 자리에 0.668이 나왔다. “클래스 1일 확률 66.8%”로 읽는다. Sigmoid는 \(z = 0\)에서 정확히 0.5이고, \(z\)가 클수록 1에, 작을수록 0에 가까워진다.

같은 Sigmoid 퍼셉트론에 \((0,0), (1,0), (0,1)\)을 넣으면 \(\hat{y}\)는 각각 얼마인가? 정답을 보기 전에 손으로 먼저 계산하라.

  • \((0,0)\): \(z = -0.3\), \(\hat{y} = \sigma(-0.3) = 1/(1 + e^{0.3}) = 1/(1 + 1.350) = 0.426\)
  • \((1,0)\): \(z = 0.2\), \(\hat{y} = \sigma(0.2) = 1/(1 + e^{-0.2}) = 1/(1 + 0.819) = 0.550\)
  • \((0,1)\): \(z = 0.2\), \(\hat{y} = 0.550\)

계단 함수의 \((0, 1, 1, 1)\)이 \((0.426, 0.550, 0.550, 0.668)\)로 부드러워졌다.

연습을 더 하려면: 도장 2주차의 유형 E가 이 계산이다.


인공신경망의 구조 (Neural Network)

지금까지 만든 것들을 노드와 아크 그림으로 한 줄에 세워 보자. 입력노드가 \(x_1, x_2, x_3\) 세 개인 경우로 그린다.

퍼셉트론

입력노드 여러 개가 출력노드 하나로 모인다.

1편향x₁x₂x₃ŷ입력노드출력노드

다중 퍼셉트론

같은 입력노드를 받는 퍼셉트론이 여러 개 나란히 있다. 출력노드가 \(s_1, s_2\) 두 개다.

1편향x₁x₂x₃s₁s₂입력노드출력노드

다층 퍼셉트론

다중 퍼셉트론의 출력 \(s_1, s_2\)가 다시 다음 퍼셉트론의 입력이 된다. 가운데 낀 \(s_1, s_2\)를 은닉노드라 부른다. 은닉노드도 퍼셉트론이므로 각각 편향을 가지고, \(\hat{y}\)를 내는 퍼셉트론도 자기 편향(가운데 초록 노드)을 가진다.

1편향x₁x₂x₃1편향s₁s₂ŷ입력노드은닉노드출력노드

층

노드를 세로로 묶어 층(layer)이라 부른다.

인공신경망 (Artificial Neural Network)

여러 계층으로 구성된 퍼셉트론. 층은 세 종류다.

  • 입력층 (Input Layer): 입력노드로 구성된 층
  • 은닉층 (Hidden Layer): 입력층과 출력층 사이에 존재하는 노드로 구성된 층
  • 출력층 (Output Layer): 출력노드로 구성된 층

은닉층의 노드 수는 데이터가 아니라 사람이 정한다(하이퍼파라미터). 아래 그림은 은닉노드가 4개인 경우다.

1편향x₁x₂x₃1편향s₁s₂s₃s₄ŷ입력층은닉층출력층

좁은 의미와 넓은 의미

  • 좁은 의미의 인공신경망: 입력층과 출력층 사이에 하나 이상의 은닉층이 존재하는 신경망. 즉 다층 퍼셉트론
  • 넓은 의미의 인공신경망: 학습을 통해 가중치의 결합 세기를 변화시켜 문제 해결 능력(패턴 인식)을 가지는 모델 전반

이 수업에서 “인공신경망”, “신경망”, “다층 퍼셉트론”은 같은 것을 가리킨다. 퍼셉트론 하나는 “노드” 또는 “뉴런”이라고도 부른다.

편향을 생략한 표기

보통 인공신경망을 그릴 때 편향 노드는 생략하는 경우가 많다. 위 그림에서 초록 노드를 빼면 다음과 같다.

x₁x₂x₃s₁s₂s₃s₄ŷ입력층은닉층출력층

그림에서 생략되어 있더라도 계산에는 편향이 포함된다는 것에 유의하자. 은닉노드 \(s_1 \ldots s_4\)와 출력노드 \(\hat{y}\)는 각각 자기 편향 \(w_0\)를 가진다.

출력층의 활성화 함수

출력층은 문제 유형에 맞는 활성화 함수를 쓴다.

문제 출력노드 수 출력층 활성화 함수
회귀 1 항등 함수 \(g(z) = z\)
이진 분류 1 Sigmoid (0~1, 확률로 해석)
다중 분류 (\(K\)개 클래스) \(K\) Softmax (3장에서 정의)

딥 인공신경망 (Deep Neural Network)

입력층과 출력층 사이에는 은닉층이 1개 이상 존재할 수 있다.

딥 인공신경망 (Deep Neural Network)

입력층과 출력층 사이에 여러 개의 은닉층으로 구성된 인공신경망.

은닉층의 개수를 깊이(depth)라 하고, 깊이가 커질수록 “깊다”고 표현한다. 딥러닝이라는 이름은 여기서 왔다.

x₁x₂x₃s₁s₂s₃s₄t₁t₂t₃t₄ŷ₁ŷ₂입력층은닉층 1은닉층 2출력층

연습문제: 가중치의 개수

인공신경망의 파라미터는 모든 아크의 가중치와 각 퍼셉트론의 편향이다. 그 개수는 모형이 얼마나 복잡한지를 보여 주는 첫 번째 척도다.

계산 규칙

이웃한 두 층만 보면 된다. 앞 층의 노드 수를 \(n_{\text{in}}\), 뒤 층의 노드 수를 \(n_{\text{out}}\)이라 하자.

  • 앞 층의 모든 노드가 뒤 층의 모든 노드와 아크로 연결되므로 가중치는 \(n_{\text{in}} \times n_{\text{out}}\)개
  • 뒤 층의 퍼셉트론마다 편향이 하나씩 있으므로 편향은 \(n_{\text{out}}\)개

이것을 모든 이웃한 층 쌍에 대해 더한다.

문제 1

위의 “편향을 생략한 표기” 그림(입력 3개 → 은닉 4개 → 출력 1개)에 존재하는 가중치는 총 몇 개인가?

코드
import pandas as pd

layers = [('입력층 → 은닉층', 3, 4), ('은닉층 → 출력층', 4, 1)]

rows, tw, tb = [], 0, 0
for name, n_in, n_out in layers:
    w, b = n_in * n_out, n_out
    tw += w; tb += b
    rows.append({'연결': name, '앞 층 노드': n_in, '뒤 층 노드': n_out,
                 '가중치': f'{n_in} × {n_out} = {w}', '편향': b})
rows.append({'연결': '**합계**', '앞 층 노드': '', '뒤 층 노드': '',
             '가중치': f'**{tw}**', '편향': f'**{tb}**'})

pd.DataFrame(rows).to_html(index=False, border=0, escape=False)
표 6: 입력 3 → 은닉 4 → 출력 1 신경망의 가중치와 편향
연결 앞 층 노드 뒤 층 노드 가중치 편향
입력층 → 은닉층 3 4 3 × 4 = 12 4
은닉층 → 출력층 4 1 4 × 1 = 4 1
합계 16 5

아크 위의 가중치는 16개, 편향까지 세면 21개다. 그림에서 아크를 직접 세어 16개인지 확인해 보라.

문제 2

다음 인공신경망에 존재하는 가중치의 개수는 총 몇 개인가?

  • 입력노드: 100개
  • 은닉층 1: 50개
  • 은닉층 2: 30개
  • 은닉층 3: 20개
  • 출력노드: 1개
연결 가중치 편향
입력 → 은닉 1 \(100 \times 50 = 5000\) 50
은닉 1 → 은닉 2 \(50 \times 30 = 1500\) 30
은닉 2 → 은닉 3 \(30 \times 20 = 600\) 20
은닉 3 → 출력 \(20 \times 1 = 20\) 1
합계 7,120 101

가중치 7,120개, 편향까지 7,221개. 노드는 다 합쳐 201개뿐인데 파라미터는 7천 개가 넘는다.

인터랙티브 — 신경망 구조를 바꾸며 파라미터 수를 확인하세요

입력, 은닉, 출력 노드 수를 변경하면 파라미터 수가 어떻게 변하는지 확인할 수 있습니다.

이 가중치들의 값을 데이터로부터 어떻게 찾는가, 즉 인공신경망의 학습은 다음 장의 주제다.


핵심 요약

개념 핵심 내용
퍼셉트론 입력노드 → 가중치 → 합 → 활성화 함수 → 출력노드. 딥러닝의 기본요소
노드와 아크 노드 = 데이터 값 하나, 아크 = 노드 사이의 연결. 가중치는 아크 위에 적는다
편향 항상 1인 기본 노드. 그 가중치가 \(w_0\)
합 \(z = w_0 + \sum w_i x_i\)
활성화 함수 \(\hat{y} = g(z)\). 항등 → 회귀, 계단·Sigmoid → 분류
단일 퍼셉트론 한계 합이 선형회귀식과 같은 모양이므로 결정 경계는 직선 하나 → XOR 불가
다중·다층 퍼셉트론 퍼셉트론의 출력을 다른 퍼셉트론의 입력으로. XOR = 퍼셉트론 3개
비선형 활성화 선형 함수만 쌓으면 퍼셉트론 하나와 같다. 미분 가능한 비선형 함수(Sigmoid·Tanh·ReLU)를 쓴다
인공신경망 구조 입력층 + 은닉층(1개 이상) + 출력층. 편향은 그림에서 생략해도 계산에는 포함
딥 인공신경망 은닉층이 여러 개. 깊이 = 은닉층 수. “딥러닝”의 유래
가중치 개수 이웃한 층마다 \(n_{\text{in}} \times n_{\text{out}}\) (+ 편향 \(n_{\text{out}}\)), 전부 더한다