딥러닝 수식을 처음 보면 행렬, 조건부 확률, 활성화 함수가 서로 떨어진 개념처럼 보인다. 실제 모델 안에서는 세 가지가 한 줄로 이어진다. 입력을 행렬로 묶어 계산하고, 활성화 함수로 신호를 바꾼 뒤, 마지막 값을 확률이나 예측값으로 해석한다.
입력 X → 가중치와 행렬 곱 XW → 편향 b 더하기 → 활성화 함수 f 적용 → 분류 확률 또는 예측값


1. 행렬은 여러 입력을 한 번에 계산하는 도구다
한 사람의 공부 시간과 모의고사 점수로 합격 가능성을 예측한다고 하자. 입력이 두 개라면 한 사람의 데이터는 [공부 시간, 모의고사 점수]처럼 표현할 수 있다. 사람이 100명이면 이 행이 100개 쌓여 행렬 X가 된다.
행렬 곱에서 가장 먼저 볼 것은 값보다 모양(shape)이다. X의 열 개수와 W의 행 개수가 같아야 곱할 수 있다. 이 규칙을 알면 딥러닝 코드에서 자주 만나는 차원 불일치 오류도 빠르게 찾을 수 있다.
import numpy as np
# 3명, 입력 특성 2개
X = np.array([
[2.0, 60.0],
[5.0, 75.0],
[8.0, 90.0],
])
# 입력 2개를 출력 1개로 결합
W = np.array([[0.4], [0.03]])
b = np.array([-3.0])
z = X @ W + b
print(z.shape) # (3, 1)
print(z)역행렬은 언제 존재할까?
정사각행렬 A의 역행렬 A⁻¹은 AA⁻¹ = I를 만족한다. 다만 모든 정사각행렬에 역행렬이 있는 것은 아니다. 행렬식 det(A)가 0이 아니어야 한다. 한 행이 다른 행의 배수처럼 정보가 중복되면 행렬식이 0이 되고 역행렬을 구할 수 없다.
A⁻¹b가 목적이라면 np.linalg.inv(A) @ b보다 np.linalg.solve(A, b)가 보통 더 안정적이고 효율적이다.
2. 뉴런 한 개는 가중합과 활성화 함수로 움직인다
뉴런은 입력마다 중요도를 뜻하는 가중치를 곱하고 편향을 더해 z를 만든다. 그다음 활성화 함수가 이 값을 다음 층에 전달할 신호로 바꾼다.
a = f(z)
공부 시간 5시간, 모의고사 점수 75점에 가중치가 각각 0.4와 0.03이고 편향이 -3이라면 z = 5×0.4 + 75×0.03 - 3 = 1.25다. 이 값을 시그모이드에 넣으면 약 0.777이 나온다. 모델을 이진 분류로 훈련했다면 이 값은 양성 클래스에 대한 점수로 해석할 수 있다.
활성화 함수가 없다면 여러 선형 층을 쌓아도 결국 하나의 선형 계산과 같다. 곡선이나 복잡한 경계를 학습하려면 층 사이에 비선형성이 필요하다.
3. 조건부 확률은 관측 후 판단을 갱신한다
P(B|A)는 사건 A가 일어났다는 조건에서 B가 일어날 확률이다. 분모는 조건으로 주어진 사건의 확률이며, P(A) > 0이어야 한다.
예를 들어 전체 이메일 중 20%가 스팸이고, 스팸 메일의 70%에 ‘무료’라는 단어가 들어 있다고 하자. 이 두 수만으로 “‘무료’가 들어간 메일이 스팸일 확률”을 바로 알 수는 없다. 정상 메일에도 ‘무료’가 얼마나 등장하는지 함께 알아야 한다.
이것이 베이즈 규칙의 핵심이다. 기존 믿음인 사전확률 P(스팸)을 새로운 관측 ‘무료’로 갱신해 사후확률 P(스팸|무료)을 얻는다. 머신러닝 분류 결과를 읽을 때도 “모델 출력이 어떤 조건과 데이터 분포에서 나온 값인지”를 함께 봐야 한다.
4. 활성화 함수는 층의 역할에 맞춰 고른다
활성화 함수는 ‘최신 함수 하나가 항상 최고’라는 식으로 고르기 어렵다. 은닉층인지 출력층인지, 분류인지 회귀인지에 따라 역할이 달라진다.

