안녕하세요?

 

11강에서 그라디언트에 대해서 공부했습니다. ML을 공부하며 제가 처음 넘겼던 고비였습니다. 그라디언트 디센트를 공부하면서 이해는 하겠는데, 뭔가 답답한 기분이 계속 들었습니다. "그라디언트가 기울기 벡터라고 하고 원래 그라디언트는 증가하는 방향이다."라는 의미가 안 다가왔었습니다. 네 맞습니다. 그라디언트에 대해서 잘 몰랐습니다. 이번강의 보시면서 저처럼 답답한 기분이 드시는 분은 꼭 11강부터 보시기 바랍니다.

11강 보기: https://www.youtube.com/watch?v=rpZnpiAa_TI

강의보기: https://www.youtube.com/watchv=kVFyBvwrcoA&list=TLPQMjcwNzIwMjSR4y9Zt-PaQw&index=2

 

Optimization(최적화)

최적화는 머신러닝뿐만 아니라 다양한 분야에서 활용되는 이론입니다. AI 대학원에서도 따로 한 과목이 있을 정도로 내용도 많고 중요한 이론이죠.

하지만, 우리는 아직 Deep Learning을 공부하는 단계가 아니니까 아주 간단하게만 공부할 예정입니다. 그래도 딥러닝 최적화에 대한 맛보기 정도는 같이 학습할 겁니다. 지난 강에서 Jacobian과 Hessian을 간단히 소개했기 때문에 충분히 이해할 수 있습니다.

가봅시다.!!

최적화의 3 요소: Objective function, Decision Variable, Constraint

영어로 3요소를 보니까 처음 보는 거 같지만, 앞에 두 개는 이미 공부했습니다.

1. Objective Function(목적함수)

$$ \min_x f(x) $$

$f(x)$ 가 목적함수고 이걸 최소화시키는 x를 찾는다는 겁니다. 많이 보고 들은 말입니다. 우리의 목적함수는 뭐였죠? 맞습니다. MSE 또는 SSE였습니다.

$$ \min_w L(w), \quad L(w) = \frac {1}{N}\sum_{i=0}^{N}(w^Tx_i - y_i)^2 $$

위와 같이 쓸 수 있습니다.

 

2. Decision Variable(결정변수)

$$ x = \begin {bmatrix}
x_0 \\
x_1 \\
... \\
x_{N}
\end {bmatrix} $$

우리의 결정변수는 $w$ 였습니다. 우리의 회귀 선을 결정해 주는 변수인 거죠.

$$ w = \begin {bmatrix}
w_0 \\
w_1 \\
... \\
w_{N}
\end {bmatrix} $$

이 두 가지는 Direct Solution을 공부하면서 계속 봐왔습니다. 혹시 잘 모르시면 이전 강의 빨리 돌려서 보시면 금방 이해하실 수 있습니다.

 

3. Constraint(제약조건)

우리의 목적함수 MSE, Loss Function을 구할 때는 제약조건이 없었습니다. 그래서 강의에서 하나 추가해서 예를 들었습니다. $w_j \geqq 0, \forall j$ 즉, 모든 $j$에 대하여 $w_j$는 0보다 크거나 같다는 겁니다. 결괏값(종속변수) $y$ 에 대해서 모든 입력값(독립변수)$x$가 양의 관계를 갖는다고 제약조건을 줬습니다.

집값과 관계가 있는 독립변수를 면적과 방의수로 했는데 만약 전체 데이터에 대해 양의관계가 아니라면 데이터가 부족하거나 편향돼있다고 판단하고 최적화 알고리즘을 실행시킬 필요도 없다는 거죠.

Convex function

출처: https://vitalik.eth.limo/general/2020/11/08/concave.html

 

사실 다 아실 겁니다. "아래로 블록", "위로 블록". Convex를 왜 공부할까요? 그라디언트 디센트가 뭐였는지 제가 간략하게 설명했었습니다. 아무점이나 잡은 다음에 $w$에 대응하는 L(w)를 구하고 $w$를 계속 변경하면서, $\nabla L(w)$가 거의 0과 가까워지면 stop 하는 알고리즘입니다. 그럼 아무 데나 잡은 점에서 convex 한 function 이어야만 합니다. 그래야 $w$를 계속 변경하면서 대입하는 게 의미가 있는 겁니다. $w$에 대한 함수가 아래로 블록 하지 않은데 $w$를 움직여 봤자 최솟값으로 갈 수 없겠죠.

 

