본문 바로가기
프로그래밍 놀이터/머신러닝, AI, 딥러닝

[머신러닝] #4 신경망 학습 #1

by 돼지왕왕돼지 2018. 7. 5.

[머신러닝] #4 신경망 학습 #1


"Deep Learning from Scratch” 책을 보고 제가 필요한 내용만 정리한 내용입니다.

자세한 내용은 책을 구매해서 보세요~

analytic differentiation, Arrange, cee, cee 구현, Choice, cross entropy error, cross entropy error delta, deep learning, end to end machine learning, LN, loss function, Machine Learning, mean squared error, mini batch, MSE, numerical differentiation, overfitting, random, rounding error, Shape, test data, traning data, 가중치 매개변수 구하기, 가중치 매개변수 최적값, 가중치 편향, 계단 함수, 계단 함수 미분, 교차 엔트로피 오차, 근사치, 기계 스스로 학습, 기계학습, 기계학습 데이터, 기계학습의 최종 목표, 기울기, 기울기 0, 데이터 주도 학습, 딥러닝, 딥러닝 최종 목표, 매개변수의 미분, 모델의 실력 평가, 미니 배치, 미니 배치 학습, 미분, 반올림 오차, 범용 능력, 범용 능력 획득, 사람 설계 기계 학습, 손실 함수, 손실 함수 최소화 매개변수, 손실함수, 수치미분, 시험 데이터, 신경망, 신경망 성능의 나쁨, 신경망 학습, 신경망 학습 미분, 오비피팅, 왜 손실함수, 원 핫 인코딩, 음수, 자연 로그, 전방 차분, 정확도 지표, 종단간 기계학습, 중앙 차분, 진정한 미분, 최적의 매개변수, 편미분, 평균 손실 함수, 평균 제곱 오차, 학습, 한 순간의 변화량, 해석적 미분, 해석적 해, 현재 상태 지표, 활성화 함수, 훈련 데이터


-

학습은 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것을 뜻한다.

신경망이 학습할 수 있도록 해주는 지표인 손실함수가 있다.

이 손실 함수의 결과값을 가장 작게 만드는 가중치 매개변수를 찾는 것이 학습의 목표이다.





4.1. 데이터에서 학습한다!


-

신경망의 특징은 데이터를 보고 학습을 할 수 있다는 것이다.

데이터에서 학습한다는 것은 가중치 매개변수의 값을 데이터를 보고 자동으로 결정한다는 뜻이다.




4.1.1. 데이터 주도 학습


-

기계학습은 데이터가 생명이다. 데이터에서 답을 찾고 데이터에서 패턴을 발견하고 데이터로 이야기를 만드는 것이 기계학습이다.

데이터가 없으면 아무것도 시작되지 않는다.

그래서 기계학습의 중심에는 “데이터”가 존재한다.



-

신경망과 딥러닝은 기존 기계학습에서 사용하던 방법보다 사람의 개입을 더욱 배제할 수 있게 해주는 중요한 특성을 지녔다.


예를 들어 손글씨 ‘5’ 를 인식하는 경우, 알고리즘을 밑바닥부터 ‘설계하는’ 대신 주어진 데이터를 잘 활용할 수 있다.

이미지에서 특징(feature)을 추출하고 그 특징의 패턴을 기계학습 기술로 학습하는 것이다.

여기서 말하는 특징은 입력 데이터(입력 이미지)에서 본질적인 데이터(중요한 데이터)를 정확하게 추출할 수 있도록 설계된 변환기를 가리킨다.

이미지의 특징은 보통 벡터로 기술하고, 컴퓨터 비전 분야에서는 SIFT, SURF, HOG 등의 특징을 많이 사용한다.

이런 특징을 사용하여 이미지 데이터를 벡터로 변환하고 변환된 벡터를 가지고 지도 학습 방식의 대표 분류 기법인 SVM, KNN 등으로 학습할 수 있다.


이 예제가 ‘기계학습 이며, 모아진 데이터로부터 규칙을 찾아내는 역할만을 ‘기계’ 가 담당한다.

