问题如下图,部分操作简化,最近在尝试实现meta SGD方法,使用tf.GrandientTape 时遇到梯度为none的问题,去百度找了一圈还是找不到哪里出错,各位仙男仙女们帮忙看看,感激不尽
下面为代码
with tf.GradientTape() as tape:
with tf.GradientTape() as tape_1:
loss_1 = operation_A # 计算损失
grads_1 = tape_1.gradient(loss_1, meta_model.trainable_variables) # 此处梯度没问题
# 更新权重
# task_lr形状与grads相同(也就是和trainable_variables形状完全相同),且为变量,对模型权重进行更新
adapted_params = []
for i in range(len(task_lr)):
adapted_params.append(
meta_model.trainable_variables[i] - tf.multiply(task_lr[i], grads_1[i])) # 步骤1
weights = operation_C # 载入更新的权重adapted_params
loss = operation_B # 在新权重下计算损失
# 对 meta_model.trainable_variables 和 task_lr 计算梯度
# 这次更新不只对trainable_variables,并且对task_lr
# 查看梯度, 其中属于trainable_variables的梯度均正常,但是task_lr的梯度全部为none
grads = tape.gradient(loss, meta_model.trainable_variables + task_lr)
optimizer.apply_gradients(zip(grads, meta_model.trainable_variables + task_lr))
# task_lr 形状与trainable_variables完全一样且类型为变量,并且在上面“步骤1”处也使用了(也仅在步骤1处使用),
# 且上述操作均在 “ with tf.GradientTape() as tape: ” 下进行,为什么求不出task_lr梯度呢?
# 是因为task_lr没有直接参与loss计算么?
梯度图如下