학습 : 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것
4.1. 데이터에서 학습한다!
✔️ 데이터 주도 학습
1. 그림을 분류하는 알고리즘을 사람이 직접 설계
2. 이미지에서 특징(feature)을 추출하고 그 특징의 패턴을 기계학습 기술로 학습하는 방법
3. 신경망 : 이미지를 있는 그대로 학습
1, 2는 사람이 개입하지만 3은 기계가 스스로 학습한다.
이와 같이 신경망은 모든 문제를 같은 맥락에서 풀 수 있다는 장점이 있다.
'5'를 인식하든, '강아지'를 인식하든 세부사항과 관계없이 신경망은 주어진 데이터를 온전히 학습하고 주어진 문제의 패턴을 발견하려 시도한다. 즉, 모든 문제를 주어진 데이터 그대로 입력데이터로 활용해 'end-to-end'로 학습한다.
✔️ 훈련데이터와 시험데이터
데이터를 훈련데이터와 시험데이터로 나눠 학습과 실험을 수행하는데 이는 범용적으로 사용할 수 있는 모델을 원하기 때문이다.
범용능력은 아직 보지 못한 데이터(훈련데이터에 포함되지 않는 데이터)로도 문제를 올바르게 풀어내는 능력이다.
이 범용능력을 획득하는 것이 기계학습의 최종목표.
오버피팅(overfitting) : 한 데이터셋에만 지나치게 최적화된 상태
수중의 데이터셋은 제대로 맞히더라도 다른 데이터셋에는 엉망으로 예측하기도 한다.
4.2. 손실함수
손실함수 : '행복의 지표'를 가진 사람이 그 지표를 근거로 '최적의 인생'을 탐색하듯 신경망도 '하나의 지표'를 기준으로 '최적의 매개변수 값'을 탐색하는데, 이 때 사용하는 지표
✔️ 평균 제곱 오차
평균 제곱 오차(mean squared error, MSE)
y_k는 신경망의 출력(신경망이 추정한 값), t_k는 정답 레이블, k는 데이터의 차원 수
def mean_squared_error(y, t):
return 0.5 * np.sum((y-t)**2)
오차가 작을 수록 정답일 가능성이 높다.
✔️ 교차 엔트로피 오차
교차 엔트로피 오차(cross entropy error, CEE)
y_k는 신경망의 출력(신경망이 추정한 값), t_k는 정답 레이블, k는 데이터의 차원 수
def cross_entropy_error(y, t):
delta = 1e-7 # delta는 아주 작은 값으로 log(0)은 -inf가 되므로 이를 막기 위한 값
return -np.sum(t * np.log(y + delta))
평균제곱오차(MSE)와 같이 오차가 작을 수록 정답일 가능성이 높다.
✔️ 미니 배치(mini-batch)
식 4-3은 데이터가 N개인 교차 엔트로피 오차를 구하는 식이다.
N으로 나눔으로써 평균 손실 함수를 구하는 것이다.
여기서 모든 데이터를 대상으로 손실 함수의 합을 구하려면 많은 시간이 소요되므로 데이터의 일부를 추려 전체의 '근사치'로 이용할 수 있다.
훈련 데이터로부터 일부만 골라 학습을 수행하는데, 이 때의 일부를 미니배치 라고 한다.
6만장의 데이터 중 100장만 무작위로 뽑아 그 100장만을 사용해 학습하는 것을 미니배치 학습 이라고 한다.
train_size = x_train.shape[0] # 전체 학습 데이터
batch_size = 10 # 미니 배치
batch_mask = np.random.choice(train_size, batch_size) # 미니 배치만큼 랜덤하게 뽑음
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]
def cross_entropy_error(y, t):
if y.ndim == 1:
t = t.reshape(1, t.size)
y = y.reshape(1, y.size)
batch_size = y.shape[0]
return -np.sum(t * np.log(y)) / batch_size
✔️ 정확도가 아닌 손실함수를 사용하는 이유
신경망 학습에서 최적의 매개변수(가중치와 편향)을 탐색할 때 손실함수의 값을 가능한 작게 하는 매개변수값을 찾는데, 이 때 매개변수의 미분(기울기)을 계산하고 그 미분값을 단서로 매개변수의 값을 서서히 갱신하는 과정을 반복한다.
정확도를 지표로 삼아서는 안되는 이유는 미분 값이 대부분의 장소에서 0이 되어 매개변수를 갱신할 수 없기 때문이다.
예를 들어 한 신경망이 100장의 훈련 데이터 중 32장을 올바르게 인식하면 정확도는 32%이다. 만약 여기서 가중치 매개변수의 값을 조금 바꾼다고 해도 정확도는 그대로 32%일 것이다. 개선된다하더라도 32.0123%가 아닌 33%, 34%처럼 불연속적으로 값이 변한다.
하지만 손실 함수의 값은 0.92534 같은 수치로 나타난다. 그리고 매개변수의 값이 조금 변하면 그에 반응하여 손실 함수의 값도 0.93432처럼 연속적으로 변화한다.
이처럼 정확도는 매개변수의 미소한 변화에 반응이 거의 없거나 반응이 있더라도 그 값이 불연속적으로 갑자기 변화한다. 이는 '계단함수'를 활성화함수로 사용하지 않는 이유와도 같다. 계단함수의 미분은 대부분의 장소(0이외의 곳)에서 0이다.
4.4. 기울기
기울기(gradient) : 모든 변수의 편미분을 벡터로 정리한 것
def _numerical_gradient_no_batch(f, x):
h = 1e-4 # 0.0001
grad = np.zeros_like(x) # x와 형상이 같은 배열을 생성
for idx in range(x.size):
tmp_val = x[idx]
# f(x+h) 계산
x[idx] = float(tmp_val) + h
fxh1 = f(x)
# f(x-h) 계산
x[idx] = tmp_val - h
fxh2 = f(x)
grad[idx] = (fxh1 - fxh2) / (2*h)
x[idx] = tmp_val # 값 복원
return grad
기울기의 결과에 마이너스를 붙인 벡터를 그리면 그림 4-9와 같다.
기울기는 함수의 '가장 낮은 장소(최솟값)'를 가르키는 것과 같다. 또한 '최솟값'에서 멀어질수록 화살표의 크기가 커진다.
이와 같이 기울기가 가르키는 쪽은 각 장소에서 함수의 출력값(손실함수)을 가장 크게 줄이는 방향이다.
✔️ 경사법(경사하강법)
손실 함수가 최솟값이 될 때의 매개변수값을 찾기 위해 기울기를 활용하는데 이 때의 방법을 경사법이라고 한다.
이 때, 기울기가 가르키는 곳에 정말 함수의 최솟값이 있는지는 보장할 수 없다.
함수의 극솟값, 최솟값이 있는 장소에서는 기울기가 0이다. 하지만 이는 한정된 범위에서의 최솟값이다. 어느 방향에서보면 극댓값이고 다른 방향에서보면 극솟값이 되는 점이다. 경사법은 기울기가 0인 장소를 찾지만 그것이 반드시 최솟값이라고 할 수는 없다. 이처럼 복잡하고 찌그러진 모양의 함수라면 평평한 곳으로 파고들면서 고원(plateuae)라고 하는 학습이 진행되지 않는 정체기에 빠질 수 있다.
경사법(경사하강법) : 현 위치에서 기울어진 방향으로 일정 거리만큼 이동하고 그 곳에서 마찬가지로 기울기를 구하여 이동하는 것을 반복한다. 이렇게 함수의 값을 점차 줄이는 방법
학습률(learning rate) : 갱신하는 양(η)
한 번의 학습으로 얼만큼 학습해야 할지, 즉 매개변수 값을 얼마나 갱신하느냐를 정한다.
이 때 학습률을 잘 설정해야 좋은 결과를 얻을 수 있다.
학습률이 너무 크면 큰 값으로 발산하고, 너무 작으면 거의 갱신되지 않은 채로 끝난다.
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
f는 최적화하려는 함수, init_x는 초깃값, lr은 learning rate(학습률), step_num은 경사법에 따른 반복 횟수
함수의 기울기는 numerical_gradient(f, x)로 구하고 그 기울기에 학습률을 곱한 값으로 갱신하는 처리를 step_num번 반복한다.
이처럼 가중치와 편향같은 신경망의 매개변수와는 성질이 다른 학습률 같은 매개변수를 하이퍼파라미터라고 한다.
신경망의 가중치 매개변수는 훈련 데이터와 학습 알고리즘에 의해 자동으로 획득되는 매개변수인 반면, 학습률 같은 하이퍼파라미터는 사람이 직접 설정해야 한다.
4.5. 학습 알고리즘 구현하기
전제 : 신경망에는 적응 가능한 가중치와 편향이 있고, 이 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정을 '학습'이라고 한다.
1단계 - 미니배치 : 훈련 데이터 중 일부를 무작위로 가져온다. 이렇게 선별한 데이터를 미니배치라 하며, 그 미니배치의 손실함수값을 줄이는 것이 목표
2단계 - 기울기 산출 : 미니배치의 손실 함수 값을 줄이기 위해 각 가중치 매개변수의 기울기를 구한다. 기울기는 손실 함수의 값을 가장 작게 하는 방향을 제시한다.
3단계 - 매개변수 갱신 : 가중치 매개변수를 기울기 방향으로 아주 조금 갱신한다.
4단계 - 반복 : 1~3단계를 반복한다.
이것이 신경망 학습이 이뤄지는 순서로, 경사하강법으로 매개변수를 갱신하는 방법이다.
이 때 데이터를 미니배치로 무작위로 선정하기 때문에 확률적 경사 하강법(stochastic gradient descent, SGD)라고 한다.
학습이 반복됨에 따라 손실함수의 값이 줄어들고 있다.
이는 학습이 잘 되고 있다는 뜻
훈련 데이터와 시험 데이터 두 정확도의 차이가 없음을 확인할 수 있다.
이는 오버피팅이 일어나지 않았다는 뜻
4.6. 정리
- 기계학습에서 사용하는 데이터셋은 훈련데이터와 시험데이터로 나눠 사용한다.
- 훈련 데이터로 학습한 모델의 범용 능력을 시험 데이터로 평가한다.
- 신경망 학습은 손실 함수를 지표로, 손실함수의 값이 작아지는 방향으로 가중치 매개변수를 갱신한다.
- 가중치 매개변수를 갱신할 때는 가중치 매개변수의 기울기를 이용하고, 기울어진 방향으로 가중치의 값을 갱신하는 작업을 반복한다.
- 아주 작은 값을 주었을 때의 차분으로 미분하는 것을 수치 미분이라고 한다.
- 수치 미분을 이용해 가중치 매개변수의 기울기를 구할 수 있다.
- 수치 미분을 이용한 계산에는 시간이 걸리지만, 그 구현은 간단하다. 한편, 다음 장에서 구현하는 (다소 복잡한) 오차역전파법은 기울기를 고속으로 구할 수 있다.
참고 git : https://github.com/geonsangyoo/DeepLearning/tree/master
'Deep Learning' 카테고리의 다른 글
[밑바닥부터시작하는딥러닝1] Chapter 7. 합성곱 신경망(CNN) (0) | 2024.04.13 |
---|---|
[밑바닥부터시작하는딥러닝1] Chapter 6. 학습관련기술들 (0) | 2024.04.12 |
[밑바닥부터시작하는딥러닝1] Chapter 5. 오차역전파법 (0) | 2024.04.05 |
[밑바닥부터시작하는딥러닝1] Chapter 3. 신경망 (0) | 2024.04.03 |
[밑바닥부터시작하는딥러닝1] Chapter 2. 퍼셉트론 (0) | 2024.04.02 |