gpt4 book ai didi

tensorflow2.0 - 是否可以将 Tensorflow Graphics 的 Levenberg-Marquardt 优化器与 Tensorflow 2.0 模型集成?

转载 作者:行者123 更新时间:2023-12-04 12:00:49 25 4
gpt4 key购买 nike

我有一个 Tensorflow 2.0 tf.keras.Sequential模型。现在,我的技术规范规定使用 Levenberg-Marquardt 优化器来拟合模型。 Tensorflow 2.0 没有将其作为开箱即用的优化器提供,但它在 Tensorflow Graphics 中可用模块。
tfg.math.optimizer.levenberg_marquardt.minimize函数接受 residuals (残差是 Python callable 返回张量)和 variables (对应于我的模型权重的张量列表)作为参数。

将我的模型转换为残差和变量的最佳方法是什么?

如果我理解正确 minimize函数有效,我必须提供两个残差。第一个残差必须为每个学习案例调用我的模型,并将所有结果聚合到一个张量中。第二个残差必须将所有标签作为单个常数张量返回。问题是tf.keras.Sequential.predict函数返回一个 numpy 数组而不是张量。我相信,如果我将其转换为张量,则最小化器将无法计算关于变量的雅可比。

变量也有同样的问题。似乎没有办法将模型中的所有权重提取到张量列表中。

最佳答案

tfg.math.optimizer.levenberg_marquardt.minimize 之间有很大区别和 Keras 优化器从实现/API 的角度来看。
Keras 优化器,例如 tf.keras.optimizers.Adam使用梯度作为输入和更新 tf.Variable s。
相比之下,tfg.math.optimizer.levenberg_marquardt.minimize本质上以图形模式展开优化循环(使用 tf.while_loop 构造)。它采用初始参数值并生成更新的参数值,这与 Adam & co 不同,后者仅应用一次迭代并实际更改 tf.Variable 的值。 s 通过 assign_add .
稍微回到理论大局,Levenberg-Marquardt 不是任何非线性优化问题(例如 Adam)的通用梯度下降式求解器。它专门解决非线性最小二乘优化问题,因此它不是像 Adam 这样的优化器的直接替代品。在梯度下降中,我们计算损失相对于参数的梯度。在 Levenberg-Marquardt 中,我们计算与参数相关的残差的雅可比行列式。具体来说,它反复求解线性化问题Jacobian @ delta_params = residualsdelta_params使用 tf.linalg.lstsq (内部对从雅可比矩阵计算的 Gram 矩阵使用 Cholesky 分解)并应用 delta_params作为更新。
注意这个lstsq操作在参数数量上具有三次复杂性,因此在神经网络的情况下,它只能应用于相当小的网络。
另请注意,Levenberg-Marquardt 通常用作批处理算法,而不是像 SGD 那样的小批处理算法,尽管没有什么能阻止您在每次迭代中对不同小批处理应用 LM 迭代。
我认为你可能只能从 tfg 的 LM 算法中获得一次迭代,通过类似的方法

from tensorflow_graphics.math.optimizer.levenberg_marquardt import minimize as lm_minimize

for input_batch, target_batch in dataset:

def residual_fn(trainable_params):
# do not use trainable params, it will still be at its initial value, since we only do one iteration of Levenberg Marquardt each time.
return model(input_batch) - target_batch

new_objective_value, new_params = lm_minimize(residual_fn, model.trainable_variables, max_iter=1)
for var, new_param in zip(model.trainable_variables, new_params):
var.assign(new_param)
相比之下,我相信以下幼稚的方法 不能用 我们在计算残差之前分配模型参数:
from tensorflow_graphics.math.optimizer.levenberg_marquardt import minimize as lm_minimize

dataset_iterator = ...

def residual_fn(params):
input_batch, target_batch = next(dataset_iterator)
for var, param in zip(model.trainable_variables, params):
var.assign(param)
return model(input_batch) - target_batch

final_objective, final_params = lm_minimize(residual_fn, model.trainable_variables, max_iter=10000)
for var, final_param in zip(model.trainable_variables, final_params):
var.assign(final_param)
主要的概念问题是 residual_fn的输出相对于其输入没有梯度 params ,因为这个依赖通过 tf.assign .但由于使用了图形模式中不允许的构造,它甚至可能在此之前失败。
总的来说,我认为最好编写自己的适用于 tf.Variables 的 LM 优化器。 , 自 tfg.math.optimizer.levenberg_marquardt.minimize有一个非常不同的 API,它并不真正适合优化 Keras 模型参数,因为您无法直接计算 model(input, parameters) - target_value没有 tf.assign .

关于tensorflow2.0 - 是否可以将 Tensorflow Graphics 的 Levenberg-Marquardt 优化器与 Tensorflow 2.0 模型集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58564821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com