详细内容或原文请订阅后点击阅览
torch 用于优化
Torch 不仅仅适用于深度学习。其 L-BFGS 优化器配备 Strong-Wolfe 线搜索,是无约束和约束优化的强大工具。
来源:RStudio AI博客到目前为止,我们在此讨论的所有 torch 用例都与深度学习有关。但是,它的自动微分功能在其他领域也很有用。一个突出的例子是数值优化:我们可以使用 torch 来找到函数的最小值。
torch
                                    
                                        torch
                                    
                                        事实上,函数最小化正是在训练神经网络时发生的事情。但是,在那里,所讨论的函数通常过于复杂,甚至无法想象通过分析找到其最小值。数值优化旨在构建处理这种复杂性的工具。然而,为此,它从组成远不那么深入的函数开始。相反,它们是手工制作的,以提出特定的挑战。
正是这篇文章首次介绍了使用 torch 进行数值优化。主要内容是其 L-BFGS 优化器的存在和实用性,以及使用线搜索运行 L-BFGS 的影响。作为一个有趣的附加组件,我们展示了一个约束优化的示例,其中通过二次惩罚函数强制执行约束。
torch
                                    
                                        为了热身,我们绕道而行,只使用张量“自己”最小化函数。 不过,这在以后会变得有意义,因为整体过程仍然相同。 所有更改都与优化器及其功能的集成有关。
优化器
                                    
                                        函数最小化,DYI 方法
要了解如何“手动”最小化函数,让我们尝试标志性的 Rosenbrock 函数。这是一个具有两个变量的函数:
Rosenbrock 函数\[f(x_1, x_2) = (a - x_1)^2 + b * (x_2 - x_1^2)^2\]
\[f(x_1, x_2) = (a - x_1)^2 + b * (x_2 - x_1^2)^2\],其中 \(a\) 和 \(b\) 可配置参数通常分别设置为 1 和 5。
\(a\) \(b\)在 R 中:
library(torch)a <- 1b <- 5rosenbrock <- function(x) { x1 <- x[1] x2 <- x[2] (a - x1)^2 + b * (x2 - x1^2)^2}
                                    
                                        library(torch)a <- 1b <- 5rosenbrock <- function(x) { x1 <- x[1] x2 <- x[2] (a - x1)^2 + b * (x2 - x1^2)^2}
                                    
                                        library(torch)
                                    
                                        库
                                    
                                        库
                                    
                                        (
                                    
                                        torch
                                    
                                        火炬
                                    
                                        )
                                    
                                        a <- 1
                                    
                                        a
                                    
                                        <-
                                    
                                        1
                                    
                                        b <- 5
                                    
                                        b
                                    
                                        <-
                                    
                                        5
                                    
                                        Rosenbrock <- function(x) {
                                    
                                        <-
                                    
                                        (分区>
                                    
                            
                            