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