가장 단순한 신경망을 통한 작동원리

신경 세포
Neuron의 그래프 표현

  • Node가 단일 뉴런 연산을 의미한다고 했는데 여기서의 단일 뉴런 연산이란 input에 가중치를 곱하고 합계를 낸 후에 activation function까지 통과시키는 과정을 의미한다.

인공신경망

Fully-Connected Layer(Dense Layer)

얕은 신경망

얕은 신경망으로 무엇을 할 수 있을까?

회귀

분류

얕은 신경망을 이용한 회귀

얕은 신경망을 이용한 이진분류

얕은 신경망을 이용한 다중 클래스 분류

뉴런의 수학적 표현

  • 위의 식에서 편향을 잊어버리지 말자!! 예를들면, 편향이 없다면 원점을 지나는 선만 표현할 수 있지만 편향을 통해 원점을 지나지 않는 선들도 표현할 수 있게 할 수 있다. 참고로 특별히 편향이 없는 경우도 있을 순 있다.

전결합 계층의 수학적 표현

입력 계층

은닉계층

출력계층

회귀 문제

회귀

  • 어떤 입력이 들어왔을 떄 출력이 연속적인 값을 가질 때 Regression을 사용한다.

단순 선형 회귀
다중 선형 회귀
다중 선형 회귀의 기하학적 해석
얕은 신경망과 회귀 알고리즘
은닉 계층과 회귀

이진 분류 문제

분류
로지스틱 회귀
sigmoid function
교차 엔트로피 오차
다중 로지스틱 회귀의 기하학적 해석
얕은 신경망과 분류 알고리즘
은닉계층과 분류

다중 분류 문제

다중 클래스 분류

one-hot Encoding
one-hot Encoding의 희소 표현
얕은 신경망을 이용한 다중 클래스 분류
어떻게 출력을 계산할 것인가?
Softmax vs Sigmoid
정답과 출력을 어떻게 비교할까?
Cross Entropy Error

  • Softmax의 분모에 의해서 다른 클래스에 대한 학습에도 영향을 준다는 의미이다. 분모는 다른 클래스로 예측한 확률또한 더해주기 때문이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# 얕은 신셩망을 이용한 다중 분류 문제
import numpy as np
import matplotlib.pyplot as plt

## 함수 구현
# Sigmoid 함수

def sigmoid(x):
return 1/(1+np.exp(-x))

# Softmax 함수
def softmax(x):
return np.exp(x)/np.sum(np.exp(x))

# 네트워크 구조 정의
class ShallowNN:
# 아래의 W와 b에 적절한 값은 추후에 넣어주기 때문에 현재는 0으로 잡음
def __init__(self, num_input, num_hidden, num_output):
self.W_h = np.zeros((num_hidden, num_input), dtype=np.float32)
self.b_h = np.zeros((num_hidden, 1), dtype=np.float32)

self.W_o = np.zeros((num_output, num_hidden), dtype=np.float32)
self.b_o = np.zeros((num_output, 1), dtype=np.float32)

# NN의 연산을 call 형태로 해서 작성
def __call__(self, x):
h = sigmoid(np.matmul(self.W_h, x) + self.b_h)
return softmax(np.matmul(self.W_o, h) + self.b_o)

# 데이터셋 불러오기
dataset = np.load('ch2_dataset.npz')
inputs = dataset['inputs']
labels = dataset['labels']

print(labels.shape)
print(inputs.shape)

# ShallowNN Model 생성
model=ShallowNN(num_input=inputs.shape[1], num_hidden=128, num_output=10)

# 사전에 학습된 파라미터 불러오기
weights = np.load('ch2_parameters.npz')
model.W_h = weights['W_h']
model.b_h = weights['b_h']
model.W_o = weights['W_o']
model.b_o = weights['b_o']

# 모델 결과 프린트
outputs = []
for point, label in zip(inputs, labels):
output = model(point)
outputs.append(np.argmax(output))
print(np.argmax(output), label)

outputs = np.stack(outputs, axis=0)

# 정답 클래스 scatter plot
plt.figure()
for idx in range(10):
mask = labels == idx
plt.scatter(inputs[mask, 0], inputs[mask, 1])
plt.title('True Label')
# plt.grid()
plt.show()

# 모델 출력 클래스 scatter plot
plt.figure()
for idx in range(10):
mask = outputs == idx
plt.scatter(inputs[mask, 0], inputs[mask, 1])
plt.title('Model output')
# plt.grid()
plt.show()