贝叶斯神经网络训练
这个例子展示了如何训练贝叶斯神经网络(BNN)形象回归使用贝叶斯反向传播[1]。您可以使用一个BNN预测手写数字的旋转和模型预测的不确定性。
贝叶斯神经网络(BNN)是一种深入学习网络,使用贝叶斯方法量化的不确定性预测的深度学习网络。这个示例使用贝叶斯通过反向传播(也称为贝叶斯backprop)估计的神经网络权重的分配。通过使用一个权重分配,而不是一套权重,你可以估计网络预测的不确定性。
这个图显示了一个示例的旋转角度预测和估计的不确定性区域分布的权重。
加载数据
加载数字数据集。该数据集包含合成图像的手写的数字与相应的角度(度)的每个图像旋转。
负荷训练和测试图像4 - d阵列使用digitTrain4DArrayData
和digitTest4DArrayData
。的TTrain
和tt
输出是度的旋转角度。训练和测试数据集每一个包含5000张图片。
[XTrain ~, TTrain] = digitTrain4DArrayData;[XTest, ~, tt) = digitTest4DArrayData;
创建一个数据存储包含训练预测和响应。使用数值数组转换为数据存储arrayDatastore
。然后,使用结合
将这些数据存储到一个数据存储功能。
dsXTrain = arrayDatastore (XTrain IterationDimension = 4);dsTTrain = arrayDatastore (TTrain);dsTrain =结合(dsXTrain dsTTrain);
提取响应的大小和数量的观察。
numResponses =大小(TTrain, 2)
numResponses = 1
numObservations =元素个数(TTrain)
numObservations = 5000
显示64个随机训练图像。
idx = randperm (numObservations, 64);我= imtile (XTrain (:,:,:, idx));图imshow(我)
定义网络体系结构
使用分布模型的权重和偏见,而不是一个确定的集合,您必须定义权重的概率分布。您可以定义分配使用贝叶斯定理:
在哪里 的可能性, 先验分布。在本例中,您将重量和偏见遵循一个高斯分布(对应平方损失)。在培训过程中,网络学习高斯分布的均值和方差,确定权重的分布和偏见。
之前设置一个高斯混合模型[1]两个组件,每个0的均值和方差sigma1
和sigma2
。你可以解决培训或学习他们在训练前的差异。这两个组件混合模型的混合比为0.5。
定义一个贝叶斯神经网络的图像回归。
图像输入,指定一个图像输入层和一个输入训练数据匹配的大小。
不正常的图像输入。设置
归一化
选择输入层“没有”
。指定三个贝叶斯完全连接层与ReLU激活层。
一个贝叶斯完全连接层是一种完全连接层,商店的平均重量和偏见的预期分布权重。计算层的激活时,软件由高斯随机噪声变化的平均重量和偏见,并使用移位的重量和偏见来计算输出层。
要创建一个贝叶斯完全连接层,可以使用bayesFullyConnectedLayer.m
自定义图层,附加到这个例子作为支持文件。金宝app贝叶斯完全连接层需要的参数作为输入输出大小和重量分布的先验概率,sigma1
和sigma2
。
定义网络。
inputSize = [28 28 1];outputSize = 784;sigma1 = 1;sigma2 = 0.5;层= [imageInputLayer (inputSize正常化=“没有”)bayesFullyConnectedLayer (outputSize Sigma1 = Sigma1 Sigma2 = Sigma2) reluLayer bayesFullyConnectedLayer (outputSize / 2, Sigma1 = Sigma1 Sigma2 = Sigma2) reluLayer bayesFullyConnectedLayer (1 Sigma1 = Sigma1 Sigma2 = Sigma2)];
创建一个dlnetwork
数组对象的层。
网= dlnetwork(层);
可视化网络使用analyzeNetwork
。可以看到,贝叶斯的可学的完全连接层包括权重的均值和方差和偏差。
analyzeNetwork(净)
定义可学的参数
可学的参数包括网络(层)可学的和全球可学的。在培训过程中,算法更新这些可学的参数:
层权重的均值和方差和偏差(每层)
重量的先验概率分布(每层)
采样噪声(全球)
初始化采样噪声
使用抽样代表噪声预测的神经网络。学习网络权值的采样噪声和偏见。
初始化采样噪声。
samplingNoise = dlarray (1);
初始化先验概率
你可以修正先验方差参数或学习他们在训练像其他可学的参数。学习参数在训练之前使用一个小的学习速率,这样他们的价值观仍接近初始值。设置初始学习率0.25。
doLearnPrior = true;priorLearnRate = 0.25;numLearnables =大小(net.Learnables, 1);为i = 1: numLearnables layerName = net.Learnables.Layer(我);parameterName = net.Learnables.Parameter(我);如果parameterName = =“Sigma1”| | parameterName = =“Sigma2”如果doLearnPrior净= setLearnRateFactor(网,layerName, parameterName priorLearnRate);其他的网= setLearnRateFactor(网络,layerName parameterName 0);结束结束结束
定义模型的损失函数
定义一个函数,它返回的梯度模型损失和损失对可学的参数。在本例中,您最小化证据下界(ELBO)中定义的损失证据下界损失部分。
创建函数modelLoss
中列出,损失函数模型部分。该函数作为输入dlnetwork
对象和一个mini-batch输入数据与相应的目标。这些函数返回值:
ELBO损失
根均方误差(RMSE)
渐变的损失就可学会的参数
渐变的损失对采样噪声
网络状态
指定培训选项
火车50时代mini-batch大小为128。
numEpochs = 50;miniBatchSize = 128;
培训期间跟踪ELBO损失。情节每50迭代和损失的平均损失5个样品可学的参数。
numSamplesForavgELBO = 5;averageLossComputationFrequency = 50;
火车模型
创建一个minibatchqueue
对象来处理和管理的mini-batches图像。为每个mini-batch:
使用自定义mini-batch预处理功能
preprocessMiniBatch
(在这个例子中定义)一个炎热的编码类标签。格式的图像数据维度标签
“SSCB”
(空间、空间、通道、批)。默认情况下,minibatchqueue
把数据转换为对象dlarray
对象与基本类型单一。火车在GPU如果一个是可用的。默认情况下,
minibatchqueue
将每个输出转换为对象gpuArray
对象如果GPU可用。使用GPU需要并行计算工具箱™许可和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU计算的需求(并行计算工具箱)。
兆贝可= minibatchqueue (dsTrain,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“SSCB”“CB”]);
初始化参数为亚当的优化。
trailingAvg = [];trailingAvgSq = [];trailingAvgNoise = [];trailingAvgNoiseSq = [];
计算迭代的总数的培训进度监控。
numIterationsPerEpoch =装天花板(numObservations / miniBatchSize);numIterations = numEpochs * numIterationsPerEpoch;
初始化培训进度监控。
监控= trainingProgressMonitor (…指标= [“RMSE”,“AverageELBOLoss”),…信息=“时代”,…包含=“迭代”);
火车模型使用自定义训练循环。对于每一个时代,洗牌和遍历mini-batches数据的数据。在每次迭代结束时,显示培训进展。为每个mini-batch:
评估损失和梯度模型使用
dlfeval
和modelLoss
函数。更新网络参数使用
adamupdate
函数。更新采样噪声参数(全局参数)使用
adamupdate
函数。记录RMSE和平均ELBO损失。
迭代= 0;时代= 0;%循环时期。而时代< numEpochs & & ~班长。停止时代=时代+ 1;miniBatchIdx = 0;%洗牌数据。洗牌(兆贝可);而hasdata(兆贝可)& & ~班长。停止迭代=迭代+ 1;miniBatchIdx = miniBatchIdx + 1;[X, T] =下一个(兆贝可);[elboLoss, rmsError gradientsNet gradientsNoise] = dlfeval (@modelLoss,…净,X, T, samplingNoise、miniBatchIdx numIterationsPerEpoch);%更新使用亚当优化网络参数。[净,trailingAvg trailingAvgSq] = adamupdate (gradientsNet净,…trailingAvg trailingAvgSq,迭代);%更新采样噪声。[samplingNoise, trailingAvgNoise trailingAvgNoiseSq] = adamupdate (samplingNoise,…gradientsNoise、trailingAvgNoise trailingAvgNoiseSq迭代);%的RMSE记录。recordMetrics(监控、迭代RMSE =双(rmsError))%的平均记录ELBO损失。如果国防部(迭代,averageLossComputationFrequency) = = 0 avgELBOLoss = averageNegativeELBO(净,X, T, samplingNoise miniBatchIdx,…numIterationsPerEpoch numSamplesForavgELBO);recordMetrics(监控、迭代AverageELBOLoss =双(avgELBOLoss))结束%更新时代和进步在监测值。updateInfo(监视、时代=字符串(时代)+“的”+字符串(numEpochs))监控。Progress = 100*(iteration/numIterations);结束结束
测试网络
bnn学习权重的概率分布,而不是优化一套像卷积神经网络权重。因此,您可以查看BNN作为一个整体的网络,你样品的每个网络学习可学的参数的概率分布。
测试的准确性BNN,生成
样品的重量和偏见和比较的平均预测
样品的真实价值。的标准偏差
预测模型的不确定性。使用modelPosteriorSample
函数中列出模型预测函数部分为一组输入生成预测。样本的函数
次从重量和偏见的后验分布。为每个
样本,该函数为输入图像生成预测。BNN使用的预测样本的重量和偏见;因此,预测包括一些变分噪音。
把测试数据dlarray
对象。
XTest = dlarray (XTest,“SSCB”);如果canUseGPU XTest = gpuArray (XTest);结束
测试单一图像
为第一个测试图像使用生成10个样本modelPosteriorSample
。函数返回10预测的角度旋转。最终的模型预测平均10的预测价值。
idx = 1;numSamples = 10;img = XTest (:,:,:, idx);预测= modelPosteriorSample(网,img, samplingNoise numSamples);YTestImg =意味着(预测,1);
情节真实的角度,角度预测,预测的均值。
图线宽= 1.5;uncertaintyColor =“# EDB120”;I = extractdata (img);imshow(我InitialMagnification = 800)在inputSize =大小(img, 1);抵消= inputSize / 2;thetaActual = tt (idx);情节(抵消*(1 -罐内(thetaActual), 1 +罐内(thetaActual)], [inputSize 0],…线宽=线宽)thetaPredAvg = YTestImg;情节(抵消*(1 -罐内(thetaPredAvg), 1 +罐内(thetaPredAvg)], [inputSize 0],…线宽=线宽)为i = 1: numSamples thetaPred =预测(i);情节(抵消*(1 -罐内(thetaPred), 1 +罐内(thetaPred)], [inputSize 0],”——“,…颜色= uncertaintyColor)结束持有从标题(”Pred:“+ (thetaPredAvg 2) +“(平均)”+”,真正的:“传奇+圆(thetaActual, 2)) ((“真正的”,“意思是预测”,“预测”),位置=“东南”)
样品的数量增加到500和情节的分布预测测试图像旋转角度。
numSamples = 500;预测= modelPosteriorSample(网,img, samplingNoise numSamples);YTestImg =意味着(预测,1);uncertaintyImg =性病(预测,1);图直方图(预测)真彩=“# 0072 bd”;predColor =“# D95319”;持有在参照线(tt (idx),颜色=真彩,线宽=线宽)参照线(= predColor YTestImg,颜色,线宽=线宽)参照线(YTestImg - 2 * uncertaintyImg,”——“颜色= uncertaintyColor,线宽=线宽)参照线(YTestImg + 2 * uncertaintyImg,”——“颜色= uncertaintyColor,线宽=线宽)从包含(“转动角”)ylabel (“频率”)标题(“分布预测(样本的数量=”+ numSamples +“)”)传说(”“,“真正的”,“意思是预测”,“+ -”+“2 \σ(标准差)”)
测试所有的图片
预测的角度旋转为每个测试图像使用100的样品可学的参数。
numSamples = 100;预测= modelPosteriorSample(网,XTest, samplingNoise numSamples);欧美=意味着(预测,1);不确定性=性病(预测,1);
计算预测误差之间的真实和预测角度旋转。
predictionError = tt -欧美';
使用RMSE测量之间的差异的真实和预测角度旋转。
广场= predictionError。^ 2;rmse =√意味着(广场))
rmse = 15.0308
可视化预测角度和不确定性
视图的一些图片和他们的预测和真正的角度。使用标准偏差显示预测的不确定性模型的预测。
numTestImages =元素个数(tt);numObservationToShow = 9;idxTestSubset = randperm (numTestImages numObservationToShow);sdToPlot = 2;tiledlayout (“流”TileSpacing =“紧”);为i = 1: numObservationToShow idx = idxTestSubset(我);nexttile I = extractdata (XTest (:,:,:, idx));imshow (I)在thetaActual = tt (idx);情节(抵消*(1 -罐内(thetaActual), 1 +罐内(thetaActual)], [inputSize 0],线宽=线宽)thetaPred =欧美(idx);情节(抵消*(1 -罐内(thetaPred), 1 +罐内(thetaPred)], [inputSize 0],线宽=线宽)thetaUncertainty = [thetaPred - sdToPlot *不确定性(idx) thetaPred + sdToPlot *不确定性(idx)];%情节上界和下界。下界=[1 -罐内(thetaUncertainty(1)), 1 +罐内(thetaUncertainty (1)));upperBound =[1 -罐内(thetaUncertainty(2)), 1 +罐内(thetaUncertainty (2)));情节(抵消*下界,[inputSize 0],”——“颜色= uncertaintyColor,线宽=线宽)情节(抵消* upperBound, [inputSize 0],”——“颜色= uncertaintyColor,线宽=线宽)从标题({“真正的= "+圆(thetaActual, 2),”Pred:“+圆(thetaPred 2)})如果我= = 2传说([“真正的”,“意思是预测”,“+ -”+ sdToPlot +“\σ(标准差)”),…位置=“northoutside”,…NumColumns = 3)结束结束
金宝app支持功能
Mini-Batch预处理功能
的preprocessMiniBatch
函数使用这些步骤:预处理数据
提取图像数据从输入单元阵列
dataX
连接成一个数字数组。连接图像数据在四维空间增加了一个三维图像,网络作为一个单通道的维度。提取角数据从输入单元格数组
dataAng
沿着第二维度和连接成一个数字数组。
函数[X] = preprocessMiniBatch (dataX dataAng) X =猫(4,dataX {:});=猫(dataAng {:});结束
模型预测函数
的modelPosteriorSample
函数作为输入dlnetwork
对象净
一个输入图像X
、采样噪声samplingNoise
,样品产生的数量numSamples
。函数返回numSample
输入图像的预测。
函数预测= modelPosteriorSample(净,X, samplingNoise numSamples)预测= 0 (numSamples、大小(X, 4));为i = 1: numSamples Y =预测(净,X,加速度=“没有”);sigmaY = exp (samplingNoise);预测(我:)= Y + sigmaY。* randn(大小(Y));结束结束
最大似然估计函数
的logLikelihood
函数估计的可能性给出的网络预测的真实值和采样噪声。函数作为输入的预测Y
,真正的价值T
和采样噪声samplingNoise
并返回对数似l
。
函数l = logLikelihood (Y, T, samplingNoise) sigmaY = exp (samplingNoise);l =总和(logProbabilityNormal (T Y sigmaY),“所有”);结束
损失函数模型
的modelLoss
函数作为输入dlnetwork
对象净
mini-batch的输入数据X
与相应的目标T
、采样噪声samplingNoise
mini-batch指数miniBatchIdx
和批次的数量numBatches
。函数返回ELBO损失,RMSE损失,损失的梯度对可学的参数,和损失的梯度采样噪声。
函数[elboLoss, meanError gradientsNet gradientsNoise] = modelLoss(净,X, T, samplingNoise miniBatchIdx, numBatches) [elboLoss Y] = negativeELBO(净,X, T, samplingNoise miniBatchIdx, numBatches);[gradientsNet, gradientsNoise] = dlgradient (elboLoss、net.Learnables samplingNoise);meanError =双(sqrt (mse (Y, T)));结束
证据下界(ELBO)损失函数
的negativeELBO
函数计算给定mini-batch ELBO损失。
ELBO损失结合这些目标:
最大化网络预测的可能性。
最小化Kullback-Leibler(吉隆坡)变分分布之间的差异 和后。变分分布 接近真实的后验分布和减少培训期间的计算复杂度。
的negativeELBO
函数作为输入dlnetwork
对象净
mini-batch的输入数据X
与相应的目标T
、采样噪声samplingNoise
mini-batch指数miniBatchIdx
和批次的数量numBatches
。函数返回ELBO损失ELBO
和的结果前进传球(网络预测)Y
。
函数[ELBO Y] = negativeELBO(净X, T, samplingNoise、miniBatchIdx numBatches) [Y,状态]=(净,X,加速度=“汽车”);β= KLWeight (miniBatchIdx numBatches);logPosterior = state.Value(状态。参数= =“LogPosterior”);logPosterior =总和([logPosterior {:}));logPrior = state.Value(状态。参数= =“LogPrior”);logPrior =总和([logPrior {:}));l = logLikelihood (Y, T, samplingNoise);ELBO = (1 * l) +(β(logPosterior - logPrior) *);结束
平均ELBO损失
的averageNegativeELBO
函数作为输入dlnetwork
对象净
mini-batch的输入数据X
与相应的目标T
、采样噪声samplingNoise
mini-batch指数miniBatchIdx
批次的数量numBatches
,样品的数量numSamples
。函数返回ELBO损失平均numSamples
样本ELBO损失。
函数avgELBO = averageNegativeELBO(净X, T, samplingNoise、miniBatchIdx numBatches, numSamples) avgELBO = 0;为i = 1: numSamples ELBO = negativeELBO(净X, T, samplingNoise、miniBatchIdx numBatches);avgELBO = avgELBO + ELBO;结束avgELBO = avgELBO / numSamples;结束
Mini-Batches和KL权重
的KLWeight
当前批次指数函数作为输入我
和批次的总数米
。函数返回β
标量值在[0,1],您可以使用当前规模批KL求和。
最小化成本为每个mini-batch使用这种重新调整策略:
,
在哪里 。
是一个比例因子的估计后验分布的权重吗[1]。
函数β= KLWeight(我)β= 2 ^ (m - i) / (2 ^ m - 1);结束
引用
[1]Blundell说,查尔斯,朱利安Cornebise Koray Kavukcuoglu,和她女儿Wierstra,“神经网络权重的不确定性”。arXiv预印本arXiv: 1505.05424(2015年5月)。,https://arxiv.org/abs/1505.05424。
另请参阅
dlnetwork
|dlarray
|minibatchqueue
|dlfeval
|adamupdate