by Yngie

다변량 분포(Multi-Variable Distribution)와 변환(Transformation)

|

이 게시물은 부산대학교 김충락 교수님의 수리통계학 강의를 참고하여 작성하였습니다.

multi-Variable Distribution

이번 시간에는 확률 변수가 2개 이상인 다변량 분포에 대해 알아보도록 하겠습니다. 다변량 분포는 앞서 말한 것과 같이 확률 변수가 2개 이상인 경우의 확률 분포를 가리킵니다. 하지만 확률 변수가 3개만 되더라도 아래에 등장하는 정리들에 대해 계산이 매우 복잡해지므로 이번 게시물에서는 확률 변수가 2개인 이변수(bi-Variable) 확률 분포에 대해서만 다루도록 하겠습니다.

bi-Variable Distribution

지금부터는 확률 변수가 하나가 아닌 2개 이상인 분포를 알아보겠습니다. 2개의 확률 변수는 $X_1, X_2$로 나타내겠습니다. 이 때의 확률 분포 함수는 아래와 같이 나타낼 수 있습니다.

[f_{X_1,X_2}(x_1,x_2)]

확률 분포 함수의 누적 분포 함수는 다음과 같이 나타낼 수 있습니다.

[F_{X_1,X_2}(x_1,x_2) = P(X_1 \leq x_1, X_2 \leq x_2)]

$X_1$ 와 $X_2$ 가 이산 확률 변수일 때, 결합 확률 질량 함수(Joint p.m.f.)는 아래와 같이 나타낼 수 있습니다.

[P_{X_1,X_2}(x_1,x_2) = P(X_1 = x_1, X_2 = x_2)]

반대로 $X_1$ 와 $X_2$ 가 연속 확률 변수라면, 결합 확률 밀도 함수(Joint p.d.f.)는 아래와 같이 나타낼 수 있습니다.

Transformation of multi r.v.s

Discrete Random Variable

$X_1, X_2$ 가 이산 확률 변수일 때 확률 변수를 $Y_1, Y_2$ 로 치환하기 위해서는 몇 가지 가정이 필요합니다. 먼저, 변환 이전의 확률 변수와 변환 이후의 확률 변수가 일대일 대응을 만족해야 합니다. 각각의 확률 변수가 일대일 대응을 만족한다면 임의의 일대일 대응인 함수 $u_1, u_2$ 에 대하여 아래와 같이 나타낼 수 있습니다.

[\begin{cases} y_1 = u_1(x_1,x_2) \ y_2 = u_2(x_1,x_2) \end{cases}]

일대일 대응 조건에 의하여 역함수가 존재하므로 $u$ 의 역함수인 $w$ 를 사용하여 아래와 같이 나타낼 수 있습니다.

[\begin{cases} x_1 = w_1(y_1,y_2) \ x_2 = w_2(y_1,y_2) \end{cases}]

따라서 변환된 확률변수 $Y_1, Y_2$에 대한 결합 확률 질량 함수는 아래와 같이 나타낼 수 있습니다.

[P_{Y_1,Y_2}(y_1,y_2) = P_{X_1,X_2}(w_1(y_1,y_2), w_2(y_1,y_2))]

이를 구하면 아래와 같이 확률 변수 하나에 대한 확률 질량 함수를 구할 수 있게 됩니다.

[P_{Y_1}(y_1) = \sum_{y_2} P_{Y_1,Y_2}(y_1,y_2)]

예를 들어, 아래와 같은 확률 질량 함수가 있다고 해보겠습니다.

[P_{X_1,X_2}(x_1,x_2) = \frac{\mu_1^{x_1} \cdot \mu_2^{x_2} \cdot e^{-(\mu_1+\mu_2)}}{x_1! \cdot x_2!} \qquad x_1,x_2 : 0,1,2, \cdots]

이 확률 질량 함수로부터 $Y_1 = X_1 + X_2$ 를 만족하는 새로운 확률 변수 $Y_1$ 의 확률 질량 함수를 구해보겠습니다. $y_1 = x_1+x_2$ 이며 $y_2 = x_2$ 이면 각각의 함수는 일대일 대응이므로 역함수를 사용하면 $x_1 = y_1-y_2, x_2 = y_2$ 로 나타낼 수 있습니다. 이를 사용하면 확률 변수 $Y_1,Y_2$ 의 결합 확률 질량 함수는 아래와 같이 구해집니다.

[P_{Y_1,Y_2}(y_1,y_2) = \frac{\mu_1^{y_1-y_2} \cdot \mu_2^{y_2} \cdot e^{-(\mu_1+\mu_2)}}{(y_1-y_2)! \cdot y_2!} \qquad \begin{cases} y_1: 0,1,2, \cdots \ y_2 : 0,1,2, \cdots,y_1 \end{cases}]

이로부터 확률 변수 $Y_1$ 의 확률 질량 함수를 구하면 아래와 같이 나타나며 식을 변환하여 간단하게 만들 수 있습니다.

[\begin{align} P_{Y_1}(y_1) &= \sum_{y_2} P_{Y_1,Y_2}(y_1,y_2)
&= \sum_{t=0}^s \frac{\mu_1^{y_1-y_2} \cdot \mu_2^{y_2} \cdot e^{-(\mu_1+\mu_2)}}{(y_1-y_2)! \cdot y_2!}
&= \frac{e^{-(\mu_1+\mu_2)}}{y_1!} \sum_{t=0}^s \frac{y_1!}{(y_1-y_2)! \cdot y_2!} \cdot \mu_1^{y_1-y_2} \cdot \mu_2^{y_2}
&= \frac{e^{-(\mu_1+\mu_2)}}{y_1!} \cdot (\mu_1 + \mu_2)^{y_1}
& \because \text{Binomial Distribution} \end{align}]

Continuous Random Variable

다음으로 연속 확률 변수에 대한 변환을 알아보도록 하겠습니다. 확률 변수 1개일 때와 동일하게 연속 확률 변수의 변환에는 2개의 방법이 존재합니다. 첫 번째는 누적 확률 분포 함수(c.d.f.)를 활용한 방법이고 두 번째는 변환(Transformation)을 이용한 방법입니다.

c.d.f. Technique

먼저 첫 번째 방법인 누적 확률 분포 함수를 활용하는 방법에 대해 알아보겠습니다. 이 방법은 변환된 확률 변수인 $Y_1$ 혹은 $Y_2$ 의 누적 확률 분포를 알 수 있을 경우에 사용합니다. 확률 변수 $S$ 에 대한 누적 확률 분포가 아래와 같이 알려져 있다고 해보겠습니다.

[F_{Y_1}(y_1) = P(w(X_1, X_2) \leq y_1)]

이 때의 확률 밀도 함수는 아래와 같이 나타낼 수 있습니다.

[f_{Y_1}(y_1) = \frac{\partial F_{Y_1}(y_1)}{\partial y_1}]

예를 들어, 아래와 같은 결합 확률 분포 함수가 있다고 해보겠습니다.

[f_{X_1,X_2}(x_1,x_2) = I(0<x_1<1, 0<x_2<1)]

