by Yngie

신경망 (Neural Network)과 활성화 함수 (Activation Function)

|

Neural Network

퍼셉트론(Perceptron)에서는 게이트를 만들어 주기 위해서 게이트 마다의 가중치를 직접 입력해주어야 했습니다. 하지만 우리의 목적은 가중치를 직접 입력하는 것이 아니라 데이터에 가장 잘 맞는 가중치를 자동으로 찾도록 하는 것이지요. 신경망(Neural Net)은 퍼셉트론을 쌓아올려 알아서 파라미터를 결정할 수 있도록 만든 장치입니다.

신경망의 구조는 아래 그림과 같습니다.

NeuralNet

이미지 출처 : kdnuggets.com

단층 퍼셉트론의 수식을 다시 떠올려 보겠습니다. 아래는 2개의 입력값 $(x_1, x_2)$을 받는 퍼셉트론을 수식으로 나타낸 것입니다. $(w_1, w_2)$는 각 입력값에 곱해지는 가중치이며 $b$ 는 편향(bias)입니다.

[y = \begin{cases} 0 \qquad (b + w_1x_1 + w_2x_2 \leq 0)
1 \qquad (b + w_1x_1 + w_2x_2 > 0) \end{cases}]

위 식을 퍼셉트론의 결과를 나타내는 함수 $h(x)$를 사용하면 아래와 같이 나타낼 수 있습니다.

[y = h(b + w_1x_1 + w_2x_2)
h(x) = \begin{cases} 0 \qquad (x \leq 0)
1 \qquad (x > 0) \end{cases}]

여기서 $h(x)$는 활성화 함수(Activation function)라고 합니다. 활성화 함수는 가중치가 곱해진 신호의 총합이 활성화를 일으키는지, 즉 임곗값을 넘는지를 판단하게 됩니다. 임계값을 넘으면 $1$ 을, 그보다 작으면 $0$ 을 나타내게 되지요. 아래는 이 과정을 나타낸 것입니다.

activation f

이미지 출처 : i2tutorials.com

Activation Function

그렇다면 활성화 함수는 어떤 것들이 있고 왜 이렇게 생기게 되었는 지에 대해서 조금 더 자세히 알아보겠습니다.

Step Function

활성화 함수는 신경망의 행동을 결정하는 중요한 역할을 합니다. 가장 간단한 형태의 활성화 함수는 계단 함수(Step function)라고 합니다. 계단 함수는 위에서 살펴본 $h(x)$ 와 같이 행동합니다. 입력값의 합이 임계값을 넘으면 $0$ 을, 넘지 못하면 $1$ 을 출력하게 됩니다. 이에 따른 계단 함수의 그래프는 다음과 같이 생겼습니다.

step_function

이미지 출처 : wikipedia - Heaviside step function

계단 함수는 활성화 함수의 조건을 가장 잘 만족하는 함수이고 직관적으로도 이해하기 쉽습니다. 하지만 두 가지 단점 때문에 실제 신경망에 사용되지는 않습니다. 첫 번째 단점은 불연속(Discontinuous)입니다. 그래프를 보면 알 수 있듯 임계값 지점에서 불연속점을 갖게 되는데 이 점에서 미분이 불가능하기 때문에 학습이 필요한 신경망에 사용할 수 없습니다. 두 번째 단점은 다른 지점에서 미분값이 $0$이 된다는 점입니다. 추후 역전파 과정에서 미분값을 통해 학습을 하게 되는데 이 값이 0이 되어버리면 제대로 된 학습이 안되지요. 이런 문제점을 해결하기 위해서 등장한 것이 시그모이드 함수(Sigmoid)입니다.

Sigmoid Function

시그모이드 함수는 기본적으로 $S$ 모양을 그리는 곡선 함수를 통칭하여 부르는 말입니다. 이 중 대표적인 함수는 로지스틱(Logistic) 함수하이퍼탄젠트(Hyper tangent, $\tanh$) 함수가 있습니다. 두 함수의 수식과 그래프를 보며 시그모이드 함수와 계단 함수가 다른 점이 무엇인지 알아보도록 하겠습니다.

로지스틱 함수(Logistic Function)

[\text{Logistic} : \frac{1}{1+e^{-x}}]

logistic

이미지 출처 : wikipedia - Logistic function

하이퍼탄젠트 함수(Hypertangent Function)

[\text{Hypertangent} : \frac{e^x-e^{-x}}{e^x+e^{-x}} = \frac{e^{2x}-1}{e^{2x}+1}]

hyper

이미지 출처 : mathworld.wolfram.com

두 함수는 모두 연속함수입니다. 계단 함수의 치명적인 단점이었던 불연속을 해결했지요. 계단 함수와 시그모이드 함수의 중요한 공통점은 비선형 함수(Non-linear)라는 점입니다.

활성화 함수는 비선형 함수를 사용해야 합니다. 활성화 함수가 선형 함수이면 안되는 이유는 무엇일까요? 선형인 활성화 함수 $l(x) = ax + b$ 가 있다고 해보겠습니다. 이 함수를 사용하여 3개의 층을 쌓는다면 최종적인 활성화 함수는 $l(l(l(x))) = l^3(x) = a(a(ax+b)+b)+b = a^3x+a^2b+ab+b$가 됩니다. $a^3 = c, d = a^2b+ab+b$라고 하면 $l^3(x) = cx+d$로 여전히 같은 형태의 함수를 사용하게 됩니다. 층을 아무리 깊게 쌓아도 여러 층을 쌓는 이점을 살리지 못하게 되지요. 여러 층을 쌓을 때의 장점을 살리기 위해 비선형 함수를 사용하게 되는 것이지요.

ReLU Function

시그모이드 함수는 불연속이라는 계단 함수의 한 가지 단점을 해결했습니다. 하지만 나머지 단점 하나는 해결하지 못했습니다. 시그모이드도 여전히 대부분의 점에서 기울기 값이 0이 되지요. 이 때문에 기울기 소실(Gradient vanishing)이라는 문제가 발생합니다. 기울기 소실은 시그모이드 함수를 활성화 함수로 사용하여 층을 깊게 쌓았을 때 학습이 잘 되지 않는 현상입니다. 이런 현상이 왜 발생하는지 알아보겠습니다.

로지스틱 함수 $L(x)$를 미분한 함수 $L^\prime(x)$ 의 수식은 다음과 같습니다.

[L^\prime(x) = \bigg(\frac{1}{1+e^{-x}}\bigg)^\prime = \frac{e^x}{(1+e^{-x})^2}]

