突破数学/统计魔障,打好AI学习基础 -- 再战梯度下降(1)

AI学习基础

我们几乎每天都会看到几则有关『人工智慧(AI)』的新闻,一般人(me too!)都会想一窥究竟,了解箇中奥妙,但是,初次接触,探究其原理,很多人就会被相关的数学/统计公式及符号所震摄,很快就鸣金收兵了,为了挽救苍生(胡说八道的),笔者想在这里提出一个不算新的想法 -- 『以程式解决统计问题』(Statistical Programming),换个角度想,我们是不是也能『以程式设计的方式学统计』。
http://img2.58codes.com/2024/200019760wGr1R1O23.jpg
图片来源:Decision makers need more math

依『How much mathematics does an IT engineer need to learn...』一文,学习AI,我们至少要了解以下四个学科:
http://img2.58codes.com/2024/20001976LK9VF4jD6Q.png
图片来源:『How much mathematics does an IT engineer need to learn...』

线性代数(Linear Algebra)微积分(Calculus)统计与机率(Statistics and Probability)线性规划(linear programming)

以上四门课在大学至少都是两学期的课程,加起来就是要修24个学分,对已经离开大学殿堂很久的工程师,应该会萌生退意了,因此,我们是不是有速成的捷径呢? 囫囵吞枣总比饿肚子好,以下我们就来想想看吧。

以程式设计代替公式推导

要缩短学习路径,先想想我们需要知道甚么? 数学/统计都是从『假设』、『定义/定理』、『证明』、『应用/计算/检定』一路学习下来:

『假设』说明『定义/定理』成立的前提。『证明』验证『定义/定理』是成立的。『应用/计算/检定』是『定义/定理』的实践,或是假设的验证。

从以上说明,工程师只要理解『假设』、『定义/定理』、『应用/计算/检定』就够了,至于,『证明』工作就留给科学家或数学家吧,因为『证明』都会有一堆的数学符号及公式推导,常会让人头晕脑胀。以下举个简单的範例说明『Statistical Programming』的概念,如有谬误,就只能怪笔者才疏学浅,胡说八道了。

从斜率(Slope)到梯度下降(Gradient Descent)

我们知道『梯度下降法』(Gradient Descent)是深度学习优化求解最重要的关键,而『梯度』就是多元变数(Multi-Variates)的斜率,因此,我们就可以从『斜率』开始理解,下图是一个简单线性迴归的图解:
http://img2.58codes.com/2024/20001976x5SKN08Zhp.jpg
图片来源:『Machine-Learning-with-Python』

简单线性迴归方程式如下
y=b1x+b0

其中 b1:斜率
b0:截距(intercept)或称偏差(bias)

要求出迴归线的斜率,我们就可以依据『最小平方法』(Ordinary Least Square, OLS)公式求出斜率:
http://img2.58codes.com/2024/20001976IIowZWuhMI.png

我们就单纯以 Python 完成它吧:

# 方法1,单纯用 Pythonx = [0.0, 1.0, 2.0, 3.0,  4.0,  5.0]y = [0.0, 0.8, 0.9, 0.1, -0.8, -1.0]# x 平均数x_mean = 0for i in x:    x_mean += ix_mean = x_mean / len(x)# y 平均数y_mean = 0for i in y:    y_mean += iy_mean = y_mean / len(y)# x、y 乘积和xy_sum = 0for index, i in enumerate(x):    xy_sum += i * y[index]# x 平方和x2_sum = 0for i in x:    x2_sum += i * i# 斜率的分子b1_numerator = (xy_sum - len(x) * x_mean * y_mean)# 斜率的分母b1_denominator = x2_sum - len(x) * x_mean * x_mean# b1:斜率b1 = b1_numerator / b1_denominator# b0:截距b0 = y_mean - b1 * x_meanprint('y={:.4f} x + {:.4f}\n'.format(b1, b0))

可以看到算出的迴归方程式,并画个图,看看算的对不对。

import matplotlib.pyplot as plt# 画图plt.plot(x, b1 * np.array(x) + b0, color='red')plt.scatter(x, y)plt.show()

http://img2.58codes.com/2024/20001976MfPYlUpi9M.png

也可以使用现成的NumPy套件如下,比对一下答案。

import numpy as npcls = np.polyfit(x, y, deg=1)p = np.poly1d(cls)print(p)

以上的程式撰写及视觉化功能,比传统的学习方法,有以下的优点:

由图形看,确实能说明公式是有效的。任意变换数据,我们的程式依然不变,可以解决问题。我们可以在图形加注或製作简单动画(animation),让学习更生动活泼。除错的过程可以让我们检视每一步骤计算的过程,使学习更深刻。将相关的函数製作成套件(Package),可以逐步堆叠我们的知识。

结论

以上拉哩拉喳讲了一堆,无非是希望藉由程式的撰写,提高对数学/统计的理解,搜寻关键字『Statistical Programming』,其实可以找到很多相关的书籍,在此推荐一本与同好分享, 『Think Stats- Probability and Statistics for Programmers』,另外,OpenEdx 认证课程DAT256x 的 Lab 也是很好的教材,从线性方程式、联立方程式求解、微分/积分、向量/矩阵/SVD、机率/统计,都有一浅显的介绍,非常精彩。

了解简单线性迴归的概念后,下次我们就来进一步探讨『梯度下降』,利用优化(Optimization)求解。
http://img2.58codes.com/2024/20001976zNQEIQnDmB.png

本文程式均放在 github 上欢迎取阅。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章