누적 확률 분포 함수를 활용한 방법을 사용하여 원래 확률 변수들의 결합 확률 분포 함수로부터 확률변수 $S = X + Y$ 의 확률 분포 함수를 구해보겠습니다. 먼저 우리가 알고자하는 확률 변수 $S$ 의 누적 확률 분포는 아래와 같이 나타낼 수 있습니다.

[F_{X_1}(x_1) = P(x_1+x_2 \leq y_1)]

위 식을 만족하는 범위에서 $x_2 \leq y_1 - x_1$ 이므로 그래프로 나타내면 다음과 같습니다.

이로부터 $y_1$ 의 범위에 따른 누적 확률 분포의 식은 아래와 같이 나타낼 수 있습니다.

[F_{Y_1}(y_1) = \begin{align} \begin{cases} 0 &y_1 <0 \ \ \int^{y_1}0 \int^{y_1-x_1}_0 d{x_2}d{x_1} &0 \leq y_1 <1 \ \ 1 - \int^1{y_1-1} \int^1_{y_1-x_1} dx_2dx_1 &1 \leq y_1 <2 \ \ 1 &y_1 > 2 \end{cases} \end{align}]

이를 계산한 결과를 나타내면 아래와 같습니다.

[F_{Y_1}(y_1) = \begin{align} \begin{cases} 0 &y_1 <0 \ \ y_1^2/2 &0 \leq y_1 <1 \ \ 1 - (2-y_1)^2/2 &1 \leq y_1 <2 \ \ 1 &y_1 > 2 \end{cases} \end{align}]

앞에서 알아본 바에 따라 $\frac{\partial F_{Y_1}(y_1)}{\partial y_1} = f_{Y_1}(y_1)$ 이므로 각 범위마다 식을 적용하여 확률 밀도 함수를 구할 수 있습니다.

[f_{Y_1}(y_1) = \begin{align} \begin{cases} y_1 &0 \leq y_1 <1 \ \ 2-y_1 &1 \leq y_1 <2 \ \ 0 &\text{otherwise} \end{cases} \end{align}]

Transformation

변환을 사용하는 방법은 단일 확률 변수일 때와 같습니다. 대신 변수가 2개 이므로 야코비안 행렬(Jacobian)의 행렬식(Determinant) $\vert J \vert$ 를 이에 맞게 구해주어야 합니다. 위의 문제를 변환 방법으로 풀어보면서 변수가 2개일 때 변환을 어떻게 적용하게 되는지 알아보겠습니다. 먼저 역함수를 구해보겠습니다.

[x_1 = y_1 - y_2, \quad x_2 = y_2 \qquad I(y_2<y_1<y_2+1, 0<y_2<1)]

이를 활용한 자코비안 $\vert J \vert$ 는 다음과 같이 구할 수 있습니다.

[\vert J \vert = \left\vert\begin{array}{cc} \frac{\partial x_1}{\partial y_1} & \frac{\partial x_2}{\partial y_2} \ \frac{\partial x_2}{\partial y_1} & \frac{\partial x_2}{\partial y_2} \end{array} \right\vert = \left\vert\begin{array}{cc} 1 & -1 \ 0 & 1 \end{array} \right\vert]

이를 활용하면 결합 확률 분포 함수를 구할 수 있습니다.

[\begin{align} f_{Y_1,Y_2}(y_1,y_2) &= f_{X_1,X_2}(w_1(x_1,x_2),w_2(x_1,x_2))
&= f_{X_1,X_2}(y_1-y_2,y_2) \cdot \vert J \vert
&= 1 \qquad I(y_2<y_1<y_2+1, 0<y_2<1) \end{align}]

따라서, 확률 변수 $Y_1$ 의 확률 밀도 함수는 다음과 같습니다.

[\begin{align} f_{Y_1}(y_1) &= \int 1 dy_2
&= \begin{cases} \int^{y_1}0 (1)dy_2 \ \int^{1}{y_1-1} (1) dy_2\end{cases} \end{align}]

위 두 가지 방법(누적 확률 분포 사용, 변환)을 사용하면 기존의 확률 변수와 연관된 새로운 확률 변수로 변환할 수 있습니다.

Comment  Read more

지금까지 공부한 자료들(Python, ML, DL, NLP)

|

파이썬 책의 첫 페이지를 켜서 주피터 노트북을 설치하고 print(“Hello, Python”)을 입력한지 벌써 1년이 되었습니다. 이를 기념하여 1년동안 어떤 자료를 보며 공부를 했는지 정리하는 게시물을 작성해보려고 합니다.

본격적으로 글에 들어가기에 앞서 엔지니어를 생각하고 공부를 했지만 공부를 하면서 기획자로 직무를 변경하기로 하였으며 현재 기획자(라고 쓰고 잡부)로 일하고 있습니다. 코딩과 관련된 부분은 다소 부족할 수 있습니다. 책은 적어도 챕터 2장 이상 분량 읽은 것만을 썼으며 책을 가지고 있더라도 그 이하의 분량만 본 것은 제외하였습니다.

Python

최근에는 코드를 직접 작성하지는 않습니다만 코드를 보고 이해하려면 파이썬을 알아야 하기에 파이썬 관련 공부를 했습니다.

