暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

计算机眼中的数学,跟你所学的不一样

机器拾趣 2019-09-29
535

Photo by  Helloquence  on  Unsplash

引子

先来一道简单的小学数学题:已知函数f(x)定义如下:

若x=0.1,将f(x)的结果一直代入f(x),迭代n次,结果是怎样?

我相信,任何具有小学数学水平的同学都能解出这道数学题:0.2, 0.4, 0.8, 0.6, 0.2, 0.4, 0.8, 0.6, 0.2, 0.4, 0.8, 0.6, 无限循环

但是我要告诉你,目前人工智能AI的基础-计算机,却无法解出这道题。你信不?


实验

你肯定要说了,不可能!计算机不就是做各种计算的么,各种高等数学微分积分都不在话下,怎么可能这道题都解不出?

OK, talk is cheap, show me the code. 你熟练的拿出MacBook Pro,啪啪啪写下如下代码, 一气呵成:

def f(x):
if x <= 0.5:
return 2 * x
if x > 0.5:
return 2*x - 1

x = 0.1
for i in range(80):
print(x)
x = f(x)

伴随着你嘴角上扬的微笑,运行了这段python代码,结果是:

0.1
0.2
0.4
0.8
0.6000000000000001
0.20000000000000018
0.40000000000000036
0.8000000000000007
0.6000000000000014
0.20000000000000284
0.4000000000000057
0.8000000000000114
0.6000000000000227
0.20000000000004547
0.40000000000009095
0.8000000000001819
0.6000000000003638
0.2000000000007276
0.4000000000014552
0.8000000000029104
0.6000000000058208
0.20000000001164153
0.40000000002328306
0.8000000000465661
0.6000000000931323
0.20000000018626451
0.40000000037252903
0.8000000007450581
0.6000000014901161
0.20000000298023224
0.4000000059604645
0.800000011920929
0.6000000238418579
0.20000004768371582
0.40000009536743164
0.8000001907348633
0.6000003814697266
0.20000076293945312
0.40000152587890625
0.8000030517578125
0.600006103515625
0.20001220703125
0.4000244140625
0.800048828125
0.60009765625
0.2001953125
0.400390625
0.80078125
0.6015625
0.203125
0.40625
0.8125
0.625
0.25
0.5
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0


傻眼了没?


为什么

你肯定不敢相信自己的眼睛。这在数学上是无法解释,说不通的啊?

其实,现实就是这么残酷,这是现代计算机的能力和限制。最根本的原因:计算机眼中的数学,跟我们学的数学不一样

我们学习的数学中的数,是无限的、是连续的;而计算机能够存储和表示的数,是有限的、离散的。

上图就是计算机中存储浮点数的方式,可以看到包括了符号(sign)、数值(mantissa)和指数(exponent)三部分。大家都知道,计算机中的小数常用float
来表示,而float32
float64
分别代表着这个小数的精度。因此,1.2-1
在计算机中并非精确的0.2
不信你再试试:

1.2 - 1
0.19999999999999996

以有限表示无限、以离散表示连续,难免会造成误差。当我们计算的次数非常多时,误差不断累积,结果就会南辕北辙。


怎么办

在普通的计算机程序里面,这种情况还好,因为很多都是整数计算,即使是小数计算,只要计算次数不多,四舍五入以后也看不出问题。

但是,在机器学习和深度学习中,就不是这样了。比如深度学习的基础 - 随机梯度下降,就是各种小数、微分、不断迭代。

因此,为了解决这些问题,有个专门的学科 - 数值方法

数值方法(numerical method,也称计算方法、数值分析等)是利用计算机进行数值计算来解决数学问题的方法,其研究内容包括数值方法的理论、分析、构造及算法等。很多科学与工程问题都可归结为数学问题,而数值方法对很多基本数学问题建立了数值计算的解决 办法,例如线性代数方程组的求解、多项式插值、微积分和常微分方程的数值解法等等。

通过数值方法,我们可以保证在一定程度上的“数值稳定性 (Numerical Stability)”,即将误差控制在一定范围内。具体操作包括避免除以趋近于零的数,或者避免非常多的小数连续相乘。

在机器学习中,为什么非常多的高手喜欢用log
,就有因为log
操作能够有这方面的功效。

我们都知道在数学上log
有个非常重要的性质:

即可以把乘法变成加法。试想下,如果x和y都是比较小的小数,连续相乘势必会非常影响计算精度,而转化成加法后,就可以把误差控制在一定范围内。

所以说,要搞好AI,不光数学功底要过硬,计算机工程也同等重要。


总结

我们平时做算法工作时,在数学上推导出了公式,把公式转化成计算机程序,切记要有数值方法的思维,采用各种操作来减少误差,因为,计算机眼中的数学跟你所学的不一样。

最后

欢迎订阅我的微信公众号“机器拾趣”,第一时间免费收到文章更新。

文章转载自机器拾趣,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论