
今日推荐:大数据传输中的二进制加密方案文章链接:https://cloud.tencent.com/developer/article/2465816
这篇文章深入浅出地探讨了数据加密技术,包括对称加密、非对称加密和哈希算法,并通过实际代码示例展示了AES加密的实现过程。同时,文章还讨论了数据传输中的安全性问题,提出了不依赖加密算法的数据传输安全方案
目录
大的batch size与小的batch size相比 优缺点
(Gradient Accumulation)是一种技术,用于在小批量(mini-batch)训练中模拟大批量的效果,特别适用于显存或内存受限的情况。以下是梯度累加的基本流程和简单举例说明:
假设我们有一个简单的神经网络训练任务,我们希望模拟大批量训练的效果,但由于显存限制,我们不能直接使用大批量。我们设定梯度累加步数为4。
import torch
import torch.nn as nn
import torch.optim as optim
# 假设模型、损失函数和优化器已经定义
model = MyModel()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
accumulation_steps = 4
grads_acc = {}
# 模拟梯度累加的过程
for i, (inputs, labels) in enumerate(data_loader):
# 模拟在每4个小批量后更新一次参数
if i % accumulation_steps == 0:
optimizer.zero_grad() # 清空之前的梯度累加器
else:
for param in model.parameters():
if param.grad is not None:
grad_key = param.__class__.__name__ + str(param.id)
if grad_key in grads_acc:
grads_acc[grad_key] += param.grad.data
else:
grads_acc[grad_key] = param.grad.data.clone()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward() # 计算梯度并累加
# 每累加4个小批量后,更新一次参数
if (i + 1) % accumulation_steps == 0:
for param in model.parameters():
if param.grad is not None:
grad_key = param.__class__.__name__ + str(param.id)
param.grad = grads_acc[grad_key] / accumulation_steps
grads_acc[grad_key].zero_()
optimizer.step() # 更新模型参数
在这个例子中,我们通过grads_acc字典来累加梯度。每处理一个小批量数据后,我们检查是否已经累加了4个小批量的梯度。如果是,我们就将累加的梯度除以4(累加步数),然后更新模型参数,并清零梯度累加器。这样,我们就能模拟使用大批量训练的效果,同时避免了因显存限制而无法直接使用大批量的问题。
梯度累加后除以累加步数(例如4)的原因是为了模拟大批量数据的梯度更新效果,同时避免单个大批量数据带来的内存或显存压力。具体来说:
因此,累加的梯度除以累加步数是为了平衡梯度的大小,使得权重更新既能够反映大批量数据的信息,又能够保持更新的稳定性和训练的可行性。这种方法在实践中被证明是有效的,尤其是在资源受限的情况下。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。