위 함수의 그래프는 아래와 같이 생겼습니다.

logistic_deri

그래프에서 볼 수 있듯 최댓값이 $0.25$ 밖에 되지 않고 $x<-5, x>5$ 범위에서는 거의 $0$ 에 가깝습니다. 역전파(Back propagation) 과정에서는 미분값을 사용하여 학습을 하게 됩니다. 따라서 이 값이 0에 가까워 지면 정보가 유실되면서 학습이 잘 안되게 됩니다. 특히 층을 깊게 쌓을 경우에는 정보가 모두 유실되는 사태가 발생하게 되지요.

그렇다면 하이퍼탄젠트 함수는 어떻게 될까요? 하이퍼탄젠트 함수 $\tanh$를 미분한 함수의 수식은 다음과 같습니다.

[\tanh^\prime(x) = \bigg(\frac{e^x-e^{-x}}{e^x+e^{-x}}\bigg)^\prime = \frac{4e^{2x}}{(1+e^{2x})^2}]

위 함수의 그래프는 아래와 같이 생겼습니다.

hypertangent_deri

하이퍼탄젠트 함수를 미분한 함수의 최댓값은 $1$ 입니다. 최댓값이 $0.25$ 밖에 안되었던 로지스틱 함수 보다는 정보를 잘 전달하게 되지요. 하지만 여전히 $x$ 가 0에서 멀어질수록 원래 함수의 미분값은 0에 가까워집니다. 그래서 하이퍼탄젠트 함수를 활성화 함수로 하더라도 퍼셉트론을 여러 층으로 쌓는다면 학습이 제대로 안되게 되지요. 이렇게 시그모이드 함수를 활성화 함수로 사용할 때 역전파시 학습이 제대로 진행되지 않는 현상을 기울기 소실이라고 합니다.

기울기 소실 문제를 극복하기 위해서 등장한 함수가 바로 ReLU(Rectified Linear Unit)함수입니다. ReLU함수는 입력값이 0보다 작을 경우에는 0을 반환하고, 0보다 클 경우에는 입력값을 그대로 반환합니다. 아래는 ReLU함수를 수식으로 나타낸 것입니다. \(h(x) = \begin{cases} 0 \qquad (x \leq 0) \\ x \qquad (x > 0) \end{cases}\)

아래는 ReLU함수의 그래프를 나타낸 것입니다.

ReLU

이미지 출처 : medium.com

ReLU함수는 $x$ 가 $0$ 보다 클 때, 미분값이 항상 $1$ 입니다. 그래서 층이 아무리 깊어져도 손실없이 정보를 전달할 수 있습니다. 미분값이 항상 $0$과 $1$ 이기 때문에 연산이 빠르다는 점도 ReLU함수의 장점입니다. 덕분에 ReLU함수는 은닉층에서 가장 많이 사용되는 활성화 함수가 되었습니다. 물론 ReLU함수에게도 문제가 있습니다. 0이하의 값이 그대로 보존되지 않고 버려진다는 것이지요. 이를 보완하기 위해 Leaky ReLU함수가 고안되어 사용되고 있습니다. Leaky ReLU 함수 $h_\text{Leaky}(x)$의 수식은 다음과 같습니다.

[h_\text{Leaky}(x) = \begin{cases} ax \qquad (x \leq 0)
x \qquad (x > 0) \end{cases}]

일반적으로는 $a=0.01$을 사용하며 그래프는 다음과 같습니다.

leaky

이미지 출처 : medium.com

Softmax

은닉층(Hidden Layer)의 활성화 함수로는 일반적으로 ReLU함수 혹은 Leaky ReLU와 같은 ReLU함수를 변형한 함수가 주로 사용됩니다. 하지만 출력층의 활성화 함수는 우리가 하고자 하는 작업에 맞게 조정해주어야 합니다. 일반적으로 회귀( Regression), 즉 연속형 변수에 대한 예측값을 출력하는 경우에는 출력층의 활성화 함수로 항등함수 $h_\text{reg}(x) = x$ 를 사용합니다.

이진 분류의 경우에는 입력값을 받아 $0$ 혹은 $1$ 의 값을 출력하는 것이므로 주로 로지스틱 함수를 많이 사용합니다. 그렇다면 인스턴스를 다중 레이블로 분류하는 경우에는 어떤 활성화 함수를 사용하는 것이 좋을까요? 이런 질문에 대한 답으로 나온 것이 바로 소프트맥스(Softmax) 함수입니다. 소프트맥스 함수는 이진 분류에서 사용하는 로지스틱 함수를 다중 분류에서 사용할 수 있도록 일반화한 함수입니다. 소프트맥스의 함수는 다음과 같습니다.

[y_k = \frac{\exp(a_k)}{\sum^n_{i=1}\exp(a_i)}]

소프트맥스도 함수도 사용할 때 주의해야 할 점이 있습니다. 소프트맥스 함수가 지수함수이기 때문에 $a$ 값이 커지게 되면 $\exp(a)$ 값이 매우 커지게 됩니다. __int32가 최대로 나타낼 수 있는 숫자는 $2,147,483,647$ 인데 $a = 22$ 만 되더라도 표현할 수 있는 값 이상이 되어 오버플로(Overflow)현상이 발생합니다. 또한 부동소수점 표기 특성상, 작은 숫자를 큰 값으로 나누면 수치가 불안정해지는 문제 역시 발생하게 됩니다.

이런 문제를 해결하기 위해서 실제로 소프트맥스 함수를 사용하기 위해서는 상수 $C$를 곱해주어 스케일을 조정해주는 과정이 필요합니다. 실제로 구현되어 있는 소프트맥스 함수의 수식은 아래와 같습니다.

[\begin{aligned} y_k &= \frac{\exp(a_k)}{\sum^n_{i=1}\exp(a_i)} = \frac{C\exp(a_k)}{C\sum^n_{i=1}\exp(a_i)}
&= \frac{\exp(a_k +\log C)}{\sum^n_{i=1}\exp(a_i + \log C)}
&= \frac{\exp(a_k +C^\prime)}{\sum^n_{i=1}\exp(a_i + C^\prime)} \end{aligned}]

위 식에서 $C^\prime = \log C$로, $C^\prime$에는 0보다 작은 값이면 어떤 값을 대입하든 상관 없지만 오버플로를 막기 위해서 일반적으로 $a_i {i=1, \cdots ,n}$ 중 가장 큰 값에 $-1$ 을 곱해준 값을 사용합니다. 예를 들어, $a_i = [1000, 1050, 1100]$이면 $C^\prime = -1100$ 이 됩니다.