다만, 이미지를 벡터로 변환할 때 사용하는 특징은 여전히 ‘사람’이 설계하는 것에 주의해야 한다.

이 말은 문제에 적합한 특징을 쓰지 않으면(혹은 특징을 설계하지 않으면) 좀처럼 좋은 결과를 얻을 수 없다는 것이다.

예를 들어 개의 얼굴을 구분하려 할 때는 숫자를 인식할 때와는 다른 특징을 ‘사람’이 생각해야 할 지도 모른다.



-

analytic differentiation, Arrange, cee, cee 구현, Choice, cross entropy error, cross entropy error delta, deep learning, end to end machine learning, LN, loss function, Machine Learning, mean squared error, mini batch, MSE, numerical differentiation, overfitting, random, rounding error, Shape, test data, traning data, 가중치 매개변수 구하기, 가중치 매개변수 최적값, 가중치 편향, 계단 함수, 계단 함수 미분, 교차 엔트로피 오차, 근사치, 기계 스스로 학습, 기계학습, 기계학습 데이터, 기계학습의 최종 목표, 기울기, 기울기 0, 데이터 주도 학습, 딥러닝, 딥러닝 최종 목표, 매개변수의 미분, 모델의 실력 평가, 미니 배치, 미니 배치 학습, 미분, 반올림 오차, 범용 능력, 범용 능력 획득, 사람 설계 기계 학습, 손실 함수, 손실 함수 최소화 매개변수, 손실함수, 수치미분, 시험 데이터, 신경망, 신경망 성능의 나쁨, 신경망 학습, 신경망 학습 미분, 오비피팅, 왜 손실함수, 원 핫 인코딩, 음수, 자연 로그, 전방 차분, 정확도 지표, 종단간 기계학습, 중앙 차분, 진정한 미분, 최적의 매개변수, 편미분, 평균 손실 함수, 평균 제곱 오차, 학습, 한 순간의 변화량, 해석적 미분, 해석적 해, 현재 상태 지표, 활성화 함수, 훈련 데이터

신경망은 이미지를 “있는 그대로” 학습한다.

기계학습의 경우는 특징을 사람이 설계하고, 기계가 학습을 했지만, 신경망은 이미지에 포함된 중요한 특징까지도 기계가 스스로 학습한다.



-

딥러닝을 종단간 기계학습(end-to-end machine learning)이라고도 한다.

여기서 종단간은 ‘처음부터 끝까지’라는 의미로, 데이터(입력)에서 목표한 결과(출력)를 사람의 개입 없이 얻는다는 뜻을 담고 있다.



-

신경망의 이점은 모든 문제를 같은 맥락에서 풀 수 있다는 데 있다.

예를 들어 ‘5’를 인식하는 문제든, ‘개’를 인식하는 문제든, 아니면 ‘사람의 얼굴’을 인식하는 문제든, 세부사항과 관계 없이 신경망은 주어진 데이터를 온전히 학습하고, 주어진 문제의 패턴을 발견하려 시도한다.

즉, 신경망은 모든 문제를 주어진 데이터 그대로를 입력 데이터로 활용해 ‘end-to-end’로 학습할 수 있다.




4.1.2. 훈련 데이터와 시험 데이터


-

기계학습에서 데이터를 취급할 때 주의할 점이 있다.

기계 학습 문제는 데이터를 훈련 데이터(training data)와 시험 데이터(test data)로 나눠 학습과 실험을 수행하는 것이 일반적이다.

우선 훈련 데이터만 사용하여 학습하면서 최적의 매개변수를 찾는다.

그런 다음 시험 데이터를 사용하여 앞서 훈련한 모델의 실력을 평가한다.


우리가 원하는 것은 범용적으로 사용할 수 있는 모델이기 때문에, 범용 능력을 제대로 평가하기 위해 훈련 데이터와 시험 데이터를 분리하는 것이다.

범용 능력은 아직 보지 못한 데이터(훈련 데이터에 포함되지 않은 데이터)로도 문제를 올바르게 풀어내는 능력이다.

