Blitz는 Pytorch에서 Bayesian Neural Network Layers (신경망 종이의 중량 불확실성에 제안 된 내용에 따라)를 만들기위한 간단하고 확장 가능한 라이브러리입니다. Blitz 레이어 및 Utils를 사용하면 표준 Pytorch를 사용하는 것처럼 레이어 간의 상호 작용에 영향을 미치지 않는 간단한 방식으로 불제성을 추가하고 모델의 복잡성 비용을 수집 할 수 있습니다.
핵심 웨이트 샘플러 클래스를 사용하면이 라이브러리를 확장하고 개선하여 Pytorch Way에 잘 통합 된 것처럼 더 큰 층에 uncertanity를 추가 할 수 있습니다. 또한 풀 요청을 환영합니다.
Blitz를 설치하려면 PIP 명령을 사용할 수 있습니다.
pip install blitz-bayesian-pytorch
또는 콘다를 통해 :
conda install -c conda-forge blitz-bayesian-pytorch
당신은 또한 git-clone it를 현지에서 설치할 수 있습니다.
conda create -n blitz python=3.9
conda activate blitz
git clone https://github.com/piEsposito/blitz-bayesian-deep-learning.git
cd blitz-bayesian-deep-learning
pip install .
우리의 계층, 무게 (및 사전 분포) 샘플러 및 Utils에 대한 문서 :
(이 예제를 컴퓨터에서 실행하여 자신을 위해 볼 수 있습니다).
우리는 이제 베이지안 딥 러닝을 어떻게 회귀에 사용될 수 있는지 보게 될 것입니다. 회귀 분석에 대한 신뢰 구간을 수집하는 연속 값 예측보다는 신뢰 구간을 수집 할 수 있습니다. 예측에 대한 신뢰 구간을 수집하는 것은 낮은 오류 추정보다 더 유용한 정보 일 수 있습니다.
나는 신뢰 구간이 양호한/높은 prob의 신뢰 구간으로 일부 상황에 대한 근위 추정보다 더 신뢰할 수있는 결정을 내릴 수 있다는 사실에 대한 나의 논쟁을 유지합니다. 예를 들어, 거래 운영에서 이익을 얻으려고 노력하는 경우, 예를 들어, 좋은 신뢰 구간을 갖는 것이 적어도 작전이 X를 결정하는 것보다 (또는 더 높은) 운영이 더 낮은지 (또는 더 높을 것인지)를 알 수 있습니다.
결정 간격으로 값이 반드시 (또는 좋은 확률을 가진)인지 아는 것은 합리적인 결정을 내리는 사람들이 한계 값보다 낮거나 높으면 트랜잭션에서 손실을 유발할 수있는 매우 근위 추정보다 합리적인 결정보다 더 많은 도움이 될 수 있습니다. 요점은 때로는 이익이 있는지 아는 것이 이익을 측정하는 것보다 더 유용 할 수 있다는 것입니다.
이를 입증하기 위해, 우리는 Boston-House-Data 장난감 데이터 세트를위한 베이지안 신경망 회귀자를 만들어 우리가 예측하려는 가격의 주택에 대한 신뢰 구간 (CI)을 만들려고 노력할 것입니다. 우리는 약간의 스케일링을 수행하고 CI는 약 75%가 될 것입니다. 예측 된 CI의 약 90%가 높은 한도보다 낮거나 (포함) 더 낮은 것보다 높다는 것을 알게 된 것은 흥미로울 것입니다.
알려진 모듈에도 불구하고, 우리는 Blitz a the variational_estimator 데코레이터에서 가져올 것입니다. 이는 모듈의 베이지안 선형 레이어를 나머지 횃불과 완전히 통합하고 물론 BayesianLinear 유지하는 데 도움이됩니다.
import torch
import torch . nn as nn
import torch . nn . functional as F
import torch . optim as optim
import numpy as np
from blitz . modules import BayesianLinear
from blitz . utils import variational_estimator
from sklearn . datasets import load_boston
from sklearn . preprocessing import StandardScaler
from sklearn . model_selection import train_test_split 태양 아래에서 새로운 것은 없으며, 우리는 훈련에 도움이되는 데이터를 수입하고 표준 스케일링하고 있습니다.
X , y = load_boston ( return_X_y = True )
X = StandardScaler (). fit_transform ( X )
y = StandardScaler (). fit_transform ( np . expand_dims ( y , - 1 ))
X_train , X_test , y_train , y_test = train_test_split ( X ,
y ,
test_size = .25 ,
random_state = 42 )
X_train , y_train = torch . tensor ( X_train ). float (), torch . tensor ( y_train ). float ()
X_test , y_test = torch . tensor ( X_test ). float (), torch . tensor ( y_test ). float ()우리는 Torch 네트워크와 마찬가지로 NN.Module의 억제로 수업을 만들 수 있습니다. 우리의 데코레이터는 베이지안 층의 복잡성 비용을 계산하고 손실을 샘플링하기 위해 많은 피드 포워드 (각각의 다른 가중치 샘플링)를 수행하는 데있어 베이지안 기능을 처리하는 방법을 소개합니다.
@ variational_estimator
class BayesianRegressor ( nn . Module ):
def __init__ ( self , input_dim , output_dim ):
super (). __init__ ()
#self.linear = nn.Linear(input_dim, output_dim)
self . blinear1 = BayesianLinear ( input_dim , 512 )
self . blinear2 = BayesianLinear ( 512 , output_dim )
def forward ( self , x ):
x_ = self . blinear1 ( x )
x_ = F . relu ( x_ )
return self . blinear2 ( x_ )이 기능은 레이블 값을 샘플링하려는 배치에 대한 각 예측에 대한 신뢰 구간을 만듭니다. 그런 다음 Predicton 분포 중 얼마나 많은 양이 데이터 포인트에 대한 올바른 레이블을 포함했는지를 찾아 예측의 정확도를 측정 할 수 있습니다.
def evaluate_regression ( regressor ,
X ,
y ,
samples = 100 ,
std_multiplier = 2 ):
preds = [ regressor ( X ) for i in range ( samples )]
preds = torch . stack ( preds )
means = preds . mean ( axis = 0 )
stds = preds . std ( axis = 0 )
ci_upper = means + ( std_multiplier * stds )
ci_lower = means - ( std_multiplier * stds )
ic_acc = ( ci_lower <= y ) * ( ci_upper >= y )
ic_acc = ic_acc . float (). mean ()
return ic_acc , ( ci_upper >= y ). float (). mean (), ( ci_lower <= y ). float (). mean () 여기서 우리는 다른 신경망과 마찬가지로 BayesianRegressor 시안 회의를 만듭니다.
regressor = BayesianRegressor ( 13 , 1 )
optimizer = optim . Adam ( regressor . parameters (), lr = 0.01 )
criterion = torch . nn . MSELoss ()
ds_train = torch . utils . data . TensorDataset ( X_train , y_train )
dataloader_train = torch . utils . data . DataLoader ( ds_train , batch_size = 16 , shuffle = True )
ds_test = torch . utils . data . TensorDataset ( X_test , y_test )
dataloader_test = torch . utils . data . DataLoader ( ds_test , batch_size = 16 , shuffle = True )우리는 Sample_elbo 방법에 의해 손실을 샘플링하여 일반적인 토치 훈련과는 다른 훈련 루프를 수행합니다. Blitz와의 목적은 문제없이 다른 베이지안 NN을 사용하여 데이터를 반복하는 데있어 삶을 편안하게하는 것이므로 다른 모든 작업은 정상적으로 수행 될 수 있습니다.
다음은 매우 간단한 교육 루프입니다.
iteration = 0
for epoch in range ( 100 ):
for i , ( datapoints , labels ) in enumerate ( dataloader_train ):
optimizer . zero_grad ()
loss = regressor . sample_elbo ( inputs = datapoints ,
labels = labels ,
criterion = criterion ,
sample_nbr = 3 )
loss . backward ()
optimizer . step ()
iteration += 1
if iteration % 100 == 0 :
ic_acc , under_ci_upper , over_ci_lower = evaluate_regression ( regressor ,
X_test ,
y_test ,
samples = 25 ,
std_multiplier = 3 )
print ( "CI acc: {:.2f}, CI upper acc: {:.2f}, CI lower acc: {:.2f}" . format ( ic_acc , under_ci_upper , over_ci_lower ))
print ( "Loss: {:.4f}" . format ( loss ))베이지안 신경망에서 불확실성이 어떻게 도입되는지에 대한 매우 빠른 설명과 예측에 대한 신뢰를 객관적으로 개선하고 탈락없이 분산을 줄이기 위해 손실을 모델링하는 방법.
우리가 알고 있듯이, 결정 론적 (베이지안이 아닌) 신경망 층에서, 훈련 가능한 매개 변수는 이전의 선형 변환에 사용 된 가중치 (또는 경우 입력)에 직접 해당합니다. 다음 방정식에 해당합니다.
(z 층의 활성화 된 출력에 해당합니다.)
베이지안 계층은 각 피드 포워드 작업에서 훈련 가능한 변수에 의해 매개 변수로 구성된 분포에서 샘플링하여 가중치에 대한 불확실성을 도입하려고합니다.
이를 통해 모델의 성능 메트릭을 최적화 할뿐만 아니라 특정 데이터 포인트에 대한 네트워크 예측의 불확실성을 수집 할 수 있으며 (많은 시간을 샘플링하고 분산을 측정함으로써) 예측에 대한 네트워크의 분산을 최대한 줄여서 특정 데이터 포인트 기능을 모델링하려고 할 경우 여전히 레이블에 대해 얼마나 많은 확고한 방법을 알 수 있습니다.
이를 위해, 각 피드 포워드 작업에서 우리는 다음 방정식으로 선형 변환의 매개 변수를 샘플링합니다 (여기서 ρ는 표준 편차를 매개 변수로 매개 변수하고 샘플 선형 변환 파라미터의 평균을 매개 변수).
무게 :
여기서 샘플링 된 w는 Nth 샘플의 ITH 층에 대한 선형 변환에 사용 된 가중치에 해당한다.
편견을 위해 :
여기서 샘플링 된 B는 N 번째 샘플의 ITH 층에 대한 선형 변환에 사용 된 바이어스에 해당한다.
힘든 가중치와 바이어스에 대한 임의의 승수를 가지고 있어도 샘플링 된 가중치 및 훈련 가능한 매개 변수 (우리의 경우 손실)의 차별화 가능한 기능을 감안할 때이를 최적화 할 수 있습니다.
그러므로:
그리고
크로스 엔트로피 손실 (및 MSE)은 차별적 인 것으로 알려져 있습니다. 따라서 차별화 가능한 복잡성 비용 함수가 있음을 증명하면 프레임 워크에이를 파생 상품을 가져 와서 최적화 단계에서 그라디언트를 계산할 수 있습니다.
복잡성 비용은 피드 포워드 작동에서 각각 베이지안 층에 의해 계산됩니다 (층의 사전 정의 된-단순한 apriori 분포 및 그 경험적 분포와 함께). 각 계층의 복잡성 비용의 합은 손실로 합산됩니다.
Neural Networks 논문에서 무게 불확실성으로 제안 된 바와 같이, 우리는 Kullback-Leibler의 발산을 훨씬 간단한 분포로 가져 가서 분포의 복잡성 비용을 수집 할 수 있으며,이 기능을 변수 (분포)와 비교 하여이 기능을 구별 할 수 있습니다.
손으로 설정 한 저지방 분포 PDF가되자
매개 변수를 고려하여 샘플링 된 가중치에 대한 후방 경험적 분포 PDF가 되십시오.
따라서, W 샘플링 된 매트릭스의 각 스칼라에 대해 :
매우 큰 n을 가정하면 다음과 같이 근사 할 수 있습니다.
따라서 :
Q 분포의 예상 (평균)은 값을 스케일링하여 끝나기 때문에 값을 방정식에서 꺼낼 수 있습니다 (프레임 워크 추적이 없기 때문에). Nth 샘플의 복잡성 비용은 다음과 같습니다.
이는 모든 매개 변수에 대해 차별화 될 수 있습니다.
따라서 N 번째 가중치 샘플의 전체 비용 기능은 다음과 같습니다.
Monte Carlo가 샘플링하여 (Netwok X 시간을 피드 포워드하고, 전체 손실을 통해 평균을 취한), 추정 값을 사용하여 역 프로파이트를 통해 실제 전체 비용 기능을 추정 할 수 있습니다. 그것은 백 프롭 당, 심지어 단일 실험에서도 적은 수의 실험에 효과적입니다.
우리는 간단한 튜토리얼에서 베이지안 딥 러닝의 끝에 왔습니다. 여기서 수행되는 작업을 알면 원하는대로 BNN 모델을 구현할 수 있습니다.
어쩌면 샘플 당 최적화 단계를 수행 하거나이 Monte-Carlo-ish 메소드를 사용하여 때로는 손실을 수집하고 평균을 취한 다음 최적화를 수행하여 최적화 할 수 있습니다. 당신의 움직임.
참고 : 우리의 베이지안 층과 Utils는 각 피드 포워드 작업에서 층을 따라 복잡한 비용을 계산하는 데 도움이되므로 많이 신경 쓰지 마십시오.
연구에서 BLiTZ 사용하는 경우 다음과 같이 인용 할 수 있습니다.
@misc { esposito2020blitzbdl ,
author = { Piero Esposito } ,
title = { BLiTZ - Bayesian Layers in Torch Zoo (a Bayesian Deep Learing library for Torch) } ,
year = { 2020 } ,
publisher = { GitHub } ,
journal = { GitHub repository } ,
howpublished = { url{https://github.com/piEsposito/blitz-bayesian-deep-learning/} } ,
}