소프트맥스 함수의 출력값은 항상 $[0,1]$ 범위 내에 있으며 모든 출력값을 더한 값이 1이 된다는, 즉 $\sum^n_{i=1}y_i = 1$ 이라는 특징이 있습니다. 이런 성질 덕분에 소프트맥스의 출력값을 확률(Probability)로도 해석할 수 있습니다. 다중 레이블에 대한 확률이 필요한 경우 소프트맥스 함수를 사용합니다.

Comment  Read more

퍼셉트론 (Perceptron)

|

Perceptron

이번 게시물에서는 모든 신경망(Neural net)의 기본이 되는 퍼셉트론(Perceptron) 에 대해서 알아보겠습니다. 신경망이 각광을 받게 된 지는 얼마되지 않았습니다만, 그보다 훨씬 전부터 신경망과 퍼셉트론에 대해서 많은 연구가 있어왔습니다. 퍼셉트론은 1957년에 고안된 알고리즘으로 다수의 신호를 입력받은 뒤 일련의 연산을 통하여 하나의 신호를 출력합니다. 아래는 단순한 퍼셉트론 하나를 이미지로 나타낸 것입니다.

perceptron

이미지 출처 : missinglink.ai

위 퍼셉트론은 총 5개의 신호 $(x_1, \cdots, x_5)$ 를 입력받습니다. 각 신호는 연산을 위한 가중치 $(w_1, \cdots, w_5)$ 를 가지고 있습니다. 가중치는 각 신호가 주는 영향력을 조절하는 요소로 추후 학습 과정에서 이 값을 업데이트하게 됩니다. 퍼셉트론은 모든 연산의 합이 임계값 $\theta$ 를 넘으면 $1$ 을, 넘지 못하면 $0$ 을 출력합니다. 입력 신호를 2개로 단순화하여 퍼셉트론이 작동하는 방식을 수식으로 나타내면 아래와 같습니다.

[y = \begin{cases} 0 \qquad (w_1x_1 + w_2x_2 \leq \theta)
1 \qquad (w_1x_1 + w_2x_2 > \theta) \end{cases}]

그리고 이를 신호가 $n$ 개인 경우로 일반화 하면 아래의 수식과 같이 나타낼 수 있습니다.

[y = \begin{cases} 0 \qquad (\sum^n_{i=1} w_ix_i \leq \theta)
1 \qquad (\sum^n_{i=1} w_ix_i > \theta) \end{cases}]

Logic Gate

이번에는 논리 회로(Logic gate)에 대해 알아보겠습니다.

처음으로 알아볼 게이트는 “AND게이트”입니다. AND게이트는 모든 입력값이 True일 때만 True를 출력하는 게이트입니다. 나머지 입력에 대해서는 False를 출력합니다. 입력 신호 $(x_1, x_2)$ 에 대한 AND게이트의 출력값 $y$ 의 진리표는 다음과 같습니다.

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

이를 만족하는 퍼셉트론의 계수 $w_1, w_2$ 와 임곗값 $\theta$ 의 예시 $(w_1, w_2, \theta)$ 로는 $(0.5, 0.6, 0.7)$ 등이 있습니다. AND 게이트는 순서도 상에서 아래와 같이 나타낼 수 있습니다.

and_gate

이미지 출처 : makecode.microbit.org

다음은 “NAND게이트”입니다. “NAND”“Not AND”의 줄임말로 NAND게이트는 AND게이트와 같은 입력을 받아 정반대의 결과를 출력합니다. 입력값 $(x_1, x_2)$ 에 대한 NAND게이트의 출력값 $y$ 의 진리표는 아래와 같습니다.

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

이를 만족하는 퍼셉트론의 계수 $w_1, w_2$ 와 임곗값 $\theta$ 의 예시 $(w_1, w_2, \theta)$ 로는 $(-0.5, -0.5, -0.7)$ 등이 있습니다. NAND 게이트는 순서도 상에서 아래와 같이 나타낼 수 있습니다.

nand_gate

이미지 출처 : commons.wikimedia.org

“OR게이트”는 하나의 입력값만 True이면 True를 출력하는 게이트입니다. 즉, 모든 입력이 False여야 False를 출력하게 됩니다. 입력값 $(x_1, x_2)$에 대한 OR게이트의 출력값 $y$ 의 진리표는 다음과 같습니다.

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

이를 만족하는 퍼셉트론의 계수 $w_1, w_2$ 와 임곗값 $\theta$ 의 예시 $(w_1, w_2, \theta)$ 로는 $(0.5, 0.5, 0.3)$ 등이 있다. OR 게이트는 순서도 상에서 아래와 같이 나타낼 수 있습니다.

or_gate

이미지 출처 : makecode.microbit.org

“XOR 게이트”배타적 논리합이라고도 불리는 논리 회로입니다. 두 입력 신호 중 한 쪽이 True일 때만 True를 출력합니다. 반대로 입력 신호가 같다면 False를 출력하게 됩니다. 입력값 $x_1, x_2$에 대한 XOR게이트의 출력값 $y$의 진리표는 다음과 같습니다.

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0

이를 만족하는 퍼셉트론의 계수 $w_1, w_2$ 와 임곗값 $\theta$ 의 예시 $(w_1, w_2, \theta)$에는 어떤 것이 있을까요? 언뜻 생각해봐도 쉽게 떠올리기 쉽지 않습니다.

당연합니다. 2개의 신호를 받는 퍼셉트론 하나로는 XOR 게이트를 만들 수 없기 때문이지요. 이유를 아래 이미지에서 보도록 하겠습니다.

XOR

이미지 출처 : towardsdatascience.com

2차원 상에서 신호 2개 $(x_1, x_2)$와 가중치 2개 $(w_1, w_2)$와 임계값 $\theta$ 로 만들어지는 경계면은 직선입니다. 위 그림에서 알 수 있듯 AND(NAND) 게이트와 OR 게이트의 출력값은 선형 분류기를 사용하여 구분할 수 있습니다. AND 게이트에서는 $(1,0), (0,1), (1,1)$ 사이의 두 점을 지나는 직선을, OR 게이트에서는 $(0,0), (0,1), (1,0)$ 사이의 두 점을 지나는 직선을 구하면 되는 것이지요. 하지만 아무리 생각해봐도 가장 오른쪽에 있는 XOR 게이트의 출력값을 분류할 수 있는 직선은 없습니다. 그래서 XOR 게이트의 $(w_1, w_2, \theta)$ 를 쉽게 떠올리기 쉽지 않은 것이지요.