이 범용 능력을 획득하는 것이 기계학습의 최종 목표이다.



-

데이터셋 하나로만 매개변수의 학습과 평가를 수행하면 올바른 평가가 될 수 없다.

수중의 데이터셋은 제대로 맞히더라도 다른 데이터셋에는 엉망인 일도 벌어진다.

한 데이터셋에만 지나치게 최적화된 상태를 오버피팅(overfitting)이라고 한다.

오버피팅 피하기는 기계학습의 중요한 과제이기도 하다.





4.2. 손실 함수


-

신경망 학습에서는 현재의 상태를 ‘하나의 지표’로 표현한다.

그리고 그 지표를 가장 좋게 만들어주는 가중치 매개변수의 값을 탐색하는 것이다.

신경망 학습에서 사용하는 지표는 손실 함수(loss function)라고 한다.

이 손실 함수는 임의의 함수를 사용할 수도 있지만 일반적으로는 평균 제곱 오차와 교차 엔트로피 오차를 사용한다.



-

손실 함수는 신경망 성능의 “나쁨”을 나타내는 지표로, 현재의 신경망이 훈련 데이터를 얼마나 잘 처리하지 “못”하느냐를 나타낸다.

손실 함수에 마이너스만 곱하면 “얼마나 나쁘지 않니”, 즉 “얼마나 좋으냐” 라는 지표로 변신한다.

또 “나쁨을 최소로 하는 것”과 “좋음을 최대로 하는 것” 은 결국 같은 것이므로, 성능의 “나쁨” 과 “좋음” 중 어느 쪽을 지표로 삼아도 본질적으로 수행하는 일은 다르지 않다.




4.2.1. 평균 제곱 오차


-

가장 많이 쓰이는 손실 함수는 평균 제곱 오차(mean squared error, MSE)이다.

analytic differentiation, Arrange, cee, cee 구현, Choice, cross entropy error, cross entropy error delta, deep learning, end to end machine learning, LN, loss function, Machine Learning, mean squared error, mini batch, MSE, numerical differentiation, overfitting, random, rounding error, Shape, test data, traning data, 가중치 매개변수 구하기, 가중치 매개변수 최적값, 가중치 편향, 계단 함수, 계단 함수 미분, 교차 엔트로피 오차, 근사치, 기계 스스로 학습, 기계학습, 기계학습 데이터, 기계학습의 최종 목표, 기울기, 기울기 0, 데이터 주도 학습, 딥러닝, 딥러닝 최종 목표, 매개변수의 미분, 모델의 실력 평가, 미니 배치, 미니 배치 학습, 미분, 반올림 오차, 범용 능력, 범용 능력 획득, 사람 설계 기계 학습, 손실 함수, 손실 함수 최소화 매개변수, 손실함수, 수치미분, 시험 데이터, 신경망, 신경망 성능의 나쁨, 신경망 학습, 신경망 학습 미분, 오비피팅, 왜 손실함수, 원 핫 인코딩, 음수, 자연 로그, 전방 차분, 정확도 지표, 종단간 기계학습, 중앙 차분, 진정한 미분, 최적의 매개변수, 편미분, 평균 손실 함수, 평균 제곱 오차, 학습, 한 순간의 변화량, 해석적 미분, 해석적 해, 현재 상태 지표, 활성화 함수, 훈련 데이터

yi 는 신경망의 출력(신경망이 추정한 값), ti 는 정답 레이블, n 은 데이터의 차원(dimension) 수를 나타낸다.

보통 1/n 을 곱하지만 1/2 를 곱하기도 한다.



-

def mean_squared_error(y, t):

    return 0.5 * np.sum((y-t)**2)




4.2.2. 교차 엔트로피 교차


-

교차 엔트로피 오차(cross entropy error, CEE) 도 자주 이용된다.

