tf1.x实现张量的梯度反转
Swift Lv6

tensorflow实现梯度反转的方法有两种:

利用@tf.custom_gradient重写梯度函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import tensorflow as tf

# 自定义反转梯度的操作
@tf.custom_gradient
def gradient_reverse(x):
def grad(dy):
return -dy # 反转梯度
return x, grad

# 定义变量 w 和 x
w = tf.Variable(2.0) # 假设 w 的初始值为 2.0
x = tf.Variable(3.0) # 假设 x 的初始值为 3.0

# 定义运算 y = w * x
y = w * x
y_reversed = gradient_reverse(y)

# 求 y 关于 x 的梯度
grad_x = tf.gradients(y, x)
grad_x_reversed = tf.gradients(y_reversed, x)

# 初始化变量
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
# 计算 y 的值和 x 的梯度
y_value, grad_x_value, grad_x_reversed_value = sess.run([y, grad_x, grad_x_reversed])
print("y: ", y_value)
print("x gradient: ", grad_x_value)
print("x gradient reversed: ", grad_x_reversed_value)

巧用stop_gradient函数

以实现DANN为例,特征提取器记作F,域分类器记作D,那么F梯度反转的实现如下:

1
2
feat = F(x)
loss = -D(F(x)) + 2*D(stop_gradient(F(x)))

  • 在前向传播的过程中,stop_gradient不起作用,那么loss = D(stop_gradient(F(x)))
  • 在反向传播的过程中,stop_gradient起作用,那么2*stop_gradient(F(x)梯度为0,梯度计算就是2D-D-F=D-F,就实现了F的梯度反转

参考

Powered by Hexo & Theme Keep
Unique Visitor Page View