걸프 스터디라고 써봤어①

9178 단어 걸프 학습Python

개시하다


최근 학습의 주요 내용은 신경 네트워크다.
NLP의 최근 논문도 신경 네트워크를 통해 쓴 것이 많다.
따라서 신경 네트워크의 프로그램 라이브러리 사용 방법 등을 배울 필요가 있지만
요즘은 신경망뿐만 아니라 시야를 좀 더 넓히고 싶어요.
(신경망의 다양한 모델들의 능력과 끈기를 이해하지 못한 경우도 있지만...)
그때는'화제 모델의 통계적 잠재적 의미 분석'을 읽고 베이즈 공부에 관심을 가졌다.
나는 좀 더 배우고 싶어서'베스 추론에 기초한 기계 학습 입문'을 읽기 시작했다.
비록 나는 아직 문외한이지만 읽은 내용을 출력하고 싶어서 코드를 썼다.
이번에는 가장 먼저 등장한'버누이 분포의 베스 학습'에 관한 것이다.
계산 후 분포를 분석할 수 있기 때문에 비교적 간단하게 썼다.

하고 싶은 일


베이스 학습의 목표는 사후 분포를 얻기 위해 모델을 구축하는 것이다.
우선, 관련 파라미터의 사전 분포와 학습 데이터를 준비한다.
그리고 학습 데이터와 파라미터의 후분포를 계산한다.
공식으로 다음과 같이 표시한다.(베이스정리)
\begin{align}
p(\theta|X)&=\frac{p(X|\theta)p(\theta)}{p(X)}\\
&\propto p(X|\theta)p(\theta)
\end{align}
매개변수의 사전 분포는 $p(\theta)$입니다.

베누리 분포


2치를 생성하는 확률 분포.
동전을 넣을 때 안팎의 확률 분포 따위.
베누리의 분포는 다음과 같다.
Bern(x|\mu)=\mu^x(1-\mu)^{1-x}
△$x\in[0,1],\mu달러는 매개 변수
실제로 대부분의 경우 대수 변환 후의 아래 공식으로 계산된다.
\ln Bern(x|\mu)=x\ln\mu+(1-x)\ln(1-\mu)
python에서 프로그램 라이브러리scipy를 사용하면 간단하게 제작할 수 있다.
from scipy.stats import bernoulli
print bernoulli.rvs(0.3, size=10)
# [0 0 0 0 1 0 0 0 1 1]

베타 분포


이것은 벨누이 분포의 멍에 예분포다.
위의 $\mu 분포입니다.
Beta(\mu|a,b)=C_B(a,b)\mu^{a-1}(1-\mu)^{b-1}\\
* C_B=\frac{\Gamma(a+b)}{\Gamma(a)+\Gamma(b)}
매개 변수는 $a, b$2입니다.
이것들을 슈퍼 파라미터라고 하는데 이번에는 사전에 설정할 것이다.
베타 분포에 대해 대수 변환을 한 후 다음과 같은 공식을 얻는다.
\ln Beta(\mu|a,b)=(a-1)\ln \mu + (b-1)\ln(1-\mu)+\ln C_B(a,b)
베타 분포도 scipy로 간단하게 제작할 수 있다.
import numpy as np
from scipy.stats import beta
from matplotlib import pyplot as plt

x = np.linspace(0, 1, 1000)
params = [[1, 1], [3, 3], [6, 6], [8, 4], [3, 7]]
for param in params:
    alpha_, beta_ = param[0], param[1]
    rv = beta(alpha_, beta_)
    y = rv.pdf(x)
    plt.plot(x, y, '-', lw=2, label=param)
    plt.legend()
plt.show()

매개 변수는 $a, b$를 바꾸면 분포에 큰 변화가 있음을 알 수 있다.
베타 분포의 공식을 보면 $a$$$$$\mu, $b$$$$(1-\mu)가 어깨에 걸려 있다.
이것은 베누리가 분포하는 공식과 같은 형상이다.
이로써 알 수 있듯이 $a는 $x=1달러, $b는 $x=0달러에 영향을 주는 매개 변수이다.
만약 $a=1, b=1달러라면 분포가 일치합니다($당 -1달러).
만약 $a=3, b=3달러라면 $P=0.5달러가 최고치로 분포된다.
달러×달러가 어느 값을 얻느냐에 있어서 편차가 없다는 것이다.
만약 $a=3, b=7달러라면 $P=0.3달러가 최고치입니다.
이런 상황에서 벨누이 시험은 $x=0$의 매개 변수 분포가 쉽게 나타난다.
이번에는 베타 분포의 매개 변수인 $a, b$$$$a를 바꾸면서 분포를 관찰할 것입니다.