Book

  • (위키독스)점프 투 파이썬 : 만인의(?) 파이썬 입문서인 점프 투 파이썬입니다. 위키독스에 있기 때문에 무료로 모든 내용을 볼 수 있으며 저자께서 버전이 바뀌면 빠르게 업데이트 해주시는 것도 장점입니다. 내용 자체가 부족하다고 할 수는 있으나 파이썬을 처음 익히는 자에게 이만한 자료도 없다고 생각합니다.

  • 데이터 분석을 위한 파이썬 철저 입문 : ‘데이터 분석을 위한’ 파이썬 철저 입문인 만큼 파이썬의 기본 내용이 있고 넘파이(Numpy), 판다스(Pandas) 등의 라이브러리와 크롤링, 웹API에 대한 설명이 있습니다. 데이터 분석에 입문하고자 하는 사람들이 개괄적으로 훑어보기에는 좋은 책일 수도 있겠으나 ‘파이썬’을 공부하고자 한다면 아래의 책이 좀 더 나아보입니다. 라이브러리나 크롤링에 관련된 내용도 대략적으로만 소개할 뿐 이를 좀 더 구체적으로 다룬 다른 책이나 자료를 참고하는 것이 좀 더 좋아 보입니다.

  • 처음 시작하는 파이썬 : 현재는 2판이 나와 있는 대표적인 파이썬 기본서 입니다. 데이터 분석보다는 파이썬 자체의 내용이 많이 담겨있습니다. 데이터 분석 라이브러리에 대한 내용도 있기는 하지만 위 책과 비교했을 때는 부족한 감이 있습니다. 하지만 동시성이나 네트워크에 대한 부분까지 폭 넓게 다루고 있는 좋은 입문서라고 생각합니다.

  • 파이썬 코딩의 기술 : 가장 유명한(?) 중급 파이썬 서적인 파이썬 코딩의 기술(이펙티브 파이썬)입니다. 최근 내용을 대폭 보강하고 파이썬3 와 관련된 내용만으로 되어있는 2판이 출시되었습니다. (1판은 파이썬2와 3에 대한 내용이 함께 있습니다) 파이썬 코딩을 잘하고 싶으신 분이라면 한번쯤은 보셔야 할 책이 아닌가 생각되네요. 제 경우는 코딩할 때 참고할 만한 부분만 찾아서 적용하는 방식으로 읽었습니다. (= 못 읽은 부분이 더 많습니다.)

  • 파이썬 자료구조와 알고리즘 : 자료구조와 알고리즘을 익히기 위해서 샀던 책입니다. 기초적인 자료구조를 파이썬 코드로 훑어볼 수 있습니다. 시중에 C 혹은 자바로 자료구조를 다룬 책은 많지만 파이썬으로 자료구조를 다룬 책은 몇 안되는 것 같습니다. (파이썬이 자료구조를 이해하기에 다소 좋지 않은 언어라 그런 것도 있는 것 같습니다만…) 자신의 주 언어가 파이썬인데 자료구조를 공부하고 싶은 분들에게 좋은 책이 되지 않을까 하빈다. 다만 그래프 자료구조와 관련된 알고리즘에 대한 내용은 없습니다.

  • 전문가를 위한 파이썬 : 파이썬 서적의 끝판왕이라고도 할 수 있는 전문가를 위한 파이썬(플루언트 파이썬) 입니다. 이 책을 보기에 실력이 모자라긴 합니다만 코딩하다 궁금한 내용이나 더 효율적으로 코딩하고 싶은 부분이 있을 때 파이썬 코딩의 기술과 같이 사전식으로 참고하고 있습니다.

Lecture

  • 프로그래밍, 데이터 과학을 위한 파이썬 : 인프런에 있는 최성철 교수님의 파이썬 강의입니다. 개인적으로는 제 파이썬 첫 공부의 시작이 되었던 강의이며 위의 어떤 책들보다도 먼저 본 강의입니다. 교수님이 상당히 친절하게 알려주시며 책에서 잘 나오지 않는 부분이나 놓칠 수 있는 부분도 모두 알려주십니다. 매 장이 끝날 때마다 주시는 과제도 큰 도움이 되고요. “무료강의도 많은데 무슨 유료강의냐!”라고 하실 수도 있겠지만 그만큼의 가치가 충분한 강의라고 생각됩니다. (한빛아카데미에서 나온 책도 있는데 본 적은 없습니다)

  • 데이터 구조 및 분석 : 아래에도 많이 등장할 에드위드에 있는 문일철 교수님의 강의입니다. 파이썬으로 배우는 자료구조 가 주요 내용으로 처음에는 파이썬 기본 문법과 OOP를 간단히 다루고 배열, 트리 등의 기본적인 자료구조를 다룹니다. 위에 있는 자료구조 책을 참고하며 재미있게 들었습니다. 그래프 등의 Non-linear 구조를 다룬 후속 강의는 이곳에 있습니다만 저는 아직 못봤네요 ㅠㅠ

Math

수학은 따로 책을 보며 공부하지는 않았습니다. 어떤 강의를 보았는지만 짧게 소개하겠습니다. 최근에는 모두의 연구소 풀잎스쿨을 통해 통계학을 공부하고 있습니다.

Book

  • 선형대수학 : 한양대학교 이상화 교수님의 선형대수학입니다. 벡터를 다루는 ML, DL을 하기 위해서는 선형대수에 대한 이해가 필요한데 이를 공부하는 데 큰 도움이 되었습니다. 다른 분들도 많이 들으셨을 강의라고 생각합니다. 다른 선형대수학 강의로는 이상엽Math 님의 선형대수학이나 칸아카데미의 선형대수학이 있습니다.

  • 확률론 기초 : 최근 통계학을 공부하면서 병행하여 보고 있는 하버드 확률론 강의입니다. 교수님이 설명을 매우 잘해주시며 ‘확률’이라는 것에 대해 많은 생각을 해 볼 수도 있는 강의입니다. 아직 다 들어본 것이 아니라서 확신은 할 수 없지만 확률을 공부하고자 하는 분들에게 좋은 가이드가 될 강의라고 생각합니다.

  • 수리통계학 : KOCW에 있는 부산대학교 김충락 교수님의 수리통계학입니다. 이전에 동일한 수업에서 영어로 진행하신 강의가 있었는데 이번 년도에 온라인 수업 때문인지 국어로 진행하신 강의를 올려주셔서 듣고 있습니다. (사실 언어의 문제 보다는 최근에 촬영한 쪽이 화질이 좋아서 이쪽을 수강하고 있습니다) 교수님 설명이 친절하여 좋습니다. 개인적으로 확률론이나 수리통계학을 들으며 모르는 부분은 풀잎스쿨 - 수리통계학에서 해결하고 있습니다 :)

Machine Learning

Book

  • 파이썬 머신러닝 완벽 가이드 : 많은 머신러닝 꿈돌이(?)의 길잡이가 된 권철민님의 책입니다. 싸이킷런(Scikit-Learn)기반으로 되어있으며 다양한 알고리즘을 캐글 예제로 굴려볼 수 있습니다. 텍스트 분석이나 추천 시스템에 관한 개괄적인 내용도 있고요. 다만 SVM에 대한 내용이 빠져 있는 점은 아쉽습니다 ㅠ

  • 핸즈 온 머신러닝 : 위 책과 더불어 머신러닝을 공부하는 데 있어 가장 좋은 책이 아닐까 합니다. 무지막지한 책의 두께에서도 알 수 있듯 내용이 상당히 방대합니다. 머신러닝 입문자가 접할 수 있는 거의 모든 머신러닝의 내용을 담고 있습니다. 1판의 텐서플로 부분은 TF 1.x 를 기준으로 쓰여있는 반면, 올해 번역되어 나온 2판의 경우 2.x 코드로 쓰여진 것으로 알고 있습니다. 책 내용뿐만 아니라 번역의 퀄리티도 매우 좋아 보기에도 부담이 없습니다. 개인적으로 박해선 역자님의 번역본은 믿고 구매하는 편입니다.

  • 패턴 인식과 머신 러닝 : 너무나도 유명한, 그리고 초심자에게는 너무도 어려운 비숍의 패턴 인식과 머신 러닝(PRML)입니다. 호기롭게 샀으나 수학적 지식이 부족해 참고 용도 외에는 거의 보지 못하고 있습니다. 아래에도 쓰겠지만 해당 책을 기준으로 한 강의를 수강하였는데 이해가 안되는 부분을 참고하기 위해서 구매 후 보고 있습니다. (다만 ) 그래도 머신러닝 전공서적 중 번역 퀄리티가 가장 좋은 편으로 알고 있습니다. 참고자료로는 Norman님의 깃허브가 있으며, 해당 책의 난이도가 너무 높은데 수학 베이스로 작성된 책을 보고 싶다면 단단한 머신러닝을 참고해보시는 것도 좋겠습니다. 단단한 머신러닝은 스르륵 훑어본 것 이상으로 자세히 본 적이 없어 생략하겠습니다.

