[밑시딥_1] 퍼셉트론(Perceptron)(1-3)
3. 퍼셉트론 구현하기
1. 간단한 구현
def AND(𝔁₁, 𝔁₂, 𝔀₁, 𝔀₂, theta):
tmp = 𝔁₁ * 𝔀₁ + 𝔁₂ * 𝔀₂
if tmp <= theta:
return 0
elif tmp > theta:
return 1
params = [
(0.5, 0.5, 0.7),
(0.5, 0.5, 0.8),
(1.0, 1.0, 1.0)
]
for 𝔀₁, 𝔀₂, theta in parmas:
print(AND(0, 0, 𝔀₁, 𝔀₂, theta)) # 0
print(AND(1, 0, 𝔀₁, 𝔀₂, theta)) # 0
print(AND(0, 1, 𝔀₁, 𝔀₂, theta)) # 0
print(AND(1, 1, 𝔀₁, w2, theta)) # 1
2. 가중치와 편향 도입
위의 공식은 𝔀₁𝔁₁ , 𝔀₂𝔁₂ ≤ θ 에서 θ 를 -b로 치환 하여 양변에 𝓫를 더한 수식이다.
𝓫는 편향(bias)라 불린다.
주의) 편향은 가중치와 다른 기능을 한다!
가중치 𝔀₁과 𝔀₂ 는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수
편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수
예를 들어 𝓫가 -0.1일 때보다 -20.0일 때 더 활성화되기 어렵다.
🔍 편향에 대해 더 자세히 알아보자.
편향 : 퍼셉트론의 문을 여는 기준값
퍼셉트론이 문이라면 그 문을 열기 위해 얼마나 세게(가중치를 곱한 입력값)을 밀어야 하는지 결정하는 흰지의 스프링 강도
편향은 퍼셉트론이 1을 출력하기 위햐 필요한 '기본 조건'을 조절 하는 역할을 한다.
즉, 입력이 아무것도없어도 퍼셉트론이 자동으로 얻는 기본 점수라고 생각 하면 된다.
✅ 쉬운 비유
- 퍼셉트론 : 문
- 가중치 : 사람이 문을 미는 힘
- 편향 : 문이 열리려면 어느정도의 힘이 필요한지 결정하는 흰지의 스프링 강도
스프링이 약하면 -> 문을 열기 쉬움(편향이 작을수록 1이 나오기 쉬움 : 편향이 작다)
스프링이 강하면 -> 문을 세게 밀어야 열림( 편향이 클수록 1이 나오기 어려움 : 편향이 크다)
✅ 실제 퍼셉트론 계산
𝔀 * 𝔁 = 0.5 * 1 + 0.5 * 0 = 0.5
=> 0.5 > 0 (출력 1)
# 힘이 0보다 크면 바로 문이 열림
𝔀 * 𝔁 + 𝓫 = 0.5 * 1 + 0.5 * 0 - 0.7 = -0.2
=> -0.2 <= 0 (출력 0)
# 힘이 부족해서 문이 안열림(편향이 흰지의 스프링을 더 강화시킴)
✅ 결론
- 편향은 퍼셉트론이 얼마나 쉽게 문을 열 수 있는지를 조절하는 핵심 요소
- 편향이 작으면 ➜ 출력 1이 잘 나옴
- 편향이 크면 ➜ 출력 0이 잘 나옴
- 퍼셉트론 공식: 𝔂 = 1 (if 𝔀 * 𝔁 + 𝓫 > 0) / else 𝔂 = 0
3. 가중치와 편향 구현
import numpy as np
### AND 게이트
def AND(𝔁₁, 𝔁₂):
# 입력값을 벡터로 저장
𝔁 = np.array([𝔁₁, 𝔁₂])
# 가중치: 각각의 입력에 곱해지는 계수
𝔀 = np.array([0.5, 0.5])
# 편향: 뉴런의 문턱값 역할을 하는 상수
𝓫 = -0.7
# 퍼셉트론 계산: 가중합 + 편향
tmp = np.sum(𝔀 * 𝔁) + 𝓫
# 퍼셉트론 결과: tmp가 0보다 작거나 같으면 0, 크면 1 출력
if tmp <= 0:
return 0
else:
return 1
### NAND 게이트
def NAND(𝔁₁, 𝔁₂):
# 입력값을 벡터로 저장
𝔁 = np.array([𝔁₁, 𝔁₂])
# NAND는 AND의 반대이므로 가중치 부호를 음수로 설정
𝔀 = np.array([-0.5, -0.5])
# 편향: 문턱값을 조절
𝓫 = 0.7
# 퍼셉트론 계산: 가중합 + 편향
tmp = np.sum(𝔀 * 𝔁) + 𝓫
# 퍼셉트론 결과: tmp가 0보다 작거나 같으면 0, 크면 1 출력
if tmp <= 0:
return 0
else:
return 1
### OR 게이트
def OR(𝔁₁, 𝔁₂):
# 입력값을 벡터로 저장
𝔁 = np.array([𝔁₁, 𝔁₂])
# OR 게이트는 두 입력 중 하나만 1이어도 1을 출력해야 하므로 가중치 유지
𝔀 = np.array([0.5, 0.5])
# 편향: AND보다 더 낮은 문턱값으로 설정 (OR은 더 쉽게 1을 출력해야 함)
𝓫 = -0.2
# 퍼셉트론 계산: 가중합 + 편향
tmp = np.sum(𝔀 * 𝔁) + 𝓫
# 퍼셉트론 결과: tmp가 0보다 작거나 같으면 0, 크면 1 출력
if tmp <= 0:
return 0
else:
return 1