美文网首页
初识人工智能原理

初识人工智能原理

作者: CV算法恩仇录 | 来源:发表于2022-03-24 16:30 被阅读0次

    原创:悬鱼铭

    你好,欢迎打开文章,本次分享是用通俗易懂的语言让你理解人工智能的奥秘!分享的内容分为两个部分,第一个部分是人工智能数据的数值表示,第二部分是人工智能原理,全文字数3千左右,阅读时间大约8分钟。

    人工智能数据的几何含义

    计算机视觉目的是让计算机像人一样可以“看到”画面,并对画面做判断及处理,你有想过,计算机世界的图像是什么样的吗?我们人类在看一个东西到时候,靠的非常近可以看的非常清楚,借助一些工具放大时能看到更加微观的信息,但是如果在电脑中放大会怎么样呢?电脑上看图片,想放大看一些特别细小的地方时,会发现图像一开始还是清晰,再放大就变得模糊起来,再放大变得有“颗粒感”。例如下图:

    图片来源

    这是因为图像在计算机的世界里是由像素组成,每个像素点都是用数值来表示。在计算机的世界里,“万物皆数值”,不管你是图片还是音频,在电脑中存储的都是一系列的数值,只是在不同形式的数据存储在电脑中的数值含义是不用的。

    同样,人工智能处理的数据也都是数值类型,比如图像、音频等。我们理解人工智能的原理,需要先理解数据数值的表现及含义。用数值表示的数据,可以从几何的角度进行理解。我们先来看一下,“3”一个数值的含义

    可以看到,一个数值表示的的数据的含义是在一维空间中的一个点。那如果是由2个数组成的数据呢?在几何空间中表示什么?是二维坐标系内的一个点。那现在有一组由2个数值组成的数据,[[-1. -2. ],[-0.5 -0.5], [ 0. 1. ], [ 0.5 2.5], [ 1. 4. ]],我们看一下它在二维空间内的图像看一下。

    图中五个点连成一条直线,图中选取了比较特殊的值,使得五个点在二维空间内呈直线状。其实每种数据在几何角度的其所在的空间内(可能是很高维的空间)都可以组成形状,虽然不太可能是这种非常简单的直线,这是数据的几何意义。

    画个重点:数值表示的数据可以在几何角度理解为高维空间中的点,由足够多数据组成的高维空间中的图形是数据分布的一种形式。

    通俗理解人工智能原理

    请问图像和人工智能的原理有什么关系呢?

    这个问题我们要从目的出发,通过学习数据完成对这类问题的预测,注意是这类问题,不局限于给定的数据。就以上面的图形为例,假设我想通过X轴的值来预测Y轴的值,为了达到这个目的,我们画一条直线。

    现在把这条直线的公式求出来,公式为 y = 3x + 1。这样当我们输入 x=1 时就得到了 -2 的结果,那么换句话说,我们画的这条直线代表了图中的 5 个点,而且不仅这 5 个点,输入其他的 x 同样可以进行预测。当我们输入 x=0.75 时,得到 y=-1,达到了预测给定的 5 个数据点之外的能力。这就是从几何的角度理解人工智能,人工智能构建一个函数,通过学习数据达到函数在几何空间内的形状和数据的几何表示非常接近,实现“代替”数据的目的,从而达到预测的能力,这个函数就是算法模型。

    那这个函数是怎么学习数据的呢?

    算法模型在进行自我学习、自我更新的过程其实就是我们定义的函数去拟合数据(数据拟合又称曲线拟合,俗称拉曲线,是一种把现有数据透过数学方法来代入一条数式的表示方式。科学和工程问题可以通过诸如采样、实验等方法获得若干离散的数据,根据这些数据,我们往往希望得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合,这过程就叫做拟合)的过程,我们先通过一系列代码看一下效果,再来讨论其中的原理是什么。

    我准备了点数据,这个数据相对前面咱们举得例子就复杂很多了,总共由1000条数据组成。数据是二维数据,由x与y组成。我们的目的是用x来对y进行预测,这时,我们称x为特征,y为目标也叫label。执行下方代码,查看数据的几何表示。

    代码

    执行代码,获得数据的几何表示。

    这个数据确实比刚才复杂多了,形成了一个弧形的曲线。

    现在我们设计一个函数,来拟合这些数据。弄的简单一点,还是使用一条直线吧。

    直线的公式为 y = a * x + b,这里我们给 a 和 b 一个初始值,假设都为 1,下面的代码是从代码实现的角度来绘制一条直线,执行看看效果吧。

    可见效果确实是不好。这是因为我们随便设置了个初始的直线,还没有进行学习。这里我们要讨论如何让我们的模型算法进行学习与更新。

    首先,我们需要确定我们要更新什么东西,在我们初中学习的时候,直线方程中 x 是变量,a 和 b 是固定值。是在固定的直线上带入 x 的值求 y,这个过程很像我们模型算法去预测时的过程。但是我们现在要做的是改变直线方程,让直线方程变得更加贴近我们的数据。这时候我们要更新的就是 a 和 b 了,对 a (斜率)和 b(偏执)进行更新,会改变直线方程。

    确定好要更新的变量之后,问题就是如何去更新。最直接粗暴的方式就是挨个去试 a 和b,看看什么效果好,这种穷举的方式当然是可以,不过这可能是“有生之年”系列,能不能完成学习完全的概率比中彩票的概率还要低的多,而且对于模型算法,它也不知道什么叫学习完成。

    我们回想一下,在幼年学习的时候,经常会被家长训,告诉我们什么是能做的,什么是不能做的。也就是告诉我们一个学习方向,上学阶段在学习知识的时候,也会给大家各种测试及考试,让我们知道我们的学习是不是对的,学习成果如何。同样的,算法需要知道如何去学习,或者说怎么学习是对的怎么学习是错的,我们需要帮助模型算法构建一个”价值观“,并且像测试一样把这个正确与错误的概念量化,量化的意思就是数值化,像我们考试的分数一样。

    我们观察一下,如果我们的算法模型拟合数据拟合的特别好会有什么样的特点,这要从我们的目标出发,目标是据 x 来判断 y 的值,那么如果直线函数和数据拟合的特别好的话,x 输入到直线函数里得到的 y_pred 应该和真实值 y_label 应该是非常接近的,这个非常接近的概念我们需要将它数值化,就用两点之间的距离来表示,这个公式就是评价模型算法拟合数据到底好不好的判断标准,这里我们称之为损失函数或者目标函数,用 loss 表示。

    那我们可以列出损失函数的公式:

    公式中 y_pred 表示直线函数预测的值,y_label 表示真实值也就是 label。

    公式中点与点之间的距离应该开一个根号吧?

    这是一个好问题,我们设置 loss 函数的目的是将函数拟合数据的表现用数值表示,那么开不开这个根号并不影响目的,还增加了计算代价。

    回到 loss 函数中,我们观察一下 loss 函数,可以发现和我们上学考试的分数是相反的,考试时分数越高表示学习效果越好,但是 loss 函数分数越低表示学习效果越好,如果 loss 函数为0,就表示模型算法很”完美“。

    那我们的目标就变成让 loss 函数越低越好,但是现在的 loss 函数里并没有 a 和 b,我们将 y_pred = a * x _ b 代入 loss 函数得到:

    要怎么求 loss 函数的最小值呢?

    在前面的内容,函数及数据都有其几何意义,在某维空间内呈直线、曲线、曲面、立方体等。loss 函数同样可以映射到几何空间内,在我们追求减少 loss 的值的过程也是追求 loss 在几何空间内的极小值。在例子中的 loss 函数上,要做的是对 a 和 b 进行优化,而 x 和 𝑦𝑙𝑎𝑏𝑒𝑙 是固定值(是训练数据,训练数据是固定的)。寻找 loss 函数的几何图形上的极小值的过程,应该是对 a 和 b 进行更新。

    那么要怎么对 a 和 b 进行更新呢?

    是不是像我们求公式一样求出来,并不是那样,咱们的计算机计算核心只能进行数值的计算,而不能进行推理,按照咱们公式推理的形式并不能应用在计算机上。计算机只能进行数值的尝试,尝试带入不同的 a 和 b。如果真的这么莽撞的尝试,人工智能也就不能被称为“第四次工业革命”了。现在剩下的问题就是,如何对 a 和 b 进行更新。在更新的过程中要确定两件事,第一件事就是往什么方向进行更新,第二件事就是要更新多少。

    下面为大家简单的复习下高等数学中的导数。这里不讲如何计算导数,需要大家理解导数的含义。函数中某一点的导数代表改点在图像中的切线斜率。切线所指的方向就是最快上升/下降的方向,导数是切线的斜率,就可以用导数的正/负来给指引更新的方向。

    图中红色直线是 𝑥=5 处二次函数的切线,而该点的导数 𝑓′(𝑥=5) = 20 表示的方向是图中红色箭头方向,为了得到极小值点,需要沿着导数的反向更新。

    而导数(切线斜率)的大小表明变化的速率,意思是当导数(切线斜率)比较大的情况下,变量变化所引起的结果变化也就更大。把这个概念引入到求 loss 的极小值的问题上,就是当 a 的偏导数比 b 大时,说明在当前情况下参数 a 更加重要(或者说参数 a 偏差的更大),需要对 a 进行更大的更新幅度。划重点,以变量偏导数乘以一个系数作为变量更新的数值,这个系数我们叫它学习率(learning rate),这个系数能帮助我们一定程度上控制算法模型的自我更新。

    回到前面咱们拟合数据的例子中,首先先求一下 loss 函数对分别对参数 a 和参数 b 的偏导数。先把 loss 函数展开。

    根据偏导数公式,求参数a的偏导数表达式 𝑙𝑜𝑠𝑠′𝑎 与参数 b 的偏导数表达式 𝑙𝑜𝑠𝑠′𝑏

    𝑙𝑜𝑠𝑠′𝑎 与𝑙𝑜𝑠𝑠′𝑏 是参数 a 和 b 的偏导数表达式,有了表达式,就可以在代码中定义求参数 a 和参数 b 的导数的方法了。接着刚才的代码,下面我们看看怎么定义 a 和 b的偏导方法。

    有了更新的方案,模型算法就可以按照这样进行自我更新、自我学习了。模型的学习需要一个过程,要进多次学习(step),而每次学习都是通过导数提供学习方向及更新的数值大小。现在再看看函数拟合数据的效果吧。

    最后总结一下,本次分享需要理解的有两点,第一个是理解数据数值的几何含义。第二个是基于机器学习和深度学习的人工智能技术的原理,利用函数拟合的方式用函数来表示数据,从而达到解决数据所代表的问题。

    相关文章

      网友评论

          本文标题:初识人工智能原理

          本文链接:https://www.haomeiwen.com/subject/mlfljrtx.html