加权采样序列以训练CNTK中的神经网络



我正在用CNTK训练LSTM。我从以下语言理解的示例开始:https://github.com/microsoft/cntk/blob/master/master/tutorials/cntk_202_language_understanding.ipynb

要训练网络,它们产生CNTK文本格式(CTF)文件,例如:

19  |S0 178:1 |# BOS      |S1 14:1 |# flight  |S2 128:1 |# O
19  |S0 770:1 |# show                         |S2 128:1 |# O
19  |S0 429:1 |# flights                      |S2 128:1 |# O
19  |S0 444:1 |# from                         |S2 128:1 |# O

i具有与每个序列关联的 stoge 。因此,我生成了以下输出:

19  |weight 10 |S0 178:1 |# BOS      |S1 14:1 |# flight  |S2 128:1 |# O
19  |weight 10 |S0 770:1 |# show                         |S2 128:1 |# O
19  |weight 10 |S0 429:1 |# flights                      |S2 128:1 |# O
19  |weight 10 |S0 444:1 |# from                         |S2 128:1 |# O

我想在训练网络时考虑weight。考虑到它的一种可能方法是修改损失函数如下:我将交叉熵乘以实例的重量。

def create_criterion_function(model):
    labels = Placeholder(name='labels')
    weight = Placeholder(name='weight')
    ce   = weight * cross_entropy_with_softmax(model, labels)
    errs = classification_error      (model, labels)
    return combine ([ce, errs]) # (features, labels) -> (loss, metric)

但是,当我有很多序列时,网络似乎没有学习。有人告诉我这是灾难性遗忘的案例:

灾难性的遗忘(也:灾难性干扰)是一个经常用于连接主义文献中的术语,用于描述许多传统人工神经网络模型的常见问题。它是指先前学到的反应的灾难性丧失,每当试图以一种新的(附加)响应来训练网络时。

另一个解决方案可能是,我可以根据重量来对Minibatch中的实例进行采样:重量较高的序列应在Minibatches中出现更多的序列。有没有办法在CNTK中进行?

我认为您的方法是正确的。但是,请注意,将目标扩展为10将对这些样品的梯度缩小10。在研究灾难性遗忘之前,我首先尝试将您的学习率降低10,以便将梯度步骤带回与以前相同的范围。

最新更新