本文转自[url=]WOLFRAM 微信公众号[/url]
% O! s% V# S& [; ?$ S* b(本文译自Stephen Wolfram于英文12.0版发布日2019年4月16日的博客。版本12不仅囊括了拿破仑定理,还有Wolfram公理以及欧几里得所著《几何原本》一书中所涉及的几何问题, N 体问题;机器学习、神经网络、图像处理、语音识别、NLP等AI功能,并集成Wolfram|Alpha的诸多功能;计算化学、大地测量学、大型数据库的处理、丰富的Wolfram知识库、提速数值优化、非线性有限元分析、与Python的接口、高级编译器、Wolfram Super Shell、操纵网页、独立的微控制器;与Unity游戏的集成,实现VR/AR 以及机器仿真环境;集成彭博和路透社的金融数据,支持Bloomberg Terminal服务,区块链等等等。)1 T5 J1 ?5 T e) ]4 d
1 j3 d. H% k; z/ p
通往版本12之路; K% w+ B) t8 N7 i6 a/ T- [ N( B
今天(4/16/2019),我们将在桌面平台和Wolfram Cloud上发布Wolfram语言(和Mathematica)第12版。我们在2016年8月发布了11.0, 2017年3月发布了11.1,2017 年9月发布了11.2, 2018年3月发布了11.3。而从版本11.3到版本12.0,这是一次质的飞跃。最新版本共有278个全新函数,范围涉及约103个领域,以及遍及系统内部的数千个不同的更新:& X2 k3 @7 R# ~2 S4 v7 U! Z. c
' y! z0 S* m: N: g
在像版本12这样的“ 整数版本 ”中,我们的目标是填补全新的功能领域。但我们同时希望在每个版本中及时推出我们的最新研发成果。因此,在12.0的新函数中,大约有一半可以被认为是对之前“.1”版本中原有函数的完美收官,而另一半则开辟了新的领域。我将在这篇文章中对这两种类型的函数进行讨论,但重点将是从11.3到12.0的新功能。
7 i& o( g$ k" q" V: Y回顾12.0从11.3一路走来,我不由得为它的功能之深之广感到惊叹。去年十月在Wolfram技术大会的主旨演讲中,我曾用将近4个小时总结了我们到当时为止所做的工作。现在要说的还有更多。 + T2 }, P! P7 ]8 N6 T' J, |2 |2 Q
$ P4 u$ g, W# l- K6 V% Y, c
" j* r, X0 b6 |7 h, [9 ?
我们能够做的就是证明我们研发工作的实力,以及Wolfram语言作为开发环境的有效性。当然,这两点我们已经做了三十年。但是12.0的一个新特点是我们把幕后设计流程展示在了世人面前 - 我在内部设计会议中进行了300多个小时的直播。因此,除了功能之外,此举应该也开辟了软件开发之先河,使得版本12.0成为首个以这种方式开放的主要软件版本。
% T- g# [, a" C' V. U% t
; Z: x/ R1 `/ P7 L12.0汇集了很多令人叹为观止的重大突破,特别是在化学、几何、数值不确定性和数据库集成方面。总的来说,新功能涉及很多领域。事实上,即使参考文档中心的基本摘要已经有19页了: 1 _/ p" S% ?0 T" a0 w
1 y: w- S/ M( G5 A- c" d5 a
首先,数学方面
* k7 b, i% x! g. J: f尽管对于现在的Wolfram语言(和Mathematica)而言,数学方面的功能仅是其众多功能的冰山一角,但我们仍然对此投入了巨大的研发力量。作为我要介绍的第一个例子,这里是多姿多彩的ComplexPlot3D:
( U; p$ b i W; ? p/ w# _' r- g8 w2 \3 Y4 i! _$ X% V/ a* j
通过编写Wolfram语言代码在复平面上绘制图形是一直就有的功能。但是直到现在我们才终于解决了在复平面自动绘制病态函数过程中所涉及的数学和算法问题。 几年前,我记得绘制二重对数函数及其实部和虚部是多么困难。而现在用ReImPlot就可以轻松实现:
7 X5 R4 a4 A: I
; l4 d, y9 p" F# j5 a复函数的可视化说来话长,细节对于人们认识一个函数很重要。因此,我们在12.0中所做的一件事就是精心挑选所引入的标准化方法(例如命名的颜色函数),来突出显示不同的功能:) J0 J" k- B+ c
1 ~$ _, d& \' Q# A& Z! q3 s不确定性的微积分% N! z8 l9 s! Z- _
# [, `# W+ s2 w7 Q
现实世界中的测量值通常具有不确定性,用带有±误差的值来表示。我们早就有了用于处理这种“带误差值”的附加软件包。但是在版本12.0中,我们可以对这种不确定性进行计算,并且我们正在做正确的事情。 这一功能的关键是符号式对象Around[x, δ],它表示“x周围”的值,其不确定性为δ:
1 K3 F1 U; U* m& i/ d: O5 p7 T
0 y" _7 m, U6 W+ D- I, ]
4 {1 s' B3 ^" U$ c! m: t你可以对Around进行代数运算,对于不确定性的组合有一整套计算:
7 {+ `+ o* t* c* t0 a+ v" n" R
6 S% h/ |8 _* u" z如果对Around数绘图,误差条也会随之显示:
, W1 i: I6 J3 y2 _4 O& {4 O
8 |$ m i0 J5 m) s" B
有很多选项可用,比如这是同时显示x 和y不确定性的一种方法:
) @# N0 ~- ?" ]. t& ~+ X: y0 S! A
7 | ~3 x4 t, nAround 可以带有单位:
& A8 g) D# k+ k2 I
& y9 @; R; F! {4 p. h7 a: ]: @
. C2 r% ]: ~& X& P' Q& n3 b
也可以有符号式Around对象:
5 e3 {! A6 P. D t+ H
: c. J% G! v2 k6 x B
但究竟什么是Around对象?它是一种基于不相关的正态分布的东西,里面存在某些组合不确定性的规则。但没有任何声明表明Around[x, δ]代表实际遵循正态分布的任何事物,它不过是由Interval[{x - δ, x + δ}]定义的区间上的一个数。只是Around对象根据一致的一般规则传播他们的误差即不确定性,这些规则成功实现了实验科学通常所做的事情。 6 q4 E( F1 X/ w- y& z# R
比方说,你对某个值进行了一组测量。你可以使用MeanAround来估算值及其不确定性(是的,如果测量值本身具有不确定性,则在对其贡献进行加权时将考虑这些因素): ' F" _+ q) a6 G
9 Y4 c/ X4 F2 u" k. F
整个系统的函数——特别是在机器学习中——开始出现选项ComputeUncertainty->True,这使得它们给出Around对象而不再是纯数字。
& E1 M8 J2 Z# G% v) b' h4 V1 O tAround可能看起来像一个简单的概念,但它充满了微妙之处 - 这是它直到现在才被纳入入系统的主要原因。许多微妙之处围绕着不确定性之间的相关性。基本思想是假设每个Around对象的不确定性是独立的。但有时候一个值具有相关的不确定性——因此除了Around,还有VectorAround,它表示具有指定协方差矩阵的潜在相关值的向量。 7 D8 W: h7 e, W8 P( C& q4 l2 E
当处理像代数公式这样的事情时,会更加微妙。如果用一个Around替换x ,那么,按照Around的规则,假设每个实例都是不相关的:
4 M" R# V, n. C) _! y | ?但是可能有人想在这里假设,即使x的值可能是不确定的,它对于每个实例都是相同的,并且可以使用函数AroundReplace来做到这一点(注意结果是不同的):
: ]$ S2 o, E- y! I
& D% b$ q O4 f( U5 f
如何显示不确定的数字也值得推敲,就像应该输入多少尾随0:
& }) N' |& @4 q
+ Q( Y! e, l- f' Y: j- l9 m' x6 @: b, m/ n( f0 t7 g$ l
或者应该包括多少精度的不确定性(当尾随数字是35时有一个传统的断点):2 m' j5 t. D8 Q1 t% O, p
% Y' x( y A0 k5 y$ h' ]6 W
在少数情况下,大量数值已知(例如一些物理常数),人们想要采用不同的方式来指定不确定性:
: Z; V: h( L% E) z5 o% r% z# z& N: @6 t e3 d% _5 }) t1 k
这种例子不胜枚举。但渐渐地,Around将开始出现在整个系统中。顺便说一下,还有很多其他方法来指定Around数。这是一个相对误差为10%的数:
8 |# l9 t! E7 Q) b
$ t5 f8 |0 S* f" w" C7 d这是Around最擅长的表示区间:
( c S2 {" W( l: V5 Y
( T1 s$ y+ J1 t6 g8 @5 e3 C& i6 R
对于分布,Around计算方差:% z( }- N- J, Q' j" }+ p) V
$ g; H U$ t* q+ A2 d0 }& J
它还可以通过给出不对称的不确定性来考虑不对称性:
2 n: o) f5 @2 [6 v' h) A
' K! y3 ~' X3 E8 _6 Y" Y, u初级和高级经典数学* E1 S& r, c* S# S1 [& X
在进行数学计算时,在保证完全正确的同时而不迷惑或吓退初学者始终是一个挑战。版本12.0引入的一些东西可能会有用。首先,尝试求解不可约的五次方程式:
9 N4 G9 g6 K5 ^6 U3 ~5 b* y
. i) i, C' b) ]* {8 D5 s: m在过去,这会出现一堆显式的Root对象。但现在Root对象被格式化为显示其近似值的框体。计算工作完全相同,但这种显示效果让人们不用立即面对必须知道的代数数字。
7 A3 E! g% y* k5 ?当我们说Integrate时,我们的意思是在不定积分的意义上,“求一个积分”。但是在初等微积分中,人们希望看到显式的积分常数(因为它们总是在Wolfram|Alpha中),所以我们为它添加了一个选项(并且C[n]也有一个很好的新输出形式):
# i' N9 r% n5 `$ g7 X2 V" T' `. J6 h. ^: C% F" v
当我们对符号式积分功能进行基准测试时,结果非常理想。但总有更多的事情可以做,特别是在求最简积分形式方面(在理论层面,这是符号表达等价的不可判定性的必然结果)。在版本12.0中,我们继续在前沿探索,添加了如下情形:
, i _5 q. D! X+ Y. f* ]3 I4 r
7 W% d1 m6 @3 ?& f+ [. g% c( ]在版本11.3中,我们引入了渐近分析,能够求积分的渐近值等。版本12.0增加了方程的渐近求和,渐近递归和渐近解:
+ w/ y( W6 Z, r. E9 F8 \
" i" G% N) j- z4 B8 w
/ p) f A6 M8 ]' ?3 z8 F
/ M0 Q' |7 l0 t6 P在数学计算方面进行的研发,为我们提供了解释数学本身的新方法。我们一直在努力提升参考文档中心的实用性,使之不仅用来诠释函数用法,而且能够解释数学概念本身。例如,这是关于极限Limit的文档开篇,对核心数学思想的解释可以说是图文与示例并茂:+ S$ p9 D( R/ b* M5 w
6 D* A2 ?, U3 R: S3 _- ^0 B! ]
多边形更多功能 多边形是自版本1以来便是Wolfram语言的一部分。但是在版本12.0中,多边形得到进一步推广和延申:现在设有一种系统方法来指定多边形上的孔洞。一个典型的地理用例是南非,其中,国中国莱索托是南非多边形上的洞。
8 A4 g7 S+ g8 Y2 u5 W- k在版本12.0中,与Root相似, Polygon也有一种方便的新显示形式: 1 T6 j ?; b# J" J" ?5 G# D
" C* F* y+ [7 t: i: T
7 R# a2 z) s/ _+ a可以像以前一样进行计算:
. B; _! x: n! N% r/ M1 P
# k& I8 y. A5 g# g. N
1 j; N$ }/ S* Q. C( J3 e. D8 v* @: D8 s1 @
RandomPolygon也是新的。例如,你可以在3D中得到5个随机凸多边形,每个多边形有10个顶点:! s" _ X0 O4 [8 O3 d5 G
9 j: `8 j7 Z6 ~3 |4 I% v, T z9 c; T/ }
) R" d7 T+ }6 ?' R, u对多边形的运算也有很多新增功能。比方说PolygonDecomposition可以将多边形拆分为多个小的凸多边形: ! N! t; I+ K- Z( U
) U8 P$ p, [7 Q: g1 j8 c
( @8 N4 g$ e+ t5 d, e! |+ p4 w
0 n. C6 a' q: o9 D0 ]9 L带孔的多边形也需要其他类型的运算,如OuterPolygon、SimplePolygonQ和CanonicalizePolygon等。 # u8 Y* n) ?2 u0 L. |% E
用多面体计算
+ n5 }- n$ I8 R9 [
6 n4 C0 ?5 \6 [
! O4 F* A1 h) o7 x x多边形的指定非常简单:您只需按顺序给出其顶点(如果有孔,也可以给出孔的顶点)。多面体则复杂一些:除了给出顶点之外,还必须说明这些顶点是如何形成面的。但是在版本12.0中,Polyhedron可以让你以相当普通的方式做到这一点,包括空洞(即二维空间上孔在三维空间上的对应)等。
! \9 G- v% K9 a- i7 O% B7 d
4 Z* {3 }) n, h& P( j但首先,要知道多面体有2000多年的历史,版本12.0引入了五个柏拉图立体的函数:
; M3 e( m' ?1 t4 U. q4 e
! q$ F% x6 Q8 a这些柏拉图立体可以直接计算:
. |) [! i& X# Q' R
& j( c4 q5 {$ ]0 F+ q6 A+ y
这是在顶点1对着的立体角(因为它是柏拉图式的,所有顶点都给出相同的角度):
9 f) \5 u9 S# z* |这是在多面体上完成的运算:
/ ~" ]' i! P: j& Z
! V0 e4 f4 J e! a5 d H- @
/ I& y; n2 F: Q% E8 C4 C4 D& I除了柏拉图式立体之外,版本12还构建了所有“均匀多面体”(每个顶点都有n个边和m个面相交),还可以从PolyhedronData获得已命名多面体的符号多面体版本:
0 O6 a2 R8 X$ V; w4 e, u, l
9 A7 |; Y6 S+ t( T
可以制作任何多面体(包括“随机”多面体,通过RandomPolyhedron),然后对其进行各种计算:
; N5 ^6 o8 H' J' _
2 P& `5 b" V5 T可计算的欧氏几何
$ ~* r. O% m, @2 Z1 B2 E: \Mathematica和Wolfram语言在显式计算几何和代数几何方面功能卓越,但是对于欧几里得所著《几何原本》一书中所涉及的几何问题(其中,人们先做出几何断言,然后再看后果)的表现又如何呢? 1 l9 [7 W4 @& x. n N
凭借我们在技术上的积累和布局,第12版终于能够提供一种新的数学计算方式,将欧几里德2000多年前所做的事情自动化。一个关键的想法是引入符号“几何场景”,用符号表示诸如点之类的结构,然后根据它们来定义几何对象和关系。
/ G& w" ~' K: E% U/ l+ O例如,这是一个几何场景,表示一个三角形abc与一个圆心为o、通过三点a,b,c的圆,其约束是o位于从a到c的线段的中点:
* | N8 r0 r0 W+ _6 l
0 C9 a5 Z ]$ l6 U: L# \就其本身而言,这只是一个符号表示。但我们可以对它进行运算。例如,我们可以要求它的随机实例,其中a,b,c和o是特定的:/ ~2 D3 i: p9 C, O
# s U7 X7 ]: r
您可以根据需要生成任意数量的随机实例。我们尽量使实例具有一般性,不出现不受约束制约的特殊情况:0 X* r0 d- R. |6 p8 K
) F" E2 K) `6 C- | G
好,现在我们来“玩欧几里得”,找到与我们的设置一致的几何猜想:
7 t0 [0 b* ~1 A2 y7 B1 S1 T( F
1 s4 h" ]6 I8 f2 m) m对于给定的几何场景,可能存在许多可能的猜想。我们试图找出我们感兴趣的。在这种情况下,我们得到两个 - 第一个如图所示:线段ba垂直于线段cb。这个结果恰好出现在《几何原本》在第3卷,作为命题31的一部分,它通常被称为泰勒斯定理。
6 i' U' l* C8 Z1 c4 `+ b" y在12.0中有一套完整的符号语言来表示出现在欧氏几何中的典型事物。这里是一个更复杂的情况,对应于所谓的拿破仑定理:( I9 n% S% ~, p! ?7 |
" n+ `0 h& _ W( w12.0新增了许多几何函数,可用于显式坐标:
( }/ t7 S5 D% q5 v$ J
3 J; R2 f" E: S4 ^" m d
支持12种“中心”类型的三角形,并且可以有符号坐标:( ?% y& }. P3 k8 U: @
$ o% c% m( Z! c7 T& T+ \
/ r: D) e% h8 F7 l, y为了支持对几何命题的设定,我们还需要“ 几何断言”。在12.0中有29种不同的类型,例如“Parallel”,“Congruent”,“Tangent”,“Convex”等。这里是三个两两相切的圆:% A) ?8 G* m( ~) H Q( [% V, b
1 I }# d- B: I4 ^: O公理化理论的超级符号化
# j8 T' U4 f, p, n版本11.3推出了FindEquationalProof,用于生成证明的符号表示。但应该用什么公理进行证明呢?12.0版引入了AxiomaticTheory,给出了各种常见公理化理论的公理。 3 C; [) ^: K1 z( c
这是我个人最喜爱的公理系统: ; A/ T9 }3 ~7 f" k2 p
* b$ y1 e# x2 \' H这是什么意思?在一定程度上这意味着更加符号化的符号表示。比如对于 1+x,我们不说x的值是什么,而是想象它可以有一个值。在上面的表达式中,a、b和c是纯“形式符号”,实际上起到的是结构的作用,甚至都不能把它想成具有什么实际值。
, S9 t! O/ o6 e) {0 i. k中心点·是做什么的呢?在1+x中我们知道加号+的意义。而·则是一个完全抽象的运算符。公理本质上是在·所能表示的事物上定义一个约束。在这个特例中,事实证明该公理是布尔代数的公理,因此·可以代表Nand 和Nor。但我们可以完全正式地推导公理的后果,例如通过FindEquationalProof:
3 m* m& x" ]/ A+ {2 f5 Q
( C8 n6 S6 N. h4 S/ l* W这其中有很多微妙之处。在上面的例子中,使用中心点·作为运算符很有用,首先因为它的显示美观。但它没有内在的含义,AxiomaticTheory让你给出其他的算符(这里是f) :
3 V. E0 B( P) B4 X
9 B* a" x; O! ^/ K5 k
"Nand"的作用是什么?它是运算符的名称(但不应将其解释为与运算符的值有任何关系)。例如,在群论的公理中,出现了几个运算符:
* z1 {0 G+ R$ @1 N; j& `. k) }8 T2 Z
这将给出此处各种运算符的默认表示形式:) _, W- I( i+ H! d# I( f+ f
0 s6 B w# R+ n/ V) y ^5 [
AxiomaticTheory知道特定公理系统的著名定理:
4 o( s* [2 H' b$ Y: i
; B( r: C5 i6 j4 r形式符号的基本思想是在第7版引入的,用于表示诸如下式生成的结构中的虚拟变量:' W1 l8 a; }' {0 t, S: v3 }- Y
2 K4 n0 p, p6 U% y: l) l
( C& F* R; q A+ A形式符号可以使用\[FormalA] 或 Esc.aEsc 等输入。但在第7版中,\[FormalA] 被渲染为a. 而那意味着上述表达式会是这样:* D# |: l w& m9 W5 N) }
3 g' s$ ^( V7 e L
我一直觉得这看起来太复杂了。在第12版中,我们希望将其简化。在尝试了各种可能后,最终定下来用单一的灰色下点表示,我认为这看起来好多了。
6 D; Q$ o1 ?3 c+ S/ i) _在AxiomaticTheory中,变量和运算符都是“纯符号的”。唯一确定的是各个算符的数量,这可以问AxiomaticTheory: 8 P( ]& v& D$ I
# ` `/ y3 @1 J/ E6 \/ l% m! J; h
" d& C$ |; D% N- F
方便的是,运算符和数量的表示都可以立即输入给Groupings,以得到涉及特殊变量的可能表达式:
2 @/ k s' M' A9 Q2 h1 z! W3 u, ]; }- P0 f$ i0 L" X& G4 }7 `
N体问题 2 Q- Q# x, l) L" M+ h" u$ V4 u
公理化理论代表了数学的一个经典历史领域。另一个经典历史区域--更多的是在应用方面--是N体问题。版本12.0引入了NBodySimulation,它提供对n体问题的模拟。这里有一个三体问题(想想地球-月球-太阳),具有一定的初始条件(和逆方力定律): " J. q' o; N% {! n" s
* B. R( K3 r5 \$ C您可以询问解决方案的各个方面;这将位置绘制为时间的函数:! m" z! A' u; h" O: U# A R- J
" X3 t% `" _7 ?% _- |- o( I- E
7 ]( a0 r1 g6 A7 f# t6 V% n. H在底层,这不过是求解微分方程,但有点像SystemModel,NBodySimulation提供了一种方便的方法来设方程并处理解。而且标准的力学定律是内置的,但也可以自己定义。 8 d; @( s3 n, |& k1 v" V
语言扩展与便捷性
5 P* U$ {) C1 o! N' ?7 a9 D1 [30多年来,我们不断打磨Wolfram语言的内核,每次新版本的发布,都会引入一些新的扩展,并进一步增强其便捷性。
# B" q% h1 m. Y5 F9 r; z: K3 Q从1.0 版开始, 我们就有了函数Information,但在12.0 中,我们对它进行了极大的扩展。它以前只是提供有关符号的信息(当然这一功能也与时俱进了):
) r, r7 {' {, `( ?" T5 p
+ v, o H) P& q/ N0 \0 F3 A0 D( v# P9 {- y3 J) g
但现在它也提供各种对象的信息。以下是有关分类器的信息:
: I' G7 K# i3 ~$ U5 j$ e- m
8 J: l% f j' E. Z9 R0 |
有关云对象的信息:
/ _0 B3 V# p; X7 J
0 V" B) X$ Q2 `$ q0 x将鼠标悬停在 "信息框" 中的标签上,您可以得到相应属性的名称:
?" g! E1 Q, I4 N% d
/ K" o) q; [& O# L0 U9 V4 k
对于实体,Information提供已知属性值的摘要:
1 v( w e! }/ C" u; P6 Z" S9 N+ @* m6 o$ p- M
在之前的几个版本中,我们引入了很多新的摘要显示表单。在版本11.3 中, 我们引入了Iconize,它本质上是为任何事物创建摘要显示窗体的一种方式。事实证明,Iconize比我们最初预期的还要有用。它非常适用于在笔记本和Wolfram 语言代码中隐藏不必要的复杂性。在12.0 中,我们重新设计了Iconize的显示方式,使它在表达式和代码中“更好读”。 8 K2 r. ]" T9 W; F: Z8 Z
可以明确地对某些内容图标化: O( `# `! u$ o/ @! }
& O6 |6 V8 A D按+键,会看到一些细节:
" w) I: G4 q$ W6 H
0 c+ l! a% [7 Z: Q2 A
3 ?# \' i) ~6 ?8 D! y5 T
按
会再次获得原始表达式:8 n* k& h% O1 l; T& A( J
: m6 u8 s' N: p3 a9 C: |% E) D4 _如果要在计算中引用大量数据,你当然可以将其存储在文件或云端(甚至存储在数据存储库中)。但将它放在笔记本中通常会更方便,这样所有内容都放在同一个地方。避免数据“接管你的笔记本”的一种方法是放入封闭的单元格。但Iconize提供了一种更加灵活和优雅的方式来实现这一目的。
9 `1 N1 e( {$ \当您编写代码时,“随时图标化”通常很方便。现在您可以通过右键单击菜单进行:
7 Q9 H& I5 u% K0 |& c
8 o {8 q/ H$ k说到显示,我们在12.0中添加了一些小巧方便的功能:
! N2 E& p. \7 c1 s: p/ g4 f
7 t! J' d0 i4 i% `- A0 Z
以下是对“数值便利”所新增的功能:
1 Y, ~2 g: b) Z" f9 K
) G" L/ U# b1 K3 s3 A, _
函数式编程一直是Wolfram语言的核心部分。但我们一直在不断扩展,并引入具有通用性的新基元。在版本12.0中,SubsetMap 就是一个例子:
+ r- J4 _; n+ ^: M3 ]
: [. N8 v, X. d7 A- M x
; Z% p- d1 ^6 i5 i& y/ a- l3 i+ e. ?函数通常可以有多个输入,但输出总是唯一的。然而,在量子计算等领域,人们对n输入和n输出更感兴趣。SubsetMap有效实现
->函数,从列表中n个指定的位置选取输入,对它们应用一些运算,然后将结果分别放回原处。 4 m4 T1 y* \+ }% c$ B- [( m2 w
我是大概一年前开始研发SubsetMap的。很快我就意识到,这个函数的功能我应该在很多地方使用过。但是,这个特殊的“计算工作包”应该叫什么?我最初拟定的名称是ArrayReplaceFunction(我在笔记中将其简称为ARF)。在一系列(现场直播)会议中,这个名称经历了反反复复地修改,比如ApplyAt (但它不是真的Apply)和MutateAt(但它没有左值意义上的突变),以及RewriteAt、ReplaceAt、MultipartApply 和ConstructInPlace 等等。此外还有关于“函数装饰器”形式的想法,如PartAppliedFunction、PartwiseFunction、AppliedOnto、AppliedAcross和MultipartCurry等。 但后来当我们解释这个函数如何在列表的一个子集运行,以及它和Map如何相像,只不过它是同时作用在多个元素上而已时,我们决定使用SubsetMap这个名字。而且这又一次体现了语言设计的重要性——由其名,故其义,并立刻看出它可以用于哪些地方,这一点是非常了不起的。8 x+ S( F) }0 r4 v- l3 T4 R f& G
更多的机器学习超级函数
( m' v5 |- O& U5 u. y8 G6 m- R7 Q6 X多年来,我们一直致力于使Wolfram语言成为机器学习前沿的最先进最自动化的系统。早期,我们引入了"超级函数"Classify和Predict,以完全自动化的方式执行分类和预测任务,自动为给定的特定输入选择最佳方法。此后,我们又引入了其他超级函数,如SequencePredict、ActiveClassification和FeatureExtract等。
3 E h1 l# b0 d2 b) D: ?$ {6 ~8 Z5 E在版本12.0中,我们又引入了几个重要的机器学习超级函数。有FindAnomalies,它能找到数据中的“异常元素”: 7 |- R: b: T/ A7 W7 o4 W" |6 ?* ?9 J
$ E( s% l: n* }此外还有DeleteAnomalies,删除它认为异常的元素:
1 ]$ r9 X! S4 D; Z, r
( ]6 U! B) t2 n; f. Q. z% V* I$ b
SynthesizeMissingValues,它试图为丢失的数据生成合理的值: 6 [ U0 u# J" i4 p; I
! U0 [: _' Z4 ^8 U这些函数如何运作?它们都基于一个名为LearnDistribution的新函数,该函数在给定一组示例的情况下尝试学习数据的基础分布。如果示例只是数字,这基本上是一个标准的统计问题,我们可以使用EstimatedDistribution这类函数。但重点是LearnDistribution适用于任何类型的数据,而不仅仅是数字。这里是学习颜色集合的基础分布:
1 d+ N( S3 F$ O
2 k* s% K s% G- W/ f8 y0 i5 Q
一旦我们获得了这种“学习分布”,我们就可以用它做各种各样的事情。例如,从中生成20个随机样本:
/ p+ d4 m% \2 h8 g
+ q p. I) ?6 l现在考虑一下FindAnomalies。它需要做的是找出哪些数据点与预期相比异常。或者,换句话说,给定数据的基础分布,它会发现哪些数据点是异常值,因为根据分布它们出现的概率非常低。
8 ^- H# M* e# x就像普通的数值分布一样,我们可以计算特定数据的概率密度函数PDF 。根据我们从示例中学到的颜色分布,非常可能是紫色:
* a( r4 W y/ l5 \
$ P( ]9 z3 z- [) ^+ P5 q* R: ]而红色则不太可能:9 G J, w3 ~( N
5 o2 b$ V' }# g
对于普通的数值分布,累积分布函数CDF阐述的是累积概率,比如说我们得到的结果“远离”某个特定值。而对于任意事物而言,实际上并没有“远离”的概念。但是我们已经有一个叫做RarerProbability的函数,它告诉我们生成一个例子--其概率密度函数比我们给出的更小--的总概率是多少:
6 G# K+ T! q9 \5 h% [
' w) }' ~* F/ I
) C. N* P4 m5 v
现在我们有了一种描述异常的方法:它们只是概率非常小的的数据点。事实上,FindAnomalies有一个选项AcceptanceThreshold(默认值为0.001),它指定具体多少应该算作“非常小”。 3 g9 q/ x$ @% s# K2 k
现在让我们看一下比颜色更复杂的东西。让我们通过查看1000个手写数字示例来训练异常检测器:
1 a/ h; ]( I9 l9 N8 C7 @- S现在FindAnomalies可以告诉我们哪些例子是异常的:
% D2 E. G9 n5 `% U& B. t- Y+ j
! |1 H- o/ q6 `% l7 x神经网络的最新进展
, t6 k( |' A: Y, a6 ~2016年,我们在第11版首次推出了构建、探索和使用神经网络的符号架构。在随后的每个版本中,各种前沿功能不断加入。在2018年6月,我们引入了神经网络存储库,使得从Wolfram语言访问最先进的神经网络模型更加轻松便捷,存储库中已经有近百个不同类型的模型,并且新的模型一直源源不断地加入进来。
' M4 l. Y8 r7 j+ n- ]4 J0 H7 X因此,如何你需要最新的BERT“transformer”神经网络,可以从NetModel得到:
1 \9 X6 z, `* @. l) S5 s( e* ^) r
) j o: E3 f8 k/ F! |" e+ D可以把它打开并查看它所涉及的网络(对了,第12版更新了网络图形的显示):# X6 m$ D. h% N; a0 X! R
1 l5 k2 H% D! e
可以立即使用这个网络,这里生成了某种“意义特征”阵列:. ~. W1 r, L8 o* a6 g
+ F% [. T" i" ?. ^$ D& _+ b在版本12.0中,我们引入了几种新的图层类型,特别是AttentionLayer,它可以让人们设置最新的“变换器”架构- 我们通过NetMapThreadOperator和多序列NetFoldOperator等函数增强了“神经网络功能编程”功能。除了这些“网内”增强功能之外,版本12.0还添加了各种新的NetEncoder和NetDecoder实例,例如数百种语言文本的BPE标记化,以及能够纳入自定义函数以将数据输入和输出神经网络的功能。
9 o( [" O1 i- J1 H7 J但是,版本12.0中最重要的增强功能是更加基础架构化。NetTrain现在支持多GPU训练,以及处理混合精度算法和灵活的早期停止准则。我们将继续使用流行的MXNet低级神经网络框架(我们一直是其主要贡献者) - 因此我们可以利用最新的硬件优化。有新的选项可以查看训练期间发生的情况,还有NetMeasurements允许您对网络性能进行33种不同类型的测量: , V& |7 ^6 L4 ~4 B' j
D# v6 K. v2 q( w x7 K, U5 O/ G
当然,神经网络不是唯一甚至也不总是最好的机器学习方法。但在版本12.0中的一个创新是,我们现在能够在Classify和Predict中自动使用自我规范化网络,因此可以在必要时轻松利用神经网络。
" g2 N1 `* M0 s [! D9 K5 g8 v图像计算 ) ~8 Z& x+ o+ r1 }, s
我们在版本10.1中引入了ImageIdentify,用于识别图像是什么。在版本12.0中,我们设法将此推广,不仅要弄清楚图像是什么,还要弄清楚图像中有什么。因此,例如,ImageCases将向我们展示图像中的已知对象类型:
# G% k" D. ?4 `6 `/ R
8 e" z% S( O8 Y7 v2 y$ D2 NImageContents提供有关图像内容的数据集,可以了解更多细节信息:7 X4 C2 q( F. t8 A; |- O
( k( f# `+ Q- c/ I可以用ImageCases查找特定类型的内容:
4 g+ P5 ^. M1 X' D% X9 i( y
. P! E* P0 `3 J! L7 Y+ B$ z, S7 F, {可以用ImageCases查找特定类型的内容:6 `6 `' N8 w8 J- K2 o! M$ w! y7 j" A
! b3 S4 ?% ~6 [ O4 P, X5 z$ |8 m2 C
在某种意义上,ImageCases就像是广义的FindFaces,用于在图像中找到人脸。版本12.0中,FindFaces和FacialFeatures变得更加高效和鲁棒;FindFaces如今基于神经网络而不是经典图像处理,而FacialFeatures的网络从500MB 变为现在的10MB:
3 N- o7 b6 N) W' N+ k4 f$ L. [4 j4 ^& n [2 x
u! t' S5 p2 Q9 L, L像ImageCases这样的函数代表了“新式”图像处理,这种处理在几年前是不可想象的。虽然这样的函数可以处理各种各样的新生事物,在更经典的技术中仍然有很多价值。虽然在Wolfram语言中完备的图像处理功能已有很长一段时间,但我们仍在继续进行渐进式增强。
' f- A+ S1 X3 T: k
. m; L; ?8 Z: p4 l
+ j5 ?& Q8 |0 o8 N, ]. z/ n8 @; q
( Y& G8 L4 q+ s& s" L1 i5 w |