我正在用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中做到这一点?
答案 0 :(得分:1)
我认为你的方法是正确的。但是,请注意,将目标按比例放大10会使这些样本的渐变比例增加10。在考虑灾难性遗忘之前,我会首先尝试将学习率降低10,以便将梯度步骤恢复到与之前相同的范围。