여기서 의문이 드셔야 됩니다. 우리가 배운 MSE는 $w$에 대한 함수이고 2차 방정식이었고, 최고차항의 계수는 $x_i^2$으로 무조건 컨벡스인데 이런 알고리즘을 배워야 돼?

 

네 맞습니다. 현재까지 배운 목적함수에 대해서 Convex를 결정하는 알고리즘을 넣는 거는 의미가 없습니다. 하지만 딥러닝에서는 얘기가 다릅니다.

딥러닝의 목적함수

 

딥러닝의 목적함수는 위 그림처럼 아주 복잡합니다. GD는 초기화 시, 아무 점이나 고르기 때문에 현재 점에서 Convex 한 지 판단할 수 있으면, Convex 하지 않은 경우 GD를 생략할 수 도 있을 겁니다.

Convex Function, Convex Set

 

Convex인지 어떻게 판단할까요? 위 그림 아래 수학식이 있습니다.

(수학식의 내용은 강의에서는 더 자세하게 설명했습니다.)

"왜 Convex 수식을 공부해야 되는 거야?" 더 나아가면, Machine Learning 수학식들을 왜 다 공부하는지도 의문입니다.

도대체 왜???????

 

수학식으로 쓸 수 있으면 알고리즘으로 만들 수 있고, 컴퓨터로 프로그래밍이 가능합니다. 컴퓨터는 계산기니 까요.

그럼 진짜 우리가 쓰는 GD알고리즘이 Convex를 판단하고 GD를 할까요?

 

다시 복잡한 딥러닝의 목적함수를 생각해 봅시다. 

 

저렇게 복잡하니 무조건 Non-Convex인데 무슨 소리인지 모르겠는데...

 

그럼 구간을 나누어서 특정 구간에서 Convex인지 판단하는 건 괜찮을 까요? 그리고 다른 $w$(즉 다른 점)를 잡아 다시 해당 구간에서 Convex여부를 판단하고 GD를 한다면 효율적일 것 같습니다. 

 

유튜브 강의에서 Non-Convex 한 4차 방정식의 경우로 생각해봅시다. 4차 방정식은 아래로 블록 2개가 있으니까 Random Initialization을 몇 번해서 Convex한 경우에 GD를 수행하고 $L(w)$가 가장 작을 때를 구하면 될 것 같습니다.  

 

진짜 이렇게 구하는 게 좋을까요? 

GD 코드 예시

 

우리가 쓰는 패키지의 GD관련 Method가 이런 방법을 사용할까요? 진짜 효율적일까 한번 생각해 봅시다. 

 

정답부터 말씀드리면 실제 GD 알고리즘에서 Convex를 판단하는 로직은 없습니다. 위 Deep Learning 목적함수 그림에서 Deep Learning 목적함수를 매우 복잡한 것처럼 표현했지만, 3차원 공간에 최대한 복잡하게 보이게 표현한 것뿐입니다. 실 데이터에서 딥러닝의 목적함수는 3차원 공간에 표현 불가능하고 훨씬 더 복잡합니다. 그 복잡한 목적함수를 구간 별로 나누어서 Convex를 판단한다는 건 전혀 실용적이지 않습니다. Convex 한 지 판단하는 계산을 추가하는 것 자체가 컴퓨터에게 추가적인 부하를 주는 겁니다.

 

그냥 그라디언트 디센트를 진행하고 Local Minimum을 피하기 위한 기법들을 사용하는 게 훨씬 효율적입니다. 또한 앞 서 말씀 뜨렸지만, 우리가 현재까지 배운 MSE는 명확하게 Convex입니다. 굳이 Convex 판단 로직을 추가하지 않아도 됩니다. 

 

Non-Convex는 Global Minimum이 보장되지 않습니다. 즉 Local Minimum에 도달할 가능성이 있다는 거죠. 하지만, Global Minimum을 찾는 방법과 Local Minimum을 피하는 방법이 있습니다. 그래서 굳이 Convex를 판단하지 않고 일단 GD를 진행하고 Global Minimum에 가는 방법을 쓰는 겁니다. 

 

대표적으로 2가지 방법이 있습니다.

 

1. 초기화와 관련된 방법과

2. 수학적으로 GD 식에 변형을 주는 방법도 있습니다.

 

