· 10 分钟

人工智能 入门笔记

符号主义(symbolism)

又称为逻辑主义(Logicism)、心理学派(Psychlogism)或计算机学派(Computerism),人工智能最早的流派,已经废弃

原理是,知识是一条逻辑规则,如果A这样,则B成立

优点:门槛低,如专家系统,股票预测系统

缺点:由于逻辑由人给出,上限永远比不过真人,且无法像人一样慢慢总结经验进步

机器学习

人工智能主流流派,由联结主义发展而来,模仿人类大脑

就像训狗一样,对了给奖励,错了给惩罚,狗就会变聪明了

狗从哪里来
怎么奖励狗
狗怎么变聪明

分别对应

模型结构
损失函数
训练过程

感知机

借鉴于符号主义,在符号主义的基础上加上权重比值,实现数值计算

如:识别苹果

红色 +1

黄色 +0.5

黑色 -1

形状小 +1

形状大 -1

味道甜 +1

味道酸 -1

把识别到的加起来,只要大于等于3,则就是苹果。

红色+形状小+味道甜 >= 3

红中带黄也是苹果:红色+黄色+形状小+味道甜 >= 3

而这称为感知机

但是感知机有一个问题,无法做异或操作(相同输出0,不同就输出1)

xyx⊕y
000
011
101
110

随便套一个公式会发现 :

0.7x + 0.7y - 0.5 > 0

是一个二元一次方程,在数轴上是一根直线,无法用一根线割出异或范围

而解法,则是把结果再做一次输入

称为多层感知机

1x + (-1y) - 0 > 0X1激活为1,否则为0
1y + (-1x) - 0 > 0Y1激活为1,否则为0
1X1 + 1Y1 - 0 > 0 时输出1,否则为0

(-0 为阈值,为了好理解可以暂时忽略)

轻松实现了异或识别

卷积神经网络

当然中间层可以不止两个,也可以不止两层。

哪怕开头只有两个输入

只要深度和宽度足够大,可以在理论上拟合任何一种函数

例如数字图像识别:

第一层输入神经元识别每一个像素,而后面神经元根据前面像素组合,识别是横、竖、撇、点。再后面神经元根据横竖撇点组合,识别数字。

后来人们发现,在动物视觉的神经系统的神经元,不需要和前一层所有神经元全部连接,只需要和局部的连接一起,而且连接结构也是类似。

而这便是卷积神经网络CNN

我们可以借鉴这一点,减少参数和计算量,提升性能

残差网络

再后来,人们发现卷积神经网络层数多了,训练起来有困难,又增加了一种跳跃式的连接,这就是残差网络Resnet。

或者可以把任何两层都跳跃连接起来,这就是densetNet

残差网络

densetNet

梯度下降

所谓智能,就是给你一堆点,用函数拟合点之间的关系,俗称找规律

在实际工作中,需要输出的结果往往不是非黑即白。结果可能不算错误,但是离完全正确又有一段距离

拿识图举例,给一张小树苗的图片,输出小树苗年龄,这时输出结果就不再对和不对了,而是完全正确、几乎、差不多、差得多、认真点。每次输出结果和正确答案就会有可视化的差距。

拟合函数

数据点则是我们的训练目标,也就是正确答案,给数据点找规律,拟合数据点的函数就叫做拟合函数

拟合函数

衡量一个拟合函数好不好叫损失函数,逐一对比计算所有数据点的偏差,并将他们平方加在一起,就会得到损失函数输出了。损失函数越低,拟合函数则越准确。

而拟合函数的难点在于,里面可调节的参数太多了,拿上面的异或识别举例,一共有9个参数(上面异或公式里的常量)可以调整。而像 GPT3 有1,750亿个参数。在数学上,这问题叫做非突优化,求解起来非常难。

因为一旦模型做大做复杂,虽然觉得它很强大,但是你找不到一个好的参数让实现这种强大。

而解决办法就是,我们假设其他参数都已经调优,现在只需要考虑把眼前这个参数调好。我们通过调节一个参数,观察损失函数的变化,目标就是找到他的最低点。

需要注意的是,我们一开始提供的数据往往不是连续的,也就是参数中间可能空了一段标准答案,导致无法看清损失函数。

不过,我们可以知道局部走势,知道是递增还是递减,也就是损失函数在某一点的切线斜率(导数

这时我们每次看着导数,来决定参数要往哪边走,走多远,直至停在底部。

通过这种办法,可以扩展成同时调节两个参数,就变成了输入两个参数的,输出一个损失函数的二元函数。用图可以表示成二维曲面,也就是损失曲面

这时,我们可以固定K2参数,只调K1参数,就得到损失函数对K1的偏导数

也就是用两个垂直坐标轴的截面和曲线相交,会分别切出两个曲线来。

如法炮制,固定K1,只调K2。

如图

最后把两个偏导数拼在一起,就得到了梯度,也就是二维版的求导。

梯度给出二维曲面上每个点上升最快的方向,

由于上升是损失函数变大,所以要反过来走,也就是梯度下降

既然用这套方法,同时调两个参数可以实现,那么就可以应用到任意多个参数。

反向传播

但是,面对复杂的神经网络,要如何优雅的计算梯度?

方法就是利用是链式法则,也就是函数嵌套。

举个例子

三个齿轮转过的角度分别是 x g(x) f(g(x))

而导数表示两个此轮之间,传动的速度之比

如果我们想知道变动最大的齿轮,会导致小齿轮变动多快,

就只需要把两个传动比乘在一起就可以了。

利用这方法我们可以从后往前拆解,这是从每一个参数到损失函数,中间一定经历了一系列函数复合。

例如,我们想调节输出结果,会导致参数有变化,可以利用上面方法从后往前,把每一个嵌套这个传导的导函数全部乘在一起,

就得到了这个参数相较于损失函数的梯度

而这,就是反向传播,专门用于计算复杂神经网络的梯度算法。

累了,休息一下

返回文章列表