What is Gradient in deep learning?
딥러닝을 공부하면 "Gradient"이라는 단어가 많이 나온다.
간단하게 기울기, 미분계수라고 이해할 수 있지만, 핵심적인 부분이기에 좀 더 깊은 이해가 필요하다.
그래서 Gradient 관련 자료를 찾아봤고, 설명이 잘된 포스팅을 리뷰하려한다.
https://machinelearningmastery.com/gradient-in-machine-learning/
What Is a Gradient in Machine Learning?
Gradient is a commonly used term in optimization and machine learning. For example, deep learning neural networks are fit using […]
machinelearningmastery.com
Gradient는 일반적으로 최적화와 머신러닝에 사용되는 용어이다.
예를 들어, 딥러닝 뉴런 네트워크는 Stochastic Gradient Descent(확률적 경사 하강법)이고, 머신러닝 알고리즘에 적합한 많은 표준 최적화 알고리즘은 Gradient 정보를 이용한다.
Gradient가 무엇인지를 이해하기 위해서 당신은 미적분 분야에서의 미분, 도함수가 무엇인지 이해할 필요가 있다.여기에는 미분, 도함수를 계산하고 값을 해석하는 방법이 포함된다. 미분에 대한 이해는 최적화 및 머신러닝에 사용되는 Gradient를 계산하고 해석하는 방법을 이해하는데 직접 적용할 수 있다.
이 튜토리얼에서 당신은 머신러닝에서의 미분과 Gradient에 대한 젠틀한 설명를 발견할 수 있을 것이다.
이 튜토리얼을 완료한 후, 당신이 알게 될 것:
- 함수의 미분은 주어진 입력에 대한 함수의 변화이다.
- Gradient는 다변량 함수에 대한 도함수 벡터이다.
- 간단한 함수의 도함수를 계산하고 해석하는 방법
제 새 책 "Optimization for Machine Learning"을 통해 모든 예제에 대한 단계별 튜토리얼과 Python 소스 코드 파일을 포함해 프로젝트를 시작하세요~~~
시작해 봅시다
- Overview
1. What is a Derivative?
2. What is a Gradient?
3. Worked Example of Calculating Derivatives
4. How to Interpret the Derivative
5. How to Calculate a the Derivative of a Function
- 개요
1. 미분, 도함수란?
2. Gradient란?
3. 미분 연산 예제
4. 미분을 해석하는 방법
5. 함수의 미분, 도함수를 계산하는 방법
* 미분과 도함수는 같은 의미로 활용된다.
1. What is a Derivative(미분이란?)
미적분에서 미분은 실수값 함수에서 주어진 점의 변화율이다.
예를 들어 변수 x에 대한 함수 f(x)의 도함수 f'(x)는 함수 f( )가 한 점 x에서 변하는 비율이다.
아주 많이 변할 수도(아주 구부러진 경우, very curved) / 조금 변할 수도(약간 구부러진 경우, slight curve) / 전혀 변하지 않을 수도(평면 혹은 고정, flat or stationary)있다.
만약 우리가 함수 변수에 대한 모든 input(입력점)에서 미분을 계산할 수 있다면, 함수는 미분 가능하다. 모든 함수가 미분 가능한 것은 아니다.
미분을 계산하면 여러가지 방법으로 사용할 수 있다.
예를 들어, 주어진 input value 'x', 그 점에 대한 미분 f'(x), 우리는 다음과 같이 도함수를 활용해 근사점 delta_x(x의 변화)에서의 함수 f(x)의 값(함수값)을 추정할 수 있다.
- f(x + delta_x) = f(x) + f'(x) * delta_x
여기서 우리는 f'(x)가 선임을 알 수 있고, delta_x로 선에 따라 이동함으로써 근사점에서 함수의 값을 추정한다.
함수의 output을 증가시키거나 감소시키는 방식으로 target 함수에 대한 input에 대한 입력을 변경하는 방법을 알려주기 때문에 함수의 최소 또는 최대에 근접할 수 있기 때문에 우리는 최적화 문제에 미분, 도함수를 사용할 수 있다.
미분은 목적 함수를 개선하기 위해 주어진 점을 변경하는 방법에 대한 정보를 제공하기 때문에 최적화에 유용합니다.- p32, Algorithms for Optimization, 2019
주변 값을 근사하는 데 사용되는 선을 찾는 것이 미분의 초기 개발의 주된 이유였다. 이 선은 탄젠트 선(접선) 혹은 주어진 점에 있는 함수의 (slope)기울기라고 한다.
곡선에 대한 접선을 찾는 문제는 limit 같은 유형의 찾는 것과 관련이 있다. 이 limit의 특별한 유형은 미분이라 불리며, 우리는 과학이나 엔지니어링에서 변화율로 해석될 수 있음을 알 수 있을 것이다.
- p104, Calculus, 8th edition, 2015
함수에서의 한 점의 접선에 대한 예제는 아래와 같다. taken from p19, "Algorithms for Optimization"
엄밀히 말하면, 지금까지 기술한 미분은 1차 미분이라 부른다.
2차 미분은 미분 함수(도함수)의 미분이다. 이는 변화율의 변화율 혹은 함수의 변화가 얼마나 변했는지이다.
- 1차 미분 : 타겟 함수의 변화율
- 2차 미분 : 1차 미분 함수의 변화율
2차 미분의 자연스런 사용은 1차 미분을 타겟 함수의 주변 점에서의 값을 추정하는 데 이용하는 것처럼, 주변 점에서의 1차 미분를 근사하는 것이다.
이제 미분이 무엇인지 알았으니, Gradient를 살펴보자
2. What is a Gradient(기울기란?)
Gradient는 둘 이상의 input 변수를 갖는 함수의 도함수이다.
선형대수학의 관점에서 함수의 미분을 나타내는 용어이다.
Gradient는 다변수 함수에 대한 미분의 일반이다. 함수의 일부 기울기를 포착해 어느 한 지점에서 어느 방향으로든 작은 걸음을 내딛게 하는 효과를 예측할 수 있다.
p21, Algorithms for Optimization, 2019
다중 입력 변수는 함께 value의 벡터(e.g. 타겟 함수에 제공될 수 있는 입력 공간의 한 점)를 정의한다.
입력 변수의 벡터를 타겟 함수의 미분는 벡터이다. 각각의 입력 변수에 대한 미분의 벡터가 Gradient이다.
- Gradient(벡터 미적분) : 입력 변수의 벡터를 취하는 함수에 대한 미분의 벡터입니다.
당신은 고등학교 혹은 이전의 대수학을 다시 불러야할지 모른다, Gradient는 또한, 일반적으로 2차원 그림에서 선의 기울기를 나타낸다.
이는 함수의 상승(y축의 변화)을 함수의 이동(x축의 변화)으로 나눈 값으로 계산되며, 다음과 같은 규칙으로 단순화된다.
- Gradient(대수학) : 선의 기울기, 상승을 이동으로 나눈 것
우리는 이것이 변수가 하나인 함수에 대한 미분의 단순하고 대략적인(rough) 근사임을 알 수 있다.
미적분에서의 미분 함수는 한 점에서 함수의 정확한 기울기를 찾기 위해 limit을 사용하기 때문에 더욱 정확하다. 대수학에서의 이 Gradient에 대한 아이디어는 관련되지만, 최적화와 머신 러닝에 사용되는 Gradient에 대한 아이디어에 직접적으로 유용하지는 않다.
다중 입력 변수들을 갖는 함수(e.g. 입력 변수의 벡터)는 다변량 함수라고 할 수 있다.
한 변수에 대한 함수의 편미분은 다른 모든 입력 변수가 일정하게 유지된다고 가정하는 미분이다.
p21, Algorithms for Optimization, 2019
Gradient(미분(도함수)의 벡터)에서의 각 성분은 타겟 함수의 편미분이라고 불린다.
편미분은 함수의 다른 모든 변수가 상수로 고정되어 있다고 가정한다.
- 편미분 : 다변량 함수에서의 변수들 중의 하나에 대한 미분
이는 선형대수학에서 square matrices(제곱 행렬)로 작업하는 것이 유용하며, 2차 도함수의 제곱 행렬을 Hessian matrix(헤시안 행렬)이라고 한다.
다변량 함수의 헤시안은 입력에 대한 모든 2차 미분을 포함하는 행렬이다.
p21, Algorithms for Optimization, 2019
우리는 Gradient와 미분을 번갈아가며 사용할 수 있다. 최적화, 머신러닝 분야에서는 일반적으로 다변량 함수에 대한 것처럼 "Gradient"를 사용한다.
미분에 대한 직관, 이해는 곧바로 더 많은 차원의 경우의 Gradient로 변환된다.
이제 우리는 미분과 gradient에 대한 아이디어에 좀 더 가까워졌다. 미분들을 계산하는 예제를 살펴보자.
- 미분 계산 예제
미분을 수행한 예를 구체적으로 만들어 보자.
먼저, 변수의 범위를 -1.0 ~ 1.0으로 하고, 입력을 제곱하는 간단한 1차 함수를 정의해보자
- f(x) = x^2
아래 예제에서는 이 함수의 입력을 0.1 단위로 샘플링해 각 입력에 대한 함수 값을 계산한 다음 결과를 나타낸다.
# plot of simple function
from numpy import arange
from matplotlib import pyplot
# objective function
def objective(x):
return x**2.0
# define range for input
r_min, r_max = -1.0, 1.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max+0.1, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# show the plot
pyplot.show()
예제를 실행하면 함수에 대한 입력(x축)과 함수에 대한 출력(y축)의 선 그림이 만들어진다.
우리는 포물선이라 불리는 U자형을 볼 수 있다.
값이 큰 미분이 예상되는 곡선의 옆면은 큰 변화나 가파른 곡선을 볼 수 있고, 값이 작은 미분이 예상되는 곡선의 중간, 함수의 중간에는 평평한 부분이 나타난다.
도함수를 -0.5, 0.5(가파름)과 0.0(평평함)으로 계산하여 이러한 예상을 확인해보자.
함수의 도함수는 아래와 같이 계산된다:
- f'(x) = x * 2
아래 예제는 타겟함수의 특정 입력점에 대한 도함수를 계산합니다.
# calculate the derivative of the objective function
# derivative of objective function
def derivative(x):
return x * 2.0
# calculate derivatives
d1 = derivative(-0.5)
print('f\'(-0.5) = %.3f' % d1) # f'(-0.5) = -1.000
d2 = derivative(0.5)
print('f\'(0.5) = %.3f' % d2) # f'(0.5) = 1.000
d3 = derivative(0.0)
print('f\'(0.0) = %.3f' % d3) # f'(0.0) = 0.000
예제를 실행하면 특정 입력 값에 대한 미분 값이 출력된다.
함수의 급경사점에서의 미분은 -1과 1이고 함수의 평평한 부분에 대한 미분은 0임을 알 수 있다.
이제 함수의 미분을 계산하는 방법을 알았으니, 미분을 어떻게 해석할 수 있는지 살펴보자.
- 미분을 해석하는 방법(How to Interpret the Derivative)
미분값은 변화율(크기)과 방향(부호)으로 해석할 수 있다.
- 미분의 크기 : 얼마나 변하는가
- 미분의 부호 : 변화의 방향
0의 미분은 변하지 않는 점(고정점, 정지점)으로 타겟 함수에 변화가 없음을 나타낸다.
함수는 하나 이상의 고정점을 가질 수 있고, 함수의 로컬 또는 전역 최소값(골짜기의 바닥) 또는 최대값(산의 꼭대기)이 고정점의 예이다.
접선 초평면의 가장 가파른 상승의 방향의 Gradient 점...
p21, Algorithms for Optimization, 2019
미분의 부호는 타겟 함수가 해당 지점에서 증가하는지 감소하는지 여부를 알려준다.
- 양의 미분 : 함수가 해당 지점에서 증가하고 있다.
- 음의 미분 : 함수가 해당 지점에서 감소하고 있다.
이전 섹션의 그림을 보면 함수 f(x)의 값이 -0.5와 0.5에 대해 Y축에서 증가하기 때문에 혼동될 수 있다.
이에 대한 해답은 항상 함수 그림을 왼쪽에서 오른쪽으로 읽는 것이다. 예를 들어 입력 x값은 y축의 값을 왼쪽에서 오른쪽으로 따른다.
실제로 왼쪽에서 오른쪽으로 읽으면 x=-0.5의 주변의 값이 감소하므로 음의 미분이 되고, x=0.5의 주변의 값이 증가하므로 양의 미분이 된다.
미분 정보만을 사용하여 이전 섹션에서의 함수의 최소값을 찾으려한다면, 미분이 음수이면 x 입력값을 증가시키고, 미분이 양수이면 x 입력값을 감소시키는 것을 상상할 수 있다.
이는 함수의 Gradient 정보에 접근하는 최적화 알고리즘의 Gradient Descent 클래스의 기본이다.
이제 미분 값을 해석하는 방법을 알았으니, 함수의 미분, 도함수를 어떻게 찾을 수 있는지 살펴보자.
- How to Calculate a the Derivative of a function(함수의 미분을 계산하는 방법)
타겟 함수 f()의 변화율을 출력하는 미분함수 f'()를 찾는 것을 미분이라고 한다.
함수의 미분(도함수)를 계산하는 많은 접근법들이 있다.
경우에 따라, 우리는 미적분 도구를 사용하여 함수의 미분을 수동으로 혹은 자동 solver를 사용하여 계산할 수 있다.
함수의 미분을 계산하는 일반적인 테크닉은 다음과 같다.
Sympy Pthon 라이브러리는 상징적인 미분을 사용할 수 있다.
Theano와 TensorFlow와 같은 계산 라이브러리는 자동 미분을 사용할 수 있다.
함수를 일반 텍스트로 쉽게 지정할 수 있는 온라인 서비스도 있다.
한 가지 예는 함수의 도함수를 계산하는 Wolfram Alpha 웹사이트이다. 예를 들면 다음과 같다.
모든 함수가 미분 가능한 것은 아니며, 미분 가능한 일부 함수는 일부 방법으로 미분을 찾는 것이 어려울 수 있다.
함수의 미분을 계산하는 것은 이 튜토리얼의 범위를 벗어난다. 심화 섹션과 같은 좋은 미적분 교재를 참고하자.
댓글