loss 加权_多任务学习中各loss权重应该如何设计呢?

1.假设多个任务loss在同一个metric下,那几乎不用统一,除了一些先验干预。各个任务可以得到平等对待。如果同一个metric下不同任务loss差别巨大,那就是任务训练难度本身的问题。同步到一个数量级也不能解决一个任务训练不好的问题。

2. 多个任务在不同metric下,这本身就是一个很trick的活,在不加任何假设前提下,统一一个数量级就是最大熵。

3. 个人认为loss是因,梯度是果。梯度是你不好控制的,你对loss进行的缩放直接就作用在了loss。目标作为优化参数,那梯度就成了因,所以从好入手的loss是可以大部分决定参数的好坏的。

4. 从动力角度,梯度衡量了loss对参数的敏感程度,决定了loss的作用能力。理论上只要梯度存在,一般算法对参数的更新会随着更新频次变小,还是可以收敛到一个比较好的值。那核心为题就是如何保持一个较为稳定持久的梯度。

5. 一般其实你看梯度,看参数都很难得到一个理想的答案。大概思路就是看收敛速度,梯度消失情况,适当对不同结构选择不同的优化器,学习率。

6. 有时候会加一些业务场景,比如结构中存在embedding这种会出现长尾分布的参数+dense这种不断再更新,或者rnn,cnn等。embedding就更适合adagrad这种适合不同频率的参数算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题是如何在Keras定义自定义损失函数并实现样本加权以及使用metrics进行模型评估的详细说明。 首先,我们来介绍一下在Keras定义自定义损失函数的方法。Keras自带了一些常见的损失函数,例如均方误差(MSE)、交叉熵(cross-entropy)等,但是在实际应用,我们可能需要根据具体的问题来定义自己的损失函数。 在Keras,我们可以通过编写一个Python函数来定义自定义损失函数,函数的输入应该是(y_true, y_pred),分别表示真实标签和模型输出的预测值,函数的输出应该是一个标量(即损失值)。例如,下面是一个计算均方误差的自定义损失函数: ```python import tensorflow as tf from keras import backend as K def custom_mse(y_true, y_pred): return K.mean(K.square(y_true - y_pred)) ``` 接下来,如果您希望对样本进行加权,可以在定义损失函数时使用Keras的API来实现。具体来说,您可以在损失函数使用Keras的乘法运算符`K.dot`来将每个样本的权重乘以对应的损失值,然后再将这些值相加。例如,下面是一个计算加权均方误差的自定义损失函数,其`sample_weight`是一个与`y_true`形状相同的张量,用于指定每个样本的权重: ```python def weighted_mse(y_true, y_pred): # sample_weight shape is (batch_size,) sample_weight = tf.constant([1, 2, 3], dtype=tf.float32) return K.mean(K.square(y_true - y_pred) * sample_weight) ``` 最后,如果您希望使用metrics来评估模型的性能,可以在Keras的`compile`函数指定一个或多个metrics。Keras提供了许多常见的metrics,例如准确率(accuracy)、平均绝对误差(MAE)等。如果您定义了自己的metrics,可以使用Keras的`Metric`类来实现。例如,下面是一个计算绝对误差百分比的自定义metrics: ```python from keras.metrics import Metric class PercentageError(Metric): def __init__(self, name='percentage_error', **kwargs): super(PercentageError, self).__init__(name=name, **kwargs) self.total_error = self.add_weight(name='total_error', initializer='zeros') self.total_count = self.add_weight(name='total_count', initializer='zeros') def update_state(self, y_true, y_pred, sample_weight=None): abs_error = K.abs(y_true - y_pred) percentage_error = abs_error / K.clip(K.abs(y_true), K.epsilon(), None) if sample_weight is not None: percentage_error *= sample_weight self.total_error.assign_add(K.sum(percentage_error)) self.total_count.assign_add(K.sum(K.ones_like(y_true))) def result(self): return self.total_error / self.total_count ``` 在`update_state`方法,我们首先计算每个样本的绝对误差百分比,然后将这些误差乘以对应的样本权重(如果有的话),并将其累加到`total_error`变量。同时,我们还将样本数累加到`total_count`变量。最后,我们在`result`方法计算总的绝对误差百分比,即将累计的误差除以样本数。 在使用自定义metrics时,我们可以将其传递给`compile`函数的`metrics`参数。例如,下面是一个使用自定义损失函数和metrics的Keras模型定义: ```python from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(10, input_shape=(3,), activation='relu')) model.add(Dense(1, activation='linear')) model.compile(loss=weighted_mse, optimizer='adam', metrics=[PercentageError()]) ``` 在这个例子,我们使用了上面定义的加权均方误差损失函数,并使用了上面定义的绝对误差百分比metrics。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值