Lecture

  • 인공지능 및 기계학습 개론 : 카이스트 문일철 교수님의 인공지능 및 기계학습 개론입니다. 바로 위에 있는 패턴 인식과 머신 러닝 책을 기반으로 하는 강의입니다. 링크에 걸어놓은 1은 그래도 할만 하다는 느낌이었는데 2나 심화과정은 어려워서 일단 보류중입니다. 머신러닝에 대해 단순 코드가 아닌 수학적 접근이 필요하신 분이나 PRML을 독학하기 어려우셨던 분들께는 최고의 강의가 될 듯 합니다.

  • Business Analytics : 고려대학교 강필성 교수님의 Business Analytics 강의입니다. 차원 축소, 커널 기반 학습, 이상치 탐지 및 앙상블 기법에 대해 다룹니다. 2020년도에 온라인 강의를 위해 진행된 일반 대학원 강의이며 소홀히 할 수 있는 부분에 대해 깊이 다뤄주셔서 감사히 듣고 있습니다. 강의 자료를 모두 주실 뿐만 아니라 설명도 잘 해주십니다. 위의 인공지능 및 기계학습 개론과 동일하게 코드보다는 수학적 접근에 대한 내용이 주를 이룹니다.

Deep Learning

Book

  • 밑바닥부터 시작하는 딥러닝 1 : 많은 사람의 입문서가 되었을 밑바닥부터 시작하는 딥러닝 1입니다. 별다른 라이브러리를 사용하지 않고 딥러닝에 필요한 여러가지 메커니즘을 코드로 구현합니다. 텐서플로우나 파이토치와 같은 딥러닝 라이브러리를 사용하여 모델을 구현하다보면 역전파가 어떤 방식으로 일어나는지, 초기화는 어떤 방식으로 이루어지는지 등에 대해 알기 어려울 때가 많습니다. 몇 가지 튜닝만으로도 이미 구현된 방식이 다 되기 때문이지요. 밑바닥부터 시작하는 딥러닝은 이런 요소를 넘파이만으로 구현하며 쉽게 넘어갈 수 있는 부분에 대한 이해를 돕습니다. 1판은 컴퓨터 비전을 위한 내용이라고 되어 있으나 딥러닝 전반에 대해 다루고 있고 끝부분에만 CNN 및 컴퓨터 비전에 관련된 모델을 다루고 있습니다. 따라서 자연어처리 만을 공부하려는 입문자라도 2판의 내용을 이해하기 위해서 1판의 내용을 먼저 숙지하는 것이 올바른 순서라고 생각됩니다.

  • 케라스 창시자에게 배우는 딥러닝 with Python : 케라스 창시자인 숄레가 쓰고 믿을만한 역자인 박해선 님이 번역한 일명 ‘케라스 딥러닝’ 입니다. 케라스를 사용하여 MLP부터 CNN, RNN, LSTM, GAN까지 많은 부분을 구현하고 있습니다. 뛰어난 저자와 역자 덕분에 설명이 깔끔합니다. 특히 제가 공부할 당시 TF 2.x 를 기준으로 하는 책은 거의 없다시피 했는데 이 책에서는 케라스를 기준으로 했으므로 TF버전에 크게 상관없이 Colab에서 모두 실행해볼 수 있었습니다.

  • 심층 학습 : 딥러닝의 대가인 벤지오와 GAN을 만든 굿펠로가 저자로 있는 심층 학습(Deep Learning)입니다. 전공서적으로 어마어마한 두께와 가격을 자랑합니다. 저자가 뛰어나니 내용도 역시 좋지만 입문자에게는 역시 어려운 편이고 번역이나 책의 디자인이 초심자가 보기에는 매우 어렵습니다. 저도 앞쪽 몇 부분을 제외하고는 거의 보지 못한 수준입니다. 원서가 부담스럽지 않은 분들이라면 이 책보다는 인터넷으로 볼 수 있는 Deep dive into Deep Learning 을 추천하는 바입니다.

Lecture

  • 모두를 위한 딥러닝 : 이제는 네이버 클로바를 벗어나 Upstage의 CEO가 되신 김성훈 교수님의 모두를 위한 딥러닝입니다. 코세라의 Andrew Ng님의 강의와 함께 딥러닝에 입문하는 사람들이라면 한 번쯤은 거쳐가는 강의가 아닐까 싶습니다. 교수님의 내공인지 설명이 길지 않음에도 쉽게 이해할 수 있었습니다. 딥러닝에 처음 입문하는 분들에게 적극 추천합니다. 링크에 걸린 재생 목록은 시즌1로 오래 전에 촬영한 것이라 TF 1.x 버전의 코드가 실려있는 것으로 알고 있습니다. 교수님 채널에 TF 2.x 버전을 기준으로 한 코드 실습도 있는 것으로 알고 있으니 그쪽을 참고하시면 좋을 것 같습니다.

  • (위키독스)Pytorch를 이용한 딥 러닝 입문 : 아래 후술하게 될 ‘딥 러닝을 이용한 자연어 처리 입문’의 저자인 유원준님이 쓴 또 다른 위키독스 책입니다. 파이토치의 사용법을 공부하면서는 공식 튜토리얼과 해당 책만을 사용하여 공부하였습니다. (물론 제가 깊게 공부한 편이 아니라서 해당 자료만으로는 부족한 부분일 있을 수도 있습니다)

Natural Language Processing

