多任务学习中任务相互影响测算及任务亲和度计算方法咨询
多任务学习网络任务亲和度相关咨询
网络实现背景
我设计了一个多任务学习网络,包含若干共享层和适配5个不同任务的专属层,相关代码如下:
input_dim_train=X_train.shape[1] n_input_dim = int(input_dim_train) shared_model = Dense(input_dim_train)(inputs) shared_model = Dense(n_input_dim, activation='relu')(shared_model) shared_model = BatchNormalization(input_dim=n_input_dim)(shared_model) shared_model = Dropout(0.1)(shared_model) shared_model = Dense(int(n_input_dim//4), activation='relu')(shared_model) shared_model = BatchNormalization(input_dim=n_input_dim)(shared_model) shared_model = Dropout(0.1)(shared_model) shared_model = Dense(int(n_input_dim//12), activation='relu')(shared_model) shared_model = BatchNormalization(input_dim=n_input_dim)(shared_model) shared_model = Dropout(0.1)(shared_model) shared_model = Dense(int(n_input_dim//20), activation='relu')(shared_model) shared_model = BatchNormalization()(shared_model) shared_model = Dropout(0.1)(shared_model) output1 = Dense(3, activation='softmax',name='target_1',)(shared_model) output2 = Dense(2, activation='softmax',name='target_2')(shared_model) output3 = Dense(4, activation='softmax',name='target_3')(shared_model) output4 = Dense(2, activation='softmax',name='target_4')(shared_model) output5 = Dense(3, activation='softmax',name='target_5')(shared_model) model = Model(inputs=inputs, outputs=[output1, output2,output3,output4,output5]) model.compile(optimizer='adam', loss='categorical_crossentropy',metrics=['accuracy',f1_metric]) history=model.fit(X_train, [y_train_task1, y_train_task2,y_train_task3,y_train_task4,y_train_task5], validation_data=(X_test,[y_test_task1,y_test_task2,y_test_task3,y_test_task4,y_test_task5]),verbose='auto',epochs=n_epoch,batch_size=n_batch_size) task1_pred,task2_pred,task3_pred,task4_pred,task5_pred = model.predict(X_test)
运行效果
该网络运行效果良好,输出结果如下:
咨询问题
- 如何衡量当前多任务学习场景中例如任务1对任务2的相互影响?
- 我需要计算任务间的亲和度得分,是否有方法可以在训练过程中跨不同epoch计算任务间亲和度得分?
问题解答
任务间相互影响的衡量方式
你可以通过两种直观的方式判断任务间的相互作用:
- 性能对比法:分别训练任务1、任务2的单任务基准模型,记录各自的精度、F1等核心指标,再和多任务训练模式下两个任务的指标做对比。如果多任务场景下任务2的指标优于单任务基准,说明任务1对任务2存在正向增益,反之则存在负向冲突。
- 梯度对齐检测:计算两个任务的损失函数在共享层参数上的梯度余弦相似度,相似度为正且数值越高,说明两个任务的优化方向一致,能够互相促进;相似度为负则说明优化方向存在冲突,会互相拖累性能。
跨epoch任务亲和度的实现方法
有两种低成本的方法可以直接适配你现有的Keras框架,实现跨epoch的亲和度计算:
1. 梯度余弦亲和度(业界通用方案)
这个方案的得分可以直接反应任务间的优化适配度,取值范围[-1,1],数值越高亲和度越高。
实现逻辑:
- 模型编译完成后,额外定义两个梯度获取函数,分别输出任务1、任务2的损失对共享层最后一层输出的梯度值
- 在每个epoch训练结束后,取验证集或者训练集的一个batch数据输入梯度获取函数,得到两个梯度向量
- 计算两个向量的余弦相似度,就是当前epoch的亲和度得分,逐epoch存储即可得到变化趋势。
2. 预测相关性亲和度(实现成本最低)
如果不想修改梯度相关的代码,可以直接在每个epoch结束后,取两个任务在验证集上的预测结果,计算皮尔逊相关系数作为亲和度得分,数值越高说明两个任务的预测趋势一致性越强,亲和度越高。这个方法不需要改动你现有模型的任何结构,直接复用每个epoch的输出结果即可实现。
内容的提问来源于stack exchange,提问作者jeny ericsoon
相关产品推荐
相关产品推荐

