如何使用具有部分信息的批次训练 pytorch 模型

How to train pytorch model using batches with partial information

在这个 PyTorch 模型中,我有两个具有两种不同模式的流数据同时输入到模型中。数据流是顺序数据块。所以我有模态一 M1 = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4],[5,5,5,5]] 和模态二 M2 = [[11,11,11,11],[22,22,22,22],[33,33,33,33],[44,44,44,44]]。我想用一个系统来训练这个模型,在训练过程中,成批的顺序数据将随机包含部分或全部信息。

所以在训练过程中会出现三种可能性:M1M2会有完整的序列数据,或者M1会被剪掉,这意味着顺序数据信息将被设置为零(例如 M1 = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] ),而 M2 将具有其完整的顺序数据信息,或者 M2 将被剪切,这意味着 [=13] 中的顺序数据信息=] 将被设置为零,而 M1 将具有其完整的顺序数据信息。

是否有任何 PyTorch 函数可以自动为我执行此操作,或者有人知道什么是实现此操作的好方法吗?

M1M2为用于训练的2D张量或3D分批张量,令p1p2p3为概率M1、M2 或两者都不归零:

p1 = 0.5 # for example
p2 = 0.3 # for example
# p3 = 1- p1 - p2 = 0.2

randn = torch.rand(1)

if randn < p1:
   M1 *= 0
elif randn > p1 and randn < p1+p2:
   M2 *= 0

# pass M1 and M2 to your model

作为次要注意事项,如果可能的话,您可能需要考虑将已删除数据的任何模式的梯度归零。你真的不希望你的网络知道零值有任何意义,你有学习的风险。

根据您的模型结构,这可能是可行的。例如,如果 M1 由 1 个网络分支处理,而 M2 由另一个分支处理,您可以进行约束,以便损失仅通过接收非零输入的分支反向传播。但是对于其他网络结构,这可能是不可能的。