Multi Layer Perceptron

즉, 단층 퍼셉트론으로는 XOR 게이트를 표현할 수 없습니다. 그렇다면 XOR 게이트는 어떻게 구현할 수 있을까요? 한 개가 안된다면 두 개를 쌓으면 됩니다. 두 개의 퍼셉트론을 이어 붙이면 XOR게이트를 아무 문제없이 구현할 수 있습니다. 이렇게 2개 이상의 층을 쌓아 만든 퍼셉트론을 다층 퍼셉트론(Multi Layer Perceptron, MLP)이라고 합니다.

게이트를 어떻게 쌓아올려야 XOR게이트를 구현할 수 있을까요? 아래는 NAND, OR 게이트와 AND 게이트를 조합하여 XOR게이트를 구현한 것입니다. 아래는 위와 같이 구현한 XOR게이트의 진리표입니다. $s_1, s_2$ 는 각각 NAND게이트와 OR게이트의 출력값이며 AND게이트는 이를 받아 값을 출력하게 됩니다.

x1 x2 s1 s2 y
0 0 1 0 0
1 0 1 1 1
0 1 1 1 1
1 1 0 1 0

이렇게 구현한 XOR 게이트의 순서도는 다음과 같습니다. 먼저, 동일한 신호가 NAND 게이트와 OR 게이트에 입력됩니다. 그리고 각 게이트에서의 출력값이 다시 AND 게이트의 입력값으로 들어가게 되지요. 이렇게 출력된 AND 게이트의 출력값 $y$ 과 맨 처음에 입력된 신호 $(x_1, x_2)$ 를 비교해보면 XOR 게이트로 작동하고 있음을 알 수 있습니다.

xor_gate

이미지 출처 : en.wikipedia.org

XOR 게이트는 순서도에서 다음과 같이 단순화하여 나타냅니다.

xor_gate2

이미지 출처 : makecode.microbit.org

Comment  Read more

머신러닝 개요 (Overview)

|

Machine Learning

머신러닝(Machine Learning, 기계 학습)이란 무엇일까요? ‘머신러닝’이란 용어를 대중화시킨 아서 사무엘(Arthur Samuel)은 다음과 같은 말을 남겼습니다.

“명시적인 프로그래밍 없이 컴퓨터가 학습하는 능력을 갖추게 하는 연구 분야다.” - Arthur Samuel, 1959

코딩 테스트 같은 알고리즘 문제를 풀 때는 주어진 문제의 규칙을 보고 직접 알고리즘을 구현합니다. 머신러닝은 이와 반대로 컴퓨터에게 수많은 케이스를 주어주고 학습시킨 뒤 이 케이스를 만하는 알고리즘을 구현하도록 합니다. 카네기 멜론 대학의 교수이자 머신러닝 학부장인 톰 미첼은 머신러닝에 대해 다음과 같은 말을 남겼습니다. 이 인용문은 머신러닝이 어떤 방식으로 이루어지는 지를 잘 알려줍니다.

“어떤 작업 T에 대한 컴퓨터 프로그램의 성능을 P로 측정했을 때 경험 E로 인해 성능이 향상됐다면, 이 컴퓨터 프로그램은 작업 T와 성능 측정 P에 대해 경험 E로 학습한 것이다.” - Tom Michell, 1997

왜 머신러닝을 사용할까요? 사람이 알고리즘을 구현하는 전통적인 방법론으로는 복잡한 문제를 풀기가 너무 어렵습니다. 예를 들어, 스팸 메일을 분류하는 알고리즘을 사람이 구현한다고 해봅시다. 이런 복잡한 문제는 고려해야 할 사항이 너무 많기 때문에 많은 사람이 긴 코드를 작성해야 합니다. 게다가 코드에서 논리적인 오류가 발견되었을 경우에는 많은 부분을 하하나 직접 수정해주어야 합니다.

같은 문제에 머신러닝 기법을 적용하면 일단 프로그램 코드가 매우 짧아집니다. 어떤 사항을 고려해야 할 지를 기계가 알아서 판단하기 때문입니다. 기존 프로그램과 맞지 않는 데이터가 새로 발견되더라도 특별한 유지보수 없이 다시 기계에게 학습시켜 프로그램을 개선할 수 있습니다. 게다가 이런 문제에 대해서는 머신러닝 방법론을 적용했을 때의 성능(정확도 등)이 더 좋습니다.

Supervised, Unsupervised, Reinforcement

학습의 기준을 어떤 것으로 하는 지에 대해서 지도 학습(Supervised learning)비지도 학습(Unsupervised learning), 강화 학습(Reinforcement learning) 으로 나눌 수 있습니다.

먼저 지도 학습부터 보겠습니다. 지도 학습은 레이블(Label)이 포함되어 있는 훈련 데이터로 학습하는 방법입니다. 답이 있는 데이터셋을 보고 그 답을 맞추는 알고리즘을 기계가 만들어내게 됩니다. 현재 연구가 되어 있는 많은 방법이 지도 학습 방법에 기초하고 있습니다. 크게는 분류(Classification)회귀(Regression) 등으로 나눌 수 있습니다. 다음은 지도 학습에 속하는 알고리즘의 예시입니다.

  • k-최근접 이웃(k-nearest neighbors, kNN)

knn

이미지 출처 : machinelearningknowledge.ai

linear_reg

이미지 출처 : primo.ai

logistic_reg

이미지 출처 : towardsdatascience.com

svm

이미지 출처 : jeremykun.com

decision_tree

이미지 출처 : algobeans.com

다음은 비지도 학습입니다. 비지도 학습은 레이블 없이 모든 것을 기계의 판단하에 처리하는 알고리즘입니다. 크게는 군집(Clustering), 시각화(Visualization)와 차원 축소(Dimensionality reduction), 연관 규칙 학습(Association rule learning) 등으로 나눌 수 있으며 사용되는 알고리즘으로는 다음과 같은 것들이 있습니다.

  • 군집
    • k-평균(k-Means)
    • 계층 군집 분석(Hierarchical cluster analysis, HCA)
    • 기댓값 최대화(Expectation maximization)

clustering

이미지 출처 : 위키피디아 - K-means

  • 시각화 및 차원축소
    • 주성분 분석(Principle component analysis, PCA), 커널 PCA(kernal PCA)
    • 지역적 선형 임베딩(Locally-Linear Embedding, LLE), t-SNE(t-distributed Stochastic Neighbor Embedding) 등이 있습니다.

visualization