analytic differentiation, Arrange, cee, cee 구현, Choice, cross entropy error, cross entropy error delta, deep learning, end to end machine learning, LN, loss function, Machine Learning, mean squared error, mini batch, MSE, numerical differentiation, overfitting, random, rounding error, Shape, test data, traning data, 가중치 매개변수 구하기, 가중치 매개변수 최적값, 가중치 편향, 계단 함수, 계단 함수 미분, 교차 엔트로피 오차, 근사치, 기계 스스로 학습, 기계학습, 기계학습 데이터, 기계학습의 최종 목표, 기울기, 기울기 0, 데이터 주도 학습, 딥러닝, 딥러닝 최종 목표, 매개변수의 미분, 모델의 실력 평가, 미니 배치, 미니 배치 학습, 미분, 반올림 오차, 범용 능력, 범용 능력 획득, 사람 설계 기계 학습, 손실 함수, 손실 함수 최소화 매개변수, 손실함수, 수치미분, 시험 데이터, 신경망, 신경망 성능의 나쁨, 신경망 학습, 신경망 학습 미분, 오비피팅, 왜 손실함수, 원 핫 인코딩, 음수, 자연 로그, 전방 차분, 정확도 지표, 종단간 기계학습, 중앙 차분, 진정한 미분, 최적의 매개변수, 편미분, 평균 손실 함수, 평균 제곱 오차, 학습, 한 순간의 변화량, 해석적 미분, 해석적 해, 현재 상태 지표, 활성화 함수, 훈련 데이터

ln 은 밑이 e 인 자연 로그이고, oi 가 신경망의 출력, ti 는 정답 레이블이다.

ti 는 정답에 해당하는 인덱스의 원소만 1이고 나머지는 0이다.(원-핫 인코딩)

그래서 실질적으로 정답일 때의 추정(tk가 1일 때의 oi)의 자연로그를 계산하는 식이 된다.

즉, 교차 엔트로피 오차는 정답일 때의 출력이 전체 값을 정하게 된다.


아래는 자연로그 그래프이다. ( 그래프를 볼 때 CEE 앞에 -(마이너스) 부호가 붙은 것을 주목해서 보아야 한다. )

analytic differentiation, Arrange, cee, cee 구현, Choice, cross entropy error, cross entropy error delta, deep learning, end to end machine learning, LN, loss function, Machine Learning, mean squared error, mini batch, MSE, numerical differentiation, overfitting, random, rounding error, Shape, test data, traning data, 가중치 매개변수 구하기, 가중치 매개변수 최적값, 가중치 편향, 계단 함수, 계단 함수 미분, 교차 엔트로피 오차, 근사치, 기계 스스로 학습, 기계학습, 기계학습 데이터, 기계학습의 최종 목표, 기울기, 기울기 0, 데이터 주도 학습, 딥러닝, 딥러닝 최종 목표, 매개변수의 미분, 모델의 실력 평가, 미니 배치, 미니 배치 학습, 미분, 반올림 오차, 범용 능력, 범용 능력 획득, 사람 설계 기계 학습, 손실 함수, 손실 함수 최소화 매개변수, 손실함수, 수치미분, 시험 데이터, 신경망, 신경망 성능의 나쁨, 신경망 학습, 신경망 학습 미분, 오비피팅, 왜 손실함수, 원 핫 인코딩, 음수, 자연 로그, 전방 차분, 정확도 지표, 종단간 기계학습, 중앙 차분, 진정한 미분, 최적의 매개변수, 편미분, 평균 손실 함수, 평균 제곱 오차, 학습, 한 순간의 변화량, 해석적 미분, 해석적 해, 현재 상태 지표, 활성화 함수, 훈련 데이터


x 가 1일 때 y 는 0 이 되고, x 가 0에 가까워질수록 y 의 값은 점점 작아진다.

정답에 해당하는 출력이 커질수록 0에 다가가다가, 그 출력이 1일 때 0이 된다.

반대로 정답일 때의 출력이 작아질수록 오차는 커진다.



-

def cross_entropy_error(y, t):

    delta = 1e-7

    return -np.sum(t*np.log(y + delta))


delta 를 더하는 이유는 np.log() 함수에 0을 입력하면 마이너스 무한대를 뜻하는 -inf 가 되어 더 이상 계산을 진행할 수 없기 때문이다.

