仍然是一篇入门文,用以补充之前文章中都有意略过的部分。
以前的系列中,咱们指望对数学并无特别喜爱的程序员,也能够从事人工智能应用的开发。但走到比较深刻以后,基本的数学知识,仍是没办法躲过的。python
全部的深度学习,始于一个最简单的公式:
程序员
\[ y=ax+b \]
算法
而后机器学习的重点来了。
在常见的方程式中,y是计算结果不用说了,x历来都当作未知数,a/b是常量,常量在方程式中也是已知量的意思。
而在机器学习中,咱们会有一大批用于学习的数据。仍以这个杜撰的房价预测为例,咱们手头会有大量房间平米数、房价的对应样本。因此房价y是已知量,房间平米数x也再也不是未知数,而成为了已知量。
反过来做为常量的a/b,咱们并不知道,也就是未知数。
单纯从符号系统来看,这个公式太诡异了,已知数变成了未知数,未知数变成了已知数。
但也不过是就这么一点点不适应,做为程序员,用惯了各类奇怪的变量名,x/y声明为常量,a/b当作求解的未知数,也没有什么好奇怪的对不对?编程
只要适应了这一点点,接下来就没有什么好神奇的了。
公式\(y=ax+b\)中,有a/b两个未知数,常识告诉咱们,其实不须要不少样本,有两组样本,足以求得两个未知数了。好比两组样本为:
公寓A,30平米,房价69万。公寓B,90平米,房价195万。仍是老话,先别在乎这两个数据合不合理,以及房价包含的不少复杂因素。
那么,列出的方程组为:
框架
\[ \begin{equation} \begin{cases} 69=30a+b \\ 195=90a+b \end{cases} \end{equation} \]
机器学习
from sympy import * a,b = symbols("a b") s1 = solve([Eq(69,30*a+b),Eq(195,90*a+b)],[a,b]) print("a=",s1[a].evalf()," b=",s1[b].evalf())
最后的结果:函数
a= 2.10000000000000 b= 6.00000000000000
如今a/b两个常量,终因而真正的常量了。以后再利用这个公式,就可以用来预测房价了。学习
小结一下:
机器学习,就是利用样本中的已知量,求解方程中常量系数的过程。
机器学习完成后,人工智能的预测过程,是使用在学习过程当中求得的常量,经过计算输入的特征值x,得出预测值y的过程。人工智能
那说了这么多,这跟梯度降低有啥关系呢?
事情是这样的,在上面简单的例子中,只有一个特征值x,和两个未知数(两个常量系数须要求解),咱们很容易就能解方程。
但在人工智能系统中,特征值可能有不少,好比一幅224x224的彩色图片,就是224x224x3(色深)=150528个特征值。至少有150529个常量须要求解。
用公式来表示会是这样:
spa
\[ y = a_1x_1+a_2x_2+a_3x_3+ ... +a_{150528}x_{150528}+b \]
\[ y = a_1x_1+a_2x_2+a_3x_3+ ... +a_nx_n+b \]
\[ \begin{align} y &= a_0x_0+a_1x_1+a_2x_2+a_3x_3+ ... +a_nx_n \\ &= \sum_{i=0}^na_ix_i \end{align} \]
咱们首先要引入两个概念,先说第一个:假设函数。
假设函数的意思是指,咱们使用一组特征值x(x是简写,其实是\(x_1\)一直到\(x_n\)),经过上述的计算公式,能够获得一个结果y'。为何是y'而不直接是y呢?由于咱们公式中全部的权重值\(a_0\)至\(a_n\)尚未肯定的值,因此求得的y',跟实际上的y必然还不一样。
整理一下,咱们把假设函数列出来,公式中h,是英语假设Hypothesis的缩写:
\[ y' = h_a(x) = \sum_{i=0}^na_ix_i \]
\[ y' = h_θ(x) = \sum_{i=0}^nθ_ix_i \]
上面说到,咱们使用一组样本的特征值x,能够求得一个目标值y'。由于公式中,咱们的常量值还没有求得正确结果,因此此时y'跟正式的y值,确定是不一样的。那么二者的差别,就是“损失”。求得二者差别的函数,就是“损失函数”。也即:
\[ l(θ) = (y' - y)^2 = (h_θ(x) - y)^2 \]
\[ J(θ) = \frac1m\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})^2 \]
\[ J(θ) = \frac1{2m}\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})^2 \]
对每个要求解的量θ,同损失函数值之间,都有一个函数关系图示以下:
固然这是一个极度理想化的图,只有一个全局的最低点。实际上大多复杂的机器学习问题,其图示关系都如同重峦叠嶂,有不少个低谷,不理解的能够参考如下题头图。那会致使咱们很容易到达了一个局部最优解以后陷入在那里,而不是全局最优,这种状况不在本文讨论。
梯度降低是微分中的一个概念,在这里应用的大意是,咱们把每个θ的取值范围,都划分为不少份,每一份的宽度咱们称为动态∂,其实际宽度是由微分步长α决定的,咱们一步步尝试改变θ的值,直至求得的损失值J(θ)最小,无限接近于0。
根据微分公式变形获得的θ迭代公式为:
\[ θ_j := θ_j - α\frac∂{∂θ_j}J(θ) \]
\[ \begin{align} \frac∂{∂θ_j}J(θ) & = \frac∂{∂θ_j}\frac1{2m}\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})^2 \\ 化简后 \\ & = \sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_j^i \end{align} \]
\[ \begin{cases} θ_0 := θ_0 - α\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})^i \\ θ_1 := θ_1 - α\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_1^i \\ θ_2 := θ_2 - α\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_2^i \\ ...... \\ θ_j := θ_j - α\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_j^i \\ θ_n := θ_n - α\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_n^i \\ \end{cases} \]
说了这么多,梯度降低就是一种解方程的方法,特别对应于机器学习这种,由于数据集特征维度超多致使的方程式权重系数量大,没法使用传统方式求解的问题。 公式的推导和解释只是为了对机器学习的底层逻辑理解的更为清楚,实际上在各个机器学习框架中,这些工做都已经由框架帮咱们完成了,而且封装了不少种经典的算法,以适应不一样的习惯和不一样的工做。咱们更多的是灵活运用便可。 固然仍是指望出现更多的基础数学专家,在基础方程和解方程方面取得突破,相信每一次的收获,对于这个计算密集的领域来讲都是里程碑式的。