들어가기 전에,
*하이퍼 파라미터와 매개변수의 차이점
하이퍼 파라미터 - 사용자가 직접 정해줄 수 있는 변수 ex) 경사하강법에서 learning rate, 딥러닝에서 은닉층의 수, 뉴런의 수, 드롭아웃 비율
매개변수 - 모델이 학습하는 과정에서 얻어지는 값 , 기계가 훈련을 통해서 바꾸는 변수.
훈련용 데이터로 훈련을 모두 시킨 모델은 검증용 데이터를 사용하여 정확도를 검증하며 하이퍼 파라미터를 튜닝한다.
또한 이 모델의 매개변수는 검증용 데이터로 정확도가 검증되는 과정에서 점차 검증용 데이터에 점점 맞추어진다.
하이퍼 파라미터 튜닝이 끝났다면, 검증용 데이터가 아닌 새로운 데이터로 모델에 대한 평가를 진행한다.
하나의 데이터, 하나의 행을 샘플이라고 부름.
퍼셉트론
오늘날 인공 신경망에서 이용하는 구조. 선형분류기
다수의 신호(흐름이 있는)를 입력 받아 하나의 신호를 출력. 이 신호를 입력으로 받아 흐른다/안흐른다(1 / 0) 정보를 앞으로 전달하는 원리로 작동
단층 퍼셉트론
값을 보내는 단계와 값을 받아서 출력하는 두 단계로만 이루어짐
AND, NAND, OR 게이트 쉽게 구현 가능.
1. AND 게이트 : 모든 입력이 1일 때 작동
2. NAND 게이트 : 두개의 입력 값이 1인 경우에만 출력값이 0, 나머지 입력 값의 쌍에 대해서는 모두 출력값 1
3. OR 게이트 : 두개의 입력 값이 모두 0인 경우에 출력값 0이고 나머지 경우에는 모두 출력값 1
적절한 weight와 bias값 찾으면 단층 퍼셉트론 식으로 구현 가능.
ex) OR 게이트
def OR_gate(x1, x2):
w1=0.6
w2=0.6
b=-0.5
result = x1*w1 + x2*w2 + b
if result <= 0:
return 0
else:
return 1
게이트를 시각화 했을 때 모두 직선으로 표현되지만, XOR 게이트는 비선형으로 표현된다.
데이터가 비선형적으로 분리되기 때문에 제대로 된 분류가 어렵다.
따라서 XOR에 대해서는 퍼셉트론으로 학습이 불가능하다.
이를 극복하는 방법?
입력층과 출력층 사이에 하나 이상의 은닉층을 두어 비선형적으로 분리되는 데이터에 대해서도 학습이 가능하도록 다층 퍼셉트론을 고안.
*심층 신경망 : 은닉층이 2개 이상인 신경망
입력층(input layer) | 데이터를 받아들이는 층 |
은닉층(hidden layer) | 모든 입력 노드로부터 입력 값을 받아 가중합을 계산하고, 이 값을 활성화 함수에 적용하여 출력층에 전달하는 층 |
출력층(output layer) | 신경망의 최종 결괏값이 포함된 층 |
bias | 가중합에 더해주는 상수. 하나의 뉴런에서 활성화 함수를 거쳐 최종적으로 출력되는 값을 조절 |
activation function(활성화 함수)
*시그모이드 함수는 은닉층에서 사용하는 것이 지양된다.
why? 기울기 소실 문제
여기서, 기울기 소실 문제는 무엇인가?
은닉층이 많은 신경망에서 주로 발생.
출력층에서 은닉층으로 전달되는 오차가 크게 줄어들어 학습이 되지 않는 현상
기울기가 소멸되기 때문에 학습되는 양이 0에 가까워져 학습이 더디게 진행되다 오차를 더 줄이지 못하고 그 상태로 수렴하는 현상이다. (역전파 과정에서 0에 가까운 아주 작은 기울기가 곱해지면 앞단에는 기울기가 잘 전달되지 않음)
이를 해결하기 위해서는 렐루 활성화 함수를 사용하면 됨.
Hyperbolic tangent function
입력값을 -1과 1 사이 값으로 반환.
얘도 기울기 소실 문제가 있지만 시그모이드 보다는 적다.
ReLU 함수
입력이 음수일 때는 0 출력, 양수일 때는 x를 출력.
경사하강법에 영향을 주지 않아 학습 속도가 빠르고, 기울기 소멸 문제가 발생하지 않음.
일반적으로 은닉층에서 사용
입력이 음수일 때 0을 출력한다는 점을 보완한 Leaky ReLU함수가 있다.
이는 입력 값이 음수이면 0이 아닌 0.001처럼 매우 작은 수 반환
class Net(torch.nn.Module):
def __init__ (self, n_feature, n_hidden, n_output):
super(Net, self).__init__()
self.hidden = torch.nn.Linear(n_feature, n_hidden) #은닉층
self.relu = torch.nn.ReLu(inplace=True)
self.out = torch.nn.Linear(n_hidden, n_output) #출력층
self.softmax = torch.nn.Softmax(dim=n_output)
def forward(self, x):
x = self.hidden(x)
x = self.relu(x)
x = self.out(x)
x = self.softmax(x) #출력층을 위한 소프트맥스 함수
return x
소프트맥스 함수
보통 딥러닝에서 출력 노드의 활성화 함수로 많이 사용
*활성화 함수? 신호를 입력 받아 이를 적절히 처리하려 출력해주는 함수
exp(x): 지수 함수
n : 출력층의 뉴런 개수
yk : 그 중에서 k번째 출력
분자 : 입력 신호 ak의 지수 함수
분모 : 모든 입력 신호의 지수함수 합으로 구성
손실 함수
remind!
경사하강법 : 학습률과 손실 함수의 순간 기울기를 이용하여 가중치 업데이트하는 방법
즉, 미분의 기울기를 이용하여 오차를 비교하고 최소화하는 방향으로 이동시킴
MSE
평균 제곱 오차, 회귀에서 주로 사용
loss_fn = torch.nn.MSELoss(reduction='sum')
y_pred = model(x)
loss = loss_fn(y_pred, y)
Cross Entropy
분류 문제에서 원핫 인코딩 했을 때만 사용할 수 있는 오차 계산법
왜 사용하는가?
sigmoid 함수 사용시 이에 포함된 자연 상수 e때문에 MSE 적용하면 매끄럽지 못한 그래프가 출력됨.
하지만 크로스 엔트로피 적용 시 경사 하강법 과정에서 학습이 지역 최소점에서 멈출 수 있음.
이를 방지하고자 e에 반대되는 자연로그 모델 출력값에 취해준다.
딥러닝 학습, 순전파와 역전파
네트워크에 훈련 데이터가 들어올 때 발생, 데이터 기반으로 예측 값 계산하기 위해 전체 신경망 교차해 지나감
즉, 모든 뉴런이 이전 층의 뉴런에서 수신한 정보에 변환(가중합 및 활성화 함수) 적용하여 다음 층의 뉴런으로 전송하는 방식이 순전파이다.
데이터가 모든 층을 통과하고 모든 뉴런이 계산을 완료하면 그 값은 최종 출력층에 도착
그리고나서, 손실/오차를 추정한다. 이때 손실 함수 비용은 0이 이상적임
따라서 cost가 0에 가깝도록 하기 위해서 모델이 훈련을 반복하면서 가중치를 update
손실(오차)가 계산되면 그 정보는 역으로 전파된다. (출력층 -> 은닉층 -> 입력층)
이처럼 거슬러 올라가기 때문에 역전파라고 불림
출력층에서 시작된 손실 비용은 은닉층의 모든 뉴런으로 전파되지만, 은닉층의 뉴런은 각 뉴런이 원래 출력에 기여한 상대적 기여도에 따라 값이 달라진다. (예측 값과 실제 값 차이를 각 뉴런의 가중치로 미분한 후에 기존 가중치 값에서 빼준다)
이 과정을 출력층 -> 은닉층 -> 입력층 순서로 모든 뉴런에 진행하여 계산된 각 뉴런의 결과를 또다시 순전파의 가중치 값으로 사용함.
한마디로, 인공 신경망의 학습은 오차를 최소화하는 가중치를 찾는 목적으로 순전파와 역전파를 반복하는 것임
'Pytorch' 카테고리의 다른 글
딥러닝 과적합 문제, 성능 저하 문제, 경사 하강법 유형, 기울기 소실과 폭주 (0) | 2023.01.02 |
---|---|
MNIST 분류 by softmax regression (0) | 2022.12.29 |
SoftMax Regression (0) | 2022.12.29 |
Logistic Regression (0) | 2022.12.29 |
Mini Batch and Data Load (0) | 2022.12.29 |