由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - Julia对可微分编程的原生支持
相关主题
[bssd]组合函数求导简单的perl问题
pytorch技术上先进一些?请看看这个Perl random sampling code 有什么问题,
兼谈轮子是第一生产力how to initialize associate data in STL map
[bssd]汇报一下Julia进展a vba question. please help
急求操作系统课的Nachos Project in Java的答案! (转载)a question of perl
需要一个自动grade程序的软件,online judge, autograder这种perl question: can I have a key of hash to be
What's wrong with this?help for Shell script commands
Perl里面$,@,#等字符问题求教一个perl问题
相关话题的讨论汇总
话题: egrad话题: tanh话题: julia话题: 微分话题: autograd
进入Programming版参与讨论
1 (共1页)
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 相当于正交测试,效率
: 比较高。这些都是基于优化的,和智能还是很牵强的
:
: :就扯吧。不能微分的函数咋办啊?
: :

相关主题
What's wrong with this?请看看这个Perl random sampling code 有什么问题,
Perl里面$,@,#等字符问题how to initialize associate data in STL map
简单的perl问题a vba question. please help
进入Programming版参与讨论
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符号运算?

相关主题
a question of perl求教一个perl问题
perl question: can I have a key of hash to be问个matlab的表达式
help for Shell script commands问个 Matlab: Matrix dimensions must agree
进入Programming版参与讨论
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 啥的,其它语言的库基本上就歇菜了。

1 (共1页)
进入Programming版参与讨论
相关主题
问个matlab的表达式急求操作系统课的Nachos Project in Java的答案! (转载)
问个 Matlab: Matrix dimensions must agree需要一个自动grade程序的软件,online judge, autograder这种
包子求助matlab编程问题What's wrong with this?
scalar compiler error on annotationPerl里面$,@,#等字符问题
[bssd]组合函数求导简单的perl问题
pytorch技术上先进一些?请看看这个Perl random sampling code 有什么问题,
兼谈轮子是第一生产力how to initialize associate data in STL map
[bssd]汇报一下Julia进展a vba question. please help
相关话题的讨论汇总
话题: egrad话题: tanh话题: julia话题: 微分话题: autograd