1. 퍼셉트론
: 퍼셉트론은 생물학적 뉴런을 모방한 간단한 인공지능 모델

AND/NAND/OR 게이트
- AND 게이트
- 두 입력이 모두 1일 때만 출력이 1이 된다. 퍼셉트론 모델에서는 가중치와 편향 값을 설정하여 이를 구현할 수 있다.
- NAND 게이트
- AND 게이트의 출력을 뒤집은 형태로, 두 입력이 모두 1일 때만 출력이 0이 된다.
- OR 게이트
- 두 입력 중 하나라도 1이면 출력이 1이 된다.
test_cases = [(0,0),(0,1),(1,0),(1,1)]
class Perceptron:
def __init__(self, weights, bias):
self.weights = weights
self.bias = bias
def activate(self, x) : # 퍼셉트론 연산
return 1 if np.dot(self.weights, x) + self.bias > 0 else 0
AND_gate = Perceptron(weights=[0.5, 0.5], bias=-0.7)
for test in test_cases:
print(f'input : {test} | output : {AND_gate.activate(test)}')
[출력]
input : (0, 0) | output : 0
input : (0, 1) | output : 0
input : (1, 0) | output : 0
input : (1, 1) | output : 1
OR_gate = Perceptron(weights=[0.5, 0.5], bias=-0.2)
for test in test_cases:
print(f'input : {test} | output : {OR_gate.activate(test)}')
[출력]
input : (0, 0) | output : 0
input : (0, 1) | output : 1
input : (1, 0) | output : 1
input : (1, 1) | output : 1
NAND_gate = Perceptron(weights=[-0.5, -0.5], bias=0.7)
for test in test_cases:
print(f'input : {test} | output : {NAND_gate.activate(test)}')
[출력]
input : (0, 0) | output : 1
input : (0, 1) | output : 1
input : (1, 0) | output : 1
input : (1, 1) | output : 0
퍼셉트론의 한계(XOR 게이트 구현 못함)
XOR (Exclusive OR, 배타적 논리합)
두 개의 비트가 서로 다를 때 1, 같을 때 0을 반환하는 논리 연산이다.
단층 퍼셉트론만으로는 XOR와 같은 비선형 문제를 해결할 수 없다. 이를 극복하기 위해 다층 구조가 필요하다
다중 퍼셉트론의 등장(XOR 문제해결)
- 다층 퍼셉트론(Multi-Layer Preceptron, MLP)은 여러 개의 퍼셉트론을 연결하여 비선형 문제를 해결한다. 입력층, 은닉층, 출력층을 가지고 있으며 은닉층에서 비선형 활성화 함수를 사용하여 복잡한 패턴을 학습할 수 있다.
- 각 층은 활성화 함수를 사용하여 출력을 계산한다.

X = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([0, 1, 1, 0])
hidden_layers = [(1,), (2, ), (4, ), (8, )]
for config in hidden_layers:
mlp = MLPClassifier(
hidden_layer_sizes=(4,4), # 은닉층 개수
activation='tanh', # 활성화 함수 종류
solver='lbfgs', # 가중치 업데이트 방식(최적화 알고리즘)
max_iter=5000, # 반복값 (epch 값)
random_state=42 # 가중치 초기화값 고정
)
mlp.fit(X,y)
pred = mlp.predict(X)
print(f'은닉층 구조 {config} -> XOR 예측 결과 : {pred}')
2. 활성화 함수

01. Sigmoid 함수

def sigmoid(x):
return 1 / (1 + np.exp(-x))
- 출력범위를 0 , 1 사이로 압축하는 비선형 함수이다. 주로 이진 분류에서 사용된다.
- 시그모이드 함수는 경사하강법을 사용하여 학습할 때 기울기가 매우 작은 값으로 변할 수 있어 학습이 느려지는 기울기 소실 문제가 발생할 수 있다.
02. 계단함수

def step(x):
return np.where(x >= 0, 1, 0)
- 입력값이 0(일정 임계값)보다 크면 1, 작거나 같으면 0을 반환하는 함수이다. 퍼셉트론에서 출력층으로 사용된다.
- 비선형 문제를 해결할 수 있지만, 미분이 불가능하여 신경망 학습에 사용하기 어렵다.
03. ReLU 함수

def relu(x):
return np.maximum(0, x)
- 출력 범위 : (0, ∞ )
- 음수 입력에 대해 0을 출력하여 계산이 간단하고 학습 속도가 빠름
- 죽은 뉴런(Dying ReLU) 문제 발생 가능
04. Leaky ReLU 함수

def leaky_relu(x, alpha=0.01):
return np.where(x >= 0, x, alpha * x)
- 출력범위 : (- ∞, ∞)
- ReLU의 죽은 뉴런 문제를 해결하기 위해 음수 입력에 작은 기울기 α 를 적용 ( α 는 일반적으로 0.01 사용)
- alpha값을 올려주면 음수 영역의 기울기를 올려줌
05. Tanh (Hypyerbolic Tangent) 함수

def tanh(x):
# return (np.exp(x) - np.exp(-x) / np.exp(x) + np.exp(-x))
return np.tanh(x)
- 출력범위를 (-1, 1) 로 설정한 함수
- 시그모이드를 변형한 함수로써, 시그모이드보다 중심이 0에 가까워 더 빠른 학습 진행이 가능 (균형적으로 학습)
- 기울기 소실 문제 발생 가능
'SKN > 06. Deep Learning' 카테고리의 다른 글
| 02. 다차원 배열 내적 / 출력층 설계(출력층 활성화함수) (0) | 2025.03.19 |
|---|
