人工智能是一个非常广泛和深刻的领域,它涉及到很多不同的学科,比如数学、物理、心理、生物等等。人工智能的目标是让机器能够模仿或者超越人类的智能,实现各种复杂的任务。但是,什么是智能呢?我们又如何让机器具有智能呢?
在这篇文章中,我们将从一个简单而又基础的问题开始探索:如何用数学函数来描述直觉。直觉是我们认知世界的一种方式,它不需要太多的逻辑推理,而是依靠经验和感觉。直觉有时候很准确,有时候也会出错。那么,我们能不能用一个简单的数学模型来模拟直觉呢?答案是肯定的,而且这个模型就是人工智能中最早也最基本的神经元模型:一元一次函数感知器。
什么是一元一次函数感知器?
为了理解一元一次函数感知器,我们先来看一个生物学的例子。假设在很深很深很深的海底,住着一个简单的生物小兰,她的世界很简单,就是去寻找周围能够吃到的一种叫做豆豆的植物,并靠此生存。但是这些豆豆在漫长的演化历史中,为了保护自己逐渐进化出了毒性。毒性的强弱和豆豆的大小有关系,越大的豆豆越有毒。而小兰也进化出了一个能够检测豆豆大小的器官,那么问题来了,小兰如何根据豆豆的大小判断它到底有多毒呢?
显然,小兰需要一个思考的器官,也就是我们常说的脑子。但是我们又如何去描述思考或者认知呢?认知以前当然就是一无所知,这种情况下,认知事物唯一的方法就是依靠直觉。那么我们又该如何去描述直觉呢?很明显是函数。为什么是函数?仔细想想,我们本来一直就在用函数认识这个世界。在物理中,一个质量为 的物体在不同的受力 下产生加速度 ,这是一个以 为自变量 为参数 为因变量的函数。在经济学中,我们把消费、投资、政府购买和进出口作为自变量,也可以形成一个关于 GDP 的认知函数。实际上,除了这些严格的领域,在很多不那么严格的事情上,如果你愿意。
其实也可以用函数去描述认知,比如气温对人心情的影响,可能是这样的一个函数:
def mood(temperature):
if temperature < 0:
return "cold and unhappy"
elif temperature < 10:
return "cool and calm"
elif temperature < 20:
return "warm and comfortable"
elif temperature < 30:
return "hot and excited"
else:
return "sweaty and annoyed"
一只小狗的眼睛大小和它可爱程度的关系,可能是这样的一个函数:
def cuteness(eye_size):
return eye_size ** 2
而后者这种不严格,人类更加擅长的问题,也就是我们人工智能要解决的问题,找到一个恰当的函数去描述它如此这般,把智能体对世界认知的过程看作是在脑中不断形成各种函数。似乎也就好有道理了,既然是直觉,那么就不需要太多的理由,豆豆的毒性和它的大小有关系,所以这里的直觉自然是一个一元一次函数。豆豆的大小 是自变量,毒性 是因变量,而 是一个确定的参数,也就是我们常说的直线的斜率。
一个简单的一元一次函数就可以描述一个直觉,建立一种思考的模型。当我们去类比生物神经元的时候,你就会发现用一个一元一次函数去描述认知,可不是乱用的,完全是有备而来。这实际上就是早在1943年,由神经学家麦克洛克和数学家皮茨在他们合作的论文中提出的一种神经元模型:麦克洛克-皮茨模型。这个模型是对生物神经元一种相当简化的模仿,这些是树突,这些是轴突,输入信号通过树突进入神经元,再通过轴突输出结果。它们分别对应着函数中的自变量和因变量输出。一般来说,有很多个输入端,如果只有一个输入,也就是一元函数。如果是两个,那就是二元函数,比如豆豆的毒性不仅和它的大小有关,也和颜色有关。三个输入就是三元函数等等等。而至于参数 ,它实际上起着控制树突上输入信号的作用。换句话说,控制着不同输入对输出的影响,我们也称之为权重。因为我们在判断一个东西的时候,不同因素对结果的重要性都不太一样。也正因为如此,我们会发现,麦克洛克-皮茨模型选择用一次函数而不是其他函数来模仿神经元是一件很自然的事情。树突输入 对权重参数 扩大或缩小,然后输出简单且有效。当然,完整的麦克洛克-皮茨模型中还有一个偏置项 ,而在一次函数后还会加上一个激活函数 ,用来激活神经元的输出。我们会在后面讨论这些东西,简单起见,暂且不表。
还是回到这个树突只有一个输入端的神经元上面来。为了理解方便,我们用简化的图形来表示:
那么小兰靠这个神经元可以存活下去吗?
看得出来,随着 取不同的值,这个直觉函数往往会产生很多的错误。当然,也不排除小兰的直觉很准,就像这样:
那么我们现在面临的问题就是这个一元一次直觉函数中的参数 设置为多少,小兰才能很好地进行预测呢?也就是说,如何从偏离现实的直觉过渡到符合现实的认知呢?
比如小兰大脑中神经元的权重值 开始是 0.1。看见一个大小为 0.59 的豆豆,经过神经元的计算,认为毒性是 0.059,于是一口吃进去。糟糕,其实它的毒性是 0.68,具有极高的毒性。很明显,小兰现在的神经元很草率。
作为早已具有智能的人类,我们知道把 调大一点,再大一点,这样就好了。但是机器又怎么知道呢?最开始,麦克洛克-皮茨神经元模型中的权重值确实需要手工调整,并没有自动的学习方法,这未免有点太不智能了。
于是,在1958年,一名叫做罗森布拉特的心理学家在麦克洛克-皮茨模型上推出了罗森布拉特感知器模型。他让神经元有了自己调整参数的能力。罗森布拉特感知器是第一个从算法上完整描述的神经元,在此之后受到他的启发。工程界、物理学界、数学界就开始纷纷投入神经网络的研究。人工智能也开始了蓬勃的发展。
我们来看一下罗森布拉特感知器是怎么做到让神经元能够改变权重值 的。其实很简单,也很直观。输入通过麦克洛克-皮茨神经元模型之后,输出一个结果 ,用标准答案 减去这个结果 ,得到误差 。这意味着预测和标准之间的差距。然后自然是根据这个误差去调整参数 ,比如我们让 直接加上这个误差 ,再让结果作为新的 。你看这样就做到了预测过小的时候误差为正数 加上误差之后向大调整,下次预测的时候结果就提升了。反过来,当预测过大误差是负数的时候, 向小调整。
这就是罗森布拉特感知器的学习过程,通过误差修正参数。当然,在罗森布拉特感知器模型中,误差还有乘以输入 ,这是为何呢?我们知道豆豆的大小只能是一个正值,小于零的豆豆可谓让人匪夷所思。但是以后我们一定会遇到输入值是负数的情况。当输入数据是负数的时候,你会发现事情正好相反,预测过大的时候需要增加 ,而不是减少。而预测过小的时候需要减小 ,而不是增加。所以我们让输入 乘以误差 ,就被巧妙地解决了。当 为正数的时候,预测过大误差为负数乘以 之后,还是负数 减小。预测过小误差为正数乘以 之后还是正数 增大。
而当 为负数的时候,预测过大误差为负数乘以 之后变成正数 增大。预测过小误差为正数乘以 之后变为负数 减小。
当然,误差除了乘以输入 之外,罗森布拉特感知器模型还让误差乘以了一个系数 ,比如 0.05,这意味着我们每次修正的时候幅度都降低了 20 倍。这个 也就是所谓的学习率,这又是为何呢?根据奥卡姆的剃刀原理,我们不妨先拿掉这个学习率参数,看看会怎么样?这时候,参数调整的过程是这样子的:
不对劲,我们让 等于 0.5 是这样的:
还是不对劲,我们让 等于 0.1 是这样的:
事实上,当 等于 0.0935 的时候,好像卡住了:
当我们继续把 向小调整,我们终于发现参数调整的过程震荡越来越小:
没错,让误差乘以学习率是为了防止调整幅度过大,错过最佳点,就好像一个人,如果他每走一步都是固定的一米。而他一开始在距离原点 0.5 米的位置,那么不论他怎样都到达不了原点。当然,学习率也不是越小越好,太小的学习率会让这个调整的过程磨磨唧唧,让人心酸呐。
这就是罗森布拉特感知器的全部工作原理了,当然机器学习的本质是数学,一切设计必须有数学的支撑。比如,这里通过误差修正参数,误差还乘以了输入和学习率,这个看起来就很玄乎的公式。虽然直观上很符合我们的感受。但谁又能保证客观上通过这种方式就一定能够调整出一个合适的参数呢?而不是越来越远离正确值呢?也就是说,如何从数学上证明这个模型中的 调整方法最后就一定收敛呢?
罗森布拉特感知器之所以拥有如此重要的历史地位,就像我们说的那样,它第一次完整地从算法上描述了一个神经元。这种描述当然也包括数学证明,但这个感知器收敛定理的证明过程有点冗长且繁琐,我们就不逐个解释了,有兴趣的同学可以自行推导。当然,证明的事情只是一颗定心丸而已,让我们相信它在数学上是合理的,如果同学们去证明有困难,也不会影响后续内容的理解,你只要相信这个感知器模型在数学上确实可以被证明 最后一定收敛于某个值。
在现代机器学习神经网络应用中,古老的罗森布拉特感知器的学习方法已经很少采用。接下来,我们将看到一种目前比较常用的学习方式:梯度下降和反向传播。这种方法可以让我们处理更复杂的函数和更多层的神经网络,从而实现更强大的人工智能。
什么是梯度下降和反向传播?
梯度下降和反向传播是两个密切相关的概念,它们都是基于一个共同的目标:最小化误差。误差是指我们的预测和标准答案之间的差距,也就是 。我们希望通过调整参数 和 ,让误差尽可能地小。但是,误差并不是一个简单的数值,而是一个复杂的函数,它取决于输入 、输出 、权重 和偏置 。我们可以把误差函数写成这样:
这里我们用了一个常见的误差函数:平方误差函数。它表示预测和标准之间的距离的平方。为什么要用平方呢?主要有两个原因:一是为了消除正负号的影响,让误差总是正值;二是为了放大较大的误差,让它们对参数调整有更大的影响。当然,平方误差函数并不是唯一的选择,还有其他的误差函数,比如交叉熵误差函数等等。我们在后面会介绍更多。
现在我们有了一个误差函数 ,我们如何找到它的最小值呢?这就需要用到梯度下降法。梯度下降法是一种迭代优化算法,它可以用来求解各种复杂函数的最小值或者最大值。梯度下降法的基本思想是:从一个随机的初始点开始,沿着函数下降最快的方向移动一小步,然后再从新的位置重复这个过程,直到找到一个局部最小值或者全局最小值。
那么如何确定函数下降最快的方向呢?这就需要用到梯度的概念。梯度是一个向量,它表示函数在某一点上变化最快的方向和速率。梯度可以通过求导数来计算。对于一个多元函数 ,它的梯度是一个由偏导数组成的向量:
梯度的方向是函数增长最快的方向,而梯度的大小是函数增长的速率。如果我们想要让函数减小,那么我们就要沿着梯度的反方向移动。这就是梯度下降法的核心思想。具体来说,我们可以用这样的公式来更新参数:
这里的 仍然是学习率,它控制着每次移动的步长。我们可以看到,参数的更新是根据误差函数对参数的偏导数来进行的,也就是误差函数在参数方向上的梯度。我们用一个负号来表示沿着梯度的反方向移动,也就是下降的方向。这样,我们就可以不断地迭代更新参数,直到误差函数达到一个最小值。
那么如何求出误差函数对参数的偏导数呢?这就需要用到反向传播法。反向传播法是一种高效计算复杂函数梯度的方法,它利用了链式法则和动态规划的思想,从输出端开始,逐层反向计算每个参数对误差函数的贡献。反向传播法的具体过程比较复杂,我们在后面会详细介绍。
通过梯度下降和反向传播,我们就可以让神经元自动地学习最优的权重和偏置,从而实现更好的预测和认知。这种方法不仅适用于一元一次函数感知器,也适用于更复杂的函数和更多层的神经网络。在下一篇文章中,我们将介绍如何用多层神经网络来实现更强大的人工智能。
总结
在这篇文章中,我们介绍了如何用一元一次函数感知器来描述直觉,以及如何用梯度下降和反向传播来让神经元自动地学习最优的参数。我们了解了以下几个重要的概念:
- 直觉是一种认知世界的方式,它可以用数学函数来描述。
- 一元一次函数感知器是一种最简单也最基本的神经元模型,它由麦克洛克-皮茨模型和罗森布拉特感知器模型组成。
- 梯度下降法是一种迭代优化算法,它可以用来求解复杂函数的最小值或者最大值。
- 反向传播法是一种高效计算复杂函数梯度的方法,它利用了链式法则和动态规划的思想。
希望这篇文章能够帮助你对人工智能有一个初步的了解和兴趣。如果你想要了解更多,请继续关注我的后续文章。谢谢你的阅读!