C*****l 发帖数: 1 | 1 前段时间我在这里说说不定语言层面就要实现对AI的原生支持。今天就看到Julia在做
这个事情,要整个Julia语法都支持自动微分,包括struct,loop和recursion
julia> function pow(x, n)
r = 1
for i = 1:n
r *= x
end
return r
end
pow (generic function with 1 method)
julia> gradient(x -> pow(x, 3), 5)
(75,)
julia> pow2(x, n) = n <= 0 ? 1 : x*pow2(x, n-1)
pow2 (generic function with 1 method)
julia> gradient(x -> pow2(x, 3), 5)
(75,)
https://julialang.org/blog/2018/12/ml-language-compiler
https://github.com/FluxML/Zygote.jl |
n******7 发帖数: 12463 | 2 这个不就是自动微分吗
主流语言都有,就是是不是放到标准库里面的区别
pyton上一堆,比如这个audi
http://darioizzo.github.io/audi/notebooks/example00.html
发现dotnet上面都有个diffsharp
// Use mixed mode nested AD
open DiffSharp.AD.Float32
// A scalar-to-scalar function
let f x = sin (sqrt x)
// Derivative of f
let df = diff f
// A vector-to-scalar function
let g (x:DV) = exp (x.[0] * x.[1]) + x.[2]
// Gradient of g
let gg = grad g
// Hessian of g
let hg = hessian g |
n******7 发帖数: 12463 | 3 还有autograd
https://github.com/HIPS/autograd
>>> import autograd.numpy as np # Thinly-wrapped numpy
>>> from autograd import grad # The only autograd function you may ever
need
>>>
>>> def tanh(x): # Define a function
... y = np.exp(-2.0 * x)
... return (1.0 - y) / (1.0 + y)
...
>>> grad_tanh = grad(tanh) # Obtain its gradient function
>>> grad_tanh(1.0) # Evaluate the gradient at x = 1.0
0.41997434161402603
>>> (tanh(1.0001) - tanh(0.9999)) / 0.0002 # Compare to finite differences
0.41997434264973155
>>> from autograd import elementwise_grad as egrad # for functions that
vectorize over inputs
>>> import matplotlib.pyplot as plt
>>> x = np.linspace(-7, 7, 200)
>>> plt.plot(x, tanh(x),
... x, egrad(tanh)(x), # first
derivative
... x, egrad(egrad(tanh))(x), # second
derivative
... x, egrad(egrad(egrad(tanh)))(x), # third
derivative
... x, egrad(egrad(egrad(egrad(tanh))))(x), # fourth
derivative
... x, egrad(egrad(egrad(egrad(egrad(tanh)))))(x), # fifth
derivative
... x, egrad(egrad(egrad(egrad(egrad(egrad(tanh))))))(x)) # sixth
derivative
>>> plt.show() |
e*******o 发帖数: 4654 | 4 整个Julia语法都支持自动微分,包括struct,loop和recursion
====
这才是重点
你在函数定义里面弄个for loop if 啥的,其它语言的库基本上就歇菜了。
【在 n******7 的大作中提到】 : 这个不就是自动微分吗 : 主流语言都有,就是是不是放到标准库里面的区别 : pyton上一堆,比如这个audi : http://darioizzo.github.io/audi/notebooks/example00.html : 发现dotnet上面都有个diffsharp : // Use mixed mode nested AD : open DiffSharp.AD.Float32 : // A scalar-to-scalar function : let f x = sin (sqrt x) : // Derivative of f
|
C*****l 发帖数: 1 | 5 这些都是基于一些特定的operation,比如np.exp, 要手写很多code来支持。Julia的实
现是在compiler层级,在IR上面实现的,所有的Julia语言写的function都可以用
【在 n******7 的大作中提到】 : 还有autograd : https://github.com/HIPS/autograd : >>> import autograd.numpy as np # Thinly-wrapped numpy : >>> from autograd import grad # The only autograd function you may ever : need : >>> : >>> def tanh(x): # Define a function : ... y = np.exp(-2.0 * x) : ... return (1.0 - y) / (1.0 + y) : ...
|
s*****e 发帖数: 115 | 6 这个在IR要怎么做?需要做到支持什么use case了?
【在 C*****l 的大作中提到】 : 这些都是基于一些特定的operation,比如np.exp, 要手写很多code来支持。Julia的实 : 现是在compiler层级,在IR上面实现的,所有的Julia语言写的function都可以用
|
h*i 发帖数: 3446 | 7 就扯吧。不能微分的函数咋办啊?
This whole "differentiable programming language" fad gives me the "4G
language" vibe.
https://en.wikipedia.org/wiki/Fourth-generation_programming_language
Another futile attempt to use a single mathematical formalism to explain
away cognition, which will fell flat, again and again.
【在 C*****l 的大作中提到】 : 前段时间我在这里说说不定语言层面就要实现对AI的原生支持。今天就看到Julia在做 : 这个事情,要整个Julia语法都支持自动微分,包括struct,loop和recursion : julia> function pow(x, n) : r = 1 : for i = 1:n : r *= x : end : return r : end : pow (generic function with 1 method)
|
C*****l 发帖数: 1 | 8 不能微分就不微分呗,看定义任何返回scalar的函数都可以微分。这是一个trend,对
未来趋势敏感的人早就能感觉到这种需要。
【在 h*i 的大作中提到】 : 就扯吧。不能微分的函数咋办啊? : This whole "differentiable programming language" fad gives me the "4G : language" vibe. : https://en.wikipedia.org/wiki/Fourth-generation_programming_language : Another futile attempt to use a single mathematical formalism to explain : away cognition, which will fell flat, again and again.
|
l*******m 发帖数: 1096 | 9 最基本的可微是定义在一点上,一般说的可微函数是指almost everything. 就是不可
微的所有点的测度是零。所以还是实际可用的。当然我也看不出这个dp有啥神奇的。我
的理解是coordinate decent 大模型效率不行。gradient decent 相当于正交测试,效率
比较高。这些都是基于优化的,和智能还是很牵强的
:就扯吧。不能微分的函数咋办啊?
: |
g****t 发帖数: 31659 | 10 我觉得这个方向的空间是很大的。(抛开AI什么的不谈)
第一个问题是微分。
一般的初等函数组合而成的程序,如何拆分成nest 函数的图,使得求梯度时需要用的
乘法最少。这个问题据我所知现在还没有答案。就算不考虑硬件结构的纯数学问题,似
乎现
在也没解。
第二个问题是积分。
微分代数很多人研究。积分代数,也就是咱们大一学过的,分部积分法多次使用的长程
符号效果和规律。
在我phd毕业那时,我看到的文献,似乎只有中国数学家陈国才研究过。
总而言之,即便只考虑最具体的问题:
多元初等函数组合而成的函数,写成哪种nest 形式,可以最有效的求微分和积分?
这个问题目前无解。所以我觉得空间很大。
: 最基本的可微是定义在一点上,一般说的可微函数是指almost
everything. 就
是不可
: 微的所有点的测度是零。所以还是实际可用的。当然我也看不出这个dp有
啥神奇
的。我
: 的理解是coordinate decent 大模型效率不行。gradient decent 相当于
正交测
试,效率
: 比较高。这些都是基于优化的,和智能还是很牵强的
: :就扯吧。不能微分的函数咋办啊?
: :
【在 l*******m 的大作中提到】 : 最基本的可微是定义在一点上,一般说的可微函数是指almost everything. 就是不可 : 微的所有点的测度是零。所以还是实际可用的。当然我也看不出这个dp有啥神奇的。我 : 的理解是coordinate decent 大模型效率不行。gradient decent 相当于正交测试,效率 : 比较高。这些都是基于优化的,和智能还是很牵强的 : : :就扯吧。不能微分的函数咋办啊? : :
|
|
|
g****t 发帖数: 31659 | 11 微分的定义都忘了?要去掉线性部分的那一部分residual极限为零才可以。
返回值为0,1的函数你怎么微分?必须借助别的编码手段转成连续问题。
: 不能微分就不微分呗,看定义任何返回scalar的函数都可以微分。这是一个
trend,对
: 未来趋势敏感的人早就能感觉到这种需要。
【在 C*****l 的大作中提到】 : 不能微分就不微分呗,看定义任何返回scalar的函数都可以微分。这是一个trend,对 : 未来趋势敏感的人早就能感觉到这种需要。
|
C*****l 发帖数: 1 | 12 我以为他问的是返回空或者string的函数。数学上不可微函数肯定要特殊处理啊,在源
码层级他要定义一个每一个step的逆操作。返回值0,1为啥不能微分,如果是常事函数
, 其他的函数至少可以定义出单侧逐点微分值。
【在 g****t 的大作中提到】 : 微分的定义都忘了?要去掉线性部分的那一部分residual极限为零才可以。 : 返回值为0,1的函数你怎么微分?必须借助别的编码手段转成连续问题。 : : : 不能微分就不微分呗,看定义任何返回scalar的函数都可以微分。这是一个 : trend,对 : : 未来趋势敏感的人早就能感觉到这种需要。 :
|
l******n 发帖数: 9344 | 13 到底说的符号计算还是数值计算?
【在 C*****l 的大作中提到】 : 我以为他问的是返回空或者string的函数。数学上不可微函数肯定要特殊处理啊,在源 : 码层级他要定义一个每一个step的逆操作。返回值0,1为啥不能微分,如果是常事函数 : , 其他的函数至少可以定义出单侧逐点微分值。
|
l******n 发帖数: 9344 | 14 积分我觉除非找到万能替换之类的公司,至上理论形式可解,否则基本没有可能
【在 g****t 的大作中提到】 : 我觉得这个方向的空间是很大的。(抛开AI什么的不谈) : 第一个问题是微分。 : 一般的初等函数组合而成的程序,如何拆分成nest 函数的图,使得求梯度时需要用的 : 乘法最少。这个问题据我所知现在还没有答案。就算不考虑硬件结构的纯数学问题,似 : 乎现 : 在也没解。 : 第二个问题是积分。 : 微分代数很多人研究。积分代数,也就是咱们大一学过的,分部积分法多次使用的长程 : 符号效果和规律。 : 在我phd毕业那时,我看到的文献,似乎只有中国数学家陈国才研究过。
|
C*****l 发帖数: 1 | 15 本质上当然是符号计算,但是会提供数值结果。
【在 l******n 的大作中提到】 : 到底说的符号计算还是数值计算?
|
C*****l 发帖数: 1 | 16 我大致看了一下他们的论文
https://arxiv.org/abs/1810.07951
原理和反向传播类似,每一个function call 会返回一个函数的值,和一个计算反向传
播的closure。 他们文中叫pull back function. closure里面有计算反向自动微分的
code,以及正向的中间结果。 他们这个方法特别的地方是IR level,所以代码结构会
简化一点,而且是closure的代码是静态编译好的,比动态解释效率高。
【在 s*****e 的大作中提到】 : 这个在IR要怎么做?需要做到支持什么use case了?
|
l******n 发帖数: 9344 | 17 Maple符号计算能力20年钱已经很强了,做一般的微积分,多项式,矩阵的符号运算很
快,现在应该更强。
如果有maple的license,用maple的符号计算来做dl符号运算,如果可以做出输入输出
的之间联系,会很有意思
【在 C*****l 的大作中提到】 : 本质上当然是符号计算,但是会提供数值结果。
|
g****t 发帖数: 31659 | 18 当年我用mathematica处理不了大的模型。文件大点的多项式都处理不了。这是第一。
第二就是算法问题,如何nest最优?这个无解。
: Maple符号计算能力20年钱已经很强了,做一般的微积分,多项式,矩阵的符号
运算很
: 快,现在应该更强。
: 如果有maple的license,用maple的符号计算来做dl符号运算,如果可以做出输
入输出
: 的之间联系,会很有意思
【在 l******n 的大作中提到】 : Maple符号计算能力20年钱已经很强了,做一般的微积分,多项式,矩阵的符号运算很 : 快,现在应该更强。 : 如果有maple的license,用maple的符号计算来做dl符号运算,如果可以做出输入输出 : 的之间联系,会很有意思
|
s*****e 发帖数: 115 | 19 我知道maple的符号运算很厉害,各种复杂表达式的积分求导都可以做,做完用数
学符号的形式表示出来。但是什么是dl符号运算?
【在 l******n 的大作中提到】 : Maple符号计算能力20年钱已经很强了,做一般的微积分,多项式,矩阵的符号运算很 : 快,现在应该更强。 : 如果有maple的license,用maple的符号计算来做dl符号运算,如果可以做出输入输出 : 的之间联系,会很有意思
|
g****t 发帖数: 31659 | 20 Sigmoid 函數是解析的。所以多項式近似有效。所以原生的neural network 很容易展
開成無窮級數。
截斷後就是一個大號的多元多項式。
所以ann的求导,就是多元多项式迭代的导数。
寫成文本文件size幾十M的多元多项式,用我当年的算法。mathematica可以求符号導數。
再大就不行了。
: 我知道maple的符号运算很厉害,各种复杂表达式的积分求导都可以
做,做
完用数
: 学符号的形式表示出来。但是什么是dl符号运算?
【在 s*****e 的大作中提到】 : 我知道maple的符号运算很厉害,各种复杂表达式的积分求导都可以做,做完用数 : 学符号的形式表示出来。但是什么是dl符号运算?
|
|
|
C*****l 发帖数: 1 | 21 ML的auto differentiation 跟传统的symbolic differentiation并不是一回事。AD用
的是graph computation,每一个节点都可以反向传播,最后算出结果。传统的
symbolic differentiation是和人做数学类似,利用规则对表达式求导数,然后化简。
【在 l******n 的大作中提到】 : Maple符号计算能力20年钱已经很强了,做一般的微积分,多项式,矩阵的符号运算很 : 快,现在应该更强。 : 如果有maple的license,用maple的符号计算来做dl符号运算,如果可以做出输入输出 : 的之间联系,会很有意思
|
n******7 发帖数: 12463 | 22 Autograd一点不差:
Autograd can automatically differentiate native Python and Numpy code. It
can handle a large subset of Python's features, including loops, ifs,
recursion and closures, and it can even take derivatives of derivatives of
derivatives. It supports reverse-mode differentiation (a.k.a.
backpropagation), which means it can efficiently take gradients of scalar-
valued functions with respect to array-valued arguments, as well as forward-
mode differentiation, and the two can be composed arbitrarily.
特别是python的ML库多都是建立在Numpy上面的,大部分时候支持Numpy就够了
【在 C*****l 的大作中提到】 : 这些都是基于一些特定的operation,比如np.exp, 要手写很多code来支持。Julia的实 : 现是在compiler层级,在IR上面实现的,所有的Julia语言写的function都可以用
|
l******n 发帖数: 9344 | 23 不需要多项式近似
maple自己的库里已经有了很多常用函数,也可以自己定义。对于求导积分之类的都没
有问题
我说的dl符号运算是想说,dl的基本原理就是微分和chain rule,这两种运算的符号计
算是很成熟的。如果能够显示的表示出ann output和input之间的关系,那就能极大的
简化training过程。
數。
【在 g****t 的大作中提到】 : Sigmoid 函數是解析的。所以多項式近似有效。所以原生的neural network 很容易展 : 開成無窮級數。 : 截斷後就是一個大號的多元多項式。 : 所以ann的求导,就是多元多项式迭代的导数。 : 寫成文本文件size幾十M的多元多项式,用我当年的算法。mathematica可以求符号導數。 : 再大就不行了。 : : : 我知道maple的符号运算很厉害,各种复杂表达式的积分求导都可以 : 做,做 : 完用数
|
l******n 发帖数: 9344 | 24 这全部说的是数值计算,不是符号
forward-
【在 n******7 的大作中提到】 : Autograd一点不差: : Autograd can automatically differentiate native Python and Numpy code. It : can handle a large subset of Python's features, including loops, ifs, : recursion and closures, and it can even take derivatives of derivatives of : derivatives. It supports reverse-mode differentiation (a.k.a. : backpropagation), which means it can efficiently take gradients of scalar- : valued functions with respect to array-valued arguments, as well as forward- : mode differentiation, and the two can be composed arbitrarily. : 特别是python的ML库多都是建立在Numpy上面的,大部分时候支持Numpy就够了
|
C*****l 发帖数: 1 | 25 不是数值的,数值微分指的是用差分方法做的。用bp做出来的结果是稳定而且是很精确
的。
【在 l******n 的大作中提到】 : 这全部说的是数值计算,不是符号 : : forward-
|
C*****l 发帖数: 1 | 26 Autograd比如pytorch里面的对象必须是pytorch tensor,不是所有的python object都
可以微分。
forward-
【在 n******7 的大作中提到】 : Autograd一点不差: : Autograd can automatically differentiate native Python and Numpy code. It : can handle a large subset of Python's features, including loops, ifs, : recursion and closures, and it can even take derivatives of derivatives of : derivatives. It supports reverse-mode differentiation (a.k.a. : backpropagation), which means it can efficiently take gradients of scalar- : valued functions with respect to array-valued arguments, as well as forward- : mode differentiation, and the two can be composed arbitrarily. : 特别是python的ML库多都是建立在Numpy上面的,大部分时候支持Numpy就够了
|
C*****l 发帖数: 1 | 27 符号计算出来的显式表达式,计算效率很可能不高,从一个例子能看出来
f(x) = h1(x) * h2(x) * h3(x)
如果显式求导,出来的是
df(x) = dh1(x) * h2(x) * h3(x) + h1(x)*dh2(x) * h3(x) + h1(x) * h2(x) *dh3(x)
可以看到每个函数都至少计算了两次。
如果是反向的AD求导
f(x) = (* h1(x) (* h2(x) h3(x)))
只要正向一次加反向一次求导。
当然显式也可以通过caching之类的来优化,会很复杂,最后也不过就是反向这个水平。
【在 l******n 的大作中提到】 : 不需要多项式近似 : maple自己的库里已经有了很多常用函数,也可以自己定义。对于求导积分之类的都没 : 有问题 : 我说的dl符号运算是想说,dl的基本原理就是微分和chain rule,这两种运算的符号计 : 算是很成熟的。如果能够显示的表示出ann output和input之间的关系,那就能极大的 : 简化training过程。 : : 數。
|
l******n 发帖数: 9344 | 28 https://blog.csdn.net/aws3217150/article/details/70214422
这个把基本的东西都讲到了,很好的参考
一个重点是其实我们遇到的问题只关心函数在某个点的函数值,所以完全的符号计算由
于计算过程中表达式膨胀反而效率不高。所以现在主流还是hybrid的微分,简单函数可
以符号微分有解析表达,复杂的还是只能求值
(x)
平。
【在 C*****l 的大作中提到】 : 符号计算出来的显式表达式,计算效率很可能不高,从一个例子能看出来 : f(x) = h1(x) * h2(x) * h3(x) : 如果显式求导,出来的是 : df(x) = dh1(x) * h2(x) * h3(x) + h1(x)*dh2(x) * h3(x) + h1(x) * h2(x) *dh3(x) : 可以看到每个函数都至少计算了两次。 : 如果是反向的AD求导 : f(x) = (* h1(x) (* h2(x) h3(x))) : 只要正向一次加反向一次求导。 : 当然显式也可以通过caching之类的来优化,会很复杂,最后也不过就是反向这个水平。
|
C*****l 发帖数: 1 | 29 不错。不过我不同意他说 “自动微分法是一种介于符号微分和数值微分的方法”
自动微分法本质上是符号计算,它里面除了数值计算本身,没有引入其他的近似。
【在 l******n 的大作中提到】 : https://blog.csdn.net/aws3217150/article/details/70214422 : 这个把基本的东西都讲到了,很好的参考 : 一个重点是其实我们遇到的问题只关心函数在某个点的函数值,所以完全的符号计算由 : 于计算过程中表达式膨胀反而效率不高。所以现在主流还是hybrid的微分,简单函数可 : 以符号微分有解析表达,复杂的还是只能求值 : : (x) : 平。
|
h**c 发帖数: 1979 | 30 有啥好处?
比效率比不过tensorflow,比方便实用还是比不过tensorflow
【在 e*******o 的大作中提到】 : 整个Julia语法都支持自动微分,包括struct,loop和recursion : ==== : 这才是重点 : 你在函数定义里面弄个for loop if 啥的,其它语言的库基本上就歇菜了。
|