【问题标题】:CNTK: A loss function for sequence to sequence processingCNTK:序列到序列处理的损失函数
【发布时间】:2017-05-24 14:14:04
【问题描述】:

我正在做一个音素对齐的序列到序列模型。具体来说,我的火车数据看起来像成对序列(phoneme - length),其中 phoneme 是一个单热向量,而 length 是一个浮点数。 所以我想给模型输入一个 phoneme 序列,得到一个对应的 length 序列。

我的网络通常是这样构建的:

model = Sequential(
    EmbeddingLayer{embeddingSize} : 
    RecurrentLSTMLayerStack {lstmDims} :
    LinearLayer{1}
)

如果我做对了,LinearLayer{1} 应该从 lstmDims 转换为 1。 所以当我给模型输入一个长度为 N 的序列时,我也应该得到一个长度为 N 的结果序列。

现在我想设置一个合适的损失函数,我认为它应该是已知结果序列的元素与模型输出之间的平均差异。应该通过时间轴进行平均,以便管理不同长度的序列。

我打算做类似的事情

objectives = Input(1) #actually a sequence here as stated in the reader
result = model(features)
errs = Abs(objectives - result)
loss_function = ReduceMean(errs)
criterionNodes  = (loss_function)

但在Reduction Operations 中明确指出

这些操作不支持对序列进行归约。相反,您可以通过重复来实现这一点。

我不确定如何为我的任务使用重复。而且我也不确定整个概念是否合适。

【问题讨论】:

    标签: deep-learning lstm cntk


    【解决方案1】:

    GitHub 中有一个特定的序列到序列教程,可引导您完成与您的数据相似的数据。您可以查看网络是如何定义的。

    https://github.com/Microsoft/CNTK/blob/master/Tutorials/CNTK_204_Sequence_To_Sequence.ipynb

    【讨论】:

    • 根据我在教程中看到的,它使用了用于分类的cross_entropy_with_softmaxclassification_error 函数。就我而言,没有分类。我正在寻找尽可能接近训练序列的浮点序列。
    • 如果没有分类错误;你可以定义你的损失函数,比如 myLoss。然后传递一个别名 myLoss ot trainer CNTK.ops.alias(myLoss)。我们目前正在仔细研究此 API。
    • 是的,我知道我需要一些其他功能,但我不明白如何编写它以便它可以在动态(序列)轴上工作。这就是我的问题所在。请查看我的问题以“我打算做类似的事情”开头的部分。我想我可以使用 ReduceMean,但它不适用于序列轴。
    【解决方案2】:

    您需要两个不太复杂的重复(对于第二个,我们使用“内置”操作,其实现在 cntk.core.bs 文件中):

    sum = errs + PastValue (0, sum, defaultHiddenActivation=0)
    count = BS.Loop.Count(errs)
    loss_function = sum / count
    

    【讨论】:

    • 谢谢!这似乎就是我想要的!我也在考虑使用SumElements 而不是对sum 部分使用重复,但不清楚是否可以(SumElements 没有可用的文档)。
    猜你喜欢
    • 2021-06-12
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多