1.2.1 从传统编程转向机器学习
为了详细了解机器学习编码与传统编码之间的核心区别,让我们来看一个例子。
考虑描述一条线的函数:
y=Wx+B
这描述了对于一条线,线上的每个点y都可以通过将x乘以值W(用于权重)并添加值B(用于偏置)来导出。
(注意:AI文献往往是非常重视数学的。如果你刚刚开始,那么这是不必要的。这是我在本书中使用的极少数数学示例之一!)
现在,假设这条线上有两个点,并且它们位于x=2,y=3处和x=3,y=5处。我们如何编写计算W和B值的代码来描述连接这两个点的线?
让我们从W开始,其中W称为权重,但在几何学中,它也被称为斜率(或梯度)。具体情况如图1-2所示。
计算很简单:
W=(y2-y1)/(x2-x1)
代入数字,便可得出斜率:
W=(5-3)/(3-2)=(2)/(1)=2
图1-2:具有斜率的线段可视化
或者,在代码中,在这种情况下使用Python:
这个函数能工作。它很简单,因为当两个x值相同时,它会忽略除以零,但现在让我们继续吧。
我们现在已经计算出W值。为了得到直线的函数,我们还需要算出B。回到高中几何,我们可以用一个点作为例子。
所以,假设我们有:
y=Wx+B
我们也可以说:
B=y-Wx
我们知道当x=2、y=3且W=2时,我们可以回填这个函数:
B=3-(2*2)
这导致我们推导出B是-1。同样,在代码中,我们会这样写:
所以,现在,要确定线上的任何点,给定一个x,我们可以很容易地说:
或者,对于完整代码:
从中可以看出,当x为10时,y为19。
你刚刚完成了一项典型的编程任务。你有一个问题要解决,可以通过搞清楚规则然后用代码表达来解决问题。当给定两个点时,有一个要计算W的规则,你创建了该代码。然后,一旦你计算出W,就可以在使用W和单个点计算B时推导出另一个规则。接着,一旦你有了W和B,就可以编写另一个规则来根据W、B和给定的x来计算y。
那是传统的编程,现在通常称为基于规则的编程。我喜欢用如图1-3所示的图表来总结这一点。
图1-3:传统编程
在最高层次上,传统编程涉及创建作用于数据并为我们提供答案的规则。在前面的场景中,我们拥有数据——一条线上的两个点。然后我们找出了作用于这些数据的规则,以计算出这条线的方程。接着,根据这些规则,我们可以获得新数据的答案,例如,我们可以绘制该线条。
这种场景下程序员的核心工作就是搞清楚规则。这就是你为任何问题带来的价值——将它分解成规则,然后使用计算机可以理解的编码语言来表达这些规则。
但是你可能并不总是能够轻松表达这些规则。考虑之前我们想要区分T恤和鞋子的场景。人们无法总是通过找出规则来确定它们之间的关系,然后在代码中表达这些规则。这就是机器学习的用武之地,但在针对这样的计算机视觉任务进行研究之前,先考虑一下如何使用机器学习来得出我们之前计算出的直线方程。