Deep learning CNTK:一种用于序列间处理的损失函数

Deep learning CNTK:一种用于序列间处理的损失函数,deep-learning,lstm,cntk,Deep Learning,Lstm,Cntk,我正在做一个音素对齐的序列到序列模型。具体来说,我的序列数据看起来像成对序列(音素-长度),其中音素是一个热向量,长度是一个浮点。 所以我想给模型提供一个音素序列,并得到相应的长度序列 我的网络通常是这样构建的: model = Sequential( EmbeddingLayer{embeddingSize} : RecurrentLSTMLayerStack {lstmDims} : LinearLayer{1} ) 如果操作正确,LinearLayer{1}应该

我正在做一个音素对齐的序列到序列模型。具体来说,我的序列数据看起来像成对序列(音素-长度),其中音素是一个热向量,长度是一个浮点。 所以我想给模型提供一个音素序列,并得到相应的长度序列

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

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)
但在这本书中明确指出

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


我不知道如何在我的任务中使用递归。而且我也不确定整个概念是否正确。

GitHub中有一个特定的序列到序列教程,可以引导您浏览类似于您的数据。您可以查看网络是如何定义的


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


从我在教程中看到的内容来看,它使用了
交叉熵与
分类错误
函数来进行分类。就我而言,没有分类。我希望得到一个尽可能接近训练序列的浮动序列;您可以定义损失函数,比如myLoss。然后传递myLoss的别名CNTK.ops.alias(myLoss)。我们目前正在仔细研究这个API。是的,我知道我需要一些其他函数,但我不知道如何编写它,以便它能够在动态(序列)轴上工作。这就是我的问题。请看我问题中以“我正计划做类似的事情”开头的部分。我想我可以使用ReduceMean,但它不能在序列轴上工作。谢谢!这似乎就是我要找的!我也在考虑使用
summelements
而不是对
sum
部分使用递归,但不清楚是否可以(summelements没有可用的文档)。
sum = errs + PastValue (0, sum, defaultHiddenActivation=0)
count = BS.Loop.Count(errs)
loss_function = sum / count