도형 모형


노드와 화살표를 사용하여 확률 분포 파라미터의 관계를 나타내는 방법.
이번에 심플한 모델인데 처음이라 써봤어요.

데이터 발생과 관련된 매개 변수는 $\mu달러이고 $\mu달러와 관련된 매개 변수는 $a, b$입니다.($a, b$를 미리 주면 도형 모형에 설명하지 않아도 됩니다.)

후분포 계산


다음 공식으로 계산할 수 있다.
\begin{align}
p(\mu|X)&=\frac{p(X|\mu)p(\mu)}{p(X)}\\
&=\frac{\{\prod_{n=1}^Np(x_n|\mu)\}p(\mu)}{p(X)}\\
&\propto \{\prod_{n=1}^Np(x_n|\mu)\}p(\mu)
\end{align}
위의 공식 대수를 변환하여 계산하다.
\begin{align}
\ln p(\mu|X)&=\sum_{n=1}^N\ln p(x_n|\mu)+\ln p(\mu)+const.\\
&=\sum_{n=1}^Nx_n\ln \mu + \sum_{n=1}^N(1-x_n)\ln(1-\mu)\\
&+(a-1)\ln\mu+(b-1)\ln(1-\mu)+const.\\
&=(\sum_{n=1}^Nx_n+a-1)\ln\mu+(N-\sum_{n=1}^Nx_n+b-1)\ln(1-\mu)+const.
\end{align}
※ 이 계산은 바로'베스 추론에 기초한 기계 학습 입문'이다.
계산 결과는 베타 분포의 대수 변환 공식과 비슷하다.
\hat {a}=\sum_{n=1}^Nx_n+a\\
\hat {b}=N-\sum_{n=1}^Nx_n+b
먼 곳
p(\mu|X)=Beta(\mu|\hat{a},\hat{b})
이런 베타 분포는 후험 분포를 나타낼 수 있다.
그럼, 이걸 실제로 계산하는 프로그램을 써볼게요.

써봤어요.


예분포와 관측 데이터를 제시할 때의 분포 상황을 살펴봅시다.
관측 데이터가 5200달러로 증가했으니, 우리는 이후의 분포 변화를 계속 관찰할 것이다.
학습 부분은 다음과 같은 느낌입니다.
X = bernoulli.rvs(p, size=N)  # 観測データの作成
xn = len(np.where(X == 1)[0])  # x=1の数
alpha_ = xn + alpha_
beta_ = N - xn + beta_
rv = beta(alpha_, beta_)
관측 데이터와 미리 분포된 초인자 $a, b$에서 분포된 베타 분포의 $\hat{a},\hat{b}달러를 계산합니다.
마지막 줄 인자 $\hat{a},\hat{b} 달러의 분포를 구합니다.
이것은 이번 사후 분포에 대응한다.
학습 결과는 다음과 같다.(이번에는 $p=0.3달러로 관측 데이터를 만들었다.)

첫 번째 줄은 관측 데이터가 전혀 없는 상황이다.이 경우 사전 분포 = 후 분포.
두 번째 줄부터 관측 데이터에 따라 예비 분포를 갱신한다.
$N=5달러라면 데이터 수가 적기 때문에 미리 분포된 초파라미터의 영향이 상당히 크다. $N=200달러라면 미리 분포된 초파라미터가 어떻든 똑같은 분포이다.
이 후 분포는 데이터의 생성을 관측할 때의 매개 변수인 $p=0.3달러라는 정보는 직접적으로 알 수 없지만 대체적으로 $p=0.3달러 부근을 최고치로 하는 분포임을 알 수 있다.
이는 관측 데이터의 특징에 따라 사후 분포를 배운다고 할 수 있다.

끝맺다


이번에 나는 베이스의 공부를 복습하기 위해 간단한 모형을 하나 썼다.
MCMC 등을 활용하는 게 더 빠를 수도 있지만, 기초를 잘 다지고 싶다.
※ 전체 코드는 여기.에 배치됩니다.

좋은 웹페이지 즐겨찾기