自学内容网 自学内容网

jax可微分编程的笔记(5)

jax可微分编程的笔记(5)

第五章 JAX编程范式及即时编译

对于任意一门哲学的理论,都是先有世界观,然后才能有方法论
λ演算正是函数式编程的“世界观”

我曾经高傲地以为,尽管大数据,人工智能和量子计算正推动着
人类社会第四次工业革命的浪潮,但如果从理论的视角审视年轻
的人工智能,它实则远远无法被称为一门科学:应用领域的成功
唯独说明了自动微分框架自身的强大,依赖为数不多的核心算法
和变态膨胀的计算资源,基于自动微分框架的深度学习正霸道地
展现出数据与算力堆叠之下几可乱真的“智慧”。

滥觞于20世纪30年代的可计算理论,其中由邱奇提出的λ演算则以
貌似复杂的数学符号将其自身层层包裹。但是如果你走进那个由函
数和变量支撑起的奇妙世界,或许会被其基本假设的简洁和符号
系统的强大深深地震撼:它的优美程度完全不亚于可微分编程的
庞大框架本身!

5.1 函数式编程

编程范式是指软件工程中的编程风格,它既可以用于描述某一门
编程语言的设计风格,也可以用际描述某一段程序代码的编写思路。
不同的编程范式,其本质是思维方式的不同。编程范式主要有
函数式编程,结构化编程,面向对象编程,还有逻辑式编程等。

5.1.1 函数式编程的价值观

所谓的函数式编程,便是让代码的编写回归于严格的数学,
使人们仅仅专注于数据的处理流程,而非变量本身的取值
变化,其本质是思维方式的转化。

例如从函数的视角来看,在函数式编程中,我们期待所写出
的函数都是纯函数。纯函数不会产生任何可观测的副作用。
从函数的视角来看,无状态,时间不变性(也称为幂等性)
及空间不变性,正是数学意义上函数的特征。

从变量和赋值的视角出发,更加严格的函数式编程还强调
变量的不可变性。

尾递归这一技巧,在函数式编程中是极为常见的。

函数式编程的优点,在于每一个构成函数自身的独立性,
这样的独立性不仅仅可以减少代码运行过程中潜在的错误
还具有下述一系列可能的优点。
可缓存,可移植,自文档化,可测试,引用透明,并行。

5.1.2 JAX中的即时编译

即时编译是一种提高解释型程序性能的方法,通过在代码
执行过程中对其进行编译,提高程序的性能。目前对于即
时编译的讨论主要基于javascript语言展开。不过在jax中
我们同样可以使用jax,jit修饰符,实现对函数式风格的
代码的编译。

5.2 λ演算

λ演算可以被称为全世界最小的通用编程语言。
λ演算是函数式编程范式的思想来源。

5.2.1 λ演算的基本设定

变量,函数,赋值这三者构成了λ演算的核心。
从原则上来说,λ演算中的变量可以用除λ以外的
任意符号来表示,而符号λ则被留作函数的定义。熟悉Python
语法的读者或许不会对 “lambda x:(x,x)”这样的表达式感到
陌生。它接受任意类型的参数x作为函数的变量,返回一个
二元元组(x,x).在λ演算中,函数 lambda x:(x,x)对应着如下的
λ表达式: λx.xx
在“.”号之前的变量x代表函数的输入,在 "."号之后的“xx”代表
函数的输出。
 
在λ演算中,函数是“一等公民”。

5.2.2 λ演算中的布尔代数

从λ演算出发,演绎出布尔代数的基本结构。为此,我们定义
布尔变量T和F。它们对应着λ演算中的两个函数:
T:=λxy.x
T:=λxy.y
基于此,我们定义布尔代数的与运算and,或运算or, 非运算not
and:=λab.aba  or:=λab.aab  not:=λab.aFT

对于与运算满足如下的四个性质:
and T T = T      and T F =F   and F T  =F and F F =F

作为一个示例,我们检查and运算的第一条性质:
and T T = (λab.aba)(λxy.x)(λxy.x)
= (λa.(λb.aba))(λxy.x)(λxy.x)
= (λb.(λxy.x)b(λxy.x))(λxy.x)
= (λxy.x)(λxy.x)(λxy.x)
= (λxy.x)
        = T

其它的演绎过程与上述的过程是类似的。
cond(A M N) 与 (if A then M else N)是逻辑上完全等价的。

λ演算几乎不含有任何语法糖,直击编程的本质,即计算的底层
实现就是布尔代数的推理过程。布尔代数的运算符对应着电子
硬件的逻辑门,计算机底层的软硬件,在此实现了连通。


原文地址:https://blog.csdn.net/gggwfn1982/article/details/136310596

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!