Book

  • 밑바닥부터 시작하는 딥러닝 2 : 밑바닥부터 시작하는 딥러닝 1판의 기조를 그대로 이어받은 시즌 2입니다. 자연어처리에서 사용되는 토큰의 벡터 표현(Representation) 뿐만 아니라 신경망을 기반으로 한 RNN, LSTM, GRU 등도 별다른 라이브러리 없이 구현해 볼 수 있습니다. 직접 구현해 봄으로써 모델의 구조를 좀 더 자세히 알 수 있다는 장점이 있습니다. 다만 이 책 하나로 자연어처리를 끝내기에는 자연어처리에서 사용되는 전처리나 토큰화(Tokenization) 등에 대한 부분이 부족하다고 생각됩니다.

  • (위키독스)딥 러닝을 이용한 자연어 처리 입문 : 자연어처리라는 어찌보면 협소한 분야에 한정된 책임에도 불구하고 위키독스 추천수 3위를 달리고 있는 유원준님의 딥러닝을 이용한 자연어처리 입문입니다. 일단 무료책이라는 최고의 장점이 있으며 심지어 다른 책과 동일한 가격이 책정되더라도 가격이 아깝지 않은 퀄리티를 자랑합니다. TF 2.x 와 케라스 기반으로 코드가 작성되어 있으며 저자분께서 여러 이미지나 도식을 설명에 사용하여 초심자도 자연어 처리에 쉽게 접근할 수 있다는 장점이 있습니다.

  • 김기현의 자연어처리 딥러닝 캠프 : 파이토치 편 : 김기현님이 패스트캠퍼스의 강의를 기반으로 만든 책입니다. 파이토치를 사용하여 작성된 것이 파이토치 사용하여 자연어처리를 공부하는 초심자에게 반가울 수는 있습니다. 하지만 이 책으로 파이토치를 입문하기에는 다소 어려운 것이 사실입니다. 파이토치 입문서나 공식 자료를 보고 어느 정도 파이토치를 익힌 뒤에 해당 책은 자연어처리를 공부하기 위한 용도로만 사용하면 좋을 것 같습니다. 책 앞부분에는 매우 설명이 자세하게 되어 있기는 하지만 뒤로 가면서 여러 내용을 다루시려는 강의의 특성 때문인지 챕터마다 설명이 조금 부족한 느낌이 있었습니다. 그래도 파이토치를 사용하여 자연어처리를 공부하고자 하시는 분들께는 가장 적합한 책이 아닐까 생각해봅니다.

  • 한국어 임베딩 : 이 블로그가 있게 해주신(?) 이기창(Ratsgo)님의 ‘한국어 임베딩’입니다. 개인적으로는 자연어처리 입문자들에게 가장 추천하는 책으로 하나를 꼽으라면 해당되는 책입니다. 처음에 등장하는 도커라는 환경설정 장벽(?)만 잘 넘긴다면 책을 보는데 큰 어려움이 없으며 설명도 깔끔합니다. 저자께서 기자 출신이기도 하고 블로그가 유명한데 이를 거쳐 나온 콘텐츠다 보니 처음 보는 사람도 큰 어려움 없이 볼 수 있다고 생각됩니다. 특히 책이 ‘한국어’ 임베딩이니만큼 책에 나오는 예시가 모두 한국어로 되어있습니다. 한국어 텍스트로 자연어처리를 하고자 하시는 분들이라면 당연히 읽어야 될 책입니다.

  • 파이썬으로 배우는 자연어 처리 인 액션 : 서평단 이벤트를 통해 받아 읽어본 책입니다. 두께가 상당히 두꺼우며 상당히 많은 양을 싣고 있는 책입니다. 다만 번역이 그리 좋지는 못합니다. 종종 과도한 번역이 눈에 띕니다. 책 자체가 장황한 것인지 아니면 번역 탓인지는 모르겠으나 중구난방으로 설명이 되어있는 것도 단점이고요. 하지만 코드에 대한 주석이 한 줄 한 줄 자세히 달려 있으며 다양한 내용을 담고 있어 자연어 처리의 전반적인 내용을 훑어보기에 괜찮은 책이라고 생각됩니다.

  • 텐서플로2와 머신러닝으로 시작하는 자연어처리 : 흔히 앵무새 책으로 불리는 책입니다. 링크에 걸려있는 개정판은 최근에 나온 것이며 저는 구판을 가지고 있습니다. 구판에서는 코드 오류가 나는 부분도 있고, 책은 TF 1.x 기준으로 코드가 작성되어 있지만 제가 TF 2.x 버전에 익숙하다 보니 코드 실습을 많이 해보지는 못했습니다. 다만 개정판에서는 이런 부분이 많이 개선된 것으로 알고 있으며 위에 서술된 책 중에서 가장 최근에 등장한 것이다보니 GPT2 까지의 내용을 다루고 있다는 장점이 있습니다.

Lecture

  • 딥 러닝을 이용한 자연어처리 입문 : 조경현 교수님의 강연했던 딥 러닝을 이용한 자연어처리 입문입니다. 사실 강의 기간이 짧고 많은 내용을 강의하시려다 보니 완전 생초보에게 그렇게 쉬운 강의는 아닌듯한데 호기롭게 신청해서 들었습니다. 그래도 설명을 너무 잘하셨고 Q&A시간에 수강생들이 했던 질문이 궁금했던 내용을 긁어주어 좋았습니다. 아래 강의를 듣기 전에 자연어처리를 개괄하는 강의가 필요하다면 해당 강의를 들어보시는 것을 추천합니다.

  • Text Analytics : 고려대학교 강필성 교수님의 텍스트 분석 강의입니다. 자연어 처리에 대한 저의 대부분의 지식은 해당 강의를 통해 만들어졌다고 해도 과언이 아닙니다. 개념이나 수학 기반의 강의인지라 코드 부분이 부족할 수는 있겠습니다. 하지만 교수님이 설명을 매우 잘해주시고 강의가 커버하는 범위도 토큰의 벡터으로 표현하는 여러 방법부터 Topic Modeling이나 Transformer 이후의 언어모델까지 꽤 넓습니다. 다만 RNN, LSTM 같은 신경망 모델에 대한 설명은 빠져있는데 이 부분은 다른 강의나 도서를 통해 공부하시면 좋을 것 같습니다. CS224와 더불어 자연어를 익힐 수 있는 강의 중에는 최고의 강의라고 생각됩니다.

Others

블로그나 아카이빙된 페이지, 유튜브 채널 등은 분야에 상관없이 한 번에 적도록 하겠습니다. 위에서도 그랬듯 순서는 아무 상관 없습니다 :)

  • Ratsgo님 블로그 : 자연어 처리를 공부하는 분들이라면 모두 방문해보셨을 이기창님의 블로그입니다. 단순히 머신러닝 및 딥러닝과 관련된 지식뿐만 아니라 한국어의 다양한 언어적 특징도 잘 정리해주셔서 잘 읽고 있습니다. 블로그만 잘 보셔도 한국어 임베딩에 있는 내용의 대부분을 습득하실 수 있지 않을까 생각합니다.

  • Lovit님 블로그 : 역시 자연어 처리를 공부하시는 분들이라면 방문해보셨을 김현중님의 블로그입니다. 여러 예제를 실행해보는 데에 있어서 큰 도움을 얻었습니다.

  • Paul-hyun님 블로그 : 이번 랭콘2020에서 강의하셨던 현청천님의 블로그입니다. 블로그에 자료가 많지는 않지만 논문 구현 자료가 큰 도움이 되었습니다. 12월부터 자연어 논문 읽기를 할 생각인데 그 때 다시 한 번 참고할 생각입니다.

  • 박해선님 블로그 : 위에서 언급했던 역자이자 저자인 박해선님의 블로그입니다. 해당 블로그에서 핸즈 온 머신러닝 2판에 대한 강의도 볼 수 있습니다.

  • tykimos님 블로그 : 케라스 코리아 관리자이신 김태영님의 블로그입니다. 케라스에 관련된 각종 자료를 포함해 다양한 자료를 볼 수 있습니다.

  • Beomi님 블로그 : KcBERT를 만들어 주신 이준범님의 블로그입니다. 블로그 자료뿐만 아니라 개인적으로는 ‘나만의 웹 크롤러 만들기’ 자료가 크롤링을 공부하면서 큰 도움이 되었습니다.

  • 허민석님 유튜브 : 허민석님의 유튜브입니다. 신경망 기초에 대한 내용부터 논문리뷰까지 다양한 내용이 있습니다. 개인적으로는 GPT-3 논문에 대한 개략적인 내용을 가장 처음 알게 된 경로가 허민석님 유튜브를 통해서였습니다.

  • DSBA : Business Analytics와 Text Analytics 강의에서 언급했던 고려대학교 산업경영공학부 DSBA랩의 유튜브 채널입니다. 해당 강의뿐만 아니라 랩실에 계시 학생 분들이 해주시는 논문 리뷰 또한 큰 도움이 되었습니다. (아직 많이 보지는 못했습니다만…)

  • PR12 : 너무나도 유명한 논문 리뷰 스터디인 PR12입니다. 참여자분들의 내공도 상당하시고 벌써 약 300개의 논문 리뷰가 올라와 있습니다.

  • 딥러닝 논문읽기 모임 : ‘딥러닝 논문읽기 모임’ 유튜브 채널입니다. 구독 후 흥미로운 주제의 논문이 올라올 때 (간혹ㅠㅠ) 보고 있습니다. 사실 논문 자체에 대한 두려움 같은 것이 있어서 위 3개 채널을 생각보다 많이 보지는 못합니다 ㅠㅠ

