我有一个seq2seq模型,我的输入是短句,如
x = "The XYZ pub near Cafe ABC has a 5 star rating. Prices start at £30."
我的输出是从输入句子中提取的语义信息,如:
y_true = name[XYZ], type[pub], price[moderate], rating[5], close_to[Cafe ABC]
问题是虽然在很多情况下我的t_true包含完整的语义信息,但在某些情况下它缺少信息,如
y_true = name[XYZ], type[pub]
我想做的是,即使模型预测:
y_predicted = name[XYZ], type[pub], price[moderate], rating[5], close_to[Cafe ABC]
如果
y_true = name[XYZ], type[pub]
损失函数还应回顾输入并检查不在目标中的预测语义信息是否位于输入中,如果它们在输入中,则成本应为零。
y_predicted和输入x的比较将是正则表达式匹配。是否有可能将这样的复杂过程集成到损失函数中,特别是在张量流中?
答案 0 :(得分:0)
当然,事实上这很简单。对于单个样本,您计算的是5个损失值的向量,类似于losses = [1.2, 0.3, 1.5, 3.3, 0.6]
。请注意,此结果是在您丢失时执行任何tf.reduce_mean
函数之前。
现在在tensorflow中构建一个函数,为每个丢失值生成1或0的结果,以指示是要将其清零(0)还是保持它(1)。根据您要保留名称和类型的示例,您现在拥有mask = [1 1 0 0 0]
,并将其他三个的损失归零。
现在,您将final_loss = losses * mask
乘以得到最终的损失值,立即应用tf.reduce_mean
并将其传递给优化程序。需要注意的关键点是,当您使用导数时,这会在渐变下降中执行您想要的操作,因为1x = dx
和0x = 0
,因此您最终会在不应用的情况下将渐变归零。这就是具有可变序列长度的RNN在通过虚拟填充值传递时的工作方式,它使用掩码将梯度归零。