또르르's 개발 Story

[09-1] 딥러닝에 사용되는 확률론 본문

부스트캠프 AI 테크 U stage/이론

[09-1] 딥러닝에 사용되는 확률론

또르르21 2021. 1. 28. 23:57

딥러닝은 확률론 기반의 기계학습 이론에 바탕을 두고 있습니다.

기계학습에서 사용되는 손실함수(loss function)들의 작동 원리는 데이터 공간을 통계적으로 해석해서 유도하게 됩니다.

즉, 예측이 틀릴 위험(risk)을 최소화하도록 데이터를 학습하는 원리는 통계적 기계학습의 원리입니다.

 

예를 들어,

회귀 분석에서 손실함수로 사용되는 L2-노름은 예측 오차의 분산을 가장 최소화하는 방향으로 학습하도록 유도합니다.

분류 문제에서 사용되는 교차 엔트로피(cross-entropy)는 모델 예측의 불확실성을 최소화하는 방향으로 학습하도록 유도합니다.

 

따라서 딥러닝에서 확률론은 중요하며, 꼭 집고 넘어가야하는 부분입니다.

 

 

1️⃣ 확률 변수

확률변수는 확률 공간에서 일어나는 확률 현상을 기인해 확률적으로 정해지는 변수를 의미합니다.

즉, 동전을 무작위로 던졌을 때 나올 수 있는 앞(=0), 뒤(=1) 면은 2개밖에 없으므로 확률변수로 표현하면 X=0,1입니다.

확률변수는 이산형(discrete)연속형(continuous)로 구분됩니다.

 

1) 이산형 확률변수

 

이산형 확률변수는 확률변수가 가질 수 있는 경우의 수를 모두 고려하여 확률에 더해서 모델링( 사용)하는 방법을 사용합니다.

 

2) 연속형 확률변수

 

연속형 확률변수는 데이터 공간에 정의된 확률변수의 밀도(density) 위에서의 적분을 통해 모델링( 사용)하는 방법을 사용합니다. (여기서 주의할점은 밀도는 누적확률분포의 변화율을 모델링한 것으로 확률로 해석 X)

 

2️⃣ 확률 분포

 

확률 분포는 확률 변수가 특정한 값을 가질 확률을 나타내는 함수입니다.

아래 그림과 같이 데이터 공간을 X×Y라 표기하고 D는 데이터공간에서 데이터를 추출하는 분포입니다.

여기서 파란색 점은 데이터를 의미합니다.

1) 결합분포 P(x,y)

 

결합 분포는 확률변수가 여러 개(x,y)일 때 함께 고려하는 확률분포입니다.

P(x,y)일 때 확률변수 x,y가 존재하며, 아래 식으로 표현됩니다.

 

  • 이산형 확률분포
    P(x,y)=P(x,y)
  • 연속형 확률분포
    P(x,y)=P(x,y)

위의 그림에서 결합 분포 P(x,y)연속형으로 나타나지만 빨간색 칸막이로 나누게 되면 이산형처럼 보이게 됩니다.
이렇게 빨간 칸 안에 있는 값을 계산해서 결합 분포 계산이 가능해집니다.

위와 같이 원래 분포가 연속형이라도 이산형으로 사용 가능한데, 모델링 목적에 따라 다르게 측정이 가능합니다. 

 

2) 주변확률분포 P(x)

 

주변확률분포는 두 이산확률 변수의 결합확률분포로부터 각각의 확률변수에 대한 분포입니다.

쉽게 이야기하면 X의 주변확률분포를 구할 때 'y를 없애고 x만 남기자'라는 생각으로 구하면 됩니다.

P(X)에 대한 주변확률분포 도식은 아래와 같습니다.

P(X)는 입력 x에 대한 주변확률분포로 y에 대한 정보를 알려주지는 않습니다.

만약 y에 대한 주변확률분포를 구하고 싶다면 'x를 없애고 y만 남기자'라는 생각으로 P(Y)를 구하면 됩니다.

 

3) 조건부확률분포 P(x|y)

 

조건부확률분포는 특정 클래스가 주어진 조건일 때 보여지는 데이터의 확률분포입니다.

즉, y가 주어져있는 상태에서 x에 대한 확률분포입니다.

아래 그림은 Y=1일 때 입력 X에 대한 확률분포를 나타냅니다.

 

조건부확률분포 P(x|y)는 데이터 공간에서 입력 x와 출력 y 사이의 관계를 모델링할 수 있습니다.

입력과 출력 사이의 통계적인 관계를 모델링할 때...예측 모델을 세울 때...등 조건부확률분포를 사용하면 주변환경을 명확하게 파악할 수가 있습니다. 

 

3️⃣ 조건부확률 P(y|x)과 조건부기대값 E[y|x]

 

조건부 확률조건부기대값로지스틱 회귀 분류문제에서 사용이되는데,