1번 중에 하나는 여러 점에서 그라디언트 디센트를 하고 가장 작은 $L(w)$를 선택하는 방법입니다. 유튜브 강의에서 설명했습니다.  또한, 향후 딥러닝을 공부할할 때 여러 번 초기화 하는 것 말고도 Xavier/He 초기화를 공부할 것입니다.

 

2번에는 AdaGrad, Adam, RMSProp 등이 있습니다. 이 역시도 Deep Learning을 학습하며 공부할 예정입니다.

 

아직까지는 Shallow만 이해하셔도 됩니다. 

Gradient Descent

유트브 강의에서는 Gradient Descent에 대한 자세한 내용을 하기 전에 Gradient에 대해서 다시 복습합니다. 11강 블로그에서 말씀드렸지만, 12강에도 틀린 부분 정정합니다.

그라디언트의 방향이 그라디언트 값이 커지는 방향이라고 했는데 *함수 $f$가 커지는 방향이 더 정확합니다.

 

*함수 $f$는 $w$에 대해 미분하기 전 원래 함수 즉, MSE를 의미합니다.

 

유트브 강의에서는 MSE를 미분한 식으로 GD를 한다는 걸 설명하고, Direct Soultion과 비교하면서 끝을 냈습니다.

마찬가지로 GD에 대한 포스팅은 다음 강으로 넘기겠습니다. ^^

안녕하세요?

지난 강에서 Direct Solution은 컴퓨팅 비용이 높아서 Gradeint Descet를 알고리즘으로 쓴다고 했습니다. 그라디언트 디센트를 학습해야 하는데, 먼저 Gradient에 대해서 자세히 보고 가겠습니다.

 

강의 틀린 부분 정정합니다: 그라디언트의 방향이 그라디언트 값이 커지는 방향이라고 했는데 함수 $f$ 가 커지는 방향이 더 정확합니다.

강의보기:https://www.youtube.com/watch?v=rpZnpiAa_TI

 

그라디언트의 정의

일차함수 $y = ax + b$를 $x$에 대해서 미분하면 $\frac{dy}{dx} = a$가 됩니다. 이 $a$ 값을 gradient라고 할 수 있을까요? 정답은 아닙니다. 그라디언트의 정의를 봅시다.

"다변수 함수 모든 입력값에서 모든 방향에 대한 순간변화율"

 

네, 적어도 다변수 함수여야 그라디언트라고 할 수 있는 겁니다.

$ f(x_1, x_2) = w_0 + w_1x_1 + w_2x_2 $ 평면에서 그라디언트의 설명

그럼 $ f(x_1, x_2) = w_0 + w_1x_1 + w_2x_2 $를 보겠습니다.

이변수 함수

만약 $f(x_1, x_2)$의 그래프가 위 그림과 같다면 $ f(x_1, x_2) $의 Gradient는 편미분한 벡터 $[w_1, w_2]$ 입니다. 이는 노란 평면 각 지점에서 기울기를 나타냅니다.

 

그라디언트 벡터 $[w_1, w_2]$는 노락 평면 각 점에서 $(x_1, x_2)$ 평면으로 사영 됐을때 벡터입니다. 즉, 그라디언트 벡터는 $(x1, x2)$ 평면에 있다는 거죠. 그런데 어떻게 기울기일까요?

 

그라디언트 벡터가 기울기가 아니라, 그라디언트 벡터의 크기가 기울기 입니다. $(x_1, x_2)$ 평면에 대해 그라디언트 크기인 $\sqrt{w_1^2 + w_2^2}$ 만큼 노란 평면이 기울어져 있다는 뜻입니다.

 

$(x_1, x_2)$ 값이 조금만 움직여도( = $\lim_{x_1, x_2 \to 0}$ ), $ f(x_1, x_2) $ 방향(위 그림에서 세로축방향)으로 $\sqrt{w_1^2 + w_2^2}$ 만큼 움직인다는 겁니다. 그럼 왜 그라디언트를 기울기 벡터라고 하는지 이해하셨을 겁니다.

 

그리고, 노란평면 어디에서도 그라디언트 벡터는 $(w_1, w_2)$니까 기울기의 크기도 당연히 같습니다. $y = ax + b$의 직선이 어느점에서도 순간 기울기가 $a$인거랑 같은 개념이라고 생각하시면 됩니다.

 

그라디언트의 방향은 어떻게 되는 걸까요? $ f(x_1, x_2) $의 값이 커지는 방향입니다. 강의에서는 그라디언트 값이 커지는 방향이라고 했는데 틀렸습니다. 함수 $f$가 커지는 방향이라고 정정합니다.

