-
머신러닝에서 선형과 비선형Math 2021. 7. 25. 15:56
많은 머신러닝 서적에서 선형과 비선형이라는 말이 등장한다.
개념이 잘 잡히지 않아서 정리해본다.
선형과 비선형의 개념은 선형대수학 책에서 선형변환을 통해 정의하게 된다.
선형성(linearity)를 따르는 변환 또는 함수들은 선형 변환, 선형함수라고 하고, 그 외의 모든 함수들은 비선형 변환, 비선형함수(non-linear function)이라고 한다.
그렇다면, 선형성이 도대체 무엇일까?
위키피디아에는 다음과 같이 선형성이 수학적으로 정의되어 있다.
선형성의 정의
함수 f가 선형이라면
- 가산성(Additivity), 임의의 수(실수나 복소수) x, y에 대해 f(x+y)=f(x)+f(y)가 항상 성립한다.
- 동차성(Homogeneity), 임의의 수 x 나 α에 대해 f(αx)=αf(x)가 항상 성립한다.
- 두 식을 하나의 식으로 표현하면 f(ax1+bx2)=af(x1)+bf(x2)로 표현된다.
즉, 위의 성질들을 만족하면 어떠한 함수가 진행하는 모양이 직선이 된다는 뜻이다. 다른 말로 1차라고도 하지만 1차가 선형 자체를 의미하지 않는 경우도 많다.
머신러닝에서 예를 들어보자.
ReLU, GELU 함수 ReLU의 수학식은 다음과 같다.
y=x(x>0)y=0(otherwise)
딥러닝의 ReLU 함수는 x의 값이 0이하에서는 0, 0초과에서는 x 값을 그대로 출력한다. 이 함수는 직선이지만 비선형 함수이다. 왜 그럴까? 바로 위의 가산성을 만족시키지 않기 때문이다.
예를 들어보자. x가 -3, y가 4라고 하고 값을 넣어보면 가산성을 만족하지 않는다.
f(−3+4)=f(1)=1
f(−3)+f(4)=0+4=4
즉, 1≠4 가 되어 선형성의 정의에 맞지 않는다.
ReLU 함수는 정의역에서 +, -, * 를 통해 연산한 값들이 치역에서 함수값들을 연산한 것들에 대해 선형적으로 사상(mapping)되지 못한다는 것을 뜻한다. 즉, 직선을 그리지 못한다는 것이다! 따라서 ReLU 함수는 비선형인 것이다!
마찬가지로 동차성도 위의 값에 대해서 동차성도 만족시키지 않는다. 0 이하의 값에 대해서는 모두 0을 출력하기 때문이다.
머신러닝에서의 선형성과 비선형성
머신러닝에서 가장 먼저 보게 되는 다항식 곡선 피팅 예시를 살펴보자.
곡선을 피팅하기 위해 다음과 같은 식을 활용한다.
y(x,w)=w0+w1x+w2x2+...+wMxM=M∑j=0wjxj
여기서 M을 차수라고 하며, j는 x의 승수이다. 패턴인식과 머신러닝 책에서는
다항함수 y(x,w)는 x에 대해서는 비선형이지만 계수 w에 대해서는 선형이라고 한다.
다변수함수의 값 y가 x에 대해서는 비선형이고, w에 대해서는 선형이라는 의미이다. 이를
matplotlib 라이브러리를 통해 확인해보자. 시각화할 수 있도록 2차까지만 전개해서 확인한다.
그림들을 확인해보면 w에 대해서는 함수값이 선형이고 x에 대해서는 비선형(곡선)임을 확인할 수 있다.
이를 확장하면 위의 식은 M-1 차원의 초평면을 이루게 될 것이다.
In [2]:import matplotlib.pyplot as plt import numpy as np
In [19]:w1 = t = np.linspace(-5., 5., 50) w2 = t = np.linspace(-5., 5., 50) w_lst = [w1, w2] x = t = np.linspace(-5., 5., 50)
y(x,w)=w1x+w2x2In [22]:def polynomialFunction(w_lst, x): w1, w2 = np.meshgrid(w_lst[0], w_lst[1]) y_lst = w1 * x + w2 * x ** 2 return y_lst
In [50]:def polynomialFunction2(w_lst, x): y_lst = w1 * x + w2 * x ** 2 return y_lst
In [23]:y_lst = polynomialFunction(w_lst, x) print(type(y_lst)) print(y_lst.shape)
<class 'numpy.ndarray'> (50, 50)
In [24]:from mpl_toolkits.mplot3d import Axes3D
In [47]:fig = plt.figure() ax = plt.axes(projection='3d') fig = plt.figure(figsize=(24, 12)) ax.plot_surface(w_lst[0], w_lst[1], y_lst) plt.tight_layout() plt.show()
<Figure size 1728x864 with 0 Axes>
In [49]:fig = plt.figure() ax = plt.axes(projection='3d') fig = plt.figure(figsize=(24, 12)) ax.plot_surface(w_lst[0], w_lst[1], y_lst) ax.view_init(45,40) plt.show()
<Figure size 1728x864 with 0 Axes>
In [52]:y_lst2 = polynomialFunction2(w_lst) print(type(y_lst2)) print(y_lst2.shape)
<class 'numpy.ndarray'> (50,)
In [54]:plt.plot(x, y_lst2) plt.show()
In [ ]:출처
[1] https://ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95_%EA%B2%B0%ED%95%A9
[2] https://ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95%EC%84%B1
'Math' 카테고리의 다른 글
Variational Inference 관련 내용 정리 (1) 2022.09.26 최적화 관련 내용 정리 (0) 2022.09.02 머신러닝에 필요한 벡터, 행렬 미분 개념정리 (0) 2022.07.26 정준연결함수(Canonical Function) (0) 2021.07.25 - 가산성(Additivity), 임의의 수(실수나 복소수) x, y에 대해 f(x+y)=f(x)+f(y)가 항상 성립한다.