인공 신경망이란 ?
- 신경망 구조를 모방하여 만든 모델
- 여러 자극 혹은 입력이 들어오면 각각의 가중치를 곱해 더해주고 추가적으로 편차도 더해줌
- 인공 뉴런 : 다 더한 값을 활성화 함수를 통해 변형하여 전달하는 단위
- 인공신경망 : 인공 뉴런들이 모인 네트워크
인공 신경망의 요소
- 입력, 출력
- 입력 단과 층력단 사이의 은닉층
- 은닉층 수에 따라 신경망과 심층 신경망으로 나뉨
- 심층 신경망: 2개 이상의 은닉층을 가진 인공 신경ㅁ아
-> 하나의 셀(뉴런)에서와 마찬가지로 입력값들의 가중치 합을 활성화 함수에 통과시켜 변형시키고, 이 과정을 반복적으로 진행하여 최종 결과값을 낸다.
- 행렬 연산
활성화 함수
- 활성화 함수가 없다면 은닉층이 몇 개더라도 결국 선형변환이기에 깊은 모델을 만든 의미가 사라짐
- 가장 많이 사용되는 함수로 <시그모이드>와 <하이퍼볼릭 탄젠트>가 있음
- 시그모이드 : 결과값이 0 에서 1인 완만한 곡선형태
- 하이퍼볼릭 탄젠트 : 결과값이 -1 에서 1의 값을 가짐
- 두 함수 모두 모든 구간에서 미분 가능하기에 역전파하기에 유용함
전파와 역전파
- 전파(순전파): 인공신경망에 입력값이 들어와 여러 은닉층을 순서대로 거쳐 결과값을 내는 과정
- 역전파 : 결과와 정답의 차이로 계산된 손실을 연쇄법칙을 이용하여 입력 단까지 다시 전달하는 과정
파이토치로 구현
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.init as init
num_data = 1000
num_epoch = 10000
#데이터 생성
noise = init.normal_(torch.FloatTensor(num_data,1),std=1)
x = init.uniform_(torch.Tensor(num_data,1),-15,15)
y = (x**2) + 3
y_noise = y + noise
## 모델, 손실함수, 최적화 함수 설정
model = nn.Sequential(
nn.Linear(1,6),
nn.ReLU(),
nn.Linear(6,10),
nn.ReLU(),
nn.Linear(10,6),
nn.ReLU(),
nn.Linear(6,1),
)
loss_func = nn.L1Loss()
optimizer = optim.SGD(model.parameters(),lr=0.0002)
# 모델 학습
loss_array = []
for i in range(num_epoch):
optimizer.zero_grad()
output = model(x)
loss = loss_func(output,y_noise)
loss.backward()
optimizer.step()
loss_array.append(loss)
# 손실 그래프
import matplotlib.pyplot as plt
plt.plot(loss_array)
plt.show()
# 학습모델의 결과와 실제 목표값 비교
plt.figure(figsize=(10,10))
plt.scatter(x.detach().numpy(),y_noise,label="Original Data")
plt.scatter(x.detach().numpy(),output.detach().numpy(),label="Model Output")
plt.legend()
plt.show()
손실 그래프
학습모델 결과와 실제 목표값 비교