이미지 출처 : ai.googleblog.com

  • 연관 규칙 학습
    • 아프리오리(Apriori), 이클렛(Eclat)

association

이미지 출처 : algobeans.com

지도 학습과 비지도 학습 방법을 혼용하는 준지도 학습(Semi-supervised learning)도 있습니다. 이 경우에는 데이터의 일부에만 레이블을 주어주고 나머지 레이블은 기계가 채운뒤 재학습 하도록 합니다. 준지도 학습 알고리즘의 예시로는 심층 신뢰 신경망(Deep belief network, DBN)이 있습니다. 이 방법은 여러 겹으로 쌓은 제한된 볼츠만 머신(Restricted Boltzmann machine, RBM)이라고 불리는 비지도 학습에 기초하고 있습니다.

마지막은 강화 학습입니다. 강화 학습은 지도 학습이나 비지도 학습과는 다른 방식으로 학습이 진행됩니다. 강화 학습에서 학습하는 시스템은 에이전트(Agent)라고 불립니다. 이 에이전트는 현재 상태(State)에서 주변 환경을 관찰하여 행동(Action)을 실행하고 그 결과로 보상(Reward) 혹은 벌점(Panelty)를 받습니다. 같은 작업을 계속 반복하면서 가장 큰 보상을 얻기 위한 최상의 전략을 스스로 학습하게 됩니다.

reinforcement

이미지 출처 : openai.com

Batch vs Online

데이터셋을 학습시키는 방법에 따라 분류하기도 합니다. 배치(Batch) 학습과 온라인(Online) 학습으로 나누기도 합니다. 배치 학습은 학습시킬 데이터를 미리 준비한 뒤에 준비한 데이터를 학습시키는 방법입니다. 방법이 간단하다는 장점이 있지만 시스템이 빠르게 변화해야 하는 상황인 경우에는 사용하기 힘들다는 단점이 있습니다. 그리고 너무 학습 데이터가 너무 방대한 경우에는 시간이 지연되는 문제가 있기 때문에 점진적으로 학습하는 알고리즘을 사용합니다.

온라인 학습은 데이터를 미니 배치(Mini batch)라고 부르는 작은 단위로 묶은 뒤 이 데이터 셋을 학습시킵니다. 커다란 데이터셋을 다룰 수 있다는 장점이 있습니다.

Problems

다음은 머신러닝에서 발생하는 주요한 문제입니다. 머신러닝의 문제점 중 가장 많은 부분을 차지하는 것은 훈련 데이터입니다. 많은 데이터셋에 대하여 훈련 데이터의 양이 충분하지 않거나 대표성이 없고, 낮은 품질의 데이터인 경우가 많습니다. 또한 데이터셋 내에 관련 없는 특성이 많아 희소(Sparsity) 문제가 발생하기도 합니다.

과적합(Overfitting, 과대적합)과소적합(Underfitting)의 발생도 주요한 문제입니다. 과적합은 생성한 모델이 훈련 데이터에 너무 잘 맞아버려 일반화(Generalization)되지 않는 현상입니다. 과적합 문제를 해결하기 위해서는 파라미터가 적은 모델을 선택하기, 훈련 데이터에 있는 특성 수를 축소하기, 모델에 규제 적용하기 등의 방법을 통해 단순한 모델을 생성합니다. 과소적합은 너무 단순한 모델이 생성되어 데이터에 잘 맞지 않는 현상입니다. 과소적합 문제를 해결하기 위해서 파라미터가 많은 모델을 선택하거나 학습 알고리즘에 더 좋은 특성을 제공하고 모델의 제약을 줄임으로써 복잡한 모델을 생성합니다. 아래는 이미지의 왼쪽은 과소적합, 오른쪽은 과적합이 발생한 경우를 그림으로 나타낸 것입니다.

over_under_fit

이미지 출처 : educative.io

과적합과 과소적합에 대한 추가적인 정보는 과적합과 과소적합 (Overfitting & Underfitting)에서 볼 수 있습니다.

Comment  Read more

벡터 공간 (Vector space)

|

Vector space

벡터 공간(Vector space)란 주어진 벡터를 더하거나 스칼라 배 하였을 때 가질 수 있는 공간을 말합니다. 예를 들어, 두 개의 벡터 $\vec{a} = (1,2), \vec{b} = (4,5)$는 평행하지 않으므로 이 두 벡터를 더하거나 실수배 하여 확보할 수 있는 공간은 평면이 될 것입니다. 그렇다면 $\vec{a} = (1,2), \vec{c} = (4,8)$은 어떨까요? 이 두 벡터는 방향이 동일하기 때문에 한 벡터를 스칼라 값을 곱해 주어도 나머지 한 벡터의 스칼라배와 동일합니다. 따라서 이 두 벡터가 가지는 벡터 공간은 하나의 직선이 됩니다.

이를 일반화하여 나타내면 임의의 벡터 $\vec{x},\vec{y}$ 와 임의의 스칼라 값 $c_1, c_2$에 대하여 $c_1\vec{x} + c_2\vec{y} \in \mathbf{V}$ 일 때, $\mathbf{V}$를 벡터 $\vec{x}, \vec{y}$의 벡터공간이라고 합니다.

부분 공간(Subspace)는 벡터 공간 내에서 특정 조건을 만족하는 부분 공간으로 앞으로 등장할 Column space(열벡터공간), Null space(영공간), Row space(행벡터공간), Left-Null space(왼쪽-영공간) 등이 모두 부분 공간에 속합니다.

Column Space & Null Space

이전까지는 정방행렬에 대해서, 즉 식의 개수와 미지수의 개수가 같은 연립방정식을 풀기 위해서 가우스 소거법(Gaussian elimination)을 사용하였습니다. 하지만 가우스 소거법을 활용하면 다른 형태의 연립방정식도 풀 수 있습니다. 지금부터는 식의 개수보다 미지수의 개수가 많은 연립방정식, 즉 행의 개수보다 열의 개수가 많은 행렬 $A_{m \times n} (m < n)$ 에 가우스 소거법을 적용하여 해를 구해보겠습니다. 아래 예시는 4개의 미지수를 갖는 3개의 식으로 이루어진 연립방정식입니다.

[\left[\begin{array}{cccc} 1 & 3 & 3 & 2 \ 2 & 6 & 9 & 7 \ -1 & -3 & 3 & 4\end{array} \right]\left[\begin{array}{c} u \ v \ w \ z\end{array} \right] = \left[\begin{array}{c} 0 \ 0 \ 0 \end{array} \right]]