추가가 필요한 부분이나 수정이 필요한 부분에 대해서는 efrks@naver.com 으로 메일 주시면 감사하겠습니다. 빠진 부분에 대해서도 지속적으로 채워나갈 예정입니다. (여러 페북 페이지나 그룹 등은 찾으면 금방 난오는 부분이라 제외하였습니다.)

Comment  Read more

적률생성함수(Moment Generating Function, MGF)

|

이 게시물은 부산대학교 김충락 교수님의 수리통계학 강의를 참고하여 작성하였습니다.

Moment Generating Function

이번에는 적률 생성 함수(Moment Generating Function)에 대해서 알아보겠습니다. 적률 생성 함수를 알아보기 전에 ‘적률’로 해석되는 모멘트(Moment)에 대해서 먼저 알아보도록 하겠습니다.

Moment

모멘트란 물리학에서도 사용되는 개념입니다. 물리학에서는 질량을 0차 모멘트로 나타내고, 질량 중심은 1차 모멘트를 사용하여 나타내며, 관성 모멘트를 나타낼 때에는 2차 모멘트를 사용합니다. 마찬가지로 통계학에서는 평균(Mean)을 나타낼 때 1차 모멘트를 사용하고, 분산(Variance)을 나타낼 때에는 2차 모멘트를 사용합니다. 왜도(Skewness)를 나타낼 때에는 3차 모멘트를 도입하여 사용하게 되며 마지막으로 첨도(Kurtosis)를 나타낼 때에는 4차 모멘트를 사용합니다. 각 차수의 모멘트를 결합하여 나타낼 수 있는 4개의 수치는 확률 밀도 함수(Probability Density Function, pdf)의 모양을 결정하는 역할을 합니다. 이에 대해서는 다음에 다시 살펴보겠습니다.

통계학에서 $k$차 모멘트를 수식으로 나타내면 $E(X^k)$ 가 됩니다.

Moment Generating Function

이제 적률 생성 함수에 대해서 알아보겠습니다. 적률 생성 함수 $M_X(t)$ 는 아래와 같이 정의됩니다.

[\begin{aligned} M_X(t) &= E\big[e^{tx}\big] \qquad \vert t \vert < h, h>0
&= \int^\infty_{-\infty} e^{tx}\cdot f(x)dx \end{aligned}]

적률 생성 함수는 왜 이런 형태를 가지는 것일까요? 이를 이해하기 위해서는 테일러 급수 전개(Taylor Series Expansion)에 대해 알아볼 필요가 있겠습니다.

Taylor Series Expansion

테일러 급수 전개는 삼각함수나 지수(및 로그)함수와 같이 다항함수가 아닌 함수를 다항함수의 결합으로 근사하는 방식입니다. 임의의 함수 $f(x) \quad f:R^1 \rightarrow R^1$ 는 다음과 같이 근사할 수 있습니다.

[\begin{aligned} f(x) &= \frac{f(x_0)}{0!} + \frac{f^\prime(x_0)}{1!}(x-x_0) + \frac{f^{\prime\prime}(x_0)}{2!}(x-x_0)^2 + \cdots
&= \sum^\infty_{j=0} \frac{f^{(j)}(x_0)}{j!}(x-x_0)^j \end{aligned}]

그렇다면 지수함수 $f(x) = e^x$를 테일러 급수 전개로 나타내면 어떤 결과가 나오게 될까요?

[e^x = \frac{e^{x_0}}{0!} + \frac{e^{x_0}}{1!}(x-x_0) + \frac{e^{x_0}}{2!}(x-x_0)^2 + \cdots]

위와 같은 식에서 $x_0 = 0$ 이라면 식을 다음과 같이 나타내게 됩니다.

[\begin{aligned} e^x &= \frac{1}{0!} + \frac{1}{1!}\cdot x + \frac{1}{2!}\cdot x^2 + \cdots
&= \sum^\infty_{j=0} \frac{x^j}{j!} \end{aligned}]

이제 테일러 급수 전개를 알아보았으니 다시 적률생성함수의 식으로 돌아가 보겠습니다.

[M_X(t) = E\big[e^{tx}\big]]

이제 이 형태를 테일러급수 전개를 통해서 변환해보겠습니다.

[\begin{aligned} E\big[e^{tx}\big] &= E\big[1+tx+t^2x^2 + \cdots \big]
&= 1 + E[X] + \frac{t^2}{2}E[X^2] + \cdots \end{aligned}]

$k$차 모먼트, 즉 $E(X^k) = \mu_k$로 나타내면 다음과 같이 식을 변환할 수 있습니다.

[\begin{aligned} M_X(t) &= 1 + E[X] + \frac{t^2}{2}E[X^2] + \cdots
&= 1 + \mu_1t + \frac{\mu_2}{2}t^2 + \cdots \end{aligned}]

이렇게 변환할 수 있으므로 적률 생성 함수를 $k$ 번 미분한 값에 0을 대입하여 $k$차 모먼트를 구할 수 있습니다.

[\begin{aligned} M_X^\prime(0) &= \mu_1
M_X^{\prime\prime}(0) &= \mu_2
&\vdots
M_X^{(k)}(0) &= \mu_k \end{aligned}]

특성

위와 같이 적률 생성 함수는 위와 같이 모먼트를 쉽게 구할 수 있다는 장점이 있지만 모든 분포가 적률 생성 함수를 가지는 것은 아닙니다. 특정 확률 분포 함수는 적률 생성 함수를 생성했을 때 적분이 불가능한 경우가 있습니다. 이런 경우에는 적률 생성 함수를 구할 수 없습니다. 예를 들어, 확률 분포 함수 $f(x) = x^{-2} \quad I(x>1)$ 의 적률 생성 함수는 적분이 불가능하며 이 때는 적률 생성 함수가 존재하지 않습니다.

