활성화함수
입력신호의 총합이 의미있는 신호인지 판단해서 다음층으로 넘길지 결정하는 역할
이 함수는 비선형성을 도입하여 신경망이 복잡한 비선형 관계를 학습할 수 있도록 함
활성화 함수는 쇼핑몰에서 고객이 구매 버튼을 누를지 말지 결정하는 임계점
과 비슷. 고객이 상품 페이지에서 받은 인상(가격, 리뷰, 디자인 등)을 종합한 점수가 일정 기준을 넘으면 "구매"를, 넘지 못하면 "포기"를 선택한다. 활성화 함수는 바로 이 "넘느냐 마느냐"의 판단 기준 역할을 한다. 어떤 함수는 0 아니면 1로 딱 잘라 판단하고(시그모이드), 어떤 함수는 "조금이라도 긍정적이면 그대로 통과시키되, 부정적이면 차단"하는 방식(ReLU)으로 작동한다.

처음 퍼셉트론은 입력값 x1, x2에 각각 가중치 w1, w2를 곱해서 더한 뒤, 그 값이 어떤 기준값 θ를 넘는지로 결과를 결정하는 구조였다. 즉, 계산한 값이 기준보다 크면 1, 아니면 0을 출력하는 방식으로, 일종의 합격/불합격을 판단하는 모델이다. 이 단계에서는 입력을 받아서 바로 기준과 비교하는 단순한 형태였다.
그런데 이 기준값 θ를 계속 따로 두고 비교하는 것이 불편하기 때문에, 이를 식 안으로 포함시키기 위해 편향(bias)이라는 개념을 도입한다. 기준값 θ를 (b = -θ)로 바꾸면, 기존의 “기준과 비교”하는 구조를 “0과 비교”하는 형태로 바꿀 수 있다. 그래서 식은 b + w1 x1 + w2 x2)가 0보다 큰지 아닌지를 판단하는 형태로 바뀌고, 이때 편향 b는 전체 값을 얼마나 쉽게 1로 만들지 조절하는 역할을 한다.
마지막으로, 이 판단 과정을 함수 형태로 분리한 것이 활성화 함수이다. 이제는 먼저 b + w1 x1 + w2 x2라는 값을 계산하고, 그 결과를 활성화 함수 (h(x))에 넣어서 최종 출력 y를 얻는다. 이 함수는 입력이 0보다 크면 1, 아니면 0을 반환하는 계단 함수 형태이다. 이렇게 하면 계산과 판단이 분리되어 구조가 훨씬 깔끔해지고, 나중에는 이 계단 함수를 Sigmoid나 ReLU 같은 다른 활성화 함수로 쉽게 바꿀 수 있게 된다.
신경망에서 편향(Bias)의 입력 신호가 항상 1로 설정되는 주된 이유는
→ 편향(b)을 가중치(w)와 같은 형태의 학습 가능한 파라미터로 처리하기 위해서
계단함수

처음 퍼셉트론에서는 이 값이 기준 넘었냐? 안 넘었냐?만 중요했기 때문에 출력을 0 아니면 1로 딱 끊어서 주는 계단함수를 사용
(최초의 활성화 함수라고 생각하면 될듯)
- But, 이 함수가 너무 단순 !!
- 값이 조금 커졌든 엄청 커졌든 결과는 무조건 1이고, 조금 작든 엄청 작든 무조건 0이라서
- 거의 모든 구간에서 기울기 = 0, 점 하나에서는 기울기 정의 안됨
- 중간 과정이나 변화 정도를 반영하지 못함
계단함수가 학습이 잘 안되는 이유?
→ 기울기(gradient)가 없기 때문이다.
딥러닝은 이렇게 학습:
1. 예측값이 틀림
2. “얼마나 틀렸는지”
3. 계산가중치를 조금 수정
4. 이걸 반복
이때 중요한 게 바로 “어느 방향으로 얼마나 바꿔야 하지?” 이걸 알려주는 게 기울기(미분)
경사하강법은 “경사”를 보고 내려가야 하는데
- 경사가 없음 → 어디로 가야 할지 모름
- 그래서 시그모이드나 ReLU와 같이 부드러운 함수로 바꿈!!!
시그모이드 함수
시그모이드 함수(Sigmoid Function)는 인공신경망에서 자주 사용되는 활성화 함수 중 하나로, 이진 분류 문제에서 주로 사용된다. 이 함수는 입력 값을 S자 형태의 곡선으로 변환하여 출력 범위를 0과 1 사이로 만듦.


