这一期我们先看AI入门,也就是实现AI的总体思想。在聊AI的时候,我们将以图像识别为例子(因为图像识别比语音识别要简单,但是语音识别的思想也是和图像识别一样,语音识别在最后的循环神经网络再聊)。
开始搞吧
OK,现在开始,现在我给你一个任务,让计算机来识别一张图片里面的一只狗,你的想法是什么?正常人的思维是这样的。
- 第一步:定义一只狗,然后输入计算机。
- 第二步:将狗的图片输入计算机,
- 第三步:将狗的图片信息和第一步中定义好的信息做对比,如果符合定义就输出是狗,如果不是就输出不是狗。
从古至今,人类在计算机领域的研究都是这么干的,包括现在的AI,但是与传统的机器识别相比,在第一步有本质的变化。传统识别中,我们是人为定义一只狗,比如颜色,大小,品种,毛的形状等等。但是在AI中,我们人类是不参与这些定义的,而是让机器自己学习这些信息,我认为这是本质区别。也就是说,这带来了一个新的概念,就是机器自己学习,学习怎么去区分一个东西,也就是进行分类。
如果让机器学习分类,那么我们先必须了解人类的大脑是怎么给物体分类的。这里不说生物学的研究历史,我们只看宏观概念,只看结论。
人类大脑在理解一只狗或者一只猫的时候,其实是对动物进行分类的。比如我们用数学中的坐标系来表示,我们人类认为的狗在红点位置(当然,哈士奇,藏獒等不同品种的狗也在红色点的不同位置),认为猫在蓝色位置,认为牛在绿色位置。
这个位置分类,是你的大脑从出生到现在一直学习的过程,只不过这些学习不受你的意识控制,是大脑完成的结果,所以你感受不到。当你看到一只狗的时候,你就会立马对应到红色区域,然后大脑告诉你,这是一只狗。也就是说,各种动物在大脑中对应的位置是不一样的。所以我们只要让电脑,也会这样的分类就可以了。
那该怎么分呢,对,我相信你肯定猜到了,就是在不同颜色之间画一条线,如果给的图片是一只狗,那么图片信息就落在这条线的右上方。所以我们的目的就是找到这么一条线来把狗单独分类出来。这个找线的过程就是计算机学习的过程。
这条线该怎么表示呢?或者说,这个例子的数学基础是什么呢(不要怕,很简单的)?在数学中这是一次函数的标准公式,就是y=kx+b,其中x是输入,y是输出。K控制斜率,b控制偏量。当k,b这两个参数变动时,这条线的位置和形状也会变动。所以用k和b可以画出任何形状的直线。
所以我们就把计算机识别狗的问题转换为找到一条合适的线,也就是找到合适的k和b,让这条线把狗的分出来。
于是,我们输入狗的信息x,在这条线的控制下,就能达到输出的y是在红色区域(也就是狗的区域),这不就达到我们的预期了吗?bing-go,继续
唉,我还要唠叨一会儿,在机器学习中,我们经常遇到拟合的概念,那啥是拟合呢?
Excel图表总该使用过吧,我们假设下图左边你们公司的一年的12个月的收入,然后可以根据这12个点来求出一条线,这些点到这条线的距离是最短的(也就是说是误差最小的)。那么这条直线就是拟合出来的线。当然,有线性拟合,比如我们上面举的例子。也有非线性拟合(就是拟合出来是一条曲线),比如下右图。为了方便,我们只聊线性拟合。
所以上面的例子如果用拟合的概念来解释,就变成了这个样子。我们将狗的这些点,拟合出来一条线,将猫的这些点拟合一条线,将牛的这些点拟合一条线。所以,在坐标系中就有了三条线,而且这三条线都是直线,可以用y=kx+b来表示。
当我们输入一张图片,也就是x,然后分别带入到三个公式中,求出3个y值,看看这个y值离哪个区域最近,机器就判断是狗还是猫,还是牛。
其实分类和拟合是对同一现象的不同角度解释。大家只需要理解就够了,因为在看新闻的时候可能会遇到这个概念。当然,你可能会看到更复杂的“xxxxxx拟合”,那只是拟合方法不同,目的是更快的找出拟合线,但是结果是一样的。
那么问题来了,我们怎么让计算机得到上述的拟合线呢?
OK,现在给你一个任务,给你一张只有4个像素的图片,里面画一只狗(不要跟我抬杠,我知道4个像素不能画一只狗,但是好说,你容易理解),这是输入。而且,为了方便,我们假设是黑白照片,不是彩色照片(其实彩色,黑白都是一样的,只不过会复杂一些,先聊黑白,再聊彩色)。
我们在输出端有三个输出,狗,猫,牛。我们希望得到的是输出三个值,而且狗的这个数值会更大,也就是下图这个模型。
我们还是套用上面的公式y=kx+b,输入x是4个像素,输出是三个数值,分别对应猫,狗,牛。与上面拟合例子不同的是,x不是一个值,而是4个像素的灰度值(一个0~255的数字,大部分都是这样子的,不信打开ps来看看),我们把这四个像素值排成一列。然后把输出值也排成一列,最后套入y=kx+b这个公式。于是,我们就得到了这个模型
模型中,用w代替k,而且换了一个名字,叫做权重(weight)。而且这个时候x,y,w,b已经不是一个数字,而是一个矩阵(真的很难解释矩阵的概念,其实就是一排一排的数字)。我们不能改变x,因为我们已经输入了4个像素。而且最后希望y1的值比y2,y3要大。所以我们只能改变w和b,寻找出最适合上述条件的w和b的值。
如果还有疑问,那我们就先看个例子。
假设我们输入的是最左边的矩阵,就是上面的例子。已经找出w和b是下面图形,
然后用输入乘以w再加上b,那么输出就是(98,3,-2)。哇塞,狗的得分最多哎,binggo,就是这个w和b的配置了。如果再换四个像素,里面还是画了一只狗,再带入w和b的公式,还是狗的得分最多,就更加认为这个w和b的分配是对的。如果所有狗的图片都满足这个条件,那么这个w和b就是完美的。这个过程会涉及到矩阵的乘法和加法,其实很简单,我在这里就不多说了,大家可以百度一下。
所以机器学习/深度学习的最终目的就是解方程,给你很多图片,也就是很多x和y,然后解这个y=wx+b的方程,求出(或者说拟合出)最好的w和b的值,这个过程就是所谓的训练,将训练好的方程,投放到市场(这个时候其实已经很准确了),供终端用户使用。当然,在用户端肯定也会有错误,没关系,随着终端用户提供的x和y越多,得到的w和b就更准确,结果也就更准确。
在上面的例子中,我们是通过人的眼睛来判断最终结果是好是坏,输入狗的照片得出结果是(98,3,-2),98是最大的,所以输出结果好.那么如果输出是(87,-10,-12)呢?这两个结果哪个比较好?我们该使用哪一组对应的w和b的值?
这个时候,我们就引入了损失函数的概念。损失函数表示的是,我们这个分类器拟合出的这条线和真实值之间的距离大小,损失函数的值越小,就表示我们拟合的越好,w和b的取值就越好。所以求w和b的过程就是,尝试一种w和b的组合,得出y值和损失函数的值,如果这个损失函数足够小,我们就认定,这组w和b的组合是好的。
当然这里面存在过拟合和欠拟合的情况,我们这里就不做过多介绍了,我觉得如果不是吃AI这口饭,不去撸算法,知道损失函数就足够了。
通过上面的内容,我相信你已经了解了大概思想,我们再聊一下计算机是怎么求出w和b来的,总不能计算机自己生成随机数,一个一个试吧,那要试到猴年马月。这个时候人类就发明了反向算法这个概念。这个可是人工智能最伟大的一步,如果没有它,我们也不会这么快就接触到AI。
那反向算法是个什么鬼呢?其实很简单,想象一下你正在下山,一步只走一个台阶。如果山比较陡,你一个台阶下去,你会感觉下降很多,如果极端点,就是一步掉悬崖。如果山不陡,你就感觉像是走平地。所以如果我们需要用最快的方式下山,就要走比较陡的地方。比如下面这个图形,这是一个山坳,中间低,我们的目的就是从周围走到中心最低的位置(因为损失函数越低越好啊)
换到数学上,山陡不陡是斜率影响的,山越陡,斜率就越大。所以我们只走斜率大的路就ok了,这是最快的下山方法。换到人工智能模型,我们需要做的就是稍微改变w的值,然后求出损失函数的值,然后反向微积分,得到这个斜率。假设w值变小时比w值变大时,损失函数减少的多(代表斜率大),那么我们就继续调小w值,这样才能用最快的速度的得出损失函数最小的时候所对应的W和b的值。
我们在用这种方法求时,假设对应的最终损失函数是0,也就是到了100%准确率的时候,随便在网上找一只狗,输入计算机,肯定狗的分数最高,那这个w和b的组合是完美的。但是可能还有新的问题。有可能会出现有两组或两组以上的w和b的值,对应到损失函数是相等的且是最小的。那我们到底该选择哪一组呢?一般情况下,我们尽量选择w不为0,而且尽可能小的值,因为我们希望,w中的每个参数都会对结果又影响,所以不能为0。至于w为什么尽可能小,唉,又是一堆数学推导,我还是不说了,了解一下就好了。
OK,这就是最基本的人工智能入门,虽然有些地方不太准确,但是可以按照这个思想来理解人工智能。
来源:半导体产业园