[\begin{aligned} M_X(t) &= \int^\infty_1 e^{tx}\cdot x^{-2}dx
&=\lim_{b\rightarrow\infty} \int^\infty_1 e^{tx}\cdot x^{-2}dx
&=\lim_{b\rightarrow\infty} \int^\infty_1 (1+tx + \frac{t^2x^2}{2}+ \frac{t^3x^3}{6}+ \cdots) x^{-2}dx
&=\lim_{b\rightarrow\infty} \int^\infty_1 (\frac{1}{x^2}+\frac{t}{x} + \frac{t^2}{2}+ \frac{t^3x}{6}+\cdots)dx
&\therefore \text{not integrable} \end{aligned}]

그리고 만약 두 랜덤 확률 변수의 적률 생성 함수가 존재하고 두 적률 생성 함수가 동일하다면 두 누적 확률 분포 또한 동일한 분포를 가집니다. 즉, 적률 생성 함수는 유일성(Uniqueness)를 가집니다.

[M_X(t) = M_Y(t) \Leftrightarrow F_X(t) = F_Y(t)]

Comment  Read more

기댓값(Expect Value)

|

이 게시물은 부산대학교 김충락 교수님의 수리통계학 강의를 참고하여 작성하였습니다.

Expect Value

중학 수학에서 도수분포표로부터 값의 평균을 구해본 적이 있을 것입니다. 예를 들어 아래와 같은 도수분포표로부터 학생 키의 평균을 구하는 문제가 있다고 하겠습니다.

키(cm) 학생 수 상대도수
150 ~ 160 2 0.1
160 ~ 170 6 0.3
170 ~ 180 7 0.35
180 ~ 190 4 0.2
190 ~ 200 1 0.05

위 표에서 학생 키의 평균을 구하려면 각 계급의 계급값을 구한 후 이 값을 상대도수(=해당 계급의 학생 수 / 전체 학생 수)와 곱하면 되었습니다. 실제로 구해보면 아래와 같습니다.

[155 \times 0.1 + 165 \times 0.3 + 175 \times 0.35 + 185 \times 0.2 + 195 \times 0.05 = 173(cm)]

확률 변수의 기댓값을 구하는 방법도 위와 유사합니다. 확률 변수 $X$ 의 기댓값 $E(X)$는 각 확률 변수의 값 $x$와 그 때의 확률 밀도(질량) 함수의 값인 $f(x)$를 전부 더하여 사용합니다. 만약 $X$가 연속형 확률 변수라면 기댓값은 아래와 같이 각 값을 적분하여 구할 수 있습니다.

[E(X) = \int^\infty_{-\infty} xf(x)dx \qquad \text{if } \int^\infty_{-\infty} \vert x\vert f(x)dx < \infty]

$X$가 이산형 확률 변수라면 따로 떨어진 확률 변수에 대해서만 더해주어야 하므로 기댓값은 아래와 같이 구해지게 됩니다.

[E(X) = \sum^\infty_{-\infty} xf(x)dx \qquad \text{if } \sum^\infty_{-\infty} \vert x\vert f(x)dx < \infty]

구하고자 하는 기댓값의 대상이 변하게 되면 기댓값은 어떻게 변하게 될까요? 위 식들을 일반화하여 나타낸 함수 $g(x)$의 기댓값은 아래와 같이 나타낼 수 있습니다.

[E(g(x)) \begin{cases} \int^\infty_{-\infty} g(x)f(x)dx \qquad \text{Continuous}

\sum^\infty_{-\infty} g(x)f(x)dx \qquad \text{Discrete} \end{cases}]

(Population) Mean & Variance

기댓값을 이용하면 모평균(Population mean, $\mu$ )과 모분산(Population variance, $\sigma^2$)을 구할 수 있습니다. 먼저 모평균은 확률변수의 기댓값으로 정의되며 수식으로 나타내면 다음과 같습니다.

[\mu := E(X)]

모분산은 편차(각 인스턴스가 평균으로부터 얼마나 떨어져 있는지) 제곱의 합이므로 아래와 같이 나타낼 수 있습니다.

[\sigma^2 := E[(X-E(X))^2]]

위 식은 아래와 같이 변형할 수 있습니다.

[\begin{aligned} E[(X-E(X)^2)] &= E[(X-\mu)^2]
&=\int(x-\mu)^2f_X(x)dx
&=\int x^2f_X(x)dx -2\int \mu \cdot xf_X(x)dx + \int \mu^2f_X(x)dx
&=\int x^2f_X(x)dx -2\mu\int xf_X(x)dx + \mu^2\int f_X(x)dx
&=\int x^2f_X(x)dx -2\mu^2 + \mu^2 \qquad (\because \int xf_X(x)dx=\mu, \int f_X(x)dx=1)
&=\int x^2f_X(x)dx -\mu^2
&=E(X^2) - [E(X)]^2 \end{aligned}]

즉 분산은 확률변수 값 제곱의 기댓값에서 기댓값의 제곱을 빼주어 구할 수도 있게 됩니다. 이 때 확률 변수를 $k$ 제곱 한 것의 기댓값, $E(X^k)$ 를 $k$-차 모멘트(Moment)라고 합니다. 즉, 평균은 1차 모멘트이며 분산은 2차 모멘트에서 1차 모멘트의 제곱을 빼준 것이 됩니다. 모멘트에 대해서는 다음 게시물인 적률 생성 함수(Moment Generating Function)에서 더 자세히 논의를 이어나갈 것입니다.

Comment  Read more

커널 기반 학습(kernel based Learning)

|

해당 게시물은 고려대학교 강필성 교수님의 강의를 바탕으로 작성한 것입니다.

kernel based Learning

커널 기반 학습(kernel based Learning)은 90년대부터 딥러닝이 대두되기 전인 2000년대 까지 머신러닝의 주류(?)에 있던 모델의 기반이 되는 학습 방법입니다. 본격적으로 커널을 사용한 모델을 알아보기 전에 커널 기반의 학습을 이해하는 데 필요한 몇 가지 개념에 대해서 알아보겠습니다.

Shatter

첫 번째로 알아야 할 개념은 Shatter입니다. 수 개의 인스턴스가 있을 때 특정 함수에 의해서 Shatter 된다는 것은 개별 인스턴스를 가능한 모든 조합의 이진 레이블로 구분해 낼 수 있다는 것을 의미합니다. 말로 설명하는 것은 어려우니 예시를 들어 설명해보겠습니다. 2차원 평면 상에 1개의 점이 있다고 하고 이를 직선 분류기로 분류해보겠습니다.

1point

이 경우에는 위와 같이 하나의 점을 빨간색 클래스로 분류하는 경우와 파란색 클래스로 분류하는 경우의 2가지가 있습니다. 그렇다면 직선 분류기로 2개의 점을 분류해보겠습니다. 이 경우에는 아래와 같이 Shatter가 가능합니다.

2point

