人工智能学习——前言
一、概论理解
首先何为人工智能?简单一句人话就是:人工操纵搭建出来的智能学习模型
那我们要用它干什么?简单一句话就是:我们给出指令 ——> 得到想要的结果
最简单的生活例子来看:就好比小狗,我们让它坐 ——> 它们就能听得懂并做出坐下的效果
那么用数学的直观理解就是:输入情景变量【x】 ——> 得到我们要的结果【y】
【原始 “符号主义”】
那么一开始人们对于人工智能的想法是通过一种【符号主义】
也就是把【一个条件或多个条件】作为【A\B\C...这样的符号】,【符号T】是推导出的【结果】,根据【A\B\C...】得到【T】
于是就有了专家系统,人们根据一些专家总结出的人尽皆知、已经求证出来的推理逻辑,给到一个 “黑箱子” ,然后你给他【A\B\C...】这些条件,他就得出对应的结果【T】
但是这样的并不是一个好的人工智能,比如有的东西没有固定的规律,比如对于起伏不定、定数未知的股票,你根本没有唯一的标准来决定【T:到底买还是不买】
而且这样固定了推理逻辑的 “人工智能” ,将不会再有所改变,因为他只有固定的结果;但是我们希望人工智能是能像人类一样,根据不断地的学习,会不断增长我们的经验的
【机器学习】!!
那么人类区别于其他物体(植物,动物)的最主要区别是 “智慧”。智慧是对生活的感悟,是对人生的积淀与思考,这与我们机器学习的思想何其相似?那么人们人为一个好的人工智能应该有通过经验获取规律的能力,没有经验就没有智慧。
于是人们提出新的人工智能的理念,那就是一直沿用至今的——【机器学习】
简单来说,机器学习就是通过人工搭建设置好一套模型,它拥有自己不断再重新学习的能力,经过N多次训练后最终达到实现人们想要的结果
就好比狗狗,你叫它坐,它不坐你就直接给它一个大鼻窦,它就知道人类喊“坐”没反应就会挨揍;它跳了也揍他、它转圈也揍他,直到它坐下了,你就给他一个大牛排,它就明白人类喊“坐”该坐下了......
机器学习 - 与AI关系
;
区别1:人工智能是一种广泛的概念,而机器学习是人工智能的一部分。机器学习(ML)是一种人工智能的子领域,它使用算法和统计模型来让计算机自动从数据中学习,其目标是让计算机自动发现数据中的模式和规律,从而可以预测未来的结果。;
区别2:人工智能需要程序员来编写算法和规则,而机器学习则是让计算机自己学习。这意味着,机器学习算法可以从数据中自动发现模式和规律,而不需要手动编写规则。
二、机器学习原理
我们知道训练一个聪明的宠物狗,先去市场选这么一只小狗,然后训练时对了就奖励/错了就惩罚,然后小狗经过我们的奖惩制度下不断自我学习
那么对于机器,我们要考虑的就是:
- 模型结构:哪来这么一个聪明的模型?
- 损失函数:怎么奖励/惩罚一个机器?
- 训练过程:机器怎么建设条件反射?
1、模型结构:神经网络
那么怎么才能弄出来这么一个聪明的模型呢?人工智能,你想让它像人一样回答你问题、解决问题,那么你就要想想人是怎么做到的?
那就是人类大脑有一套完整的神经网络,帮助我们不断学习;那么机器也可以搭建一个神经网络
1)模式识别(单层感知机)
最早的机器学习叫——“模式识别”(单层感知机)
举个简单例子:我们人为判断一个“苹果”时,知道用下图这些特征来判断
那么各种水果之间有不同的 【特征】 ,比如西瓜是 “尺寸大、绿色、味道甜”,那么我们可以把这些【特征】整理成一个表,符合某一水果如果符合某一【特征】,就标记上。(符合就是1,不符合就是0)
然后我们将这些【特征】抽象成【x1、x2、x3......】这些特征变量
然后我们给定一定的【参数:1、2、3...】来表示 “符不符合”对应的特征变量
在计算公式里我们又可以把符合的参数写成正数、不符合的参数就是负数
那么这就可以整合成一个公式:【1x1 + 2x2 + 3x3 + ... = ?】
然后我们在设定一个【阈值】:b,作为判定这个是什么水果的标准值
那么当【1x1 + 2x2 + 3x3 + ...】 >= b 就说明符合这个水果标准
【1x1 + 2x2 + 3x3 + ...】 < b 就说明不符合这个水果标准
而判定最终符不符合标准的这个【结果】,看成【y】
最终公式就是: (1x1 + 2x2 + 3x3 + ...) — b = y
根据这个公式,我们不仅可以识别苹果,也可以识别别的水果,只需要把对应【特征:x1、x2、x3......】的【参数:1、2、3...】调整一下,以及对应的【阈值b】也要调整一下
比如山楂调整成:尺寸大的参数1是负数、尺寸小2是正数、红色3是正数......,对应新的【阈值b】
这就是早期的感知机(1个神经元),这一理论又称为“联结主义”
这就好像人类的神经元,神经元的轴突接收各个树突传来的信号,然后再整合成一个信号通过轴突传给别的神经元
2)神经网络的进一步发展:多层感知机
那么我们前面说的感知机只是抽象概念,真正落实到计算机上的话,我们是不可能直接让一个电脑看懂一个 “苹果的图片” 的,人能看得懂图片,但是计算机看到的只是一堆二维像素点
而且感知机在后期被认为是“错误的理论”,这是由1969年马文闵斯写的一篇《感知机》给彻底推翻感知机的理论正确性,这里我们可以举个例子来解释:
当我们的特征变量只有两个的时候,我们只需要把【x1、x2、x3......】这些特征变量写成两个:【x】和【y】即可,原来的公式也就转化成:
或者是
然后我们只需要不断调整三个参数【1、2、b】就可以作为一个解决简单的只有2个特征向量的问题的感知机神经网络了
比如下面这个问题,如何根据2个特征向量:【体重】和【长度】,来区别【鳄鱼】和【蛇】
另外这个公式大家中学一定也学过,人工智能这里大家习惯写成:1x + 2y — b = 0
那我换成中学我们学的线性规划、直线方程,大家就懂了:
Ax + By + C = 0 、 Ax+By+C >= 0 、 Ax+By+C < 0
那么我们把【x】和【y】两个特征向量分布在一个二维坐标系,就能直观区分出我们要的结果了,还是拿【区分鳄鱼和蛇】的例子来说,假如给出下面这些特征向量值,如何区分【鳄鱼】和【蛇】?
那我们画成二位直角坐标系看看,用蓝色代表鳄鱼、红色点代表蛇,一目了然,只要中间画条线就能区分开了
因此我们本质在做的事就是【线性规划】!!!我们通过调整三个参数【1、2、b】
(1、2控制直线的上下斜率,b控制直线上下移动)
然后我们求得到能够精准区分两个结果的直线方程之后,这个方程就是我们训练好的感知机模型(1个神经元)
然而,马文闵斯的《感知机》中提到,计算机组成原理里有一个电路元件叫:【异或门】
两端输入两个信号(1或0),若相同(都是1或都是0)则输出结果0,若不同则输出结果1。
那么现在带入到感知机模型(1个神经元),我们会发现它在二位直角坐标系的分布是这样的
没有任何一条直线可以将【异】和【同】两种情况完整区分开!!
因此联结主义、神经网络在之后的二三十年间被当成学术骗局、垃圾
但是(1个神经元)不行,我们多加几个神经元可不可以呢?
我们在多加一层神经元,像“苹果识别机”一样,我们设置它们分别一个是在(x=1、y=0)时激活,一个是(x=0、y=1)时激活
然后第一次(x=1、y=0)时
组合系数是1=1、2=-1(因为在计算公式里我们又可以把符合的参数写成正数、不符合的参数就是负数,那x=0就是“不符合”、y=1就是“符合”的意思嘛),阈值b=0.5
这样就组成了【1x + (-1)y > 0.5】的直线方程,当 (x, y) 符合【1x + (-1)y > 0.5】,就是其中一种【异】的情况
;
然后第二次(x=0、y=1)时
组合系数是1=-1、2=1,阈值b=0.5
这样就组成了【(-1)x + 1y > 0.5】的直线方程,当 (x, y) 符合【(-1)x + 1y > 0.5】,就是其中一种【异】的情况
;
我们把中间这两种激活状态神经元的输出设为【Y1】、【Y2】,然后直接相加(也就是求交集),当【Y1 + Y2】> 0,就说明在【异】的情况之内;当【Y1 + Y2】< 0,就说明在【同】的情况之内;
这就是【MLP多层感知机】,当中间神经元不止两个、层数也不止两层的时候,便是我们的神经网络了!!!!
3)神经网络结构细分析
以手写数字数据集为例,想让一个机器识别出下图的手写“3”图片,就需要设计一个三级的神经网络
首先我们以手写数字图像为例,每一个图片都是一个28×28像素的灰色通道图片
那么人脑对于一个 “3” 的认知是首先由一个光感系统识别它,然后大脑有一块处理视觉的智能区域,能够辨别各种形状不一样的 “3” 的意义相同
那么要让计算机理解识别,他就得从28×28=784个像素点,变为1×784的一个N维向量
然后这个N维向量数据线经过神经网络【输入层】,输入层也会有784个神经元,每一个神经元对应接收一个向量的维度
神经元在这暂时可以理解为一个存着数字的容器,里面的数值是【对应像素的灰度值】,灰度值越大色越量越白,越低越暗
然后【输入层】传给【隐藏层】,【隐藏层】提取特征并减少神经元,再由【隐藏层】传播一个更少维度的向量给到【输出层】
因为要把【数字图像】最终识别成【0-9】的任意一个数字,那么输出层就需要包含0-9的神经元即可
最后,输出一个10维的向量,作为10种数字的预测结果
这还没结束,【输出层】还会把预测结果输入给【softmax层】,由这层来产生对应又可能是[ 0~9 ]的概率
那这样笼统讲了一下,还是不明白机器到底是怎么而学习的啊,这里识别数字为什么要分三层神经网络?每一层之间到底又是怎么传递信息提取特征值?
还是以最简单的手写数字图像为例子,一个数字图像哪怕以我们人类的思维,小的时候我们学习的时候肯定也是分成几个突出的特征,然后通过组合来认识的,比如9是头顶一个圈圈加下面一竖
我们就可以在一层接一层的拆分这些数字,不单单是数字有特征,一个圆圈、一竖一横都是有特征的,在一个圆圈、一竖一横的基础上还能再拆分,一直拆成最简单的结构图像
那么我们知道前面讲了,一个数字图像有784个像素,每个像素记录着的是灰度值,灰度越高图像越亮,灰度越低图像越暗,那就可以根据这些信息一层一层的传递下去
第一层【输入层】可能会被这些信息一次性激活所有的神经元;
到了第二层【隐藏层】就可能拆成很细的一杠一撇一娜,对应数值就能激活部分神经元;
然后到第三层【输出层】就能对应激活一个圈一个竖的神经元,最终组合成一个 “9” 数字
应用到复杂的图片也可以是这样
2、损失函数
看完刚刚的手写数字图像识别的例子,相信很多人还是有问题:你凭什么认为有一杠一撇一娜就一定是能组合出数字,你能知道他们的位置吗?假如一个圈、一个竖线是 “9”,那 “6” 怎么办呢?
把上面的问题换成一种更抽象简单的说法:我们到底具体该怎么奖励、惩罚一个神经网络?我们要怎么训练得让它知道知道自己的哪些输出结果是错误的、哪些输出结果是正确的?
回顾我们之前讲得,人工智能就是人工操纵搭建出来的智能学习模型
那么这个模型就是我们要设计出一个【函数式 f(x)】来满足对应输入的问题【x】,得到想要的输出结果【y】
换成一种更贴近数学应用的说法,所谓【智能】就是给出一堆测试样例作为一堆离散的点,我们需要尽可能地找到拟合这些所有点的关系的函数曲线!!!!
而【损失函数】就是找出这个最拟合函数曲线的重点!!!!
;
泰勒公式里,完整的泰勒展开公式还有一项Rn(x) “误差项”,因为这个通式无论再无限接近原函数,终究还是存在高阶无穷小的误差的
那么这个Rn(x) “误差项”就代表了拟合函数的好坏:当Rn(x) “误差项”越小,拟合函数就越接近原函数曲线,Rn(x) “误差项”越大就代表拟合函数越不接近原函数,当然在人工智能这里我们通常把它叫做【损失函数】
1)前提补充:泰勒公式
这里我推荐各位可以先看一下泰勒公式的这个视频讲解,首先你考研、研究人工智能等等都必须要用到这些数学公式,所以很有必要花点时间去看一下,推荐这个b站视频:泰勒公式,39分钟,小白也直接上手!|高等数学_哔哩哔哩_bilibili
不看视频也可以看我这里讲解:人们发现任意曲线函数,都可以通过无限的规律的加减组合,来无限接近这个原曲线函数,比如sinx这个函数:
;
那么怎么找到这么一个规律函数的通式,来适配任意一个函数呢?
通过sinx的规律函数形式,人们总结出可以先写成:
f(x) = a0 + a1(x-x0) + a2(x-x0)^2 + .... + an(x-x0)^n + ...
;
可以发现越往后面求出更多的【an(x-x0)^n 】就越精确(别管为啥,这是前人总结的)
现在我们的目的就是找到前面的系数【ai】,就能确定在这个函数式通式了
那么假设我们现在已知有一个【原函数f(x)】,并且它在x=x0处有n阶导数
那么我们就要找到这么个通式函数【Pn(x) = a0 + a1(x-x0) + a2(x-x0)^2 + .... + an(x-x0)^n + ...】,尽可能让它跟【原函数f(x)】一样
;
数学家们就找到一个方法:让【Pn(x) 】跟【原函数f(x)】在x0处的n阶导数尽可能都相等,就能尽可能的拟合了,因为导数代表曲线函数的变化率、2阶导数是1阶导数的变化率......n阶导数越相同,就代表曲线的变化形状越相像(不理解我这句话的再自己去研究一下高阶导数的意义)
那么把【Pn(x0)】的n阶导数分别求出来,并且让【原函数f(x)】的每一阶导数都跟【Pn(x0)】的每一阶导数相等,那么下面是关于【原函数f(x)】和【Pn(x0)】的n阶导数的等式求解过程:
可以看到规律:a0就是常数a0、a1=f'(x0)、a2=f''(x0)/2!、a3=f'''(x0)/3! ..... an=f(n)(x0)/n!
那么通过这些等式我们就已经求出了系数【ai】的通式:an=f(n)(x0)/n!
所以通式 f(x) = [ f(x0) + f'(x0)/1!*(x-x0)^1 + f''(x0)/2!*(x-x0)^2 + ... + f(n)(x0)/n!*(x-x0)^n ] + Rn(x)
;
其中最后一项Rn(x)是 “误差项”,因为这个通式无论再无限接近原函数,终究还是存在高阶无穷小的误差的,它只是尽可能拟合的一个通式函数。
2)代价(损失)函数公式
统计学入门的函数,任给一个直线【预测函数】,尝试拟合直角坐标系上的所有实际点,这个函数记作:【y = wx】(其实就是直线方程的斜截式:【y=kx+b】其中“与y的截距”:b=0)
;
那么每一个实际点的值离这个函数的误差就是: ei = (yi - Yi)^2 (把函数上每一个值记作yi,实际的每一个点的值是Yi)
;
那么【代价(损失)函数】就是所有实际点和函数的误差的相加总和
通过化简、变形,变成下面式子,因为Xi、Yi(因为我敲不出^yi,所以我这里的Xi、Yi就是图片里的xi、yi,也就是实际的点的x、y坐标)是实际已知的点的坐标,因此下面黄色框的部分可以看作常数:a、b、c
最终【代价(损失)函数】式子就是下图:
;
然后对比【预测函数】和【代价(损失)函数】
可以看出,【代价(损失)函数】刚好表示了【预测函数】的变化,【代价(损失)函数】值越小、【预测函数】越接近各个实际点;【代价(损失)函数】越大、【预测函数】越跟各个实际点误差大
当【代价(损失)函数】在曲线最低端、【预测函数】最接近各个实际点
;
这是相对于一个最简单的【y = wx】的【预测函数】的【代价(损失)函数】,只涉及1个参数【w】
那么如果是2个参数呢?比如【y = wx + b】?
(其实就是直线方程的斜截式:【y = kx + b】)
那么它对应的【代价(损失)函数】将不再是一个简单的抛物线,而是一个三维空间的抛物面
不过抽象来看道理还是一样的,这个抛物面的最低点就是【代价(损失)函数】的最小值,也就是【预测函数】最完美、误差最小的状态
随着参数越来越多,相对应的【代价(损失)函数】还可能是更复杂维度的 “超曲面”
;
如何调整众多参数,从而找到【代价(损失)函数】的最小值就成了一个大问题......
3)梯度下降算法
步骤:
- 确定一个小目标——预测函数
- 找到差距——代价函数
- 明确搜索方向——梯度计算
- 一步要走多远?——学习率
要解决找出复杂的【代价(损失)函数】的最小值问题,这里就要提到【梯度下降算法】,目前基本所有人工智能大模型在做的算法,无非都是【梯度下降算法】
【梯度下降算法】要做的事就是找到参数【w】的最合适的移动步长,从而达到损失函数最小值位置
(对于【拟合函数】y=wx,步长【w】大小变化,影响y=wx大小变化;对于损失函数e=aw^2 + bw + c,步长【w】大小变化,也直接影响损失函数值 e 的大小变化)
【梯度下降算法】的梯度就是指【代价(损失)函数】的导数、切线斜率
导数意义提要:
;
回顾直线的5种方程
其中【斜截式】:【y = kx + b】,k是斜率,b是函数跟y轴的截距
那么一个曲线的某一点x0处的切线斜率要怎么求?很显然就是y1-y0 / x1-x0,也就是▲y /▲x
那么【斜截式】:【y = kx + b】中的 k也就等于下面的导数公式
然后我们再看导数的意义,我们用回【损失函数】来举例(因为损失函数就是一个曲线函数)
对于几何意义上,导数表示【f(x) 在x0处的切线斜率】,当斜率越大,f(x)函数曲线越陡峭;当斜率越小,f(x)函数曲线越平缓,那么对应【损失函数】,是不是当导数(斜率)越小,越接近函数曲线底部?
对于函数变化的意义,导数表示函数【f(x)在x0处的变化率】,变化率越大说明变化越快越多 、反之则越慢越少
【梯度下降算法】要做的事就是找到参数【w】的最合适的移动步长,从而达到损失函数最小值位置
我们用通俗易懂的说法解释,现在【损失函数】就像一片大雾里的深山,我们根本看不清中间的地形地貌,我们只知道自己脚下的地形,【梯度下降算法】要做的事就是我们要如何摸索到【损失函数】这片大山的最底山脚
参数【w】具体每一步多大:【学习率】
那么到底该怎么一步一步走下去?我们就要找到适合参数【w】的这个“步长”(又叫“学习率”)
通过测试人们发现,这个“步长”不能乱取
步子迈太大——学习率太高,比如如果直接取一个值=0.2,可能会出现以下效果,它有可能会在最低点附近来回震荡
那么导数就派上了用场:
;
因为斜率越大的时候,离损失函数最低点远,就可以让【w】移动得步长大一些(y=wx、e=aw^2 + bw + c,w大了,y=wx、e=aw^2 + bw + c不就变化也大了嘛);
;
斜率越小的时候,越接近损失函数的最低点,就可以让【w】移动得步长小一些(w小了,y=wx、e=aw^2 + bw + c不就变化也小了嘛)
;
所以对于【y = wx】这样的拟合函数,我们需要求出损失函数【e = a*w^2 + b*w + c】这个二维曲线函数的最小值,我们就得靠每次移动【w】的步长为:导数【dy / dx】,来调整参数【w】
但是要精确来看,其实也不能完全让【w】=【dy / dx】
因为人们发现直接这么取会导致损失函数值一直左右反复横跳.......
恰当的学习率:直到人们发现,把斜率缩小,让斜率乘一个很小的值,就能以非常丝滑的方式移动到损失函数最底部,并最终停下
(例如0.01)是受推崇的,效果也不错,很快找到了最低点
那么这个很小的值有个名字叫【学习率】,最终的步长参数【w】的公式就是
【新w = 旧w - 斜率 + 学习率】
简单来说,梯度下降算法就是这么4个步骤:
但是我们刚刚的例子只是简单的1个参数的拟合函数(y=wx)
即使找到损失函数最小时的参数值【w】,使得损失函数值达到最小,但是1个参数的拟合函数明显还是跟实际点的误差很大很大,需要加入更多的参数
我们在这再举个例子:
;
先假设任意曲线函数的拟合函数可以由6个函数组合组成:f(x)=常数、f(x)=x、f(x)=x^2、f(x)=x^3、f(x)=x^4、f(x)=x^5,搭配6个系数参数:k0、k1、k2、k3、k4、k5就是这个通式拟合函数了
;
拟合函数 => f(x) = k0 + k1*x + k2*x^2 + k3*x^3 + k4*x^4 + k5*x^5
(这里拟合函数就类似我前面泰勒公式里讲的那个通式函数)
然后我们来求对应它的【损失函数】
我们可以理解我们在玩一个游戏机,游戏机有这么几个参数,你需要通过调整它们,使得【损失函数】贴近【原函数f(x)】
但是问题来了,哪怕是这个五次多项式就已经有6个参数了,实际上要解决很多复杂问题的神经网络并不能只靠这么点参数,可能还要成千上万个参数要调,这怎么调啊????
根据前面我们讲的:如何找【y=wx】这样的一个参数的拟合函数的损失函数的参数【w】,我们已经知道如何调整参数【w】的步长了
对应这里就相当于,假设现在已知【k0、k2、k3、k4、k5】都已经固定好了,然后我们就可以考虑调整【k1】这个参数来适配拟合函数
然后按照前面讲的【新w = 旧w - 斜率 + 学习率】就可以很快把【k1】调整到最完美的状态,让损失函数降到最小,从而拟合函数误差最小
但是现实是不止一个参数旋钮需要我们调
前面我们对于 “如何找【y=wx】这样的一个参数的拟合函数的损失函数的参数【w】”这样的方法还有用吗?对2个参数该怎么办?其实一样!
这里要用到的数学是【偏导数】!!!
我们知道两个参数时,【损失函数】是一个三维的抛物曲面,那么我们可以先固定参数【k2】,只变化【k1】,这样我们就得到了【损失函数对于k1的偏导数】;
反之,先固定参数【k1】,只变化【k2】,这样我们就得到了【损失函数对于k2的偏导数】;
对应图像就是,就意味着我们用两个垂直的平面与损失函数这个曲面相交,如果固定【k2】,那么其中一个截面会在在损失函数曲面截出一条曲线,然后求【k1】在这条曲线的导数;反之亦然
这【求偏导】便是完整的所谓的【梯度】!!!!
【梯度】说白了就是在某个给定位置的函数【变化最快的方向】,也是曲面在【局部最陡峭的方向】
注意是局部!
不仅仅是两个参数,对于多维的超曲面,我们都可以每次先固定其他参数,然后将其中一个参数向局部损失函数最快方向前进
这样就会得到每一个参数对应的偏导数,如果是6个参数就会对应得到6个偏导数,对应这就是一个6维的【梯度】
然后我们只需要不断在上一个参数调整完的基础上迭代调整下一个参数,一直往后迭代,就能拟合出这些数据底层的规律了
这就好像走山路,我们每次都直接朝着一个局部最低的地方走去,可能这不是山脚,但至少会比原来的位置低,那么这么一直走下去,总能走到山脚
4)反向传播算法(暂时不讲细节,只讲思想)
刚刚我们说了【梯度】这个原理概念,但是我们具体怎么去计算这个【梯度】呢
因为要知道这神经网络中间可能是有数万层神经元的,细看的话其实每一次都是生成一个拟合函数【f(x)】,然后一层一层的迭代之后复合之后,最终最后一层才会得到一个代表整个神经网络模型的函数【F(x)】
前面我们学的【感知机】模型,都只是一些简单的加减乘除、指数.....函数,那么这是针对一层感知机模型而言的单个简单函数
对于神经网络,我们中间有很多很多层神经元,抽象的理解我们就是把每一层的简单的加减乘除、指数.....给不断组合、复合、迭代,最后组成一个超大的超复杂的复合函数
那么我们关心的是每个参数【w】变化一点点,最后的损失函数随之变化的对应关系
那么我们在最后一层得到的复合函数是这个模型想要的预测函数式,我们直接对它计算损失函数,然后再进行求导,这样我们就得到了最后一层预测函数的损失函数的参数的调整【步长】
接着根据链式法则,我们一层一层往回求每一层复合函数的导数,这样一直回到第一层,然后将每一层的导数乘在一起,我们就知道了这个参数相对于整个神经网络的调整【步长】了
就好比几层齿轮,导数代表这些齿轮的转动的速率,如果我们想知道调整第一个小齿轮会让最后一个大齿轮转多块,那只需要把他们的每一层齿轮的速率乘在一起就行了
5)泛化
最后,为什么我们用给出的训练实际点,机器不仅能得出我们要的已定答案,还能自己学会对应的思路?
就好比我们只告诉小孩1+1=2、1+3=4,但是他是怎么学会3+3=6的呢?
这是因为神经网络具有 “泛化”,他根据我们给出的实际点,“勾勒”出一种趋势,一种拟合函数,即使在某些地方我们并没有给出准确的已知的答案,但是随着这种趋势机器也会觉得应该是某个结果
三、大语言模型原理
我们正常人的说话逻辑是严格按照语法逻辑来的,虽然我们并不会刻意去用语法说话,但是潜意识我们就是会按照正常的语法感觉,先想好然后再说出来
但是大语言模型不是,他是一个字一个字的在做“完形填空”,他会有对每一个空的预测的数万个结果,但是具体要填哪一个?要根据具体的语境来判断
1、【语言学】:语言规律
对于任何语种语言,远古时期都是从象征某种事物的 “符号”,因此任何语言都是“符号”
每个词语在人工智能这里专业名词叫【token】,对应在语言学中又叫 “语素”
因此语言的规律就是理解每个token(词语)在现实世界所表示的意义,以及他们是以什么规律一个接一个的出现,这种规律出现的序列整体传递的是什么意思
那么【计算语言学】就是要计算出每下一个词出现的规律
2、语言模型
1)语法模型
最早提出的语法模型,人们考虑的就是用语法来设计,根据已定的语法,构建“语法树”结构,让模型根据这个结构构建语言,但是发现根本行不通,就好比1928年艾弗拉姆提出的例子:“无色的绿点子狂暴的睡觉”,语法完全没问题,但是语义狗屁不通......
而且现在还有这么多网络语言,总不能产生一个网络语言就再制定一个对应的语法规则吧?
于是这个想法行不通
2)统计语言模型
第二种就是后面我们平时常用的输入法,当我们输入的一个内容之后,一直点下去就会一直连着出现跟上一个内容相关联的词语
专业名称叫【n-Gram Model】,n就是代表上一个内容的字数
比如【1-Gram Model】就是根据每次输入的上一个字,对应产生对应关联这个字的下一个字
【2-Gram Model】就是根据每次输入的上一词语,对应产生对应关联这个词语的下一个词语
根据上一个文本的长度,使用统计的方法,预测生成对应下一个文本的算法就是:统计语言模型
虽然它生成的文章整体依旧意思狗屁不通,但是这种针对上一个文本内容生成下一个文本内容的思想,对GPT模型提供了很大帮助
3)GPT模型
上面我们说的统计语言模型里的【针对上一个文本内容生成下一个文本内容的】的过程,就对应GPT里的【Pre-trained(预训练)】
G对应【Generative(生成)】,表示模型做是的生成语言的任务
T对应【Transform(改变)】,表示具体用来训练并预测后面那个词是什么的模型
而GPT主要强大的点就来自于transformer,这里比较,后期再详细专题讲解
这里暂时只需要知道transformer是一个会举一反三的模型,根据输入的是图片还是文字,找出识别图片的规律或找到文本下一个词语的规律是什么
这种一个字一个字生成的方式的专业名词叫 “next-token-prediction”
那么到底是怎么让GPT模型能够理解人类语言的词感、语境、情绪、含义......?
依旧跟人类一样,人怎么学它也怎么学,依靠的就是海量庞大的数据,在夸张庞大的数据集反复训练下,GPT才慢慢能理解人类说话的规律
另外GPT对于这么大的数据集的计算所要耗费的时间很长,这也就是为什么市面上的AI模型需要依靠大量的GPU来跑程序
最后,GPT模型还需要两个步骤来实现日后日愈精确的结果,一个是【监督训练微调】,一个是【人类反馈强化】
简而言之就是,前者是在训练时期就参与人工干预,人为调整;后者是在后期实际使用模型的时候,用户给予对模型结果的反馈,从而让机器意识自己的的结果是正确与否