그래서 아주 작은 값인 delta 를 더해서 절대 0이 되지 않도록 한 것이다.




4.2.3. 미니배치 학습


-

기계학습 문제는 훈련 데이터에 대한 손실 함수 값을 구하고, 그 값을 최대한 줄여주는 매개변수를 찾아낸다.

이렇게 하려면 모든 훈련 데이터를 대상으로 손실 함수 값을 구해야 한다.

이는 평균 손실 함수를 구하면 된다.

평균을 구해 사용하면 훈련 데이터 개수와 관계없이 언제든 통일된 지표를 얻을 수 있다.



-

데이터의 갯수가 엄청 많을 때는 모든 데이터를 대상으로 손실 함수의 합을 구하려면 시간이 오래 걸린다.

빅 데이터 수준이 되면 그 수는 수백만에서 수천만도 넘는 거대한 값이 되기도 한다.

이 많은 데이터를 대상으로 일일이 손실 함수를 계산하는 것은 현실적이지 않다.

이런 경우 데이터 일부를 추려 전체의 ‘근사치’로 이용할 수 있다.

신경망 학습에서도 훈련 데이터로부터 일부만 골라 학습을 수행한다.

이 일부를 미니배치(mini batch)라고 한다. 미니배치를 통한 학습 방법을 미니배치 학습이라고 한다.



-

ex)

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]






4.2.4. (배치용) 교차 엔트로피 오차 구현하기


-

def cross_entropy_error(y, t):

    if y.ndim == 1: # y가 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



-

정답 레이블이 원-핫 인코딩이 아닌 경우에는 return 값이 아래와 같이 바뀌면 된다.

return -np.sum(np.log(y[np.arrange(batch_size), t])) / batch_size


np.arrange(batch_size) 는 0부터 batch_size - 1 까지 배열을 생성한다.

만약 batch_size 가 5이고, t가 [2, 7, 0, 9, 4] 라면..

np.arrange 가 [0, 1, 2, 3, 4] 를 생성하고,

y[np.arrange(batch_size), t] 는 각 데이터의 정답 레이블에 해당하는 신경망의 출력을 추출한다. (여기서는 y[0, 2], y[1,7], y[2,0], y[3,9], y[4.4] 인 배열을 생성)




4.2.5. 왜 손실 함수를 설정하는가?


-

높은 “정확도” 대신 “손실 함수의 값” 이라는 우회적인 방법을 선택하는 이유는, 신경망 학습에서의 “미분”의 역할에 주목하면 해결된다.

신경망 학습에서 최적의 매개변수(가중치와 편향)을 탐색할 때 손실 함수의 값을 가능한 한 작게 하는 매개변수 값을 찾는다.

이 때 매개변수의 미분(정확히는 기울기)을 계산하고, 그 미분 값을 단서로 매개변수의 값을 서서히 갱신하는 과정을 반복한다.


가중치 매개변수의 손실 함수의 미분이란 ‘가중치 매개변수의 값을 아주 조금 변화시켰을 때, 손실 함수가 어떻게 변하나’ 라는 의미이다.

만약 이 미분 값이 음수면 그 가중치 매개변수를 양의 방향으로 변화시켜 손실 함수의 값을 줄일 수 있다.

반대로, 이 미분 값이 양수면 그 가중치 매개변수를 음의 방향으로 변화시켜 손실 함수의 값을 줄일 수 있다.

그러나 미분 값이 0이면 가중치 매개변수를 어느 쪽으로 움직여도 손실 함수의 값은 달라지지 않는다. 그래서 그 가중치 매개변수의 갱신은 거기서 멈춘다.


정확도를 지표로 삼아서 안 되는 이유는 미분 값이 대부분의 장소에서 0이 되어 매개변수를 갱신할 수 없기 때문이다.


!! 신경망을 학습할 때 정확도를 지표로 삼아서는 안 된다. 정확도를 지표로 하면 매개변수의 미분이 대부분의 장소에서 0이 되기 때문이다. !!

( 그 이유는 아래 설명한다. )



