用于在CNTK中训练神经网络的加权采样序列

时间:2017-02-27 11:39:48

标签: cntk

我正在用CNTK训练加权序列的LSTM。我从以下语言理解示例开始:https://github.com/Microsoft/CNTK/blob/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

我对每个序列都有权重。因此,我生成了以下输出:

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)

然而,当我有很多序列时,网络似乎没有学习。我被告知这是catastrophic forgetting

的情况
  

灾难性遗忘(也称:灾难性干扰)是一个术语,通常用于连接论文献中,用于描述许多传统人工神经网络模型的常见问题。它指的是每当尝试用一个新的(额外的)响应来训练网络时,先前学习的响应的灾难性丢失。

另一种解决方案可能是我可以根据重量对小批量中的实例进行采样:具有较高权重的序列应该更多地出现在小批量中。有没有办法在CNTK中做到这一点?

1 个答案:

答案 0 :(得分:1)

我认为你的方法是正确的。但是,请注意,将目标按比例放大10会使这些样本的渐变比例增加10。在考虑灾难性遗忘之前,我会首先尝试将学习率降低10,以便将梯度步骤恢复到与之前相同的范围。