위 미지수의 해를 구하기 위한 첫 번째 방법으로 왼쪽에 위치한 행렬 $A_{3 \times 4}$ 에 가우스 소거법을 적용하여 상삼각행렬과 비슷한 모양을 만들어 줄 수 있습니다. 이 과정을 수행하면 아래와 같이 행렬이 변하게 되며 이렇게 생성된 행렬의 형태를 Echelon form이라고 합니다.

[\left[\begin{array}{cccc} 1 & 3 & 3 & 2 \ 0 & 0 & 1 & 1 \ 0 & 0 & 0 & 0\end{array} \right]\left[\begin{array}{c} u \ v \ w \ z\end{array} \right] = \left[\begin{array}{c} 0 \ 0 \ 0 \end{array} \right]]

정방행렬에서는 상삼각행렬을 만든 뒤에 바로 해를 구할 수 있었습니다. 하지만 열의 개수가 더 많은 행렬에서는 한 번 더 처리해주어야 합니다. 이를 위해서 Echelon form에서 영벡터가 아닌 가장 아래 행을 조작하여 그 위에 있는 행의 특정 성분을 0으로 만들어 줍니다. 이렇게 해서 최종으로 나온 마지막 행렬의 모습을 Row reduced form이라고 합니다. 이 과정을 수행한 행렬은 다음과 같은 모습을 가지게 됩니다.

[\left[\begin{array}{cccc} 1 & 3 & 0 & -1 \ 0 & 0 & 1 & 1 \ 0 & 0 & 0 & 0\end{array} \right]\left[\begin{array}{c} u \ v \ w \ z\end{array} \right] = \left[\begin{array}{c} 0 \ 0 \ 0 \end{array} \right]]

Row reduced form의 피봇은 1행 1열과 2행 3열에 있고 피봇과 관계된 미지수는 $u,w$입니다. 이렇게 피봇과 관계된 미지수를 피봇 변수(Pivot variable)이라고 합니다. 피봇 변수에 해당하지 않는 미지수는 모두 자유 변수(Free variable)이라고 합니다. 미지수를 이렇게 두 범주로 구분했다면 이를 통해서 위 연립방정식의 해를 구할 수 있습니다.

먼저 자유 변수를 사용하면 각각의 피봇 변수에 대하여 식을 정리할 수 있습니다. 위 예시에서는 $u = -3v+z, w= -z$ 로 나타납니다. 이제 모든 변수에 대하여 미지수를 자유 변수로 묶어낼 수 있습니다. 다음의 예시를 보며 이 두 절차를 이해해보겠습니다.

[\left[\begin{array}{c} u \ v \ w \ z\end{array} \right] = \left[\begin{array}{c} -3v+z \ v \ -z \ z\end{array} \right] = v\left[\begin{array}{ccc} -3 \ 1 \ 0 \ 0\end{array} \right] + z\left[\begin{array}{c} 1 \ 0 \ -1 \ 1\end{array} \right]]

위 식에서 가장 오른쪽에 위치하는 것이 이 연립방정식의 해입니다. 이를 Special solution이라고 하며, Special solution이 이루는 공간을 $A$의 Null space라고 합니다. Null space는 열벡터로 이루어진 행렬 $A$에 의해서 만들어집니다. 그렇기 때문에 특정 행렬 $A$의 Null space는 Column space와 관계됩니다. 행렬 $A$를 구성하는 열벡터가 달라지면, 즉 $A$의 Column space가 달라지면 Null space 역시 달라지기 때문입니다.

이 Special solution을 사용하면 더 일반적인 형태의 연립방정식도 풀 수 있습니다. 이제는 등호의 오른쪽이 영벡터가 아닌 $A\mathbf{x} = 0$에 대해서 풀어봅시다. $b = (1,5,5)^T$ 인 경우를 예로 들어보겠습니다. 왼쪽은 위와 동일한 과정을 수행하되 오른쪽이 영벡터가 아니므로 고려하여 식을 변형해줍니다.

[\left[\begin{array}{cccc c} 1 & 3 & 3 & 2 & 1 \ 2 & 6 & 9 & 7 & 5 \ -1 &-3 & 3 & 4 & 5\end{array} \right] \Rightarrow \left[\begin{array}{cccc c} 1 & 3 & 0 & -1 & -2 \ 0 & 0 & 1 & 1 & 1 \ 0 & 0 & 0 & 0 & 0 \end{array} \right]]

이 때에도 해를 구하는 방법은 동일합니다. 피봇 변수에 대해 식을 정리한 후에 자유 변수와 상수에 대하여 식을 묶어내면 됩니다. 이 과정을 수행하면 아래와 같이 식을 나타낼 수 있습니다.

[\left[\begin{array}{ccc} u \ v \ w \ z\end{array} \right] = \left[\begin{array}{ccc} -3v+z-2 \ v \ -z+1 \ z\end{array} \right] = v\left[\begin{array}{ccc} -3 \ 1 \ 0 \ 0\end{array} \right] + z\left[\begin{array}{ccc} 1 \ 0 \ -1 \ 1\end{array} \right] + \left[\begin{array}{ccc} -2 \ 0 \ 1 \ 0\end{array} \right]]

여기서 Special solution 뒤에 새로 더해진 부분은 Particular solution이라고 하며 $X_p$로 나타냅니다.

Fundamental Subspace

위에서 알아본 Column space, Null space 등의 특정한 의미를 가지는 부분 공간을 주요 부분 공간(Fundamental subspace)라고 합니다. 앞서 등장한 두 개의 부분공간 외에도 Row space와 Left-Null space가 있습니다. 먼저 Column space부터 다시 알아보겠습니다.

행렬 $A$의 Column space란 행렬 $A$를 구성하는 열벡터가 형성하는 벡터 공간입니다. 기호로는 $\mathbf{C}(A)$로 나타냅니다. Null space는 조건 $A\mathbf{x} = 0$ 을 만족하는 $\mathbf{x}$가 공간입니다. 기호로는 $\mathbf{N}(A)$로 나타냅니다. 나머지 두 주요 부분 공간도 크게 다르지 않습니다.

행렬 $A$의 Row space란 행렬 $A$를 구성하는 행벡터가 형성하는 벡터 공간이며 기호로는 $\mathbf{C}(A^T)$로 나타냅니다. Left-Null space는 조건 $A^T\mathbf{y} = 0$ 을 만족하는 $\mathbf{y}$가 형성하는 벡터 공간이며 기호로는 $\mathbf{N}(A^T)$로 나타냅니다. Column space와 Null space가 관계를 가지고 있었던 것처럼 Row space와 Left Null space도 관계를 가지고 있음을 알 수 있습니다.