로지스틱 회귀에서 사용했던 선형모델과 소프트맥스 함수의 결합은 데이터에서 추출된 패턴을 기반으로 확률을 해석해석하는 데사용되기 때문입니다. 

 

 

1) 조건부확률 P(y|x)

 

조건부확률 P(y|x)입력변수 x에 대해 정답이 y일 확률을 의미합니다.

(연속확률분포의 경우 P(y|X)는 확률이 아니고 밀도로 해석합니다.)

 

데이터 x로부터 추출된 특징패턴 ϕ(x)가중치행렬 W을 통해 조건부확률 P(y|x)를 계산하는 과정이 바로 분류문제의 softmax(Wϕ+b)를 계산하는 과정입니다.

(P(y|x)P(y|ϕ(x))라 표기해도 됩니다.)

(여기서 데이터 x가 아닌 ϕ(x)라고 표기한 이유는 softmax가 출력층 부분에 존재하므로 데이터X들은 이미 여러 hidden layer을 통과하여 특징패턴이 생성되었기 때문입니다.)

(딥러닝은 다층신경망을 사용하여 데이터로부터 특징패턴 ϕ을 추출합니다.)

 

 

2) 조건부기대값 E(y|x)

 

조건부기대값 E(y|x)회귀문제에서 추정을 할 때 사용합니다.

회귀 문제에서 조건부기대값은 적분으로 되어있는데 y가 연속한 경우를 다루기 때문입니다.


그렇다면 왜 회귀문제에서 기대값을 사용할까요?

 

회귀문제를 사용할 때 E||yf(x)||2 즉, L2-노름을 사용하는데 조건부기대값은 L2-노름을 최소화하는 함수f(x)와 일치합니다. 이 부분은 수학적으로 증명이 되어있습니다.

 

또한, 기대값을 이용하면 분산, 공분산 등 여러 통계량을 계산할 수 있습니다.


하지만 만약 관찰되는 데이터가 로버스트(robust:이상치/에러값으로부터 영향을 크게 받지 않는)하게 예측을 하지 못하면 조건부기대값보다는 중앙값(median)을 사용해서 추정해야 합니다.

 

 

4️⃣ 몬테카를로 샘플링

 

몬테카를로(Monte Carlo)는 확률론에서 많이 사용되는 고유명사입니다. 

값(데이터)이 너무 많거나 분포가 명확하지 않을 경우 많이 사용됩니다.

 

몬테카를로 샘플링도 기계학습에서 많은 문제들이 확률분포를 명시적으로 모를 때가 많기 때문에 사용됩니다.

확률분포를 모를 때 데이터를 이용하여 기대값을 계산하려면 몬테카를로 샘플링 방법을 사용해야 합니다.

(몬테카를로는 이상형이든 연속형이든 상관없이 성립합니다.)

즉, 몬테카를로 샘플링은 함수f(x)에서 수많은 데이터를 계속 더한 후 개수로 나눠 f(x)의 평균에 근사 시키는 방법입니다. 이 방법은 함수f(x)를 모르기 때문에 데이터만 사용해서 f(x) 평균에 가까워지는 방법입니다.

 

예시로, f(x)=ex2의 [-1, 1] 상에서 적분값을 구하는 방법을 알아봅시다.

f(x)=ex2의 적분을 해석적으로 구하는 것은 불가능하기 때문에 몬테카를로 샘플링을 사용할 것입니다.

구간 [-1,1]의 길이는 2이므로 적분값을 2로 나누면 기대값을 계산하는 것과 같으므로 몬테카를로 방법을 사용할 수 있습니다. (적분값에서 2로 나누면 "기대값=평균"이 나옴)

(아래그림처럼 빨간선이 f(x)의 평균이기 때문에 평균값 위로 나온 적분값을 x×f(x)의 사격형 남은 부분을 채웠다고 생각하면 편합니다. 여기서 X를 나눠주면 f(x)의 평균값(기대값)만 나오게 됩니다.)

기대값 계산

따라서 적분값을 구하기 위해서는 2를 넘겨줍니다.

적분값 계산

Python 코드로 구현하면 아래와 같습니다.

import numpy as np


def f_x(x):

    return np.exp(-x**2)
    

def mc_int(fun, low, high, sample_size=100, repeat=10):

    int_len = np.abs(high-low)
    
    stat= []
    
    for _ in range(repeat):
    
        x = np.random.uniform(low=low, high=high, size=sample_size)
        
        fun_x = fun(x)
        
        int_val = int_len * np.mean(fun_x)			# np.mean(fun_x)가 이미 기대값(평균) 의미
        
        stat.append(int_val)					# 2 * 몬테카를로 값을 list에 넣는다.
        
    return np.mean(stat), np.std(stat)
>>> print(mc_int(f_x, low=-1, high=1, sample_size=10000, repeat=100))

(1.4932777925360639, 0.004060504216166873)

값은 1.49327±0.0039 이므로 오차 범위 안에 참값이 있습니다.

Comments