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

CNTK: A loss function for sequence to sequence processing

我正在为音素对齐做一个序列到序列模型。具体来说,我的火车数据看起来像成对的序列 (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 中明确指出

These operations do not support reduction over sequences. Instead, you can achieve this with a recurrence.

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

GitHub 中有一个特定的 Sequence to Sequence 教程,可以引导您完成与您的数据类似的数据。您可以查看网络的定义方式。

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

您需要两个不太复杂的循环(对于第二个,我们使用 "builtin" 操作,其实现在 cntk.core.bs 文件中):

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