티스토리 뷰

1. 학습 알고리즘

신경망에는 매개변수(가중치, 편향)이 있고, 이를 데이터에 적응하도록 조정하는 과정을 학습이라고 한다. 학습은 다음과 같은 4단계로 수행된다.

 

  • 1단계 : 미니배치 : 학습 데이터의 일부를 무작위로 가져온다. 선별된 데이터를 미니배치라고 한다.
  • 2단계 : 기울기 산출 : 미니배치의 손실 함수 값을 줄이기 위해, 손실 함수에 대한 각 매개변수의 기울기를 구한다.
  • 3단계 : 매개변수 갱신 : 가중치 매개변수를 기울기 방향으로 아주 조금 갱신한다.
  • 4단계 : 1~3단계를 반복한다.

 

무작위 확률적으로 골라낸 데이터에 대해 수행하는 경사 하강법이므로, 이를 확률적 경사 하강법이라고 부른다.

 

 

 

 

 

2. 그라디언트를 구하는 방법

수치 미분 방식(아주 작은 차분으로 미분)으로 각각의 매개변수의 손실 함수에 대한 기울기를 구하는 것이 기본적인 방법이다. 이 방식은 기울기를 구하는 데 많은 시간이 걸린다. 기울기를 빠르게 구하는 오차역전파 알고리즘이 존재한다.

 

 

 

 

 

3. 미니배치 학습 구현

import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

# 데이터 읽기
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)

# 신경망 정의
network = TwoLayerNet(input_size = 784, hidden_size = 50, output_size = 10)

#하이퍼파라미터
iters_num = 10000
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1

train_loss_list = []
train_acc_list = []
test_acc_list = []

iter_per_epoch = max(train_size / batch_size, 1)


for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)

    x_batch = x_train[batch_mask] # 미니 배치
    t_batch = t_train[batch_mask] # 정답

    # 그라디언트 계산
    grad = network.numerical_gradient(x_batch, t_batch)

    # 그라디언트 방향으로 매개변수 업데이트
    for i in ('W1', 'b1', 'W2', 'b2'):
        network.params[i] -= learning_rate * grad[i]

    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)

    # 1에포크만큼 학습했을 때 로그 기록
    if (i % iter_per_epoch) == 0:
        train_acc = network.accuracy(x_train, t_train)
        test_acc = network.accurarcy(x_test, t_test)
        train_acc_list.append(train_acc)
        test_acc_list.append(test_acc)
        print("train_acc, test_acc : " + str(train_acc) + ", " + str(test_acc))

 

 

위의 구현에선 매개변수를 업데이트한 뒤, 미니배치에 대한 손실 함수 값을 계산하여 기록하고 있다. 이러한 손실 함수 값의 변화 추이를 그래핑하면 아래와 같다.

 

 

 

 

 

학습이 진행됨에 따라 손실 함수의 값이 줄어드는 것을 볼 수 있다. 학습이 잘 되고 있다는 뜻으로, 신경망의 매개변수가 서서히 데이터에 적응하고 있음을 의미한다.

 

 

 

 

 

4. 시험 데이터로 평가하기

학습이 되면서 손실 함수 값이 서서히 내려가는 것을 확인했다. 하지만 이는 학습 데이터의 미니배치에 대한 손실 함수 값이다. 이 결과만으로는 다른 데이터셋에도 비슷한 실력을 발휘할지 알 수 없다.

 

즉, 오버피팅을 일으키지 않는지 확인해야 한다. 신경망 학습의 원래 목표는 범용적인 능력을 익히는 것이므로, 범용 능력을 평가하려면 학습 데이터가 아닌 데이터를 대상으로 정확도를 기록하면 된다. 이를 시험 데이터라고 한다.

 

시험 데이터에 대한 정확도가 증가하다가 감소하는 시점을 오버피팅의 발생이라고 해석할 수 있다. 이러한 순간을 포착하여 학습을 중단하면 오버피팅을 효과적으로 예방할 수 있으며, 이를 조기 종료(early stopping)이라고 한다.

'밑바닥부터 시작하는 딥러닝1' 카테고리의 다른 글

매개변수 갱신 방법  (2) 2023.12.05
오차역전파법  (0) 2023.12.03
경사 하강법  (0) 2023.11.26
신경망 학습  (0) 2023.11.26
신경망  (0) 2023.11.25
«   2024/05   »
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