CNTK:序列到序列处理的损失函数

时间:2017-01-10 06:59:00

标签: deep-learning lstm cntk

我正在为音素对齐做一个序列到序列的模型。特别是我的列车数据看起来像配对序列(音素 - 长度),其中音素是一个热门矢量,长度< / em>是一个浮点数。 所以我想用音素序列为模型提供相应的长度序列。

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

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中明确指出

  

这些操作不支持减少序列。相反,您可以通过重复实现此目的。

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

2 个答案:

答案 0 :(得分:1)

您需要两次不太复杂的重复(对于第二次我们使用&#34;内置&#34;操作,其实现位于cntk.core.bs文件中):

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

答案 1 :(得分:0)

GitHub中有一个特定的序列序列教程,可以引导您完成与您类似的数据。您可以了解网络的定义方式。

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