이전 챕터에서는 신경망의 기초적인 개요에 대해 살펴봤다. 이번장에서는 데이터를 통해 신경망이 어떤 식으로 가중치 매개변수를 갱신하는지 알아본다!
이를 위해 신경망이 학습할 수 있도록 해주는 지표인 손실 함수를 살펴보고, 이 손실 함수의 결괏값을 가장 작게 만드는 가중치 매개변수를 찾는 방법인 함수의 기울기를 활용하는 경사하강법을 소개하고 있다.
4.1 데이터로부터 학습한다!
신경망은 데이터를 통해 학습한다는 점이 특징이다.
신경망이 데이터를 보고 가중치 매개변수를 자동으로 결정한다는 의미이다!
이처럼 머신러닝, 딥러닝에서는 데이터가 생명이다. 데이터가 있어야 결국 적절한 매개변수 값을 찾기 때문이다.
자동으로 알고리즘을 결정한다는 것은 전통적인 프로그래밍과 다른 인공지능의 특징이다.
다음 포스팅에서 설명되어 있으니 참고하기!
기계 학습의 관점에서 두 가지 접근법이 있다.
사람이 생각한 특징을 기계학습으로 학습하여 결과를 내는 것, 딥러닝에 데이터를 넣어 바로 결과를 내는 것.
여기서 사람이 생각한 특징이란 말 그대로 사람이 생각하기에(사람의 관점) 해당 문제를 푸는데 도움을 주는 특징을 의미한다.
가령 얼굴 인식 프로그램을 만든다고 하면, 사람의 눈 코 입의 특징(픽셀 색의 변화, 위치)등을 고려하여 추출하는 것이다. 실제로 HOG를 사용하여 특징을 추출하면 얼굴의 눈 코 입의 형상을 볼 수 있다. 이를 활용하여 dlib으로 얼굴을 인식하고 눈 코 입 landmark 좌표를 추출하여 응용할 수 있다.
실제로 아이돌 사진에 적용하는 코드를 짜봤는데 잘 되는데 정면 상황을 가정해야 성능이 좋다고 한다..
설윤님 죄송합니다
결국 딥러닝 학습 방식은 데이터만 입력해주면 되기 때문에 어떻게 학습하는지 알 필요가 있다!
4-2 손실 함수
손실함수란 신경망의 매개변수가 얼마나 최적의 값으로 있는지 판단하게 해주는 함수형 지표이다.
얼마나 행복한지?에 대해 판단하려면 정성적인 방법으로 파악해야한다. 하지만 이를 수치화시켜 정성적으로 평가하면
계산하는데 편하다! 따라서 행복한지에 대한 물음에 "나는 103.2099만큼 행복해!" 라고 한다면 103.2099가 손실함수의 값이 될 것이다. 행복이 최적이 되려면 그 값이 max여야 할 것이다. 이 때 행복을 위한 가중치 매개변수는 최적의 값을 가질 것이다!
우리가 해결하고자 하는 문제가 회귀,분류 등의 문제인지에 따라 손실함수를 다양하게 사용할 수 있다.
회귀, 분류 문제에서 가장 많이 쓰이는 손실 함수를 하나씩 소개하면 다음과 같다.
1. 오차 제곱합
실제값과 예측값의 차이에 제곱한 값이다. 이게 작으면 예측한 값이 실제값과 거의 차이가 안 나기 때문에 모델의 좋은 예상 결과를 기대할 수 있다.
2. 교차 엔트로피 오차
log를 사용하여 실질적으로 정답일 때의 추정의 자연로그를 계산하는 식이다.
정답일 때의 출력이 작아질수록 오차는 커진다. (-log함수를 생각해보자!)
이에 대해 자세한 내용은 따로 포스팅 할 예정입니다! (정보이론, 엔트로피)
4-3 수치 미분
처음에는 "손실 함수를 최소로 하는 값이 가중치 매개변수의 최적의 값을 결정해준다"라고 했는데, 머리가 달린 것도 아니고 어떻게 손실 함수를 최소로 하는 값에 도달 할 수 있을까?라는 의문이 들었다.
경사하강법이라는 방식으로 손실 함수를 최소화하는 것이다. 이 때 사용되는 수학적 개념이 미분이다.
미분에는 극한의 개념이 적용되는데, 파이썬 프로그래밍으로는 극한의 값을 정의할 수 없다. 따라서 해석적 미분은 불가능하다.
-> 수치미분을 사용하자!
수치 미분은 중심 차분을 이용하여 두 점 사이의 순간 변화량을 나타낸다. 아래의 설명을 보면 쉽게 이해할 수 있다.
가령 x1 - x2 / f(x1) - f(x2)에서 차분(오차와 비슷한 개념)을 아주 작은 값으로 둔다면 그 지점에서의 기울기(해석적 미분 값)와 거의 비슷할 것이라고 보는 것이 수치 미분의 핵심이다. 정확히 같지는 않지만 그 정도의 오차는 용인한다는 마인드!
수식은 다음과 같다. 여기서 차분은 'x+h - x' 을 의미한다.
수치미분을 파이썬으로 구현하면 다음과 같다.
def numerical_diff(f, x):
h = 1e-4
return (f(x+h) - f(x-h)) / (2*h)
4-4 편미분
변수가 2개라면 이를 어떻게 미분할 수 있을까? 편미분을 활용하자!
편미분은 어느 변수에 대한 미분을 구하는 것인지를 파악하는 게 중요하다.
f(a, b) = a**2 + b**2 라는 식이 있다면, a에 대한 미분인지 b에 대한 미분인지를 파악하는 게 그것이다.
위 식에 대한 편미분을 구해보자
이를 파이썬으로 이를 구현 하면 다음과 같다.
# 기존 함수 식
def function_d(x):
return x[0]**2 + x[1]**2
# a=3, b=4 일 때의 편미분 구하기
def function_tmp(x0):
return x0 * x0 + 4**2
numerical_diff(function_tmp, 3.0)
이렇게 변수별로 따로 계산된 그래프를 동시에 계산하기 위해서는
모든 변수의 편미분을 벡터로 정리하면 된다.
예를 들어, f = a + b에서 a,b에 대한 편미분을 (df/da, df/db)처럼 묶는 것이다.
4-5 경사 하강법
'Book Review > [밑바닥부터 시작하는 딥러닝 1] 리뷰' 카테고리의 다른 글
5장. 오차역전파법 (0) | 2023.11.09 |
---|---|
3장. 신경망 (1) | 2023.10.04 |
2장. 퍼셉트론 (1) | 2023.09.17 |