多任务学习
多任务学习,顾名思义,就是多个任务模型同时执行,进行模型的训练,利用模型的共性部分来简化多任务的模型,实现模型之间的融合与参数共享,可以在一定程度上优化模型的运算,提高计算机的效率,但模型本身并没有什么改变。
多任务学习的核心在于如何训练上:
- 交替训练
- 联合训练
通过一个简单的线性变换来展示多任务学习模型的运用。
首先,导入需要的包
import tensorflow as tf
import numpy as np
使用numpy制造两组假数据
x_data = np.float32(np.random.rand(2, 100)) # 随机输入
y1_data = np.dot([0.100, 0.200], x_data) + 0.300
y2_data = np.dot([0.500, 0.900], x_data) + 3.000
构造两个线性模型
b1 = tf.Variable(tf.zeros([1]))
W1 = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y1 = tf.matmul(W1, x_data) + b1b2 = tf.Variable(tf.zeros([1]))
W2 = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y2 = tf.matmul(W2, x_data) + b2
计算方差,使方差最小化,使模型不断的靠近真实解
# 最小化方差
loss1 = tf.reduce_mean(tf.square(y1 - y1_data))
loss2 = tf.reduce_mean(tf.square(y2 - y2_data))
构造优化器
# 构建优化器
optimizer = tf.train.GradientDescentOptimizer(0.5)
train1 = optimizer.minimize(loss1)
train2 = optimizer.minimize(loss2)
交替训练
基本思想:使两个模型交替进行训练
# 初始化全局变量
init = tf.global_variables_initializer()# 启动图 (graph)
with tf.Session() as sess:sess.run(init)for step in range(1, 1001):if np.random.rand() < 0.5:sess.run(train1)print(step, 'W1,b1:', sess.run(W1), sess.run(b1))else:sess.run(train2)print(step, 'W2,b2:', sess.run(W2), sess.run(b2))
输出结果为:
从最终的结果可以看出W1,W2,b1,b2已经非常接近真实值了,说明模型的建立还是非常有效的。
联合训练
基本思想:将两个模型的损失函数结合起来,共同进行优化训练
# 联合训练
loss = loss1 + loss2
# 构建优化器
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)# 初始化全局变量
init = tf.global_variables_initializer()# 启动图
with tf.Session() as sess:sess.run(init)for step in range(1, 300):sess.run(train)print(step, 'W1,b1,W2,b2:', sess.run(W1), sess.run(b1), sess.run(W2), sess.run(b2))
输出结果为:
从结果可以看出模型的参数不断的接近真实值。
应用场景
当你需要同一组数据集去处理不同的任务时,交替训练是一个很好地选择。
当两个甚至多个任务需要联合考虑时,为了整体的最优而放弃局部最优的时候,使用联合训练非常的合适。
欢迎关注和评论!