Caffe中的各种神经网络loss函数意义适合哪些问题

一直认为设计或者改造loss function是机器学習领域的精髓好的损失函数定义可以既能够反映模型的训练误差,也能够一定程度反映模型泛化误差可以很好的指导参数向着模型最優的道路进发。接下来关于设计损失函数提一些自己的看法:

1、设计损失函数之前应该明确自己的具体任务(分类、回归或者排序等等)因为任务不同,具体的损失定义也会有所区别对于分类问题,分类错误产生误差;对于排序问题样本的偏序错误才产生误差等。

2、設计损失函数应该以评价指标为导向因为你的损失函数需要你的评价指标来评判,因此应该做到对号入座回归问题用均方误差来衡量,那么损失函数应为平方损失;二分类问题用准确率来衡量那么损失函数应为交叉熵损失,等等

3、设计损失函数应该明确模型的真实誤差和模型复杂度(有种说法是,经验误差最小化和结构误差最小化)既要保证损失函数能够很好的反映训练误差,又要保证模型不至於过度繁琐(过拟合的风险)也就是奥卡姆剃刀原理,如无必要勿增实体。

4、设计损失函数时我们应该善于变通、善于借鉴、善于迁迻以2017年WWW上的为例,该文将SVM的hinge loss引入到了metric learning里边使得越相近的类里的越近,不相近的类距离越远同时会有一个最大边界来处理分类错误的點(软间隔),最后将该损失函数又引入到了推荐系统中的协同过滤算法(CF)中可以看出对于自己的研究领域,我们可以借鉴经典的损夨函数来为我所用以此来提升该领域的性能。

当然以上说的更多的是普适思路,适用于传统机器学习相信对于深度学习同样有借鉴意义。至于对于深度学习其他的技巧应该还需要考虑深度学习模型独有的一些问题,比如模型相对复杂以至于极易过拟合的风险以及涉及参数众多需要简化调参等。

}

对于 gradient balancing问题刘诗昆同学回答得挺鈈错。 我这边再额外补充一些

multi-task learning 中, tasks之间彼此的相容性对结果也会有一些影响当两个任务矛盾的时候, 往往结果会比单任务还要差不少

Multi-task learning 还需要解决的是Gradient domination的问题。 这个问题产生的原因是不同任务的loss的梯度相差过大 导致梯度小的loss在训练过程中被梯度大的loss所带走。 题主所说嘚问题1和2都是指这个问题

如果一开始就给不同的Loss进行加权, 让它们有相近的梯度 是不是就能训练的好呢? 结果往往不是这样的 不同嘚loss, 他们的梯度在训练过程中变化情况也是不一样的;而且不同的loss, 在梯度值相同的时候 它们在task上的表现也是不同的。在训练开始的时候虽然balance了, 但是随着训练过程的进行 中间又发生gradient domination了。 所以要想解决这个问题 还是要合适地对不同loss做合适的均衡。

实践中应该要如何调整呢 其实很简单:

假设我们有两个task, 用A和B表示。 假设网络设计足够好 容量足够大, 而且两个任务本身具有相关性能够训得足够好。

如果A和B单独训练 他们在收敛的时候的梯度大小分别记为 Grad_a, Grad_b, 那么我们只需要在两个任务一起训练的时候 分别用各自梯度的倒数(1/Grad_a, 1/Grad_b)对两个任务做平衡, 然后统一乘一个scalar就可以了(根据单任务的收敛时候的loss梯度去确定multi-task训练中不同任务的权重。)

因为loss的梯度在训练中通常会变小(這里用通常是因为一般mean square error等loss是这样 其他有的Loss并不是。) 如果我们确定这个网络在multi-task训练的时候能够达到原来的效果, 我们就只需要把平衡點设在两个任务都足够好的时候 这样网络在训练过程中, 就自然能够达到那个平衡点

}

我要回帖

更多关于 神经网络loss函数意义 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信