SKN/06. Deep Learning

01. 퍼셉트론 / 활성화 함수

claovy☘️ 2025. 3. 18. 14:39

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에 가까워 더 빠른 학습 진행이 가능 (균형적으로 학습) 
  • 기울기 소실 문제 발생 가능