-

한 신경망이 100장의 훈련 데이터 중 32장을 올바로 인식한다고 하자.

그럼 정확도는 32% 이다.

만약 정확도가 지표였다면 가중치 매개변수의 값을 조금 바꾼다고 해도 정확도는 그대로 32% 일 것이다.

즉, 매개변수를 약간만 조정해서는 정확도가 개선되지 않고 일정하게 유지된다.

혹, 정확도가 개선된다 하더라도 그 값은 32.0123% 와 같은 연속적인 변화보다는 33% 나 34% 처럼 불연속적인 띄엄띄엄한 값으로 바뀌어 버린다.

( 정확도는 맞췄다 틀렸다로 나뉘는 개념이라 정수 % 로 나온다. )


한편, 손실 함수를 지표로 삼았다면.. 손실 함수의 값이 0.92543... 같은 수치로 나타나기 때문에, 매개변수의 값이 조금 변하면 그에 반응하여 손실 함수의 값도 0.93432.. 처럼 연속적으로 변화한다.


이는 계단 함수를 활성화 함수로 사용하지 않는 이유와도 맞는다.

활성화 함수로 계단 함수를 사용하면 값이 급격히 변하기 때문에, (연속적이지 않아) 미분을 하기 어렵다.





4.3. 수치 미분


4.3.1. 미분


-

미분은 한 순간의 변화량을 이야기한다.

수학적 관점에서는 x 의 작은 변화가 함수 f(x) 를 얼마나 변화시키느냐를 이야기한다.



-

# 나쁜 구현 예

def numerical_diff(f, x):

    h = 10e-50

    return ( f(x+h) - f(x) ) / h


함수명은 수치 미분(numerical differentiation) 으로부터 정해졌다.

10e-50 은 0.00…1 형태에서 0이 50개라는 의미이다.


위의 방식은 반올림 오차(rounding error) 문제를 일으킨다.

반올림 오차는 작은 값(가령 소수점 8자리 이하)이 생략되어 최종 계산 결과에 오차가 생기게 한다.

np.float32(1e-50) 값은 0.0 이 된다.

너무 작은 값을 이용하면 컴퓨터로 계산하는 데 문제가 된다는 것이다.

이 미세한 값을 10-4 로 이용하면 된다. 10-4 정도로 설정하면 좋은 결과가 얻어진다고 알려져 있다.


두번째 개선은 진정한 미분이 어렵다는 것이다.

미분은 해당 위치의 함수의 기울기에 해당하지만, f(x+h) - f(x) 차분을 h 로 나눈 것은 정확하게는 해당 점의 기울기가 아니다.

이 차이는 h 를 무한히 0으로 좁히는 것이 불가능해 생기는 한계이다.

따라서 f 의 차분을 사용하면 계산에 오차가 있다.



-

이 오차를 줄이기 위해 (x+h) 와 (x-h) 일 때의 함수 f 의 차분을 계산하는 방법을 쓰기도 한다.

이 차분은 x를 중심으로 그 전후의 차분을 계산한다는 의미에서 중심 차분 혹은 중앙 차분이라 한다. ( x+h 와 x 의 차분은 전방 차분이라 한다. )

def numerical_diff(f,x):

    h = 1e-4 # 0.0001

    return ( f(x+h) - f(x-h) ) / (2*h)



-

아주 작은 차분으로 미분하는 것을 수치 미분이라 한다.

한편, 수식을 전개해 미분하는 것을 해석적(analytic)이라는 말을 이용하여 '해석적 해’ 혹은 ‘해석적으로 미분하다’ 등으로 표현한다.

해석적 미분은 오차를 포함하지 않는 진정한 미분 값을 구해준다.




4.3.2. 수치 미분의 예




4.3.3. 편미분


-

변수가 여럿인 함수에 대한 미분을 “편미분” 이라고 한다.

편미분은 변수가 하나인 함수를 정의하고, (미분하려는 변수가 아닌 녀석은 값을 미리 대입하여) 그 함수를 미분하는 형태로 풀 수 있다.




댓글0