벌써 4번째!!
1,2는 간단했지만 3번째부터는 꽤 시간이 소요되고 있다..
그래도 예전에 공부했던 것을 또 복습하고 놓쳤던 부분을 알 수 있어서 더 좋은거 같다.
이번 챕터도 아좌좌!!
곧 시험이어서 많은 시간을 투자하진 못해서 시험 끝나고 다시 추가해서 올릴 예정이다..
스터디 + 기말 쉽지 않다..
이전 챕터가 궁금하신 분들은 밑의 링크를 참고해 주시길 바랍니다.
2023.06.12 - [Deep Learning] - [밑바닥부터 시작하는 딥러닝] Chapter 3. 신경망
해당 포스팅은 "밑바닥부터 시작하는 딥러닝"을 공부하고 정리, 요약한 글입니다.
모든 내용은 해당 도서 내용 기준입니다.
학습이란?
훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것
학습 목표는 밑에와 같다.
손실 함수의 결과값을 가장 작게 만드는 가중치 매개변수를 찾자
4. 1 데이터에서 학습한다.
신경망의 특징은 데이터를 보고 학습할 수 있다는 점이다. -> 가중치 매개변수의 값을 데이터를 보고 자동으로 결정한다.
위와 같이 신경망은 이미지를 '있는 그대로'학습합니다. 그렇기 때문에 딥러닝을 종단간 기계학습이라고 부르기도 한다. 데이터(입력)에서 목표한 결과(출력)를 사람의 개입 없이 얻기 때문이다.
신경망의 이점은 모든 문제를 같은 맥락에서 풀 수 있다는 점이다.
세부사항과 관계없이 신경망은 주어진 데이터를 온전히 학습하고, 주어진 문제의 패턴을 발견해 시도한다. 즉, 신경망은 모든 문제를 주어진 데이터 그래도를 입력 데이터로 활용해 'end-to-end'로 학습할 수 있다.
4. 2 손실 함수
손실 함수 loss function : 신경망 학습에서 최적의 매개변수 값을 탐색하기 위해 사용하는 지표
ex) 오차제곱합, 교차 엔트로피 오차
4.2.1 오차제곱합
가장 많이 쓰이는 손실 함수는 오차제곱합(sum of squares for error, SSE)이다.
위 수식에서 yk는 신경망의 출력(신경망이 추정한 값), tk는 정답 레이블, k는 데이터의 차원수를 나타낸다.
# 오차제곱합 구현
import numpy as np
import matplotlib.pyplot as plt
def sum_squares_error(y,t):
return 0.5 * np.sum((y-t)**2)
# 정답은 '2'
t = [0,0,1,0,0,0,0,0,0,0]
# '2'일 확률이 가장 높다고 추정함 (0.6)
y = [0.1, 0.05, 0.6, 0.0 , 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
print(sum_squares_error(np.array(y), np.array(t)))
# '7'일 확률이 가장 높다고 추정함 (0.6)
y = [0.1, 0.05, 0.1, 0.0 , 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]
print(sum_squares_error(np.array(y), np.array(t)))
오차 제곱합을 구현해보았다. 여기서 정답이 '2'이고 신경망의 출력도 '2'로 같은 경우 손실 함수의 출력 결과 값이 작다. 하지만 두 번째 예시에서는 신경망 출력이 '7'에서 가장 높다. 이 실험의 결과로 첫 번째 예의 손실 함수 쪽 출력이 작으며 정답 레이블과 오차도 작은 것을 확인 할 수 있다. 즉, 오차제곱합 기준으로는 오차가 더 작으니 정답에 더 가까울 것이라고 판단할 수 있다.
* 원-핫 인토딩 : 한 원소만 1로하고 그 외에는 0으로 나타내는 표기법
4.2.2 교차 엔트로피 오차 cross entropy error, CEE
위 수식에서 log는 밑이 e인 자연로그 (ln)이다. yk는 신경망의 출력(신경망이 추정한 값), tk는 정답 레이블이며 tk에서는 정답에 해당하는 인덱스 원소만 1이고 나머지가 0이다. 그래서 위 수식은 정답일때만 자연로그를 계산하는 식이 된다. 즉, 교차 엔트로피 오차는 정답일 때의 출력이 전체 값을 정하게 된다.
# 교차 엔트로피 오차
import numpy as np
import matplotlib.pyplot as plt
def cross_entropy_error(y,t):
delta = 1e-7 # 아주 작은 0을 넣어 마이너스 무한대가 발생하지 않도록 함.
return -np.sum(t*np.log(y + delta))
# 정답은 '2'
t = [0,0,1,0,0,0,0,0,0,0]
# '2'일 확률이 가장 높다고 추정함 (0.6)
y = [0.1, 0.05, 0.6, 0.0 , 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
print(cross_entropy_error(np.array(y), np.array(t)))
# '7'일 확률이 가장 높다고 추정함 (0.6)
y = [0.1, 0.05, 0.1, 0.0 , 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]
print(cross_entropy_error(np.array(y), np.array(t)))
결과(오차 값)가 작은 첫 번째 추정이 가능성이 높다고 판단한다.
4.2.5 왜 손실 함수를 설정하는가?
신경망을 학습할 때 정확도를 지표로 삼아서는 안된다. 정확도를 지표로 하면 매개변수의 미분이 대부분의 장소에서 0이 되기 때문이다.
* 시그모이드 함수의 미분은 어느 장소라도 0이 되지 않는다 (기울기가 0이 되지 않는 덕분에 신경망이 올바르게 학습할 수 있다.)
4. 3 수치 미분
수치 미분 : 작은 차분으로 미분하는 것
4. 4 기울기
4.4.1 경사 하강법
기계학습 문제는 대부분 학습 단계에서 최적의 매개변수를 찾아낸다. 기울기를 잘 이용해 함수의 최솟값(또한 가능한 한 작은 값)을 찾으려는 것이 경사하강법(경사법)이다.
4. 5 학습 알고리즘 구현하기
신경망 학습 절차
전제
신경망에는 적응 가능한 가중치와 편향이 있고, 이 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정을 '학습'이라 한다.
1단계 - 미니배치
훈련 데이터 중 일부를 무작위로 가져온다. 이렇게 선별한 데이터를 미니배치라 하며, 그 미니배치의 손실 함수 값을 줄이는 것이 목표다.
2단계 - 기울기 산출
미니배치의 손실 함수 값을 줄이기 위해 각 가중치 매개변수의 기울기를 구한다. 기울기는 손실 함수의 값을 가장 작게 하는 방향을 제시한다.
3단계 - 매개변수 갱신
가중치 매개변수를 기울기 방향으로 아주 조금 갱신합니다.
4단계 - 반복
1~3단계를 반복한다.
SGD(확률적 경사 하강법) : 확률적으로 무작위로 골라낸 데이터에대해 수행하는 경사 하강법
4. 6 정리
- 기계학습에서 사용하는 데이터셋은 훈련 데이터와 시험 데이터로 나눠 사용한다.
- 훈련 데이터로 학습한 모델의 범용 능력을 시험 데이터로 평가한다.
- 한 데이터셋에만 지나치게 최적화된 상태인 오버피팅을 피하는 것은 기계학습의 중요한 과제이다.
- 신경망 학습은 손실 함수를 지쵸로, 손실 함수의 값이 작아지는 방향으로 가중치 매개변수를 갱신한다
- 가중치 매개변수를 갱신할 떄는 가중치 매개변수의 기울기를 이용하고, 기울어진 방향으로 가중치의 값을 갱신하는 작업을 반복한다.
- 아주 작은 값을 주었을 때의 차분으로 미분하는 것을 수치 미분이라고 한다.
- 수치 미분을 이용해 가중치 매개변수의 기울기를 구할 수 있다.
- 수치 미분을 이용한 계산에는 시간이 걸리지만, 그 구현은 간단하다. 한편 다음장에서 구현하는(다소 복잡한)오차역전파법은 기울기를 고속으로 구할 수 있다.
낼 셤이고 아는 내용도 많아 간단히 정리해두고 셤끝나고 한번 더 복습한 후 자세히 정리해야겠다.
'Deep Learning' 카테고리의 다른 글
[밑바닥부터 시작하는 딥러닝] Chapter 6. 학습 관련 기술들 (0) | 2023.06.20 |
---|---|
[밑바닥부터 시작하는 딥러닝] Chapter 5. 오차 역전파법 (0) | 2023.06.19 |
x[밑바닥부터 시작하는 딥러닝] Chapter 3. 신경망 (0) | 2023.06.12 |
[밑바닥부터 시작하는 딥러닝] Chapter 2. 퍼셉트론 Perceptron (0) | 2023.06.05 |
[밑바닥부터 시작하는 딥러닝] Chapter 1. 헬로 파이썬 (0) | 2023.06.03 |