标签: automatic-differentiation

高阶函数的导数

这是在的情况下自动微分 -什么会这样的系统做像一个函数map,或者filter-或者甚至一个SKI组合子

示例:我具有以下功能:

def func(x):
    return sum(map(lambda a: a**x, range(20)))
Run Code Online (Sandbox Code Playgroud)

它的派生词是什么?结果是AD系统会产生什么结果?(此函数在实数输入上定义良好)。

language-agnostic programming-languages automatic-differentiation

5
推荐指数
1
解决办法
628
查看次数

Numeric.AD函数中可接受的类型

我几乎没有成功地绕着包装中涉及的类型的基本管道ad包裹.例如,以下工作完美:

import Numeric.AD

ex :: Num a => [a] -> a
ex [x, y] = x + 2*y

> grad ex [1.0, 1.0]
[1.0, 2.0]
Run Code Online (Sandbox Code Playgroud)

哪里grad有类型:

grad
  :: (Num a, Traversable f) =>
     (forall (s :: * -> *). Mode s => f (AD s a) -> AD s a)
     -> f a -> f a
Run Code Online (Sandbox Code Playgroud)

如果我改变的类型签名ex[Double] -> Double,并尝试同样的事情,我得到

Couldn't match expected type `AD s a0' with actual type `Double'
Expected type: …
Run Code Online (Sandbox Code Playgroud)

haskell types automatic-differentiation constraint-kinds

5
推荐指数
1
解决办法
392
查看次数

优化问题,非线性:自动分析Jacobian/Hessian来自物镜和R中的约束?

在R中,当您仅提供优化问题的目标函数和约束时,是否可以分析地找到雅可比/ Hessian /稀疏模式?

AMPL这样做,从我听到的甚至MATLAB都可以做到这一点,但我不知道你是否需要Knitro.

然而,R的所有优化工具(例如nloptr)似乎都要求自己输入渐变和Hessian,这是非常困难的,因为我正在使用复杂的模型.

r automatic-differentiation

5
推荐指数
1
解决办法
470
查看次数

如何在hmatrix上自动区分?

Sooooo ......因为事实证明从伪矩阵hmatrix数据类型变得非常重要:)

序言部分供参考:

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ParallelListComp #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}

import           Numeric.LinearAlgebra.HMatrix
import           Numeric.AD

reconstruct :: (Container Vector a, Num (Vector a)) 
            => [a] -> [Matrix a] -> Matrix a
reconstruct as ?s = sum [ a `scale` ? | a <- as | ? <- ?s ]

preserveInfo :: (Container Vector a, Num (Vector a))
     => Matrix a -> [a] -> [Matrix …
Run Code Online (Sandbox Code Playgroud)

haskell automatic-differentiation hmatrix

5
推荐指数
1
解决办法
297
查看次数

Theano在计算渐变方面的效率/智能程度如何?

假设我有一个有5个隐藏层的人工神经网络.目前,忘记神经网络模型的细节,如偏差,使用的激活函数,数据类型等等.当然,激活功能是可区分的.

通过符号区分,以下计算目标函数相对于图层权重的渐变:

w1_grad = T.grad(lost, [w1])
w2_grad = T.grad(lost, [w2])
w3_grad = T.grad(lost, [w3])
w4_grad = T.grad(lost, [w4])
w5_grad = T.grad(lost, [w5])
w_output_grad = T.grad(lost, [w_output])
Run Code Online (Sandbox Code Playgroud)

通过这种方式,计算梯度WRT W1梯度WRT W2,W3,W4和W5必须先计算.类似于计算梯度wrt w2,梯度wrt w3,必须首先计算w4和w5.

但是,我可以使用以下代码计算每个权重矩阵的渐变:

w1_grad, w2_grad, w3_grad, w4_grad, w5_grad, w_output_grad = T.grad(lost, [w1, w2, w3, w4, w5, w_output])
Run Code Online (Sandbox Code Playgroud)

我想知道,这两种方法在性能方面有什么区别吗?Theano是否足够智能以避免使用第二种方法重新计算渐变?智能我的意思是计算w3_grad,Theano应该[最好]使用w_output_grad,w5_grad和w4_grad的预先计算的梯度,而不是再次计算它们.

gradient automatic-differentiation neural-network python-2.7 theano

5
推荐指数
1
解决办法
251
查看次数

如何创建一个与NumPy ufuncs兼容的类数组类?

我正在尝试使用行为类似于NumPy数组的类来实现自动微分.它不是子类numpy.ndarray,但包含两个数组属性.一个用于值,一个用于雅可比矩阵.每个操作都被重载以对值和雅可比行为进行操作.但是,我无法使NumPy ufuncs(例如np.log)在我的自定义"数组"上工作.

我创建了以下最小示例,说明了该问题.Two应该是NumPy数组的辐射加固版本,它可以计算两次,并确保结果相同.

它必须是支持索引,元素对数和长度.就像平常一样ndarray.当使用调用时,元素对数工作正常x.cos(),但在调用时会执行意外操作np.cos(x).

from __future__ import print_function
import numpy as np

class Two(object):
    def __init__(self, val1, val2):
        print("init with", val1, val2)
        assert np.array_equal(val1, val2)
        self.val1 = val1
        self.val2 = val2

    def __getitem__(self, s):
        print("getitem", s, "got", Two(self.val1[s], self.val2[s]))
        return Two(self.val1[s], self.val2[s])

    def __repr__(self):
        return "<<{}, {}>>".format(self.val1, self.val2)

    def log(self):
        print("log", self)
        return Two(np.log(self.val1), np.log(self.val2))

    def __len__(self):
        print("len", self, "=", self.val1.shape[0])
        return self.val1.shape[0]

x …
Run Code Online (Sandbox Code Playgroud)

python numpy automatic-differentiation

5
推荐指数
0
解决办法
801
查看次数

结合Eigen和CppAD

我想在Eigen线性代数中使用CppAD提供的自动微分机制.示例类型是Eigen :: Matrix <CppAD :: AD,-1,-1>.由于CppAD :: AD是自定义数字类型,因此必须提供此类型的NumTraits.CppAD提供文件cppad/example/cppad_eigen.hpp中的那些.这使得以下最小的示例编译:

#include <cppad/cppad.hpp>
#include <cppad/example/cppad_eigen.hpp>

int main() {
   typedef double Scalar;
   typedef CppAD::AD<Scalar> AD;

   // independent variable vector
   Eigen::Matrix<AD,Eigen::Dynamic,1> x(4);
   CppAD::Independent(x);

   // dependent variable vector 
   Eigen::Matrix<AD,Eigen::Dynamic,1> y(4);

   Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> m(4,4);
   m.setIdentity();

   y = 1. * x;
   // THIS DOES NOT WORK
   // y = m * x;

   CppAD::ADFun<Scalar> fun(x, y);
}
Run Code Online (Sandbox Code Playgroud)

一旦使用一些更复杂的表达,例如所提到的

y = m * x;
Run Code Online (Sandbox Code Playgroud)

代码无法编译:

PATH/Eigen/latest/include/Eigen/src/Core/Product.h:29:116: error: 
      no type named 'ReturnType' in 'Eigen::ScalarBinaryOpTraits<double, CppAD::AD<double>,
      Eigen::internal::scalar_product_op<double, CppAD::AD<double> > >'
  ...typename …
Run Code Online (Sandbox Code Playgroud)

c++ templates automatic-differentiation eigen

5
推荐指数
1
解决办法
531
查看次数

张量流如何在梯度计算过程中处理不可微节点?

我了解自动微分的概念,但找不到任何解释,例如,tf.where在我的损失函数或tf.cond图形中,tensorflow如何计算不可微函数的误差梯度。它工作得很好,但是我想了解张量流如何通过这样的节点反向传播错误,因为没有公式可以根据它们计算梯度。

python automatic-differentiation backpropagation tensorflow

5
推荐指数
1
解决办法
344
查看次数

pytorch中的if-else语句和torch.where有什么区别?

看代码片段:

import torch
x = torch.tensor([-1.], requires_grad=True)
y = torch.where(x > 0., x, torch.tensor([2.], requires_grad=True))
y.backward()
print(x.grad)
Run Code Online (Sandbox Code Playgroud)

输出是tensor([0.]),但是

import torch
x = torch.tensor([-1.], requires_grad=True)
if x > 0.:
    y = x
else:
    y = torch.tensor([2.], requires_grad=True)
y.backward()
print(x.grad)
Run Code Online (Sandbox Code Playgroud)

输出是None.

我很困惑为什么输出torch.wheretensor([0.])

更新

import torch
a = torch.tensor([[1,2.], [3., 4]])
b = torch.tensor([-1., -1], requires_grad=True)
a[:,0] = b

(a[0, 0] * a[0, 1]).backward()
print(b.grad)
Run Code Online (Sandbox Code Playgroud)

输出是tensor([2., 0.]). (a[0, 0] * a[0, 1])与 …

python automatic-differentiation pytorch

5
推荐指数
1
解决办法
2507
查看次数

在 Julia 中导航自动微分生态系统

Julia 有一个有点庞大的 AD 生态系统,据我所知,现在可能有十多个不同的包,正向模式(ForwardDiff.jlForwardDiff2.jl ),反向模式(ReverseDiff.jlNabla 。 jlAutoGrad.jl)和源到源(Zygote.jlYota.jlEnzyme.jl,可能还有即将推出的 Diffractor.jl)在编译管道的几个不同步骤,以及更奇特的东西像NiLang.jl

在这些包之间,对不同语言结构(控制流、变异等)的支持是什么,是否有关于如何为给定任务选择给定 AD 的经验法则?我相信在某个时候在 Julia Slack 上有一个比较和对比表,但我似乎无法在相关的话语线索或其他可能的地方 ( 1 , 2 ) 中找到为后代复制的任何内容

automatic-differentiation julia

5
推荐指数
1
解决办法
132
查看次数