Comment  Read more

가우스 소거법 (Gaussian Elimination)

|

이 포스트는 한양대 이상화 교수님의 선형대수 강의 를 바탕으로 작성되었습니다.

Gaussian Elimination

이번 시간에는 선형 연립방정식의 해를 구하는 가우스 소거법(Gaussian elimination)에 대해서 알아보겠습니다. 사실 가우스 소거법을 몰라도 연립방정식의 해는 구할 수 있습니다. 가장 간단한 형태의 연립방정식을 예로 들어보겠습니다.

[\begin{cases}\begin{aligned} x + 2y = 3 \qquad \cdots 1
4x + 5y = 6 \qquad\cdots 2 \end{aligned}\end{cases}]

위 식에서 $x, y$의 해는 중등 과정에서 배운 가감법과 대입법을 통해서도 구할 수 있습니다. 가감법을 사용하려면 식 $1$을 $4$배 해준 뒤 식 $2$를 빼주어 $y=2$ 를 구하고 이를 아무 식에나 대입하여 $x=-1$ 을 구합니다. 대입법을 사용하려면 식 식 $1$ 을 $x = 3-2y$ 처럼 한 문자에 대하여 정리한 뒤에 식 $2$ 에 식을 대입하여 $y=2$ 를 구하고 이를 아무 식에나 대입하여 $x=-1$ 을 구합니다.

둘 중 어느 방법을 사용하든 이 방법은 $x + 2y = 3$ 과 $4x + 5y = 6$ 의 두 직선의 교점을 구하는 관점에서 풀고 있습니다. 만약 미지수의 개수가 3개로 늘어난다면 평면의 교선을 구하는 관점에서 풀게 되지요. 하지만 선형대수학에서 연립방정식의 풀이를 이런 관점으로 바라보는 것이 좋은 방법은 아닙니다. 이런 관점에서는 미지수와 식의 개수가 늘어날수록 직선, 평면 혹은 그 이상의 초평면이 식의 개수만큼 만나는(Intersect) 공간을 상상해야 합니다. 하지만 사람의 머리로 3차원 이상을 상상하기란 쉬운 일이 아닙니다.

그래서 선형대수학에서는 다른 관점으로 연립방정식을 바라봅니다. 이 방식은 다음과 같습니다. 먼저, 미지수의 계수에 해당하는 열벡터를 만들어 이를 미지수만큼 스칼라곱하여 더합니다. 이 때, 등호 오른쪽 열벡터까지 다다르는 미지수의 조합을 찾습니다. 위에서 사용했던 예시를 벡터를 사용하여 나타내면 이렇게 바꾸어 볼 수 있습니다.

[\left[\begin{array}{c} 1 \ 4 \end{array} \right]x + \left[\begin{array}{c} 2 \ 5 \end{array} \right]y = \left[\begin{array}{c} 3 \ 6 \end{array} \right]]

즉 벡터 $(1,4)^T$와 $(2,5)^T$를 각각 $x,y$ 배 해주어 곱합니다. 물론 이 방법도 벡터의 차원수가 높아지면 상상하기 어려운 것은 매한가지이지만, 만나는 부분을 찾는 것은 아니기에 조금 더 상상하기 쉽습니다. 그렇기 때문에 고차원의 벡터를 다루는 선형대수학에서는 보다 해의 의미를 찾기 쉬운 아래의 관점을 사용합니다.

Gaussian Elimination

가우스 소거법도 이런 방법을 사용하여 연립방정식을 푸는 방법입니다. 아래와 같이 미지수 3개와 식 3개로 구성된 연립방정식이 있습니다.

[\begin{align} \begin{cases} 2u + v + w &= 5 \qquad \cdots 1\ 4u - 6v &= -2 \quad \cdots 2\ -2u + 7v + 2w &= 9 \qquad \cdots 3 \end{cases} \end{align}]

연립방정식을 각 벡터의 합으로 보기로 했으므로 이를 행렬식으로 만들어 보겠습니다. 위 식을 행렬로 나타내면 아래와 같이 나타낼 수 있습니다.

[\left[\begin{array}{ccc} 2 & 1 & 1 \ 4 & -6 & 0 \ -2 & 7 & 2 \end{array} \right]\left[\begin{array}{c} u \ v \ w \end{array} \right] = \left[\begin{array}{c} 5 \ -2 \ 9 \end{array} \right]]

가우스 소거법은 가장 왼쪽 행렬을 상삼각행렬(Uppert triangular matrix, $U$)로 만드는 과정부터 시작합니다. 상삼각 행렬이란 행렬의 대각 성분(Diagonal elements)을 기준으로 왼쪽 아래 성분이 모두 $0$ 인 행렬입니다. 상삼각행렬을 만드는 방법은 가감법을 사용하여 연립방정식을 푸는 방법과 유사합니다. $1$번째 행에 적절한 수를 곱한 뒤 나머지 각 행과 더하거나 빼주어 각 1열의 성분을 0으로 만듭니다. 위 식에서는 $1$ 번째 행을 2배 해준 뒤에 $2$ 번째 행에서 이를 빼줌으로써 1열의 성분을 0으로 만들 수 있습니다. 마찬가지로 $1$ 번째 행에서 $3$ 번째 행을 더해주어 3행 1열의 성분도 0으로 만들 수 있습니다. 이 계산을 수행하면 아래와 같은 결과가 나오게 됩니다.

[\left[\begin{array}{ccc} 2 & 1 & 1 \ 0 & -8 & -2 \ 0 & 8 & 3 \end{array} \right]\left[\begin{array}{ccc} u \ v \w \end{array} \right] = \left[\begin{array}{c} 5 \ -12 \ 14 \end{array} \right]]

다음에는 $3$ 번째 행 2열 성분을 0으로 만들어 줄 차례입니다. 위 행렬의 $2$ 번째 식과 $3$ 번째 식을 더해주면 아래와 같이 미지수 왼쪽에 있는 행렬을 상삼각행렬로 만들 수 있습니다.

[\left[\begin{array}{ccc} 2 & 1 & 1 \ 0 & -8 & -2 \ 0 & 0 & 1 \end{array} \right]\left[\begin{array}{ccc} u \ v \w \end{array} \right] = \left[\begin{array}{ccc} 5 \ -12 \ 2 \end{array} \right]]

