主要内容

列车网络的使用联合学习

这个例子展示了如何使用联合训练一个网络学习。联合学习技术,允许您在一个分布式网络训练,分散的方法[1]。

联合学习允许您使用来自不同数据源的数据训练模型没有将数据移动到一个中央位置,即使单个数据源不匹配的总体分布数据集。这就是所谓的诱致性和同分布(non-IID)数据。联合学习可以训练数据很大时特别有用,或者当有隐私的担忧将训练数据。

而不是分发数据,联邦学习技术火车多个模型,每个在相同的位置作为数据源。您可以创建一个全局模型,从所有的数据源通过定期收集,结合本地的可学的参数训练模型。通过这种方式,您可以训练一个全局模型没有任何训练数据集中处理。

这个示例使用联合学习训练分类模型并行使用一个高度non-IID数据集。使用数字模型训练数据集,它包含10000份手写的图像数字0到9。并行运行的例子使用10名员工,每个处理图像的一个数字。网络的平均可学的参数在每一轮的培训,每个工人提高性能在所有的模型类,没有其他类的处理数据。

而数据隐私是联合学习的应用之一,这个例子不处理维护数据隐私和安全的细节。这个例子演示了基本的联合学习算法。

设置并行环境

创建一个平行池与相同数量的工人为类的数据集。这个例子中,使用一个本地平行池10工人。

池= parpool (“本地”10);numWorkers = pool.NumWorkers;

加载数据集

最初这个示例中所使用的所有数据存储在一个集中的位置。高度non-IID使这个数据,你需要根据工人阶级中分发数据。创建验证和测试数据集,数据的一部分工人转移到客户端。数据正确设置后,与工人和训练数据的类测试和验证数据的类在客户端,培训期间没有进一步的数据传输。

指定包含图像数据的文件夹。

digitDatasetPath = fullfile (matlabroot,“工具箱”,“nnet”,“nndemos”,“nndatasets”,“DigitDataset”);

分配工人之间的数据。每个工人接收的图像只有一个数字,这样工人1接收的所有图像数字0,工人2接收图片的数量1,等等。

图像的每个数字都存储在一个单独的文件夹的名字,数字。每个工人使用fullfile函数来指定一个特定的类文件夹的路径。然后,创建一个imageDatastore包含所有的数字图像。接下来,使用splitEachLabel函数来随机独立的30%的数据用于验证和测试。最后,创建一个augmentedImageDatastore包含了训练数据。

inputSize = [28 28 1];spmddigitDatasetPath = fullfile (digitDatasetPath num2str (labindex - 1));imd = imageDatastore (digitDatasetPath,“IncludeSubfolders”,真的,“LabelSource”,“foldernames”);[imdsTrain, imdsTestVal] = splitEachLabel (imd, 0.7,“随机”);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain);结束

测试的性能组合全球模型训练期间及之后,创建测试和验证数据集包含所有类的图像。每个工人的测试和验证数据合并成一个单一的数据存储。然后,这个数据存储分割成两个数据存储,每个包含15%的总体数据,一个用于验证网络在训练,另一个用于测试网络训练后。

文件列表= [];labelList = [];i = 1: numWorkers tmp = imdsTestVal {};文件列表=猫(1,文件列表,tmp.Files);labelList =猫(1 labelList tmp.Labels);结束imdsGlobalTestVal = imageDatastore(文件列表);imdsGlobalTestVal。标签= labelList;[imdsGlobalTest, imdsGlobalVal] = splitEachLabel (imdsGlobalTestVal, 0.5,“随机”);augimdsGlobalTest = augmentedImageDatastore (inputSize (1:2), imdsGlobalTest);augimdsGlobalVal = augmentedImageDatastore (inputSize (1:2), imdsGlobalVal);

数据现在安排,每个工人都有数据从一个类培训,和客户端验证和测试数据从所有类。

定义网络

确定数据集的类的数量。

类=类别(imdsGlobalTest.Labels);numClasses =元素个数(类);

定义网络体系结构。

层= [imageInputLayer inputSize,“归一化”,“没有”,“名字”,“输入”32岁的)convolution2dLayer (5“名字”,“conv1”)reluLayer (“名字”,“relu1”)maxPooling2dLayer (2“名字”,“maxpool1”64年)convolution2dLayer(5日,“名字”,“conv2”)reluLayer (“名字”,“relu2”)maxPooling2dLayer (2“名字”,“maxpool2”)fullyConnectedLayer (numClasses“名字”,“俱乐部”)softmaxLayer (“名字”,“softmax”));

创建一个dlnetwork对象的层。

净= dlnetwork(层)
dlnet = dlnetwork属性:层:[9×1 nnet.cnn.layer.Layer]连接:[8×2表]可学的:[6×3表]状态:[0×3表]InputNames:{“输入”}OutputNames: {“softmax”}初始化:1

