단일층 신경망(Single-layer neural network)
: 하나의 입력층과 하나의 출력층으로 구성된 인공신경망 모델
: 입력 데이터가 입력층으로 들어가면 출력층에서 결과가 출력된다.
: 연결층에는 여러 개의 뉴런이 존재한다.
각 뉴런은 입력 데이터와 연결된 가중치(Weight)와 편형(Bias) 값을 가지고 있습니다.
입력 데이터는 이 가중치와 편향 값에 따라 출력층으로 전달된다.
한계점
- XOR 문제와 같은 비선형 분류 문제는 해결할 수 없다 => 다층 신경망, 딥러닝
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
cancer = load_breast_cancer()
x = cancer.data
y = cancer.target
x_train, x_test, y_train, y_test = train_test_split(x,y,stratify = y, test_size = 0.2 , random_state = 42)
np.unique(y_train, return_counts=True)
class SingleLayer:
def __init__(self):
self.w = None
self.b = None
self.losses = []
def forpass(self, x):
z = np.sum(x * self.w) + self.b
return z
def backprop(self, x, err):
w_grad = x * err
b_grad = 1 * err
return w_grad , b_grad
def activation(self, z):
z = np.clip(z,-100,None)
a = 1 / (1+np.exp(-z))
return a
def fit(self, x, y, epochs = 100):
self.w = np.ones(x.shape[1])
self.b = 0
for i in range(epochs):
loss = 0
indexes = np.random.permutation(np.arange(len(x)))
for i in indexes:
z = self.forpass(x[i])
a = self.activation(z)
err = -(y[i]-a)
w_grad, b_grad = self.backprop(x[i],err)
self.w -= w_grad
self.b -= b_grad
a = np.clip(a,1e-10,1-1e-10)
loss += -(y[i]*np.log(a)+(1-y[i])*np.log(1-a))
self.losses.append(loss/len(y))
def predict(self, x):
z = [self.forpass(x_i) for x_i in x]
return np.array(z) > 0
def score(self, x, y):
return np.mean(self.predict(x) == y)
layer = SingleLayer()
layer.fit(x_train, y_train)
layer.score(x_test, y_test)
plt.plot(layer.losses)
plt.show()
유방암 데이터를 사용하여 단일층 신경망을 학습하고, 학습과정에서 손실(loss) 값을 계산하여 시각화 하는 코드
=> 결과 그래프는 손실(loss) 값을 도식화 한다.
activation(self, z) => 가중치와 편향이 적용된 입력값 `z`를 받아 활성화 함수(시그모이드 함수)를 적용한 값을 반환한다.
z 값이 너무 작으면 np.clip을 사용하여 -100 이하의 값으로 잘라내고, 시그모이드를 적용한 결과를 반환한다.
fit(self,x,y,epochs=100) => epochs 수 만큼 반복하면서 데이터를 학습한다.
나머지 과정은 앞서 설명한 로지스틱 회귀와 동일하다.
로그 손실값을 계산하여 self.losses 리스트에 추가한다.
score(self,x,y) => 정확도를 계산해준다.
손실함수에 대한 도식화
사이킷런의 경사하강법
- 사이킷런에서 제공하는 SGDRegressor , SGDClassifier는 확률적 경사하강법을 기반으로 하는 모델
- 대규모 데이터 셋에 적합이 가능하다
- 규제를 사용하여 다양한 변종 알고리즘을 제공한다.