목차
Norms
비공식적으로 벡터의 노름은 벡터의 크기를 알려줍니다. 여기에서 고려되는 크기의 개념은 차원이 아니라 구성요소의 크기와 관련이 있습니다. 선형 대수학에서 벡터 노름은 벡터를 스칼라에 매핑하여 일단의 속성을 만족시키는 함수 f입니다.
임의의 벡터 x가 주어지면 첫 번째 속성은 벡터의 모든 요소를 상수 인자 α로 스케일링하면 그 노름도 동일한 상수 인자의 절대값으로 스케일링된다는 것을 나타냅니다.
$$f(\alpha x) = |\alpha|f(x)$$두 번째 속성은 친숙한 삼각형 부등식입니다.
$$f(x+y) \lt f(x)+f(y) $$세 번째 속성은 norm은 음이 아니어야 합니다.
$$\Vert x \Vert_2 = \sqrt{\sum^n_{i=1} x^2_i}$$ 위 식에서 아래첨자 2는 L2 norm을 의미하며 생략하여 나타내기도 합니다. 즉, $\Vert x \Vert_2$는 $\Vert x \Vert$와 같습니다.
import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch
u=torch.tensor([3.0, -4.0]) L2=torch.norm(u) L2
tensor(5.)또한 벡터 요소의 절대값의 합으로 표현되는 L1 규범도 자주 사용합니다. $$\Vert x \Vert_1 = \sum^n_{i=1}\vert x_i \vert$$ L2 norm에 비해 이상치(outlier)에 덜 민감합니다.
L1=torch.abs(u).sum() L1
tensor(7.)L2와 L1은 일반화된 Lp norm의 특별한 형태입니다. $$\Vert x \Vert_p=\left(\sum^n_{i=1} \vert x_i \vert^p \right)^{1/p}$$ 벡터에 대한 L2 norm을 행렬 X ∈ ℝm × n에 확장한 경우는 다음과 같이 계산되며 Frobenius norm이라고 합니다.
$$\Vert x \Vert_F=\sqrt{\sum^m_{i=1}\sum^n_{j=1} x^2_{ij}}$$ Frobenius 노름은 벡터 노름의 모든 속성을 만족합니다. 행렬 모양 벡터의 L2 노름인 것처럼 동작합니다. 다음 함수를 호출하면 행렬의 Frobenius 노름이 계산됩니다.
x=torch.ones((4,9)) x
tensor([[1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1.]])
torch.norm(x)
tensor(6.)
torch.sqrt((x**2).sum())
tensor(6.)딥 러닝에서 우리는 종종 최적화 문제를 해결하려고 시도합니다. 즉, 예측과 실제 관찰 사이의 거리를 최소화합니다. 이것은 관찰된 데이터에 할당된 확률을 최대화한다는 것을 의미합니다. 유사한 항목 간의 거리는 최소화하고 유사하지 않은 항목 간의 거리는 최대화되도록 항목(예: 단어, 제품 또는 뉴스 기사)에 벡터 표현을 할당합니다. 종종 목표(데이터 외에) 딥 러닝 알고리즘의 가장 중요한 구성 요소는 norm으로 표현됩니다.
Autograd(자동미분)
x=torch.arange(4.0) x
tensor([0., 1., 2., 3.])
x.requires_grad_(True) # = torch.arange(4.0, requires_grad=True)
x.grad # The default value is None
y=2*torch.dot(x, x) y
tensor(28., grad_fn=> MulBackward0 <)x는 길이가 4인 벡터이므로 x와 x의 내적이 수행되어 y에 할당하는 스칼라 출력이 생성됩니다. 다음으로, 역전파를 위한 함수를 호출하고 그래디언트를 인쇄하여 x의 각 구성 요소에 대한 y의 그래디언트를 자동으로 계산할 수 있습니다. $$\begin{align}y&=2x^2\\ \frac{dy}{dx}&=4x \end{align}$$
y.backward() x.grad
tensor([ 0., 4., 8., 12.])
x.grad==4*x
tensor([True, True, True, True])위 결과인 x에 대한 y의 그래디언트 즉, x.grad는 축적됩니다. 다른 연산에 의한 x.grad를 계산하기 위해서는 이 축적된 값들을 0으로 만들어야 합니다. .grad.zero_()를 사용합니다.
x.grad.zero_() x.grad
tensor([0., 0., 0., 0.])
y=x.sum() y
tensor(6., grad_fn=>SumBackward0<)$$\begin{align}y&=\sum^3_{i=0} x_i\\ \frac{dy}{dx}&=1 \end{align}$$
y.backward() x.grad
tensor([1., 1., 1., 1.])
x.grad.zero_() y=x*x y
tensor([0., 1., 4., 9.], grad_fn=>MulBackward0<)위 y는 벡터로서 non-scalar입니다. 이에 대한 기울기를 계산하기 위해서는 스칼라로 전환해야 하며 y의 모든 값들의 합을 적용합니다.
y.sum().backward() x.grad
tensor([0., 2., 4., 6.])
x
tensor([0., 1., 2., 3.], requires_grad=True)
x.grad.zero_() y=x*x y
tensor([0., 1., 4., 9.], grad_fn=)
z=y*x z.sum().backward() x.grad
tensor([ 0., 3., 12., 27.])위의 계산과정은 x → y → z의 순서로 이루어집니다. 이 과정에서 z에 대한 x의 미분 결과는 다음과 같습니다. $$\begin{align}z&=y \cdot x=x^2 \cdot x=x^3\\ \frac{dz}{dx}&=3x^3 \end{align}$$ 그러므로 중간 계산인 y 역시 x에 관계된 변수로 취급됩니다. 이 과정에서 y를 상수로 취급하려고 할 경우
.detach()
메소드를 사용합니다. 다음은 객체 y에 대한 변화도를 고려하지 않기 위해 y.detach()를 사용하여 계산한 것으로 이후 진행된 z의 미분 결과에서 y는 상수로 작용한 것을 알 수 있습니다.
위의 계산과정은 x → y → z의 순서로 이루어집니다. 이 과정에서 z에 대한 x의 미분 결과는 다음과 같습니다. $$\begin{align}z&=y \cdot x=x^2 \cdot x=x^3\\ \frac{dz}{dx}&=3x^3 \end{align}$$ 그러므로 중간 계산인 y 역시 x에 관계된 변수로 취급됩니다. 이 과정에서 y를 상수로 취급하려고 할 경우 ``.detach()`` 메소드를 사용합니다. 다음은 객체 y에 대한 변화도를 고려하지 않기 위해 y.detach()를 사용하여 계산한 것으로 이후 진행된 z의 미분 결과에서 y는 상수로 작용한 것을 알 수 있습니다.
x.grad.zero_() y=x*x u=y.detach() z=u*x z.sum().backward() x.grad
tensor([0., 1., 4., 9.])
x.grad==u
tensor([True, True, True, True])위의 과정에서 z에 사용된 것은 y의 결과인 값이므로 y 자체에 대한 미분을 시행할 수 있습니다. $$\begin{align}y &=x^2\\ \frac{dy}{dx}&=2x \end{align}$$
x.grad.zero_() y.sum().backward() x.grad tensor([0., 2., 4., 6.]) 2*x
tensor([0., 2., 4., 6.], grad_fn=>MulBackward0<)이와같이 자동미분에 의해 최초 변수에 대한 계산의 흐름의 복잡도(반복문, 조건문등과 연계되어 매우 복잡한 연산흐름)와 관계없이 그 결과의 그래디언트를 계산할 수 있습니다.
Probability
어떤 형태로든 머신 러닝은 예측을 하는 것입니다. 환자의 임상 병력을 고려하여 내년에 심장마비를 앓을 확률을 예측할 수 있습니다. 이상 탐지에서 비행기의 제트 엔진이 정상적으로 작동할 경우 측정값이 얼마나 나올지 평가할 수 있습니다. 강화 학습에서 우리는 에이전트가 환경에서 지능적으로 행동하기를 원합니다. 즉, 사용 가능한 각 작업에서 높은 보상을 받을 확률에 대해 생각해야 합니다. 그리고 추천 시스템을 구축할 때 확률에 대해서도 생각해야 합니다. 예를 들어, 우리가 대규모 온라인 서점에서 일했다고 가정해 보겠습니다. 특정 사용자가 특정 책을 구매할 확률을 추정할 수 있습니다. 이를 위해 우리는 확률의 언어를 사용할 필요가 있습니다. 전체 과정, 전공, 논문, 경력, 심지어 부서까지 확률에 전념합니다.
160×160 픽셀의 해상도의 이미지에서 사람이 고양이와 개를 인식하기 쉽지만 40×40 픽셀에서는 어렵고 10×10 픽셀에서는 불가능에 가깝다. 다시 말해, 먼 거리에서(따라서 저해상도) 고양이와 개를 구별하는 우리의 능력은 정보가 없는 추측에 접근할 수 있습니다. 확률은 우리의 확실성 수준에 대해 형식적인 추론 방법을 제공합니다. 이미지가 고양이를 묘사하고 있다고 완전히 확신하는 경우 해당 레이블 y가 "cat"이고 P(y = "cat")로 표시될 확률이 1이라고 말합니다. y = " cat" 또는 y = "dog"인 경우 두 가지 가능성이 이를 P(y = "cat") = P(y = "dog") = 0.5로 표현했을 가능성이 동등하다고 말할 수 있습니다. 합리적으로 확신하지만 이미지에 고양이가 있는지 확실하지 않은 경우 확률 0.5 <P(y = "cat") <1을 할당할 수 있습니다.
이제 두 번째 경우를 고려하십시오. 일부 날씨 모니터링 데이터가 주어지면 내일 타이페이에 비가 올 확률을 예측하려고 합니다. 여름이면 비가 올 확률이 0.5입니다.
두 경우 모두 관심 가치가 있습니다. 그리고 두 경우 모두 결과에 대해 불확실합니다. 그러나 두 경우에는 중요한 차이점이 있습니다. 이 첫 번째 경우 이미지는 실제로 개인지 고양이인지 알 수 없습니다. 두 번째 경우에, 당신이 그러한 것들을 믿는다면 결과는 실제로 무작위 사건일 수 있습니다. 따라서 확률은 우리의 확실성 수준에 대한 추론을 위한 유연한 언어이며 광범위한 맥락에서 효과적으로 적용될 수 있습니다.
주사위를 던져서 다른 숫자가 아닌 1이 나올 확률을 알고 싶다고 가정해 봅시다. 주사위가 공정하면 6가지 결과가 모두 {1, …, 6}이 발생할 가능성은 동일하므로 6개 중 1개에서 1이 표시됩니다. 공식적으로 우리는 1이 1/6의 확률로 발생한다고 말합니다. 그럼 주사위의 공정성 여부를 어떻게 알 수 있을까요? 이러한 조사의 자연스러운 하나의 방법은 주사위 던지기를 실행하여 각각의 수의 발생수를 전체 시행수로 나누어 비율을 조사하는 것입니다. 이 결과는 주어진 사건(event)에 대한 확률의 추정을 제시합니다.
큰 수의 법칙(The law of large numbers)에 따르면 던지기 횟수가 늘어남에 따라 이 추정치는 실제 기본 확률에 점점 더 가까워집니다. 실행을 위해 다음 함수를 적용할 수 있습니다.
Multinomial(total_count=1, probs=None, logits=None, validate_args=None)
위 함수는 지정한 확률(prob)에 따라 각 시행횟수(total_count)에 대응하는 다중정규분포를 반환합니다.
from torch.distributions import multinomial fairProb=torch.ones([6])/6 multinomial.Multinomial(1, fairProb).sample()
tensor([0., 1., 0., 0., 0., 0.])샘플러를 여러 번 실행하면 매번 임의의 값이 나오는 것을 알 수 있습니다. 주사위의 공정성을 추정할 때와 마찬가지로 우리는 종종 동일한 분포에서 많은 샘플을 생성하기를 원합니다. Python for 루프로 이 작업을 수행하는 것은 참을 수 없을 정도로 느릴 것이므로 우리가 사용하는 함수는 한 번에 여러 샘플을 그리는 것을 지원하고 원하는 모양의 독립 샘플 배열을 반환합니다.
multinomial.Multinomial(10, fairProb).sample()
tensor([2., 2., 0., 1., 2., 3.])위의 결과는 10번을 시행할 경우 지정한 확률에 따라 무작위로 반환되는 빈도수를 나타냅니다. 즉, 주사위의 각 눈 {1, 2, 3, 4, 5, 6}이 나타날 확률은 각 1/6이고 이에 대응하여 10번을 시행할 경우 위의 결과는 각 눈이 1부터 2, 3, 0, 1, 2, 3번이 나타남을 의미합니다. 각 빈도수를 전체 시행수로 나눈다면 각 눈의 확률이 될 것입니다. 그러면 1000번을 시행할 경우 확률은 다음과 같습니다.
count=multinomial.Multinomial(1000, fairProb).sample() prob=count/1000 prob
tensor([0.1570, 0.1700, 0.1930, 0.1630, 0.1550, 0.1620])공정한 주사위의 경우 각 눈에 대한 확률은 $\displaystyle \frac{1}{6} \approx 0.1666 $이 됩니다. 시행횟수를 증가시키면 이 값에 더욱 근접할 것입니다.
count=multinomial.Multinomial(100000, fairProb).sample() prob=count/100000 prob
tensor([0.1658, 0.1656, 0.1656, 0.1681, 0.1683, 0.1666])
re=torch.FloatTensor() rng=range(1, 10001) for i in rng: re1=multinomial.Multinomial(i, fairProb).sample() re1=re1.view(-1, 6)/i re=torch.cat((re, re1)) re.size()
torch.Size([10000, 6])
plt.figure(figsize=(10, 5)) for i in range(6): plt.plot(rng, re[:, i], label=f"P({i})") plt.axhline(y=1/6, linestyle="dashed",label=r"$\frac{1}{6}$") plt.legend(loc="best") plt.xlabel("# of trials") plt.ylabel("Probability") plt.show()
확률실험에서 모든 결과 집합을 표본공간(S)이라고 하며 주사위의 경우 S={1,2,3,4,5,6}이 됩니다. 사건(event)은 주어진 표본공간에서의 어떤 대상의 결과 집합입니다. 예를들어 5인 이벤트는 {5}이며 홀수 이벤트는 {1, 3, 5}가 됩니다. 공식적으로 **확률은 집합을 실제 값에 매핑하는 함수**로 생각할 수 있습니다. 주어진 표본 공간 S에서 사건 A의 확률은 P(A)로 표시되며 다음 속성을 충족합니다.
- 어떤 사건 A의 확률은 음수가 아닙니다. P(A) ≥ 0
- 모든 표본공간의 확률은 1입니다. P(S) = 1
- 사건들 A1, A2, …, An이 독립(mutually exclusive)이라면 (i ≠ j → Ai ∩ Aj = ∅) 그 모든 사건들의 확률은 각 사건의 확률 합과 같습니다. $$P(\cup^\infty_{i=1} A_i)=\sum^\infty_{i=1}P(A_i)$$
Random Variables(확률변수)
확률변수는 거의 모든 양(quantity)이 될 수 있으며 결정적이지 않습니다. 무작위 실험에서 가능성 집합 중 하나의 값을 취할 수 있습니다. 주사위 던지기 실험에서 표본공간은 {1,2,3,4,5,6}에서 사건 x는 그 공간 내의 어떤 값(들)이 될 수 있습니다. 그 값들의 확률은 P(x)로 표시합니다. 확률이론에서 사건은 표본 공간의 결과 집합이므로 무작위 변수가 취할 값의 범위를 지정할 수 있습니다.
- 결합확률: P(A=a, B=b)
- 조건부확률: P(B=b | A=a) 즉, 사건 A중에 B의 확률
- Bayes' Theorem
- 조건부 확률의 정의를 사용하여 베이즈 이론을 유도 할 수 있습니다.
- $\displaystyle P(A|B)=\frac{P(B|A)P(A)}{P(B)}$
댓글
댓글 쓰기