定义模型损失函数

创建函数modelLoss中列出,损失函数模型的这个例子中,需要dlnetwork输入数据与相应的标签的对象和一个mini-batch并返回损失和损失的梯度对网络中可学的参数。

定义联合平均函数

创建函数federatedAveraging,中列出联合平均函数的这个例子中,这需要网络的可学的参数在每个工人,每个工人的归一化因子,并返回平均可学的所有网络参数。使用平均可学的参数来更新每个工人的全球网络和网络。

定义计算精度函数

创建函数computeAccuracy中列出,计算精度函数的这个例子中,需要dlnetwork对象,一个数据集内minibatchqueue对象,类的列表,并返回所有观察预测的准确性的数据集。

指定培训选项

在培训期间,员工定期沟通他们的网络可学的参数给客户,以便客户端更新全局模型。培训分为轮。在每一轮的培训,可学的平均参数和全球模型更新。工人模型替换为新的全球模型,和培训继续工人。

训练300轮,每轮5时代。训练一个小号码的时代每轮确保网络的工人不偏离得太远之前平均。

numRounds = 300;numEpochsperRound = 5;miniBatchSize = 100;

指定的选项SGD优化。指定一个初始0.001学习速率和动量0。

learnRate = 0.001;动量= 0;

火车模型

创建一个自定义函数句柄mini-batch预处理功能preprocessMiniBatch(定义在Mini-Batch预处理功能这个示例的部分)。

每个工人,找到培训的总人数的观察处理本地工人。使用这个数字来规范化可学的参数对每个工人当你发现平均每个communicaton轮后可学的参数。这有助于平衡一般如果是有区别的数据量在每个工人。

在每个工人,创建一个minibatchqueue对象流程和管理mini-batches图像在训练。为每个mini-batch:

  • 使用自定义mini-batch预处理数据预处理功能preprocessMiniBatch转换编码的标签在一个炎热的变量。

  • 格式的图像数据维度标签“SSCB”(空间、空间、通道、批)。默认情况下,minibatchqueue把数据转换为对象dlarray对象与基本类型。不格式添加到类的标签。

  • 火车在GPU如果一个是可用的。默认情况下,minibatchqueue将每个输出转换为对象gpuArray如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅GPU支持释放(金宝app并行计算工具箱)。

预处理= @ (x, y) preprocessMiniBatch (x, y,类);spmdsizeOfLocalDataset = augimdsTrain.NumObservations;兆贝可= minibatchqueue (augimdsTrain,“MiniBatchSize”miniBatchSize,“MiniBatchFcn”进行预处理,“MiniBatchFormat”,{“SSCB”,});结束

创建一个minibatchqueue对象管理验证数据使用在训练。使用相同的设置minibatchqueue在每一个工人。

mbqGlobalVal = minibatchqueue (augimdsGlobalVal,“MiniBatchSize”miniBatchSize,“MiniBatchFcn”进行预处理,“MiniBatchFormat”,{“SSCB”,});

初始化培训进展阴谋。

图lineAccuracyTrain = animatedline (“颜色”[0.85 0.325 0.098]);ylim([0正])包含(“沟通”轮)ylabel (“精度(全球)”网格)

个解算器初始化速度参数。

速度= [];

初始化全局模型。首先,全球模型的初始参数训练的网络在每个工人。

与=净;

火车模型使用自定义训练循环。对于每一个通信圆,

  • 更新网络上最新的全球网络的工人。

  • 火车上的网络工人5时代。

  • 找到所有网络的平均参数使用federatedAveraging函数。

  • 全球网络参数替换为平均值。

  • 计算的准确性使用验证数据更新的全球网络。

  • 显示培训进展。

对于每一个时代,洗牌和遍历mini-batches数据的数据。为每个mini-batch:

  • 评估损失和梯度模型使用dlfevalmodelLoss功能。

  • 更新本地网络参数使用sgdmupdate函数。

开始=抽搐;轮= 1:numRoundsspmd%给每个工人全球更新参数。net.Learnables。值= globalModel.Learnables.Value;%循环时期。时代= 1:numEpochsperRound%洗牌数据。洗牌(兆贝可);%在mini-batches循环。hasdata(兆贝可)% mini-batch读取的数据。[X, T] =下一个(兆贝可);%计算模型和梯度使用dlfeval损失% modelLoss函数。(损失,梯度)= dlfeval (@modelLoss,净,X, T);%更新使用个优化网络参数。(净、速度)= sgdmupdate(净、渐变速度,learnRate动量);结束结束%收集更新可学的参数对每个工人。workerLearnables = net.Learnables.Value;结束%找到每个工人的标准化因素基于比率的数据%加工工人。sizeOfAllDatasets =总和([sizeOfLocalDataset {:}));normalizationFactor = [sizeOfLocalDataset {}): / sizeOfAllDatasets;%更新全球模型与新可学的参数,规范化%的平均所有的工人。globalModel.Learnables。值= federatedAveraging (workerLearnables normalizationFactor);%计算全局模型的准确性。精度= computeAccuracy(与、mbqGlobalVal、类);%显示全局模型的培训进度。D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);addpoints (lineAccuracyTrain、轮、双(精度))标题(“交流圆:“+轮+”,过去:“+ drawnow字符串(D))结束