예시

아직 아리송하신 분들을 위해 예를들어 설명드릴께요. 강의에서 말씀드렸지만, 저는 단순하거나 극단적인 예를 좋아합니다. $ f(x_1, x_2) = 2x_1 + x_2 $의 예를 봅시다.

그라디언트 벡터는 [2, 1]입니다. 그리고, 그라디언트 벡터의 크기는 $\sqrt{5}$ 입니다. $(x_1, x_2)$ 축으로 아주 조금씩만 움직여도 $ f(x_1, x_2) $ 방향으로는 $\sqrt{5}$ 만큼 움직인다는 겁니다.

 

그라디언트 벡터 자체는 $(x_1, x_2)$ 평면에 표시되는 거고요. 저 보라색 면이 $(x_1, x_2)$ 평면에 대하여 $\sqrt{5}$ 만큼 기울어져 있다고 해석할 수 있는 겁니다.

 

저는 사실 2차 포물면으로 처음 이해했습니다. 대부분의 자료에서 2차 포물면으로 설명하고 있습니다. 처음 이해했을때 아주 감동을 받았었죠. 다 이해하고 나니까 1차 평면에서 먼저 이해하고 2차 포물면으로 넘어가는게 훨씬 수월할거 같아서 1차 평면부터 설명드렸습니다.

 

혹시 이해가 잘 가셨나요? 피드백 부탁드립니다.

2차 포물면에의 그라디언트

강의에서는 조금 더 나아가서, 2차 포물면에서 그라디언트와 독립변수가 2개 이상인 경우도 설명했습니다. 원리는 같습니다.

 

예를들어 2차 포물면에서는 그라디언트 벡터가 $[w_1, w_2]$가 아니라 $[2w_1x_1, w_2x_2]$ 이렇게 되는 겁니다. 무슨 얘기냐고요? 그라디언트 벡터가 $(x_1, x_2)$ 좌표에 따라서 값이 변한다는 거죠?

 

우리는 $f(x) = x^2$의 순간기울기가 $x$ 값에 대해서 변한다는 걸 이미 알고 있습니다. 같은 개념이니까 충분히 이해할 수 있습니다.

 

상세한 내용은 유트브 강의 참고하세요. 감사합니다.

안녕하세요? 이번 강은 벡터미분입니다. 그냥 미분도 골 아픈데 벡터 미분까지 해야되나라는 생각이 절로 듭니다. 샬로우 러닝 단계에서는 썸네일에 소개한거 처럼 스칼라를 벡터로 미분하는 정도만 이해하면 되지만, 딥러닝에서의 최적화를 이해하기 위해서는 벡터를 벡터로 미분하는 것 까지 이해해야 합니다. (Jacobian과 Hessian 이해죠)

강의보고오기: https://www.youtube.com/watch?v=u19p1eJsvB0&t=89s

 

 

무조건 이해해야 되냐고요? 세상에 무조건은 거의 없습니다. 이해 못해도 됩니다. 그래도 알면 조금 더 재미있어 집니다.

강의에서 제가 간단하게 미분을 설명했습니다. 머신러닝을 공부할때 꼭 알아야 되는 부분이라 간단하게 설명했습니다. 더 자세히 알기 위해 강추드리는 아래 강의 영상을 보시는 겁니다. 

 

미분의 이해 참고 동영상

 

1. 뉴턴 vs 라이프니치의 미적분 이야기: https://www.youtube.com/watch?v=GJO-52Xm6JU

 

2. 수학은 다르마: https://www.youtube.com/watch?v=glW0ugwYvnA&t=1864s

 

영상 보시고 오셨나요? 저는 재미있게 봤습니다. ^^

 

벡터미분

 

