多任务学习框架中的损失效应
The loss effects in multitask learning framework
我设计了一个多任务网络,其中第一层在两个输出层之间共享。通过研究多任务学习原理,我知道应该有一个权重标量参数,例如 alpha
来抑制从两个输出层输出的两个损失。我的问题是关于这个参数本身。它对模型的最终性能有影响吗?可能是。
这是我计算损失的代码片段的一部分:
...
mtl_loss = (alpha) * loss_1 + (1-alpha) * loss_2
mtl_loss.backward()
...
上面,loss_1
是MSELoss,loss_2
是CrossEntropyLoss。因此,选择 alpha=0.9
,我在训练步骤中得到以下损失值:
[2020-05-03 04:46:55,398 INFO] Step 50/150000; loss_1: 0.90 + loss_2: 1.48 = mtl_loss: 2.43 (RMSE: 2.03, F1score: 0.07); lr: 0.0000001; 29 docs/s; 28 sec
[2020-05-03 04:47:23,238 INFO] Step 100/150000; loss_1: 0.40 + loss_2: 1.27 = mtl_loss: 1.72 (RMSE: 1.38, F1score: 0.07); lr: 0.0000002; 29 docs/s; 56 sec
[2020-05-03 04:47:51,117 INFO] Step 150/150000; loss_1: 0.12 + loss_2: 1.19 = mtl_loss: 1.37 (RMSE: 0.81, F1score: 0.08); lr: 0.0000003; 29 docs/s; 84 sec
[2020-05-03 04:48:19,034 INFO] Step 200/150000; loss_1: 0.04 + loss_2: 1.10 = mtl_loss: 1.20 (RMSE: 0.55, F1score: 0.07); lr: 0.0000004; 29 docs/s; 112 sec
[2020-05-03 04:48:46,927 INFO] Step 250/150000; loss_1: 0.02 + loss_2: 0.96 = mtl_loss: 1.03 (RMSE: 0.46, F1score: 0.08); lr: 0.0000005; 29 docs/s; 140 sec
[2020-05-03 04:49:14,851 INFO] Step 300/150000; loss_1: 0.02 + loss_2: 0.99 = mtl_loss: 1.05 (RMSE: 0.43, F1score: 0.08); lr: 0.0000006; 29 docs/s; 167 sec
[2020-05-03 04:49:42,793 INFO] Step 350/150000; loss_1: 0.02 + loss_2: 0.97 = mtl_loss: 1.04 (RMSE: 0.43, F1score: 0.08); lr: 0.0000007; 29 docs/s; 195 sec
[2020-05-03 04:50:10,821 INFO] Step 400/150000; loss_1: 0.01 + loss_2: 0.94 = mtl_loss: 1.00 (RMSE: 0.41, F1score: 0.08); lr: 0.0000008; 29 docs/s; 223 sec
[2020-05-03 04:50:38,943 INFO] Step 450/150000; loss_1: 0.01 + loss_2: 0.86 = mtl_loss: 0.92 (RMSE: 0.40, F1score: 0.08); lr: 0.0000009; 29 docs/s; 252 sec
训练损失显示,我的第一个使用 MSELoss 的网络似乎收敛得非常快,而第二个网络还没有收敛。 RMSE
和 F1score
是我分别用来跟踪第一个和第二个网络进度的两个指标。
我知道选择最佳 alpha 有点实验性,但是是否有提示可以使选择过程更容易?具体来说,我希望训练的网络彼此一致,而不是像上面那样第一个网络收敛速度非常快。 alpha
参数可以帮助控制这个吗?
有了这个 alpha,loss_1 对结果的贡献更大,并且由于反向传播更新权重与错误成比例,所以它改进得更快。尝试使用更平衡的 alpha 来平衡两个任务的性能。
您也可以尝试在训练期间更改 alpha。
我设计了一个多任务网络,其中第一层在两个输出层之间共享。通过研究多任务学习原理,我知道应该有一个权重标量参数,例如 alpha
来抑制从两个输出层输出的两个损失。我的问题是关于这个参数本身。它对模型的最终性能有影响吗?可能是。
这是我计算损失的代码片段的一部分:
...
mtl_loss = (alpha) * loss_1 + (1-alpha) * loss_2
mtl_loss.backward()
...
上面,loss_1
是MSELoss,loss_2
是CrossEntropyLoss。因此,选择 alpha=0.9
,我在训练步骤中得到以下损失值:
[2020-05-03 04:46:55,398 INFO] Step 50/150000; loss_1: 0.90 + loss_2: 1.48 = mtl_loss: 2.43 (RMSE: 2.03, F1score: 0.07); lr: 0.0000001; 29 docs/s; 28 sec
[2020-05-03 04:47:23,238 INFO] Step 100/150000; loss_1: 0.40 + loss_2: 1.27 = mtl_loss: 1.72 (RMSE: 1.38, F1score: 0.07); lr: 0.0000002; 29 docs/s; 56 sec
[2020-05-03 04:47:51,117 INFO] Step 150/150000; loss_1: 0.12 + loss_2: 1.19 = mtl_loss: 1.37 (RMSE: 0.81, F1score: 0.08); lr: 0.0000003; 29 docs/s; 84 sec
[2020-05-03 04:48:19,034 INFO] Step 200/150000; loss_1: 0.04 + loss_2: 1.10 = mtl_loss: 1.20 (RMSE: 0.55, F1score: 0.07); lr: 0.0000004; 29 docs/s; 112 sec
[2020-05-03 04:48:46,927 INFO] Step 250/150000; loss_1: 0.02 + loss_2: 0.96 = mtl_loss: 1.03 (RMSE: 0.46, F1score: 0.08); lr: 0.0000005; 29 docs/s; 140 sec
[2020-05-03 04:49:14,851 INFO] Step 300/150000; loss_1: 0.02 + loss_2: 0.99 = mtl_loss: 1.05 (RMSE: 0.43, F1score: 0.08); lr: 0.0000006; 29 docs/s; 167 sec
[2020-05-03 04:49:42,793 INFO] Step 350/150000; loss_1: 0.02 + loss_2: 0.97 = mtl_loss: 1.04 (RMSE: 0.43, F1score: 0.08); lr: 0.0000007; 29 docs/s; 195 sec
[2020-05-03 04:50:10,821 INFO] Step 400/150000; loss_1: 0.01 + loss_2: 0.94 = mtl_loss: 1.00 (RMSE: 0.41, F1score: 0.08); lr: 0.0000008; 29 docs/s; 223 sec
[2020-05-03 04:50:38,943 INFO] Step 450/150000; loss_1: 0.01 + loss_2: 0.86 = mtl_loss: 0.92 (RMSE: 0.40, F1score: 0.08); lr: 0.0000009; 29 docs/s; 252 sec
训练损失显示,我的第一个使用 MSELoss 的网络似乎收敛得非常快,而第二个网络还没有收敛。 RMSE
和 F1score
是我分别用来跟踪第一个和第二个网络进度的两个指标。
我知道选择最佳 alpha 有点实验性,但是是否有提示可以使选择过程更容易?具体来说,我希望训练的网络彼此一致,而不是像上面那样第一个网络收敛速度非常快。 alpha
参数可以帮助控制这个吗?
有了这个 alpha,loss_1 对结果的贡献更大,并且由于反向传播更新权重与错误成比例,所以它改进得更快。尝试使用更平衡的 alpha 来平衡两个任务的性能。
您也可以尝试在训练期间更改 alpha。