最后一轮的培训后,更新网络与最后每个工人平均可学的参数。这是很重要的,如果你想继续使用或火车上的网络工人。

spmdnet.Learnables。值= globalModel.Learnables.Value;结束

测试模型

测试模型的分类精度通过比较测试集上的预测与真正的标签。

创建一个minibatchqueue对象管理测试数据。使用相同的设置minibatchqueue在训练和验证使用的对象。

mbqGlobalTest = minibatchqueue (augimdsGlobalTest,“MiniBatchSize”miniBatchSize,“MiniBatchFcn”进行预处理,“MiniBatchFormat”,“SSCB”);

使用computePredictions函数来计算预测类和计算预测的准确性在所有的测试数据。

精度= computeAccuracy(与、mbqGlobalTest类)
精度=0.9873

你和计算完成后,您可以删除你的平行的池中。的gcp函数返回当前并行池对象,这样你就可以删除池。

删除(gcp (“nocreate”));

损失函数模型

modelLoss函数接受一个dlnetwork对象mini-batch的输入数据X与相应的标签T并返回损失和损失的梯度参数对可学的。自动计算梯度,使用dlgradient函数。计算预测网络的训练期间,使用向前函数。

函数[损失,梯度]= modelLoss向前(净,X, T) YPred =(净,X);损失= crossentropy (YPred T);梯度= dlgradient(损失、net.Learnables);结束

计算精度函数

computePredictions函数接受一个dlnetwork对象,一个minibatchqueue对象兆贝可类的列表,并返回所有数据集上的预测的准确性。在验证或计算的预测网络训练完成后,使用预测函数。

函数精度= computeAccuracy(净、兆贝可类)correctPredictions = [];洗牌(兆贝可);hasdata(兆贝可)(XTest, tt) =下一个(兆贝可);tt = onehotdecode (tt、类1)';YPred =预测(净,XTest);YPred = onehotdecode (YPred、类1)';correctPredictions = [correctPredictions;YPred = = tt);结束predSum =总和(correctPredictions);精度=单(predSum. /尺寸(correctPredictions 1));结束

Mini-Batch预处理功能

preprocessMiniBatch函数使用以下步骤:预处理数据

  1. 提取图像数据从传入单元阵列和连接到一个数字数组。连接图像数据在四维空间增加了一个三维图像,作为单通道尺寸。

  2. 从传入细胞提取标签数据数组和连接到一个直言沿着二维数组。

  3. 一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。

函数(X, Y) = preprocessMiniBatch(伊势亚、YCell类)%连接。猫(X = 4,伊势亚{1:结束});%从细胞中提取标签数据和连接。Y =猫(2,YCell{1:结束});%一个炎热的编码标签。Y = onehotencode (Y, 1,“类名”、类);结束

联合平均函数

这个函数federatedAveraging函数的参数可学的网络在每个工人,每个工人的归一化因子,并返回平均可学的所有网络参数。使用平均可学的参数来更新每个工人的全球网络和网络。

函数可学的= federatedAveraging (workerLearnables normalizationFactor) numWorkers =大小(normalizationFactor, 2);%初始化容器均可学的与现有大小一样%可学的。使用可学的第一个工人网络作为一个例子。exampleLearnables = workerLearnables {1};可学的=细胞(高度(exampleLearnables), 1);i = 1:高度(可学的)可学的{我}= 0(大小(exampleLearnables{我}),“喜欢”(exampleLearnables{我}));结束%添加所有工人的规范化可学的参数%计算平均值。i = 1: numWorkers tmp = workerLearnables {};值= 1:元素个数(可学的)可学的{值}=可学的{值}+ normalizationFactor(我)。* tmp}{值;结束结束结束

引用

[1]麦克马汉,h·布伦丹绒鸭摩尔,丹尼尔·拉梅奇塞芬和布莱斯Aguera y阿尔卡斯。“Communication-Efficient学习的深度从分散的数据网络。”Preprint, submitted. February, 2017. https://arxiv.org/abs/1602.05629.

另请参阅

||||||

相关的话题