TensorFlow实现部分参数梯度更新:变量作用域与Stop Gradient详解

听雨眠
听雨眠
发布时间:2026-10-13| 6人浏览过
原创

本文介绍在TensorFlow中实现部分模型参数梯度更新的两种方法。第一种通过变量作用域筛选需优化的变量,第二种利用tf.stop_gradient()函数冻结特定层。结合矩阵部分行或列更新的示例,详细解析如何在迁移学习和Embedding场景中保持预训练参数不变并微调特定层。

迁移学习与部分参数更新背景

在深度学习领域,迁移学习是一种广泛应用的技术。通常的做法是将预训练于大数据集上的模型迁移至特定任务,此时往往需要保持模型的大部分参数不变,仅对与目标任务相关的模型层进行微调。

本文将重点介绍在TensorFlow框架下,如何实现仅更新模型部分参数的方法。

基于变量作用域的梯度更新方法

方法一:根据Variable scope剔除需要固定参数的变量

变量筛选代码实现


def get_variable_via_scope(scope_lst):
  vars = []
  for sc in scope_lst:
    sc_variable = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,scope=scope)
    vars.extend(sc_variable)
  return vars
 
trainable_vars = tf.trainable_variables()
no_change_scope = ['your_unchange_scope_name']
 
no_change_vars = get_variable_via_scope(no_change_scope)
 
for v in no_change_vars:
  trainable_vars.remove(v)
 
grads, _ = tf.gradients(loss, trainable_vars)
 
optimizer = tf.train.AdamOptimizer(lr)
 
train_op = optimizer.apply_gradient(zip(grads, trainable_vars), global_step=global_step)

基于Stop Gradient的梯度更新方法

方法二:使用tf.stop_gradient()函数

在构建计算图(Graph)的过程中使用该函数,可以非常简洁地避免使用scope来获取和筛选参数。

矩阵部分行或列的参数更新场景

方法三:实现矩阵中部分行或列参数的更新

在实际场景中,如果一个矩阵仅有部分行或列需要更新参数,而其余部分保持不变,这种情况十分常见。例如,在Word Embedding中,一些预定义的领域相关词保持不变(使用领域相关的Word Embedding初始化),而另一些通用词则允许变化。

部分更新代码示例


import tensorflow as tf
import numpy as np
 
def entry_stop_gradients(target, mask):
  mask_h = tf.abs(mask-1)
  return tf.stop_gradient(mask_h * target) + mask * target
 
mask = np.array([1., 0, 1, 1, 0, 0, 1, 1, 0, 1])
mask_h = np.abs(mask-1)
 
emb = tf.constant(np.ones([10, 5]))
 
matrix = entry_stop_gradients(emb, tf.expand_dims(mask,1))
 
parm = np.random.randn(5, 1)
t_parm = tf.constant(parm)
 
loss = tf.reduce_sum(tf.matmul(matrix, t_parm))
grad1 = tf.gradients(loss, emb)
grad2 = tf.gradients(loss, matrix)
print matrix
with tf.Session() as sess:
  print sess.run(loss)
  print sess.run([grad1, grad2])

以上关于TensorFlow实现部分参数梯度更新的操作内容,就是小编分享给大家的全部信息。希望这些内容能对大家有所帮助,也欢迎大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。