노션에서 작성한 노트를 HTML로 가져오기 때문에 형식이 어색할 수 있습니다.
!잘 보이지 않으시면 오른쪽 밑의 달 모양 버튼을 클릭해주세요!
페이지 배경지식
- 비선형 분리 문제는 자동으로 학습 불가능
- 신경망의 매개변수는 수천에서 수억에 이를 수 있어 수작업으로 매개변수를 정할 수 없음
- 손실 함수: 신경망이 학습할 수 있도록 해주는 지표
- 신경망은 데이터를 학습함으로서 매개변수의 값을 자동으로 결정함
- 손실 함수의 결과값을 가장 작게 만드는 가중치 매개변수를 찾는 것이 목표 - 예) 경사법 (함수의 기울기 활용)
데이터 주도 학습
기계학습/딥러닝(신경망):
데이터에서 패턴을 발견하여 답을 찾는 것 - 이때 사람의 개입을 최대한 배제하는 것이 중요
단순해 보이는 문제여도 알고리즘을 구현하는 것이 매우 어려울 수 있음 - 설계보단 주어진 데이터로 문제를 해결
문제 해결 방법:
- 이미지에서 특징 추출
- 특징의 패턴을 기계학습 기술로 학습
- 특징: 입력 데이터에서 중요한 데이터를 정확하게 추출할 수 있도록 설계된 변환기
한계:
특징은 아직 사람이 설계함 - 적합한 특징이 아니면 좋은 결과를 얻을 수 없음
기계학습 vs. 신경망(딥러닝)
신경망 - 특징까지 스스로 학습
딥러닝: 종단간 기계학습(end to end machine learning) - 종단간(처음부터 끝까지), 데이터에서 결과를 사람의 개입 없이 얻는다는 뜻
모든 문제를 같은 맥락에서 풀 수 있음 - 주어진 데이터를 온전히 학습해 주어진 문제의 패턴을 발견하려 시도
훈련 데이터 & 시험 데이터
훈련 데이터: 학습을 위해 사용되는 데이터 - 이를 통해 최적의 매개변수를 찾음
시험 데이터: 찾은 매개변수의 범용성 확인
- 범용성: 처음 보는 데이터라도 문제를 정확하게 풀어내는 능력 - 기계학습의 최종 목표
예) 만약 손글씨를 알아보는 문제에서 한 사람의 손글씨만 학습했다면 다른 사람의 손글씨는 못 알아볼 수 있음
오버피팅: 한 데이터셋에만 지나치게 최적화된 상태 ↔ 언더피팅: 데이터셋이 너무 간단하여 학습 오류가 줄어들지 않는 것
손실 함수
- 신경망의 성능의 나쁨을 나타내는 지표 = 훈련 데이터를 얼마나 못 처리하는지
오차제곱합(Sum of Squares for Error, SSE)
*y: 신경망의 출력(신경망의 결과) t: 정답
def sum_squares_error(y, t):
return 0.5 * np.sum((y-t)**2)
교차 엔트로피 오차(Cross Entropy Error, CEE)
*y: 신경망의 출력(신경망의 결과) t: 정답
자연 로그 함수는 입력이 1보다 작을때 음수이므로 -1을 곱함, 정답 확률이 높을수록(1에 가까울수록) 출력이 0에 가까워짐 (ln1 = 0)
def cross_entropy_error(y, t):
delta = 1e-7
return -np.sum(t*np.log(y+delta))
미니배치 학습
모든 데이터에 대해 손실함수의 합을 구하는 것이 이상적이나 현실적으로 수많은 데이터의 손실함수의 합을 구하는 것은 시간이 너무 많이 걸림 - 데이터의 일부만 골라 전체의 근사치로 이용
미니배치 학습: 훈련 데이터의 일부만 골라 학습하는 것
손실 함수 사용의 의미
정확도 대신 손실 함수의 값을 사용하는 이유: 미분
신경망 학습에서는 최적의 매개변수를 찾을 때 손실함수의 값을 가능한 작게 하는 값을 찾음
매개변수의 미분을 계산하여 양이면 음의 방향으로, 음이면 양의 방향으로 매개변수의 값을 이동시켜 손실 함수의 값을 줄임
*미분 값이 0이면 손실함수의 값이 변하지 않기 때문에 해당 매개변수의 갱신이 멈춤
*정확도를 지표로 할 경우 미분 값이 대부분 0이 됨
정확도: 매개변수의 미소한 변화에는 거의 반응이 없음 - 있어도 불연속적인 변화
손실 함수: 매개변수의 변화에 연속적으로 변화
계단 함수 - 미분 값이 대부분 0이므로 의미가 없음, 시그모이드 함수 - 기울기가 연속적으로 변화
수치 미분 - 수학적인 미분의 근사치
*미분 계산은 항상 오차가 있음 - h를 무한히 0으로 좁히는 것이 불가능하기 때문
오차를 줄이기 위해 중심 차분/중앙 차분 을 사용 -
def numerical_difference(f, x):
h = 1e-4
return (f(x+h) - f(x-h)) / (2*h)
h가 0과 가깝게 하기 위해 작은 값을 대입 - 너무 작은 값은 부동 소수점의 반올림 오차가 생기므로 적당한 값 대입
편미분
편미분: 변수가 여럿인 함수에 대한 미분 - 에서 어떤 변수 하나만 미분하고 나머지 하나는 값을 고정 | x축 방향(xz평면에 평행한) 접선의 기울기
기울기
모든 변수의 편미분을 벡터로 정리한 것 - 예)
def numerical_gradient(f, x):
h = 1e-4
grad = np.zeros_like(x)
for idx in range(x.size):
tmp_val = x[idx]
# f(x+h)
x[idx] = 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
*기울기는 함수의 출력 값을 가장 크게 줄이는 방향을 가리킴
함수의 최솟값, 최댓값, 안장점(보는 방향에 따라 최솟값/최댓값이 될 수 있는 점)에서는 기울기가 0/복잡하고 찌그러진 모양의 함수는 평평한 곳인 고원으로 감 - 학습이 진행되지 않는 정체기
경사법
기울기를 이용해 손실 함수의 값을 최소로 하는 것 - 어떤 위치에서 기울기의 방향으로 이동하는 것을 반복해 함수의 값을 줄이는 것
최솟값을 찾으면 경사 하강법, 최댓값을 찾으면 경사 상승법 - 경사 하강법 자주 사용
*: 갱신하는 양 = 학습률 - 매개변수 값 갱신 범위을 정하는 것/미리 값을 특정 값으로 정해야 함 - 너무 크거나 작으면 최적의 값 찾을 수 없음
하이퍼 파라미터: 사람이 직접 설정하는 파라미터 - 여러 후보 값 중 시험을 통해 가장 잘 학습하는 값을 찾음 예) 학습률
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
# ----- #
lr = 0.1 -> [-0.000000006, 0.0000000008] # 적정
lr = 10 -> [-2589837470000, -129524862000] # 너무 큼
lr = 0.0000000001 -> [-3, 4] # 너무 작음
신경망 학습 알고리즘
- 전제: 신경망에는 적응 가능한 가중치와 편향 존재 - 가중치와 편향을 훈련 데이터에 적응하도록 조정화는 과정이 학습
- 미니배치
- 훈련 데이터 중 일부를 무작위로 가져옴
- 기울기 산출
- 손실 함수 값을 줄이기 위해 가중치 매개변수의 기울기를 구함
- 매개변수 갱신
- 가중치 매개변수를 기울기 방향으로 학습률만큼 갱신
- 반복
- 1~3단계 반복
* 확률적 경사 하강법(Stochastic Gradient Descent, SGD): 데이터를 무작위로 선정하며 경사 하강법을 사용
시험 데이터로 평가
에폭: 학습에서 훈련 데이터를 모두 소진 했을 때의 횟수 - 예) 10000개의 데이터 중 100개가 미니배치면 100회가 1에폭 (확률적으로 100개의 데이터를 100회 고르면 10000개)
에폭마다 훈련 데이터와 시험 데이터를 계산하고 기록 - 매개변수 갱신마다 기록하면 시간이 오래 걸리고 그렇게 자주 기록하지 않아도 됨
정리:
손실 함수로 신경망의 현재 상태를 평가하고 손실 함수의 값이 줄어들게 하는 것이 신경망의 목표 - 이를 위해 경사법 사용
'데이터 사이언스' 카테고리의 다른 글
<데이터 사이언스/Data Science> 2. 신경망 (0) | 2021.02.07 |
---|---|
<데이터 사이언스/Data Science> 1. 퍼셉트론 (0) | 2021.01.31 |
<데이터 사이언스/Data Science> 0. 노트 공유 (0) | 2021.01.31 |