TensorFlow 多任务学习实战指南
一 核心概念与适用场景
二 建模与训练要点
三 代码模板 Keras 版
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Lambda
from tensorflow.keras.models import Model
import tensorflow_probability as tfp
def build_mtl_model(input_dim, task1_dim, task2_dim,
shared_units=[128, 64],
lr_shared=1e-3, lr_head=1e-3):
x = Input(shape=(input_dim,))
# 共享骨干
z = x
for u in shared_units:
z = Dense(u, activation='relu')(z)
# 任务1头(分类示例)
logits1 = Dense(task1_dim)(z)
# 任务2头(回归示例)
mu2 = Dense(task2_dim)(z)
# 可学习的噪声参数(标量,任务2)
log_sigma2 = Dense(1, activation='softplus')(z) # > 0
sigma2 = Lambda(lambda s: 1e-6 + s, name='sigma2')(log_sigma2)
# 任务1损失:稀疏交叉熵
loss1 = tf.reduce_mean(
tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y1, logits=logits1))
# 任务2损失:异方差高斯负对数似然
sq_err = tf.reduce_sum((y2 - mu2) ** 2, axis=-1)
nll2 = 0.5 * (sq_err / sigma2 + tf.math.log(2 * np.pi * sigma2))
loss2 = tf.reduce_mean(nll2)
# 总损失 = 任务1损失 + 任务2损失(不确定性已内嵌到 loss2 的 sigma2)
total_loss = loss1 + loss2
model = Model(inputs=x, outputs=[logits1, mu2, sigma2])
# 优化器:共享与任务头使用不同学习率
opt_shared = tf.keras.optimizers.Adam(lr_shared)
opt_heads = tf.keras.optimizers.Adam(lr_head)
# 变量分组
shared_vars = model.layers[1].trainable_variables # 共享层
head1_vars = model.layers[-4].trainable_variables # 任务1头
head2_vars = (model.layers[-3].trainable_variables +
model.layers[-2].trainable_variables) # 任务2头(mu + log_sigma2)
# 分别最小化
train_step = tf.function(lambda: [
opt_shared.minimize(lambda: loss1, var_list=shared_vars),
opt_heads.minimize(lambda: loss2, var_list=head1_vars + head2_vars)
])
return model, train_step
# 使用示例(伪代码)
# model, train_step = build_mtl_model(input_dim=100, task1_dim=10, task2_dim=1)
# for xb, y1b, y2b in dataset:
# loss = train_step(xb, y1b, y2b)
四 数据流水线与实践建议
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。