위와 같이 두 점을 모두 빨간색 클래스로 분류하는 경우(1)와 파란색 클래스로 분류하는 경우(4)가 있습니다. 그리고 각 점을 다른 클래스로 분류하되 왼쪽 점을 빨간색 클래스로 분류하는 경우(2)와 파란색 클래스로 분류하는 경우(3)까지 총 4개의 경우를 사용하여 Shatter할 수 있습니다. 3개의 점이 있는 경우에는 아래와 같이 분류할 수 있습니다.

3point

이미지 출처 : github.com/pilsung-kang/Business-Analytics-IME654

위와 같이 3개의 점을 직선 분류기로 분류하는 경우에도 8개의 케이스를 사용하면 Shatter된다는 것을 알 수 있습니다. 점을 또 하나 더 늘려 4개인 경우를 살펴보도록 하겠습니다.

4points

이미지 출처 : github.com/pilsung-kang/Business-Analytics-IME654

점이 4개인 경우 모든 점을 다른 클래스로 분류하는 데에 대한 경우의 수는 위와 같이 16개입니다. 하지만 직선 분류기를 사용하면 마지막 2개 클래스로 분류할 수 없습니다. 흔히 XOR문제라고도 불리는 두 경우는 어떤 선형 분류기를 사용하더라도 분류할 수 없습니다. 따라서 직선 분류기는 점 4개부터는 Shatter할 수 없게 됩니다. 이렇게 분류기를 사용하여 모든 이진 레이블 조합으로 나누는 행위를 Shatter라고 합니다.

VC Dimension

다음으로 VC Dimension(Vapnik-Chervonekis dimension)에 대해서 알아보겠습니다. VC Dimension은 어떤 가설 공간의 Capacity를 측정한 지표입니다. Capacity란 특정 모델의 복잡도와도 같으며, 모델의 표현력이나 유연성 등을 나타내는 지표이빈다. VC Dimension은 특정 분류기에 의해서 최대로 Shatter될 수 있는 점의 수로 정해집니다. 위와 알아본 바와 같이 2차원 상에 있는 직선 분류기의 $VC = 3$ 이라고 할 수 있습니다.

Structure Risk Minimization

특정 모델의 복잡도를 알고 있다면 구조적 위험 최소화(Structure Risk Minimization, SRM)를 통하여 최선의 모델을 이끌어 낼 수 있습니다. 구조적 위험 최소화는 경험적 위험 최소화(Empirical Risk Minimization, ERM)와 비교되는 개념입니다. 만약 존재하는 모든 데이터를 모을 수 있다면 우리는 그 데이터에만 맞는 모델을 만들면 될 것입니다. 학습 데이터에 최적화 된, 즉 경험적 위험만을 최소화하는 모델을 생성하면 되지요.

하지만 현실적으로 모든 데이터를 가지는 것은 불가능하기 때문에 일반화로부터 발생하는 오류를 고려해야 합니다. 즉 모델의 구조로부터 발생하는 위험을 최소화 해야 하는 것이지요. 아래 그림을 통해서 구조적 위험 최소화에 대해서 알아보겠습니다.

srm

이미지 출처 : www.researchgate.net

위 그림에서 X축을 나타내는 $h$는 모델의 복잡도, 즉 VC Dimension 입니다. Capacity를 모델의 복잡도를 나타내는 지표이므로 $h$가 증가 할수록 Capacity에 의한 오차, 즉 일반화로부터 발생되는 오차(Variance)가 증가하는 것을 알 수 있습니다. 반대로 복잡한 모델을 사용할수록 학습 데이터에는 더 잘 맞춰지기(Fitting) 때문에 그로부터 발생하는 오차(Bias)는 점점 줄어드는 것을 볼 수 있지요. 분산(Variance)으로부터 발생하는 오차와 편향(Bias)으로부터 발생하는 오차는 본 블로그의 이곳에서 더 자세히 알아보실 수 있습니다.

결국 모델의 구조적 위험은 학습 데이터에 대한 오차, 즉 경험적 위험에는 반비례하지만 복잡도에는 비례함을 알 수 있습니다. 따라서 이러한 트레이드오프(Trade-off)를 고려하여 구조적 위험을 최소화하는 지점에서의 모델이 최선의 모델이 되겠습니다. 이를 수식으로 알아보겠습니다. 함수 $f$로부터 나타나는 경험적 위험을 $R_{\text{emp}}[f]$ 라 하면 모델의 구조적 위험은 아래와 같이 나타낼 수 있습니다.

[R[f] = R_{\text{emp}}[f] + \sqrt{\frac{h(\ln\frac{2n}{h}+1) - \ln(\frac{\delta}{4})}{n}}]

위 식에서 $n$은 학습 데이터의 수를 나타냅니다. 즉 경험적 위험이 동일할 때, 데이터의 수 $n$이 증가하면 Capacity로부터 발생하는 오차가 감소하게 되고 모델의 총 오차 역시 감소하게 됩니다. 하지만 VC Dimension인 $h$가 증가하면 Capacity로부터 발생하는 오차가 증가하게 되고 모델의 총 오차 역시 증가하게 됩니다.

However

구조적 위험 최소화(SRM)때문에 2000년대 까지는 데이터의 수 $n$보다 특성의 수 $V$가 적어야 한다는 것, 즉 $n > V$ 가 모델에서의 불문율로 여겨졌습니다. 하지만 딥러닝이 대두되면서 이런 불문율을 어기면서도 좋은 성능을 나타내는 모델이 등장하고 있습니다.

dl_para1

이미지 출처 : github.com/pilsung-kang/Business-Analytics-IME654

구조적 위험 최소화에 따르면 파라미터가 매우 많은 깊은 신경망의 경우에는 일반화로부터 발생하는 오차가 엄청나게 증가해야 합니다. 하지만 여러가지 보정을 통해 실제 딥러닝 모델은 매우 많은 파라미터에도 좋은 일반화 성능을 보이고 있습니다. 아래는 이미지 처리에 사용되는 다양한 모델의 파라미터 수 $p$ 와 학습 데이터의 수 $n$ 의 비율을 구하여 나타낸 것입니다. Wide Resnet의 경우 학습 데이터 대비 거의 180배에 달하는 파라미터 숫자를 가진 모델임을 볼 수 있습니다.

dl_para2

이미지 출처 : github.com/pilsung-kang/Business-Analytics-IME654

하지만 커널 기반의 방법에서는 여전히 $n > V$라는 불문율을 지켜야 하며 구조적 위험 최소화 역시 중요하게 다루어야 합니다. 최근 딥러닝이 다양한 분야에서 좋은 성능을 기록하고 있는 것은 사실입니다. 하지만 하나의 좋은 모델이 모든 데이터 형태에 대해서 좋으리란 법은 없으며 실제로도 데이터마다 좋은 성능을 나타내는 알고리즘이 다릅니다. “(최적화에도) 공짜 점심은 없다”라는 말처럼요. 그런만큼 커널 기반의 학습 방법에 대해서도 잘 알아야 할 것입니다. 그러므로 앞으로의 몇 가지 게시물은 여러 커널 기반의 학습을 적용한 모델에 대해 알아보겠습니다.

Comment  Read more