本文系统介绍了人工智能领域的基础概念,重点解释了神经网络如何通过将实际问题转化为数学问题来学习。详细阐述了神经网络作为复杂函数的表示方法、参数学习中的最优化问题、梯度下降和反向传播的工作原理,以及不同类型的损失函数。通过天气预测等实例,展示了从问题建模到训练学习的完整流程,帮助读者理解大模型背后的数学原理和核心机制。
这期内容写什么我犹豫了很久,本来是想写一些别的论文,但是了解到很多朋友对人工智能领域中的一些基本概念还不太清楚,但是又很感兴趣,所以还是决定出一期内容,专门来讲讲这些看起来高深的基础概念到底是什么。
本期内容目录如下:
- 问题建模:将实际问题转化为数学问题
- 神经网络:复杂函数的表示
- 参数学习:最优化问题
- 关于batch norm 和 layer norm区别的直观示例
- 梯度下降:调整参数的方法
损失函数:衡量误差的指标
梯度的定义和参数更新
- 训练学习的流程
首先,一言以蔽之,当前,你看到的任何模型,不管是Transformer,diffusion model,VAE,world model还是什么天花乱坠的看着不明所以的模型,本质上都是各种不同结构的神经网络。而神经网络的训练、学习全都是同一个方式——梯度下降和反向传播。
总之,你可以把神经网络想象成一块积木,而那些拥有天花乱坠的各种名字的模型全都是用这块积木搭建成的不同形状的东西。Transformer的名字最形象,中文名变形金刚,变形金刚本身也是积木搭出来的。虽然这个名字是因为作者喜欢变形金刚才取的,但是也确实很符合Transformer现在作为大模型基石的地位,它本身很强大但同时又很灵活,可以有各种应用和变体。
其实我觉得现在很多教程都讲反了,上来就给公式说结论,看着不明所以。而我们日常生活中的逻辑,一定是先遇到一个问题,然后才想到要用什么方法去解决,而这些模型都属于方法,所以我们必须要先把问题讲清楚。
问题建模:将实际问题转化为数学问题
我们生活中所有的问题都可以用数学建模,如果解决不了,基本上就是你建的模不行,或者数据量不够。
打个比方,明天某地天气如何?这看起来和数学没关系吧?但实际上,你可以把天气分类成晴、阴、雨、雪、雾,这就成了个分类问题。
这个问题可以被表示成,输入是过去某地区几年内的每天的天气、这个地区所在的经纬度等,输出就是应晴、阴、雨、雪、雾这五类天气的概率,都是0~1之间的值。输入也给成这种数据形式,那就完全可以用数学来解决。而这种把实际问题转化成数学问题的过程,就称为建模,也可以理解成,把实际问题翻译成数学语言来表达。
再比如我们平时刷短视频,为什么存在信息茧房,为什么你越喜欢什么你就越能刷到什么内容?是因为平台收集了你点击的视频数据,他们会拿去建模你的喜好,和你的个人特征。首先他们自己的视频会有一些标签,比如知识科普,个人成长,萌宠,育儿,职场,旅行,情侣,美食,舞蹈,音乐,电影,动漫,美妆,穿搭等等等等,你点击哪一类的更多,在哪一类视频上的停留时间更长,那他们就会更多的给你推荐这一类,而且从喜好上也可以反推出你个人的一些特征,比如你看育儿的多,那你大概率是个宝妈,你看职场的多,那你大概率是个牛马等等。所谓推荐算法就是建模你的喜好得来的。
我们都学过函数,知道y=F(x),其中x是输入,y是输出,F(x)是x和y的对应关系对吧。上面的两个例子中,历史天气经纬度、视频点击输入就都是x,而明天天气、个人喜好特征就是它们对应的y,我们要学的,或者说我们想得到的就是y=F(x)的一个对应关系,我们希望通过这个对应关系,可以用已知的数据去预测明天天气、个人喜好。
神经网络:复杂函数的表示
在神经网络出现之前,遇到这种问题,要怎么解决呢?
数学家或者说算法专家们会绞尽脑汁的试图建立一个公式,来描述输入的数据和输出的数据之间的关系。但这很难很复杂,对吧?
然后,神经网络出现了。这是一种非常暴力的解法。我管你输入输出什么关系,你自己用数据自己学。
接下来我们就展开讲讲神经网络是什么,为什么这个东西给它点输入输出的真实数据样本,它就能自己学了。
这张图就是一个非常简单的神经网络。隐藏层其实就是除了输入输出之外的所有层,我们还可以再添加更多的隐藏层,但是输入和输出都是只有一层的。
接下来我们把上文说的天气问题简化一下,来看看如果套用神经网络,天气该怎么学。
假设输入只包含两个数据,就是今天的天气x1(假设只包含阴晴两种天气,阴天用0表示,晴天用1表示)和经纬度x2(假设经度116纬度39表示成11639),输出y用一个0~1之间的值,表示明天是个什么天气的概率。y1表示阴天的概率,y2表示晴天的概率,其他天气先忽略。
除了x1,x2和y1,y2之外,我们还看到了连接线上标注的权重wij,这些表示的其实是输入对输出影响的强度。
怎么理解呢,其实神经网络这个东西来自于我们人脑的神经元,如下图。
看着有点复杂对吧,没关系,我们把复杂的部分全给它盖住,简化成下图:
是不是和神经网络那张图一模一样?其实w代表的就是神经元之间传递的信号强度,比如说x1这个神经元本身的信号强度是1,w11的传输强度只有0.6,那么传给h1的时候就变成了x1*w11=1*0.6,也就是说只剩0.6了。但我们可以看到h1的信号来源不止有x1,还有x2,假设x2=2,w12=0.4,那h1=x1*w11+x2*w12=1.4,后面的y1的计算也是同理,我们先忽略掉激活函数这个概念,假设y1=w’11*h1+w’21*h2+w’31*h3,那么,我们是不是可以很清晰的看到,y1和y2与x1和x2之间建立了如下的函数的对应关系:
所以,神经网络本质上表示的就是更加复杂的函数。
参数学习:最优化问题
那神经网络学的是什么呢?它和我们平时给个输入给一堆条件,让你建立方程求结果的过程不一样,它学的是w这些参数的值,我们要求解的是参数,这在数学中被称为最优化问题。
这么多个参数怎么求解?参数太多了没法解方程。怎么办?
靠猜!
对,就是这么朴素。
猜,所以初始值可以是随机的。但是关键是,你猜的不对的时候怎么优化呢?
比如你现在有个数据样本,昨天的天气是晴,也就是x1是1,经纬度x2的值就是11639,然后今天的天气也是晴,也就是y1是0,y2是1。初始的时候你先随便猜了一些参数w。为了方便计算,咱们先假设全都是1。
你带入算了一下子,得到y1=y2=34920,你跟答案的y1=0,y2=1对比了一下,
你说,不行,这太离谱了,误差太大了。
你发现输入x2的值普遍很大,对结果影响很大,所以得把跟他有关的参数全调小。然后你就一点一点的试,直到你得到了一组w,当x1=1,x2=11639的时候,y1,y2的值和答案大差不差。
这是一种方式,还有另外一种方式是,将数据调整成范围差不多大的,然后再去调整参数。比如我们可以让1.1639来表示经纬度(116,39),这样让数据分布的范围更集中往往训练效果更好(我们的大脑神经元的电信号也是集中分布在几十μv,不会差太多)。实际中我们一般采用的是归一化的方式来达到类似的效果,Norm,Normalization说的都是这种方式。
那么我们之前在确定参数的时候为什么不搞一组参数让你得到的y1,y2和答案完全一样?你只有一组或两组x,y的样本数值时当然可行,但数据点多了之后不会那么理想的聚在一条直线上,难免会有误差,咱们拿最简单的线性关系y=wx来看一下:
- 关于Batch Norm和Layer Norm区别的直观示例
关于Norm操作,很多朋友可能都听过Batch Norm和Layer Norm,我们现在就用这个例子来直观的看一下这两种Norm方式的区别。
来看下面这两组数据,每一行代表[x1,x2,y1,y2]:
Batch Norm是针对一个批次(batch)数据的归一化操作,我们现在这个批次有两个数据,我们关注的是batch数据的分布,也就是不同数据样本之间的关系,所以我们的归一化是纵向求平均值和方差,得到:
根据这个平均值和方差利用下面的公式将原始的数据进行归一化:
这里面ϵ是个很小的正数,为了防止分母为0,我们取1e-8,归一化后的两组数据如下:
Layer Norm与Batch Norm不同,针对的是单个数据内部的归一化操作,也就是说会对每一行取均值和方差。
再次利用之前的归一化公式得到:
这两种归一化方式各有利弊。比如batch norm通常需要一个batch的数据量更大一些。像我们这个例子一个batch只有两个数据就不行,这样得到的均值方差不准确。
梯度下降:调整参数的方法
好的,现在我们知道,当我们自己想构造一个拟合这些数据关系的曲线时,我们会有一个怎么去调整的‘直觉’,但是当我这个神经网络的参数变的非常多,比如,输入的x有50个,每个x的值的区间还都差不多,而h有100个,y有10个,这需要50*100*10个w,你很难一下子猜出来该调整哪些w,怎么调整,那怎么办呢?
- 损失函数:衡量误差的指标
我们还是来看天气的例子。现在,我们的误差是这么算的:
可以看到,y1和e1,y2和e2之间是线性关系,也就是说y1变小,e1也变小,y2小,e2也小。
这里的误差其实在神经网络中有另外一个别名,叫损失,而上面计算误差的公式又叫损失函数(loss function),上面的公式对应的损失函数是:
这里为了避免把我们构建的神经网络所表示的y和真实的y值弄混,我们把真实值y(又被称作标签)一律用常数c表示,L是loss的缩写,也就是损失,同时也是误差。
有的人可能会发现这个损失函数存在一些问题,不过因为它非常简单,所以我们现在还是继续先用它来讲解,至于它存在什么问题,我们后面会展开说。
现在我们的目标是让所有真实的样本误差越接近0越好,也就是让损失的累加和趋近于0。
这里面N表示的是数据样本的数量,也就是说要把每个样本的误差都相加,最后取平均,用这个平均值来衡量你建立的函数关系对真实的样本数据的拟合程度,拟合的越好你的误差平均值自然就越小。
所以我们想调小L,就要把y1,y2调小,那y1,y2怎么调小?对固定的数据,x是常数值,所以要调整w。我们先只把y1展开:
这个式子中的每个w都是可以影响L值的变量。我们为什么直觉上知道想要调小L就要让w11,w21等等这些参数都缩小呢?
直观来看我们知道L和这些w11等全部都是类似下图的线性关系(其他w固定成1),所以w11变小,L也会变小。但是当L和w不再是这种简单的线性关系,你很难直观的看出该怎么调整参数w,调整多少才能真的让L变小的时候要怎么办呢?
- 梯度的定义和参数更新
还记得梯度的定义吗?梯度是一个偏导数构成的向量,它的方向是函数在当前数值点增长最快的方向,大小描述了函数在该方向上的瞬时变化率。图上的红色箭头就表示L在其他参数全为1,梯度在w11=1时的方向。
所以如果我们想让L变小,就要向梯度的反方向调整w11。
再加个w12,其他参数固定:
我们要向梯度的反方向调整w,来让L变小。那其他参数怎么调?其实和这两个是一样的,每个维度都向L缩小的方向迈一小步。这就称为梯度下降。
这就是整体的梯度的向量。同时我们还会用一个参数α学习率用来控制每次调整的幅度大小,也可以从字面上理解成学习的速度。
现在我们知道该怎么调整参数让L变小了。
训练学习的流程
其实这个不断调整参数来让拟合函数的误差与真实数据误差越来越小的过程就是神经网络的训练、学习的过程。我们来从头到尾捋一下流程。
接下来我们用一个简单的数据样本来顺着这个流程走一遍。
我们的数据只有一个(1,1,1,1),batch=1,学习率α=0.1,初始化所有w都等于1。
我们根据公式一层一层向前计算(前向传播),先得到h1=h2=h3=2,再计算一层得到y1=y2=6。
接下来计算损失值L=10。梯度如下:
新的参数:
第二次再根据新的参数前向传播,得到h1=h2=h3=1.8,y1=y2=4.32,这次再次计算损失L=8.64,误差真的变小了!
值得注意的是,实际上反向传播虽然本质上是计算梯度的操作,但相比我们平时计算梯度时使用的复杂的链式法则,反向传播采用了一种更为巧妙的计算方式,如果没有这种计算方式,那么复杂函数的梯度求解会非常麻烦。这个其实也可以展开一期内容,不过这里就先不多讲了,我们知道反向传播是用于实现梯度下降的手段就可以了。
对代码实现感兴趣的朋友可以看一下我们上面的简单的训练过程对应的代码:
```python 6import torch 7 8class SimpleNet: 9 def __init__(self): 10 # 初始化权重为 1 11 self.w = torch.ones((3, 2), requires_grad=True) 12 self.w_prime = torch.ones((2, 3), requires_grad=True) 13 14 def forward(self, x): 15 # 前向传播计算隐藏层输出 h 和输出层输出 y 16 h = torch.matmul(self.w, x) # matmul:矩阵乘法 17 y = torch.matmul(self.w_prime, h) 18 return h, y 19 20 def backward(self, x, y_pred, target): 21 # 计算损失(均方误差) 22 loss = torch.mean((y_pred - target) ** 2) 23 # 反向传播开始 24 loss.backward() # 计算梯度,存入.grad中 25 26 # 打印梯度信息 27 print("w的梯度:", self.w.grad) 28 print("w'的梯度:", self.w_prime.grad) 29 30 return loss.item() 31 32# 输入样本 33input_sample = torch.tensor([1.0, 1.0], requires_grad=False) #x1,x2 34target = torch.tensor([1.0, 1.0]) # y1,y2 35 36# 创建网络实例 37net = SimpleNet() 38 39# 前向传播 40hidden_layer_output, output_layer_output = net.forward(input_sample) 41 42print("隐藏层输出: ", hidden_layer_output) 43print("输出层预测值: ", output_layer_output) 44 45# 反向传播 46loss_value = net.backward(input_sample, output_layer_output, target) 47print("损失值: ", loss_value) 48 49# 更新权重(手动更新,模拟优化器) 50learning_rate = 0.01 51with torch.no_grad(): 52 net.w -= learning_rate * net.w.grad # .grad取梯度 53 net.w_prime -= learning_rate * net.w_prime.grad 54 # 清除梯度以便下一次迭代使用 55 net.w.grad.zero_() 56 net.w_prime.grad.zero_() 57 58print("\n更新后的权重 w:") 59print(net.w) 60print("\n更新后的权重 w':") 61print(net.w_prime)我们从代码中可以看到,前向传播其实就是矩阵乘法,而反向传播被打包到了loss.backward()方法中,其实就是梯度的计算。
损失函数的改进
细心的朋友应该能够发现,上面代码实现的损失和我们的L=y1+y2-c1-c2并不一样,而是采用的均方误差。这就是我们前面提到的,L=y1+y2-c1-c2存在问题。
来看回这张图:
如果我们的误差loss用y1-c去计算,那么这几个数据点的误差分别是0.5,-0.5,0.5,-0.5,最后相加,结果为0,被抵消了!
所以为了误差不被抵消,于是我们就用它的平方去计算损失了:
我们把累加和还有平均的操作也一起加进去,得到公式:
需要注意的是,这个损失函数依然存在问题,不过至少我们现在已经解决了误差抵消的问题了!
这个公式其实就是典型的均方误差的形式:
平方括号中的第一项就是你构造的神经网络估计出来的y值,第二项是真实的y值。
那么这个损失函数还存在什么问题呢?
我们最初想要解决的是预测明天天气的问题对吧?我们预测的实际上是天气的概率分布,但是,我们没有把最终的输出当作一个概率分布来处理,而是简单的当作数值来回归。
实际上我们应该把阴天和晴天建模成一个离散的条件概率分布:
这里面隐含了概率的区间范围以及y1和y2的关系,如果我们只把y1,y2当作数值来拟合,很可能无法学到这两种特性,比如预测值可能出现晴天概率0.8,阴天概率0.4,但如果我们用新的建模方式,就不会出现这种问题了。
那么,当神经网络要拟合的不再是线性/非线性的函数关系而是上面的条件概率分布时,损失该怎么计算呢?还用均方误差吗?不,这个时候要用交叉熵损失,这个损失能够衡量两个分布之间的差异,one-hot分类问题中(任意数据仅属于一个类别,就是y1=1,y2就为0,不会出现y1=1,y2=1的情况,之前我们捋训练流程的时候举的例子是因为好算),交叉熵就等于KL散度:
这里面i代表的是类别,我们只有两类,那就是y1和y2。
我们给一个标签y1=1,y2=0和预测值y1=0.8,y2=0.2以及预测值y1=0.2,y2=0.8,用这个公式来计算一下损失。
第一个预测值的损失为:
最终得到L=0.2231
第二个预测值的损失为L=-log(0.2)=1.6094
关于交叉熵和KL散度的内容感兴趣的朋友可以关注我后续发的文章,我会单独写一期,因为涉及到计算机领域的一些编码和信息论的知识,现在我们只需要知道,损失函数是有多种形式的,不同的问题适合不同的损失函数就可以了。
最后
我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。
我整理出这套 AI 大模型突围资料包:
- ✅AI大模型学习路线图
- ✅Agent行业报告
- ✅100集大模型视频教程
- ✅大模型书籍PDF
- ✅DeepSeek教程
- ✅AI产品经理入门资料
完整的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇
为什么说现在普通人就业/升职加薪的首选是AI大模型?
人工智能技术的爆发式增长,正以不可逆转之势重塑就业市场版图。从DeepSeek等国产大模型引发的科技圈热议,到全国两会关于AI产业发展的政策聚焦,再到招聘会上排起的长队,AI的热度已从技术领域渗透到就业市场的每一个角落。
智联招聘的最新数据给出了最直观的印证:2025年2月,AI领域求职人数同比增幅突破200%,远超其他行业平均水平;整个人工智能行业的求职增速达到33.4%,位居各行业榜首,其中人工智能工程师岗位的求职热度更是飙升69.6%。
AI产业的快速扩张,也让人才供需矛盾愈发突出。麦肯锡报告明确预测,到2030年中国AI专业人才需求将达600万人,人才缺口可能高达400万人,这一缺口不仅存在于核心技术领域,更蔓延至产业应用的各个环节。
资料包有什么?
①从入门到精通的全套视频教程⑤⑥
包含提示词工程、RAG、Agent等技术点
② AI大模型学习路线图(还有视频解说)
全过程AI大模型学习路线
③学习电子书籍和技术文档
市面上的大模型书籍确实太多了,这些是我精选出来的
④各大厂大模型面试题目详解
⑤ 这些资料真的有用吗?
这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。
所有的视频教程由智泊AI老师录制,且资料与智泊AI共享,相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。
智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念,通过动态追踪大模型开发、数据标注伦理等前沿技术趋势,构建起"前沿课程+智能实训+精准就业"的高效培养体系。
课堂上不光教理论,还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事!
如果说你是以下人群中的其中一类,都可以来智泊AI学习人工智能,找到高薪工作,一次小小的“投资”换来的是终身受益!
应届毕业生:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。
零基础转型:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界。
业务赋能 突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型。
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓**