我正在编写一个程序来预测某事何时会发生。我不知道该使用哪种激活函数来输出星期几(1-7)。
我尝试过使用sigmoid函数,但它需要输入预测的日期并输出其概率,我不希望是这样。
我希望激活函数返回0到无穷大,ReLU是否是此任务的最佳激活函数?
编辑:
另外,如果我希望输出超过7天,例如,x将在今天后的第9天或第15天发生等?我正在寻找动态的方法来实现这一点
回答:
我想补充@隐藏人名提出的观点,这在你的问题设置中提出了一个有效的观点。你会在下文找到你最初问题的答案,但我强烈建议你先阅读以下评论。
一般来说,你需要区分分类变量、顺序变量和区间变量。我在Stackoverflow上的另一个回答中给出了一个相对较长的解释,这可能有助于更详细地理解这个概念。
在你的场景中,你主要是想了解“你错得有多离谱”。当然,假设你正在做的事情并将其解释为区间变量是完全合理的,因此具有假设的顺序(和距离)在不同值之间。
然而,问题在于你假设了一个连续空间在一个离散变量上。例如,解释4.3
的输出是没有意义的,因为你只能在4
(假设你从0开始编号你的日子,即星期五)或5
(星期六)之间做出判断。任何中间值都必须四舍五入,这完全没问题——直到你想在这个损失上进行反向传播。这是有问题的,因为你实际上引入了非凸和非连续的函数,无论你如何“四舍五入”你的值。再举个例子,你可以假设四舍五入到最接近的数字;那么,在4.5
的值处,你会看到损失的突然增加,这是不可微分的,因此会给你的优化器带来困难,可能限制你的系统的收敛性。
相反,如果你使用多个输出神经元,如@隐藏人名所建议的,你可能会在纸面上失去距离信息(你偏离了多少天),但你当然仍然可以以任何你喜欢的方式解释你的损失。这对于离散值变量来说无疑是更好的选择。
回答你的最初问题:我个人会确保你的损失函数在上限和下限都是有界的,否则你可能会有未定义/不一致的损失值,这可能会导致次优的优化。一种方法是重新缩放Sigmoid函数(sigmoid(R)
的共域是[0,1]
)。最终,你可以将输出乘以6
,得到一个值范围为[0,6]
,并可以(在四舍五入后)覆盖你想要的所有值。