什么是联邦学习?
它是训练深度学习模型的一种简单而强大的方法。考虑一下训练数据,一般它总是某种收集过程的结果:人们(通过设备)通过记录现实世界中的事件来生成数据。通常,此数据被聚合到单个中央位置,以便您可以训练机器学习模型。而联邦学习扭转了这一局面!
你无需将训练数据带到模型(一个中央服务器),而是将模型带到训练数据(无论其位于何处)。
这个想法允许创建数据的任何人拥有数据唯一的永久副本,从而保持对有权访问该数据的人的控制。很酷吧?
#训练示例
#2.1 一个玩具联合学习的例子
'''让我们从一个集中式训练的玩具模型开始。就像得到模型一样简单。我们首先需要:
玩具数据集
一个模型
用于训练模型以适合数据的一些基本训练逻辑。'''
import torch
from torch import nn
from torch import optim
# 一个玩具数据集
data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)
# 一个玩具模型
model = nn.Linear(2,1)
'''nn.Linear(2, 1): 这是一个线性(全连接)层的创建。在神经网络中,线性层通常用于将输入数据与权重矩阵相乘,然后加上偏置项。具体来说:
2: 第一个参数 2 指定了输入特征的数量。在这个例子中,输入数据的维度是 (batch_size, 2),其中 batch_size 是每次训练时使用的数据样本数量。
1: 第二个参数 1 指定了输出特征的数量。这意味着线性层将把输入特征从 2 维降到 1 维。'''
def train():
''''''
# 训练逻辑
opt = optim.SGD(params=model.parameters(),lr=0.1)
#opt = optim.SGD(params=model.parameters(), lr=0.1): 这行代码创建了一个随机梯度下降(SGD)优化器,用于更新模型的参数。
# params=model.parameters() 表示优化器将更新 model 中的所有可学习参数。lr=0.1 表示学习率设置为 0.1,即每次参数更新时的步长大小。
for iter in range(20):
# 1) 消除之前的梯度(如果存在)
opt.zero_grad()
# opt.zero_grad(): 这行代码用于清除之前参数的梯度。在每次参数更新之前,都需要先将梯度清零,以避免梯度累积。
# 2) 预测
pred = model(data)
#pred = model(data): 这行代码使用模型 model 对输入数据 data 进行预测,得到预测结果 pred。
# 3) 计算损失
loss = ((pred - target)**2).sum()
# 4) 指出那些导致损失的参数(损失回传)
loss.backward()
# 5) 更新参数
opt.step()
# 6) 打印进程
print(loss.data)
train()
改为FL:
#2.1 一个玩具联合学习的例子
'''让我们从一个集中式训练的玩具模型开始。就像得到模型一样简单。我们首先需要:
玩具数据集
一个模型
用于训练模型以适合数据的一些基本训练逻辑。'''
import torch
from torch import nn
from torch import optim
import syft as sy
hook = sy.TorchHook(torch)
# 创建一对工作机
bob = sy.VirtualWorker(hook, id="bob")
alice = sy.VirtualWorker(hook, id="alice")
# 一个玩具数据集
data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)
# 通过以下方式获取每个工作机的训练数据的指针
# 向bob和alice发送一些训练数据
data_bob = data[0:2]
target_bob = target[0:2]
data_alice = data[2:]
target_alice = target[2:]
# 初始化玩具模型
model = nn.Linear(2,1)
data_bob = data_bob.send(bob)
data_alice = data_alice.send(alice)
target_bob = target_bob.send(bob)
target_alice = target_alice.send(alice)
# 将指针组织到列表中
datasets = [(data_bob,target_bob),(data_alice,target_alice)]
#优化器
opt = optim.SGD(params=model.parameters(),lr=0.1)
def train():
# 训练逻辑
opt = optim.SGD(params=model.parameters(), lr=0.1)
for iter in range(10):
# NEW)遍历每个工作人员的数据集
for data, target in datasets:
# NEW) 将模型发送给对应的工作机
model.send(data.location)
# 1) 消除之前的梯度(如果存在)
opt.zero_grad()
# 2) 预测
pred = model(data)
# 3) 计算损失
loss = ((pred - target) ** 2).sum()
# 4) 指出那些导致损失的参数(损失回传)
loss.backward()
#print(loss)
# 5) 更新参数
opt.step()
# NEW) 获取模型(带梯度)
model.get()
#Loss = loss.get()
#
# 6) 打印进程
#print(loss.get())
#print(loss.data.get)
print(loss.data)
# 联合平均
train()
问题:输出的这是什么?有没有大佬知道的?
修改为后输出变为
不太理解,请求指教