人工智能从1950年图灵测试 提出到现在也经历了几十年的发展了,直到最近大语言模型 展现出的惊艳效果才再次将人工智能推到了风口。网上的资料铺天盖地,但是要想对一项技术有自己的判断,还是需要学习一下技术本身的基础知识。本文正是基于这个目的而来。
2017年的时候由于对机器学习的兴趣,我也曾经学习过一段时间,那个时候深度学习还不是很火热,那时候学习的主要还是支持向量机,推荐算法这些。最近一年的时间我重拾机器学习,发现技术真的是发生了很大的变化,现在讲的已经不是算法的巧妙,模型的数学原理 ,而是算力。
0x0. 区分几个概念
人工智能这个领域的水很深,毕竟也发展了几十年了。这期间提出了很多数学模型,算法。上面这个图针对各个领域方法间的包含关系做了个划分。我们现在常说的机器学习其实只是人工智能里面的一个流派而已。
机器学习:通过学习的手段,让机器获得智能。
人工智能的发展经历了推理 ,知识 ,学习 。推理方法论最著名的就是专家系统 ,通过知识来实现最著名的就是知识图谱。不管是推理还是知识都存在一个问题,就是这里面注入了太多的人类智慧。简单来说就是就是将人类智慧转换为规则。
机器学习则是设计一个模型,让机器自主的根据数据去学习。具体做法我们后面再讲。深度神经网络是机器学习方法里面的翘楚,通过简单的模型实现无穷大的力量。现在的大语言模型可以说真的是大力出奇迹🐶
0x1. 机器学习如何学习

机器学习根据数据是否有标签 (也就是上图中的Ground Truth),可以分为
- 监督学习:数据是有标签的,也就是输入是有对应的预期输出的
- 无监督学习:只有输出,没有预期的输出。最常见的就是聚类算法,一开始并不知道要聚成哪几类。
- 变种:半监督学习, 自监督学习等等,顺便一提现在的大语言模型在预训练的时候用的是自监督学习,其实也可以理解为监督学习。
目前大部分任务还是监督学习比较多,如无特殊说明本文说的机器学习指的是监督学习。
让我们把视角回到上图中,上图展示的是机器学习一个通用处理过程:
- 收集输入输出数据
- 定义模型:简单理解就是一个函数,给定一个输入,给出一个输出。这个函数是有未知参数的,这些参数是需要机器去学习的。
- 定义模型的学习目标 :目标显然就是让模型的输出和我们期望的输出是一样的,转换为数学含义就是我们需要定义一个函数,这个函数的输入为模型输出和期望输出,函数的输出为模型输出和期望输出的差异。这个函数称之为损失函数。
- 模型参数学习 :一般用的就是大名鼎鼎的梯度下降法
问题阐述
下面我们一个简单的例子来说明这个过程。假设我们有这样一个问题,我希望预测掘金文章的阅读数,直觉上来说这个阅读数和展现数应该有很大的一个关系。
收集数据
收集历史数据,假设收集了最近一年数据: <math xmlns="http://www.w3.org/1998/Math/MathML"> ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . . ( x 365 , y 365 ) (x_1,y_1),(x_2,y_2)....(x_{365},y_{365}) </math>(x1,y1),(x2,y2)....(x365,y365), <math xmlns="http://www.w3.org/1998/Math/MathML"> x i x_i </math>xi为展现数, <math xmlns="http://www.w3.org/1998/Math/MathML"> y i y_i </math>yi为对应的阅读数
定义模型
假设阅读数和展现数是一个线性的关系,那么我们可以定义一个模型函数如下:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> y = a x + b ; y 为阅读数, x 为展现数, a , b 为未知参数 y = ax+b;y为阅读数,x为展现数,a,b为未知参数 </math>y=ax+b;y为阅读数,x为展现数,a,b为未知参数
定义损失函数
我们肯定是希望模型的预测结果和预期结果一模一样的。
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> L ( a , b ) = ∑ i = 1 365 ∣ y i − ( a x i + b ) ∣ L(a,b) = \sum_{i=1}^{365}|y_i-(ax_i+b)| </math>L(a,b)=i=1∑365∣yi−(axi+b)∣
模型参数学习
找到一个参数对(a,b)使得损失函数最小,或者足够小。这个怎么找有一套数学方法,可以先不用管。
0x2. 神经网络

每个神经元会获取前一层神经元的输出作为输入,然后生成一个输出。
<math xmlns="http://www.w3.org/1998/Math/MathML"> o u t p u t = a c t i v e F ( ∑ i = 1 n w i x i + b ) output = activeF(\sum_{i=1}^nw_ix_i +b) </math>output=activeF(∑i=1nwixi+b) activeF称为激活函数。
神经网络为什么有用
神经网络这个模型是有数学原理支撑的,理论上只要神经元足够多,该模型能够拟合所有的曲线。称之为万能近视定理。可以看下图获得一个直观的理解。
假设我们要拟合的是 <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( x ) f(x) </math>f(x)这条曲线,按照微分的思想,曲线我们是可以用无数多的分段直线去拟合的 ,而这些分段的直线都可以用 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( x ) g(x) </math>g(x)这种形式来表示。 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( x ) g(x) </math>g(x)即对应激活函数。可以看到这个形式和上面的神经网络模型是一个东西。下图描述的是虽然是二维平面的,但是只要把自变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> x x </math>x变成一个向量,就可以扩展到高维上面。