공부를 하는 입장이기 때문에, 내용에 오류가 있을 수 있습니다. 오류가 있다면 적극적으로 알려주시면 감사합니다!
1. 신경망 학습(Neural Network Learning)
신경망을 학습한다는 것은 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 알아내는 것을 말한다. 기계학습에서는 데이터의 특징을 사람이 직접 정의하고 이를 학습시키는 반면, 신경망 학습은 데이터를 있는 그대로 학습하여 특징을 자동으로 추출한다.
과적합(overfitting)은 모델이 훈련 데이터에게만 지나치게 최적화가 되어 다른 데이터들에는 성능이 떨어져 일반성을 잃게 되는 것을 말한다.
기계학습과 마찬가지로, 모델의 일반화를 위해 훈련 데이터(training data)와 시험 데이터(test data)를 나누어 사용한다. 또한 학습 과정 중 모델을 평가하고 과적합(overfitting)을 방지하며, 하이퍼파라미터를 튜닝하기 위해 훈련 데이터를 훈련 데이터와 검증 데이터(validation data)로 다시 나누어서 사용한다. 검증 데이터의 구체적인 역할은 나중에 설명하겠다.
2. 손실 함수(Loss Function)
학습을 평가하기 위해서는 기준이 필요하다. 신경망 학습에서는 '학습이 얼마나 잘못되었는가?'를 기준으로 학습을 진행하며, 이를 측정하는 지표로 손실 함수를 사용한다. 손실 함수의 값을 기반으로 경사하강법과 같은 최적화 알고리즘을 통해 손실 함수의 값을 줄이는 방식으로 모델을 학습한다.
2.1 Mean Squared Error
평균 제곱 오차는 회귀에서 많이 사용한다. 예측 값과 실제 값의 차이를 제곱하여 평균을 계산하는 방식으로 오차를 구한다. $$ E = \frac{1}{2}\sum_k(y_{k}-t_{k})^{2} $$
def mean_squared_error(y, t):
return 0.5 * np.sum((y-t)**2)
2.2 Cross Entropy Error
교차 엔트로피 오차의 경우는 분류에서 많이 사용한다. 교차 엔트로피 오차의 경우는 자연로그를 사용한다. $$ E = -\frac{1}{N}\sum_n\sum_kt_{nk}\ln{y_{nk}} $$
- : 데이터 샘플의 개수
- : \(N\) 번째 샘플의 \(k\) 번째 클래스에 대한 실제 정답 레이블 (0 또는 1)
- : \(N\) 번째 샘플의 \(k\) 번째 클래스에 대한 예측 확률 (0~1 사이 값)
분류 문제에서는 출력 신호가 0에서 1 사이의 확률 값으로 나타나고, 정답 레이블은 0 또는 1로 주어 진다.
- 정답이 0일 경우: \(t_{nk}\) = 0이므로 모든 식이 0이 되어 손실 값에 영향을 주지 않는다.
- 정답이 1일 경우: 오차는\(-\ln{y_{nk}}\)로 계산되며, 예측 확률 \( y_{nk}\) 가 1에 가까울수록 오차는 작아지고, 0에 가까울수록 오차가 크게 증가한다.
def cross_entropy_error(y, t):
delta = 1e-7
return -np.sum( t * np.log(y + delta))
만약 y가 0이 될 경우, 값이 음의 무한대가 되므로 계산이 진행이 되지 않는다. 따라서 1e-7라는 아주 작은 값을 더해서 이런 경우를 막는다. 하지만 이 경우는, batch데이터는 처리를 하지 못한다.(별도로 처리해야 함)
이 코드는 조금 더 확장성을 갖는다.
def cross_entropy_error(y, t):
# 데이터가 1차원일 경우 통일성을 위해 2차원으로 만듦
if y.ndim == 1:
t = t.reshape(1, t.size)
y = y.reshape(1, y.size)
# 훈련 데이터가 원-핫 벡터라면 정답 레이블의 인덱스로 반환
if t.size == y.size:
t = t.argmax(axis=1)
batch_size = y.shape[0]
return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size
이 코드는 정답 레이블이 1인 경우만 계산한다.
아래의 코드는 정답 인데스에 위치한 y값만 선택하는 코드이다.
y[np.arange(batch_size), t]
예를 들어 데이터의 개수가 3개인(batch가 3) 출력 데이터와 정답 테이블이 들어왔다고 하면 $$ y = \begin{bmatrix}0.1 &0.05&0.6 \\0.0& 0.05& 0.1\\0.0 & 0.1& 0.0 \end{bmatrix} ,\;\; t = \begin{bmatrix}1 & 0 & 0 \\0& 1 & 0\\0 & 0 & 1 \end{bmatrix} $$
다음 코드를 통해 정답 데이터가 정답 인덱스의 배열로 바뀐다. $$ t = \begin{bmatrix}0 & 1 & 2 \end{bmatrix} $$
if t.size == y.size:
t = t.argmax(axis=1)
그리고 y가 넘파이 배열인 것을 이용하여 정답 인덱스의 위치에 대한 데이터 값만 뽑는다.
y[np.arange(batch_size), t]
동작
- np.arange(batch_size)는 [0, 1, 2] 배열(batch size = 3)을 생성한다.
- y[np.arange(batch_size), t]는 각 배치의 행(row)에서 t에 해당하는 열(column)의 값을 선택한다.
(\( t = \begin{bmatrix}0 & 1 & 2 \end{bmatrix} \) )- 첫 번째 데이터에서 정답 인덱스 0에 해당하는 0.1 선택
- 두 번째 데이터에서 정답 인덱스 1에 해당하는 0.05 선택
- 세 번째 데이터에서 정답 인덱스 2에 해당하는 0.0 선택
결론적으로 y는 정답 인덱스로만 구성된 데이터를 갖게 된다. $$y = \begin{bmatrix} 0.1 & 0.05 & 0.0 \end{bmatrix}$$
이후 log함수에 넣어 batch size로 나누어 cross entropy error를 구할 수 있게 된다.
3. 확률적 경사 하강법(Stochastic Gradient Descent)
경사 하강법이란 손실함수의 기울기를 통하여 최적의 매개변수(가중치와 편향)를 구하는 방식을 말한다. 확률적 경사 하강법이란 전체의 데이터 셋이 아닌 데이터 몇 개만 랜덤으로 골라서 배치를 만드는 미니 배치(mini batch)를 이용하여 진행하는 경사 하강법을 말한다. $$ w_{1} \leftarrow \, w_{0}-\eta\frac{\partial {LossFunction}}{\partial w_{0}} $$
- : 학습률 (보통 0.01이나 0.0001 같이 미리 정해둔 값이다.)
작동 방식
- 기울기가 양수인 경우: \(-\eta\frac{\partial {L}}{\partial w}\)가 음수이므로 다음번 가중치가 줄어든다.
- 기울기가 음수인 경우 : \(-\eta\frac{\partial {L}}{\partial w}\)가 양수이므로 다음번 가중치가 증가한다.
num만큼 진행하는 함수이다.
def gradient_descent(f, init_x, lr=0.01, step_num=100):
x = init_x
for i in range(step_num):
grad = numerical_gradient(f,x)
x -= lr * grad
return x
'밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
Backpropagation (0) | 2024.12.24 |
---|---|
Neural Network Learning Example (0) | 2024.12.22 |
Neural Network example (1) | 2024.12.20 |
Neural Network (0) | 2024.12.19 |
밑바닥부터 시작하는 딥러닝 (0) | 2024.12.18 |