벡터미분을 이해하기 위해서 3가지 개념 먼저 소개해 드리겠습니다. 바로 Scalar, Vector, Matrix 입니다.

                        출처: [https://www.linkedin.com/pulse/machine-learning-basics-scalars-vectors-matrices-tensors-prasad/](https://www.linkedin.com/pulse/machine-learning-basics-scalars-vectors-matrices-tensors-prasad/)

출처 링크를 읽으시면 좋지만, 대부분 알고 계실거 같습니다.

 

우선 규칙을 말씀드리면 벡터는 특별한 언급이 없으면 열벡터를 의미합니다.(그냥 관례입니다)

 

벡터를 스칼라로 미분

벡터는 열벡터를 의미한다고 했죠? 어느 한 벡터를 스칼라로 미분한다는 건, 벡터 각 성분의 값을 스칼라 값으로 미분해준다는 걸 의미합니다.

원래 있던 열벡터의 각 성분에 하나의 스칼라로 미분하고 그대로 쓰는 거니까 어렵지 않으실 겁니다.

 

스칼라를 벡터로 미분

스칼라를 벡터로 어떻게 미분할까요? 우리가 가장 익숙한 건 스칼라를 스칼라로 미분하는 거였죠? 네 늘 해오던 그냥 미분입니다. 그런데 이걸 벡터로 미분하려면 어떻게 해야 할까요?

 

스칼라는 양 밖에 없고, 벡터는 방향과 양이 있습니다. 우리가 미분하고 싶은 스칼라 값이 원래 벡터의 연산이였다고 생각하면 됩니다. 같은 성분을 가진 벡터끼리의 내적은 스칼라가 되기 때문입니다. 또는 방향이 없는 스칼라를 미분해야 하니까, 스칼라 값을 미분하고 싶은 벡터 공간으로 데리고 온다고 생각하면 됩니다. 벡터 공간으로 데리고 오니까 성분이 생길 수 있는 거죠?

자세히 보면, 그라디언트의 정의와 같습니다.(그라디언트는 아직 공부 안했습니다.)

  • "스칼라 값으로 나오는 벡터의 연산이 있었다" 우리 계속 봐온거죠?

$ \hat{y} = w^{T} x $를 x벡터로 미분하면 $w^{T}$만 남습니다. 각 성분으로 편미분한 결과입니다. 그리고 $w^{T} x $는 같은 성분을 가진 벡터의 내적이니까 스칼라 값입니다. 

  • 직관적으로 생각해 봅시다. 양만 있는 스칼라를 벡터로 미분하려면, 스칼라를 벡터공간으로 데리고 와야되고 벡터 공간으로 데리고 오면 각 성분이 생기니까, 각 성분으로 미분해 주면 된다 라는 인사이트가 있으시면 됩니다.

스칼라를 벡터로 미분한 결과는 행벡터로 씁니다. 이거는 기억해 주세요. 벡터를 스칼라로 미분하면 열벡터로 쓰고, 스칼라를 벡터로 미분하면 행벡터로 쓴다는거는 외우시는게 좋습니다. 

 

벡터벡터미분에 대한 Insight

 

강의에서는 추가로 벡터를 벡터로 미분, 스칼라를 벡터로 두번 미분 / 즉 Jacobian과 Hessian을 설명합니다. 우리는 아직 Shallow Learning을 공부하는 단계라 꼭 알 필요는 없지만 추가 설명했습니다. 

 

딥러닝에서 중요한 개념이기 때문에 아래 내용을 느낌적으로 가져가 주셨으면 좋겠습니다. 

 

스칼라를 벡터로 미분하는거 까지가 Shallow Learning입니다. 즉 하나의 스칼라 $y$ 값에 대해 여러 $x$ 값이 있는거 입니다. 어떤 데이터의 특성이 결국 "선형" 이라는 말입니다. 

 

그런데 벡터를 벡터로 미분한다고 생각해보세요. 여러 스칼라 $y$ 값에 대해 여러 $x$ 값이 있다는 거라고 생각할 수 있는거죠. 데이터의 구간에 따라서 식도 변할 수 있고, 같은 구간에서도 여러 y값을 가질 수 있다는 의미죠? 굉장히 복잡하기는 하지만 어떤 관계를 있다라고는 생각할 수 있는거 입니다. 

 

네 바로 딥러닝 설명을 드린겁니다. 굉장히 복잡하지만 수학식으로 표현되면 그 관계를 학습해서 유의미한 결과를 얻을 수 있는거죠? 

 

벡터를 벡터로 미분한 걸 Jacobain이라고 하는데 결국 우리의 데이터가 가지는 기울기의 집합이라고도 이해할 수도 있는거고. 스칼라를 벡터로 2번 미분한건 Hessain이고 딥러닝 옵티마이제이션 문제를 푸는데 활용할 수 있는 값입니다. 

 

강의를 보시면 더 직관적으로 상상하실 수 있을 겁니다. 하지만, 아직 Deep Learning을 배우기 전이니 이 정도만 하고 넘어가겠습니다.  

 

다음강에서 뵙도록 하겠습니다. 

 

+ Recent posts