| 함수 | 주로 쓰는 곳 | 특징과 주의점 |
|---|---|---|
| ReLU | 일반적인 은닉층 | 계산이 단순하고 양수 영역의 기울기가 유지된다. 음수 영역이 계속 0이면 뉴런이 학습하지 못할 수 있다. |
| Leaky ReLU | ReLU의 음수 영역 보완 | 음수에도 작은 기울기를 남긴다. 기울기 크기는 하이퍼파라미터다. |
| GELU·SiLU | Transformer 등 여러 최신 구조의 은닉층 | 입력을 부드럽게 통과시킨다. 모델 구조와 학습 비용을 함께 보고 선택한다. |
| Sigmoid | 이진 분류 출력 | 값을 0~1로 압축한다. 깊은 은닉층에서는 포화 구간의 기울기 소실에 주의한다. |
| Softmax | 서로 배타적인 다중 분류 출력 | 클래스 점수 전체를 합이 1인 분포로 바꾼다. |
| Linear | 회귀 출력 | 출력 범위를 제한하지 않는다. 집값·온도 같은 연속값 예측에 적합하다. |
Sigmoid와 Softmax의 차이
- Sigmoid: 각 출력이 독립적으로 0~1 값을 가진다. 여러 태그를 동시에 고르는 다중 레이블 문제에도 쓸 수 있다.
- Softmax: 여러 클래스가 하나의 확률을 나눠 갖는다. 고양이·개·새 중 하나를 고르는 문제에 맞다.
5. 코드로 입력부터 확률까지 연결하기
앞에서 계산한 z에 시그모이드를 적용하면 한 번의 순전파를 확인할 수 있다.
def sigmoid(x):
return 1 / (1 + np.exp(-x))
probability = sigmoid(z)
print(np.round(probability, 3))
# [[0.310]
# [0.777]
# [0.953]]PyTorch에서는 손실 함수가 내부에서 더 안정적인 계산을 제공하는 경우가 많다. 이진 분류의 BCEWithLogitsLoss는 시그모이드와 손실을 결합하고, 다중 분류의 CrossEntropyLoss는 원시 점수인 logits를 받는다.
import torch
import torch.nn as nn
model = nn.Sequential(
nn.Linear(2, 8),
nn.ReLU(),
nn.Linear(8, 3) # 클래스 3개의 logits
)
x = torch.tensor([[5.0, 75.0]])
logits = model(x)
probabilities = torch.softmax(logits, dim=1)
print(logits.shape) # torch.Size([1, 3])
print(probabilities.sum()) # tensor(1.)6. 실수하기 쉬운 부분
- 행렬 곱 오류: 값보다 먼저 각 배열의
shape를 출력한다. - 역행렬 남용: 연립방정식은
solve를 우선하고 특이행렬 여부를 확인한다. - 조건부 확률 방향:
P(A|B)와P(B|A)는 일반적으로 같지 않다. - 출력층 혼동: 이진 분류, 다중 분류, 다중 레이블, 회귀를 먼저 구분한다.
- Softmax 중복: PyTorch
CrossEntropyLoss앞에 Softmax를 다시 넣지 않는다. - 확률 과신: 출력값이 실제 확률처럼 잘 보정됐는지는 별도로 검증해야 한다.
- 행렬은 여러 샘플과 특성을 한 번에 계산하며, 곱셈 가능 여부는 shape로 판단한다.
- 뉴런은
XW+b로 가중합을 만들고 활성화 함수로 비선형 신호를 만든다. - 조건부 확률은 관측 이후 판단을 갱신하는 규칙이며 조건의 방향을 구분해야 한다.
- 은닉층과 출력층의 목적에 맞춰 ReLU 계열, Sigmoid, Softmax, Linear를 선택한다.