이제는 모든 미지수의 값을 구할 수 있게 되었습니다. 마지막 행으로부터 $w = 2$ 이니 이 값을 $2$ 번째 행에 대입하여 $u=1$ 을 구하고, 두 값을 $1$ 번째 행에 대입하여 $u=1$ 을 구하면 됩니다. 이렇게 왼쪽에 있는 행렬을 상삼각행렬로 만드는 과정을 가우스 소거법이라고 합니다. 여기서 대각 성분에 해당하는 $2, -8, 1$을 피봇(Pivot)이라고 합니다. 만약 계산하면서 피봇 자리에 $0$이 등장하는 경우에는 그 열의 성분이 $0$이 아닌 다른 행과 바꾸어 다시 소거 계산하면 되는데 이렇게 바꿔주는 과정을 피봇팅(Pivoting)이라고 합니다. 예시처럼 모든 피봇이 $0$이 아니면 연립방정식에 특정한 해(Unique solution)이 존재하는 경우에 해당합니다. 반대로 그렇지 않은 연립방정식은 해가 없거나(No solution) 무한한 해(Infinite solution)를 가집니다.

LU Factorization (Decomposition)

LU분해법(LU Factorization, LU Decomposition)은 가우스 소거법을 사용하여 특정한 행렬을 하삼각 행렬과 상삼각 행렬의 곱으로 분해하는 방법입니다. 위에서 가우스 소거를 했던 예시를 통해 LU분해법에 대해 알아보겠습니다. LU 분해법은 이름에서도 유추할 수 있듯, 특정한 행렬을 하삼각행렬(Lower triangular matrix, $L$)과 상삼각행렬의 곱으로 분해하는 것입니다. 위에서 사용했던 예시를 가져와서 이 행렬이 어떻게 분해되는지를 알아보겠습니다. 처음의 행렬은 다음과 같았습니다.

[\left[\begin{array}{ccc} 2 & 1 & 1 \ 4 & -6 & 0 \ -2 & 7 &2 \end{array} \right]\left[\begin{array}{ccc} u \ v \w \end{array} \right] = \left[\begin{array}{ccc} 5 \ -2 \ 9 \end{array} \right]]

가우스 소거법에서 $\enclose{circle}{1}$ 번째 행을 제외한 행의 1열 성분을 모두 0으로 만들기 위해서 $2$ 번째 행에서 $1$ 번째 행을 두 배 해준 것을 빼주었고, $3$ 번째 행에서는 $1$ 번째 행과 더해주었습니다. 이 과정을 행렬 곱으로 나타내면 아래와 같은 행렬식이 나오게 됩니다.

[\begin{aligned} &\left[\begin{array}{ccc} 1 & 0 & 0 \ -2 & 1 & 0 \ 1 & 0 & 1 \end{array} \right]\left[\begin{array}{ccc} 2 & 1 & 1 \ 4 & -6 & 0 \ -2 & 7 &2 \end{array} \right]\left[\begin{array}{ccc} u \ v \w \end{array} \right] = \left[\begin{array}{ccc} 5 \ -12 \ 14 \end{array} \right]
\because &\left[\begin{array}{ccc} 1 & 0 & 0 \ -2 & 1 & 0 \ 1 & 0 & 1 \end{array} \right]\left[\begin{array}{ccc} 2 & 1 & 1 \ 4 & -6 & 0 \ -2 & 7 &2 \end{array} \right] = \left[\begin{array}{ccc} 2 & 1 & 1 \ 0 & -8 & -2 \ 0 & 8 & 3 \end{array} \right] \end{aligned}]

마찬가지로 가우스 소거법에서 $1$ 번째 행과 $2$ 번째 행을 제외한 행의 2열 성분을 모두 0으로 만들기 위해서 계산한 행렬의 $2$ 번째 행과 $3$ 번째 행을 더해주었습니다. 이 과정을 행렬 곱으로 나타내면 아래와 같은 행렬식이 나오게 됩니다.

[\begin{aligned} &\left[\begin{array}{ccc} 1 & 0 & 0 \ 0 & 1 & 0 \ 0 & 1 & 1 \end{array} \right] \left[\begin{array}{ccc} 1 & 0 & 0 \ -2 & 1 & 0 \ 1 & 0 & 1 \end{array} \right]\left[\begin{array}{ccc} 2 & 1 & 1 \ 4 & -6 & 0 \ -2 & 7 & 2 \end{array} \right]\left[\begin{array}{ccc} u \ v \w \end{array} \right] = \left[\begin{array}{ccc} 5 \ -12 \ 14 \end{array} \right]
\because &\left[\begin{array}{ccc} 1 & 0 & 0 \ 0 & 1 & 0 \ 0 & 1 & 1 \end{array} \right] \left[\begin{array}{ccc} 1 & 0 & 0 \ -2 & 1 & 0 \ 1 & 0 & 1 \end{array} \right]\left[\begin{array}{ccc} 2 & 1 & 1 \ 4 & -6 & 0 \ -2 & 7 & 2 \end{array} \right] = \left[\begin{array}{ccc} 2 & 1 & 1 \ 0 & -8 & -2 \ 0 & 0 & 1 \end{array} \right] \end{aligned}]

전체 과정에서 기존 행렬 $A$ 왼쪽에 새로 만들어진 두 하삼각행렬을 원래의 행렬과 가까운 것부터 $L_1, L_2$ 라고 해보겠습니다. 이제 기호를 사용하면 위 수식에서 $\because$ 이하의 식을 다음과 같이 간단하게 나타낼 수 있습니다.

[L_2 L_1 A = U]

왼쪽에는 $A$만 남을 수 있도록 $L_2, L_1$의 역행렬을 각각 양변의 왼쪽에 곱해주겠습니다. 그러면 식이 다음과 같이 변하게 됩니다.

[\begin{aligned} L_1^{-1}L_2^{-1}L_2 L_1 A &= L_1^{-1}L_2^{-1}U
A &= L_1^{-1}L_2^{-1}U \end{aligned}]

여기서 두 역행렬의 곱 $L_1^{-1}L_2^{-1}$는 항상 하삼각행렬 $L$이 나오게 됩니다. 그렇기 때문에 위 식을 정리하면 $A = LU$ 로 나타낼 수 있으며 이를 LU분해법이라고 합니다. 특정한 행렬 $A$에 대해 LU분해법으로 등장하는 $L, U$ 행렬 쌍은 오직 하나이며 $A$가 달라지면 $L,U$도 각각 달라집니다. 이런 이유에서 특정한 정방행렬 $A$에 대하여 LU분해법은 일대일대응(Unique)이라고 할 수 있습니다.

Comment  Read more