- 여기서 e는 입력 값이며, e는 자연상수(약 2.718)를 의미
- 출력 범위 : 시그모이드 함수의 출력은 0에서 1 사이의 값으로 제한.
- 이로 인해, 입력 값이 매우 큰 경우 출력은 1에 가깝게 되고,
- 입력 값이 매우 작은 경우 출력은 0에 가깝게 됨
- 0과 1 사이의 값으로 출력 값이 제한됨 → 확률로 해석하기 쉬워 이진 분류 문제에서 많이 사용
x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) # y축 범위 지정
plt.show()
import torch
import matplotlib.pyplot as plt
x = torch.range(-5., 5., 0.1)
y = torch.sigmoid(x)
plt.plot(x.numpy(), y.numpy())
plt.show()
→ 파이토치에서는 sigmoid 함수를 제공한다.
ReLU 함수

시그모이드 함수는 신경망 분야에서 오래전부터 이용해왔으나, 최근에는 ReLU를 주로 이용
→ 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하이면 0을 출력하는 함수
계단 함수 vs 시그모이드 함수

공통점: 비선형함수
- 시그모이드 함수 = 곡선, 계단함수 = 계단처럼 구부러진 직선
- 둘 다 비선형함수로 분류.
선형함수: f(x) = ax+b, 곧은 1개의 직선인 함수
비선형함수: 선형이 아닌 함수. 직선 1개로는 그릴 수 없는 함수
→ 신경망에서는 활성화함수로 비선형함수를 사용해야 함.
why?? 선형함수를 사용하면 신경망의 층을 깊게 하는 의미가 없기 때문
3층 신경망 구현하기
항등함수: 입력을 그대로 출력. 입력 = 출력
- 출력층에서 항등함수 사용하면, 입력신호 → 출력신호
소프트맥스 함수
현업에서 지수함수 계산에 드는 자원 낭비를 줄이고자 출력층의 소프트맥스 함수는 생략하는 것이 일반적이라고 했는데, WHY?
Softmax는 “확률로 해석할 때만 필요”
→ 실제 계산(학습/추론)에서는 굳이 안 써도 되는 경우가 많다.
트랜스포머에서 마지막에 Softmax를 통해 다음 단어 확률 분포를 만들지 않나?
트랜스포머의 마지막 레이어를 지나면 각 단어 위치마다 이런 값이 나옴
- logits (로짓) → 아직 확률 아님
- 그냥 숫자들 (예: [2.1, -0.5, 3.2, ...])
이건 “각 단어가 얼마나 가능성이 있는지 점수” 같은 것이 logits를 그대로 쓰면 확률이 아니니까
Softmax 함수를 적용해서 확률로 바꿔줌
즉, "다음 단어가 뭐일지에 대한 확률 분포"
- 모든 값이 0 ~ 1 사이
- 전체 합 = 1
예를 들어 vocab이 이렇게 있다고 했을 때:
- "나는" "밥을" "학교에" "간다"
Softmax 결과가 이렇게 나오면:
- 나는: 0.1 밥을: 0.6 학교에: 0.2 간다: 0.1
→ 모델은 “밥을”이 가장 가능성이 높다고 보는 것
트랜스포머는 마지막에 Softmax를 통해 “다음 단어가 될 확률 분포”를 만듦
손글씨 숫자 인식
MNIST 손글씨 분류에서 원핫인코딩을 사용하는 이유?
MNIST 손글씨 분류에서 원핫 인코딩을 사용하는 이유는, 숫자 0~9가 단순한 ‘값’이 아니라 ‘클래스(범주)’이기 때문이다. 만약 라벨을 3처럼 숫자로 그대로 사용하면 모델이 이를 크기나 순서가 있는 값으로 잘못 이해할 수 있다. 하지만 실제로는 각 숫자는 서로 독립적인 의미를 가지는 카테고리일 뿐이다.
그래서 3을 [0,0,0,1,0,0,0,0,0,0]처럼 원핫 벡터로 바꿔서, 단순히 ‘3번 클래스’라는 정보만 전달한다. 또한 모델의 출력이 softmax를 통해 확률 벡터 형태로 나오기 때문에, 정답도 같은 형태로 맞춰주기 위해 원핫 인코딩을 사용한다.
'AI' 카테고리의 다른 글
| [밑바닥부터 시작하는 딥러닝] ch.4 신경망 학습 (0) | 2026.05.24 |
|---|---|
| [밑바닥부터 시작하는 딥러닝] ch2. 퍼셉트론 (0) | 2026.05.24 |
| 완벽한 스미싱 분류 모델을 향해서 (2) (1) | 2025.05.28 |
| 완벽한 스미싱 분류 모델을 향해서 (1) (4) | 2025.05.27 |
| [LLM] RAG와 Vector Database (0) | 2025.05.26 |