摘要:在数字化时代,AI图像识别技术无处不在,但其背后的原理却鲜为人知。本文将带你深入探索AI如何“看懂”图片,重点剖析卷积神经网络(CNN)这一图像识别领域的经典模型。
在数字化时代,AI图像识别技术无处不在,但其背后的原理却鲜为人知。本文将带你深入探索AI如何“看懂”图片,重点剖析卷积神经网络(CNN)这一图像识别领域的经典模型。
这篇文章要讨论啥?
讨论AI是如何识别图像内容的。上一篇奶茶销量预测的模型输入输出都只是数字,我们当然希望模型能够处理更加复杂的图片、音频乃至视频。所以这篇文章先从讨论处理图片。
咋讨论这个问题?
对于AI识别图片内容这件事,我觉得需要搞明白这几个核心问题:
① 如果说模型的本质是一套数学公式,那么识别图像内容的模型的数学公式是什么?
② 这套公式内部具体进行了什么运算?
③ 为什么这样运算就能识别图像?
我会以图像识别的经典之作LeNet-5为例,一步一步搭出这个模型并解释其工作原理,并在这过程中讨论上述3个核心问题。除此之外也会顺带解释以下几个次要问题:
④ 什么是有监督学习?
⑤ 为什么模型训练依赖GPU
⑥ 大模型领域常说的SFT是什么意思?
这几个问题,核心结论是什么?
① 识别图像内容的数学公式已经不能用一个简单式子来描述了,只能画出模型结构来描述
② 模型内部进行了卷积、池化、全连接的运算从而完成识别图像内容的任务
③ 为什么这样运算就能识别图像,没人真正知道为什么,只知道这么做就是行,这就是模型的不可解释性
④ 训练数据有标签就是有监督学习
⑤ 模型训练中存在大量并行计算,因而可以通过GPU加速训练
⑥ SFT就是在预先训练好的模型基础上使用有标注的特定任务的数据进一步训练模型,使其适应具体任务
“在 AI 学会说‘我爱你’之前,它先学会了读你的字迹”
——题记
在上一篇文章《从0构建大模型知识体系(1):啥是模型?》中我们设计并训练了一个奶茶销量预测模型,它的输入是一个数字,输出也是一个数字。但显然,日常生活中的信息呈现形式还有文本、图片、视频、音频。我们自然希望模型能处理的信息类型越多越好。而在理解图片内容这一领域的经典模型叫做卷积神经网络(CNN,Convolution Neural Network)。让我们来一起看看
文本、图片、视频、音频,每一种信息呈现形式被称作为一种模态(modality)。现在各家厂商都在拼的“多模态模型”中的模态就是这个意思。如果一个模型能够同时处理至少2种模态的数据,那这个模型就被称作多模态模型。
假设你在上世纪90年代的邮局上班,那时候电脑刚开始普及,老板要求邮件的邮政编码都需要录入电脑中。这时你收到一封邮件并看了眼左上角的邮政编码:
“呵,有点意思哈”,心中泛起一丝涟漪的同时也开始感叹,这种手工录入数字的工作枯燥又乏味,重复又无聊,要是能让电脑自动完成就好了,这样你就可以提前下班跟对象约会了。
那么问题来了,应该如何让电脑识别人类的手写数字呢?
上一篇文章提到,无论大模型小模型,其本质都是把一个数通过一定运算变成另一个数的数学公式。可是图片,它是数吗?诶嘿~是的。
图片的本质是一个数字矩阵。我们日常看到的图片一般是由一个一个小方块组成的,每一个小方块被称作一个“像素”。比如刚才那张图片一共有28×28=784个像素,就像下面这样。
对于一张黑白图片而言,每个像素一般来说是一个0-255的整数。如果为0,则这个像素在显示屏上会显示为全黑,255则为全白,二者之间则为灰。所以这张黑白图片在计算机眼里本质长这样:
像这样的一个二维数表在数学上叫做矩阵。所以,识别一张图片中的数字意味着需要设计一个模型以一个二维矩阵作为输入,再以0-9中的一个数作为输出。
接下来介绍搭建模型会用到的三种数学运算,别问为什么,先接受,之后会解释。
运算1:全连接(fully connected)。A个数与B个神经元全连接表示对这A个数进行乘法和加法运算后可以得到B个结果,其中A和B不必相等。奶茶销量预测模型中用到的一次函数y=kx+b从输入输出的角度可以理解为给定一个输入x,在此基础上乘以k再加上b从而得到输出。现在我们用下图来表示这个过程:
我们给红框部分取一个响亮的名字:神经元,表示对输入x乘以k之后再加上b。大名鼎鼎的神经网络中的神经就是指这个。在有多个输入的情况下,其输出则按照如下的方式进行计算。
像这种每个输入都与每个神经元相连接的情况就叫做全连接。不理解运算细节也没关系,只需要记住开头加粗部分就好。
运算2:卷积(convolution)。卷积就是把一个小矩阵放到一个大矩阵上从头到尾滑一遍以得到一个新的矩阵。如下图所示,将一个小的矩阵(即卷积核)在输入数据(一个大矩阵)上进行滑动,并在每个位置上执行逐元素相乘然后求和的操作,最终生成一个新的矩阵,这个新矩阵就是卷积操作的输出。比如下图中的绿色小矩阵先与蓝色大矩阵的左上角对齐,相重合的9对数字先进行相乘得到9个积,再全部加起来产生一个新的数。然后绿矩阵向右滑动一格,重复一遍相乘再相加的操作,直到滑动到大矩阵的右下角。不理解运算细节的话只需要记住开头加粗部分就好。
运算3:池化(pooling)。池化就是把一个小窗口放到一个大矩阵上从头到尾滑一遍以得到一个新的矩阵。如下图所示,将一个特定大小的运算窗口在输入数据(一个大矩阵)上进行滑动,每次滑动都对窗口内的元素进行特定的计算(比如求最大值),从而得到一个输出值,最终所有这些输出值构成了池化后的输出矩阵。不理解运算细节也没关系,只需要记住开头加粗部分就好。
好了,有了上面3种运算就可以开始搭模型识别图中的数字了。没错,就凭上面这3种运算。虽然“全连接”、“卷积”、“池化”听着挺唬人的,但本质就是加减乘除(甚至其实都没有减和除)。
给AI开眼一共分8步:
通过这8步最终得到了10个数字,每个数字均为一个0~1之间的小数。第一个数字表示图片中的数字为0的概率,第二个表示为1的概率,第三个表示为2的概率……第十个表示为9的概率,哪个概率最大,模型就判断这张图片是几。
到此,我们的模型就搭完了,其本质也是一个数学公式,即给定一张图片后所进行的一系列运算,但显然这个公式没办法用一个简单的表达式写出。奶茶销量预测模型只有2个参数,但现在每个卷积核中的数字,每个神经元中的k和b都是需要训练的参数,加起来一共有61706个。
随着模型规模从 2 个参数大幅提升至 6 万参数,训练过程也需要更精细的阶段划分。
打标开始成为一项重要的工作。除了收集一大波手写数字图片,我们还需要人工标记每张图片到底是数字几,类似这样:
这样我们才能在前向传播的时候知道模型的识别结果是否正确,进而通过反向传播调整参数。像这样每个训练数据都打上了标签的训练方式就叫有监督学习(supervised learning)。
诶?那有没有无监督学习呢?哈哈哈有的。如果训练数据没有标签,那就叫无监督学习(unsupervised learning)。可是没有标签还咋学?比如如果我们想训练一个可以玩马里奥的模型,我们可以规定只要模型操作人物前进、收集到了物品、击败敌人以及过关,我们就算模型的操作正确,而一旦受伤死亡或者停滞不前我们就算操作错误。模型不断的操作,并不断的接受到哪些操作正确,哪些操作错误的反馈,最后就能学会怎么通关马里奥。
模型训练的三集:训练集、测试集、验证集。对于一个CNN网络而言,当我们准备好一堆数据之后,算法工程师会把它分为3个部分来用:
训练集:用来调整参数的数据。也就是我们一个又一个,一轮又一轮喂给模型,让它通过前向传播和反向传播对参数进行调整所用到的数据。测试集:用来测试模型最终效果的数据。完成训练后我们总得测一测模型的效果好不好吧?为了达成这个目的所喂给模型的数据就是测试集。算法工程师反馈的模型准确性就是在这个数据集上得到的。验证集:用来调整超参数的数据。之前介绍模型的参数量时是这么说的:到此,我们的模型就搭完了,其本质也是一个数学公式……奶茶销量预测模型只有2个参数,但现在每个卷积核中的数字,每个神经元中的k和b都是需要训练的参数,加起来一共有61706个。
这句话说了卷积核中的数字,神经元的k和b是参数,但没有说模型需要多少个卷积核,多少个神经元。卷积核、神经元越多,模型结构就越大越复杂。这种用于控制模型结构的参数就叫做超参数(hyper-parameter),验证集是用来调整这个的。
举个例子:如果把一个班的学生视作模型,题目视作数据的话,平时的作业就是训练集,考试就是测试集。而为了保证教学质量,一个班不能有太多的学生,于是学校分别对含有30、50、70名学生的班级做了一次测验来决定一个班的最佳学生人数,这个测验就是验证集。
6万参数模型的训练过程在思想上和奶茶销量预测模型一致:先猜一个初始值,再一个又一个,一轮又一轮的通过前向传播和反向传播对参数进行训练。但重点是,模型训练中的大量并行计算使 GPU 加速成为可能,进而让GPU制造商英伟达(NVIDIA)一飞冲天。
所谓并行,是指做一件事时不依赖另一件事的完成,否则就是串行。比如洗衣服和晾衣服只能串行,但洗衣服和烧开水可以并行。并行计算就是指一个计算任务的执行并不依赖其他的计算任务的完成。以卷积运算为例,当我们得到了输入矩阵与卷积核后,我们可以快速的数出一共需要做多少次计算任务,且每次任务具体都是哪些数在进行运算。然后把这些任务分发给GPU计算核心让所有核心同时进行计算。
CPU与GPU计算核心的区别
CPU(中央处理器)与 GPU(图形处理器)都有计算核心,但CPU的核心被设计用于执行复杂逻辑,结构复杂,单核功耗高,因此核心数不会很多,主流 CPU 核心数通常为 4-64 核。而 GPU 的每个核心仅被设计用于进行简单计算,结构简单,单核功耗小,因此数量可达数千至上万(如 NVIDIA A100 有 16896 个核心)。
原论文中,模型在用60000张美国人手写数字图片训练后的准确率可以达到99.2%,按道理来说模型到此就可以投入使用了。但我们自然会想,能不能把这个模型用来识别中国人手写的数字呢?分析一下,中美手写数字的习惯还是有些许不同,比如有些美国人写7会在中间加一横(如下图所示),但整体书写方式还是很接近的。
所以二者之间有差异,但不大,整体书写规律基本一致,这种情况下我们只需要对模型做一下微调就行。于是我们再收集一波中国人的手写数字数据,打上标签,再直接在已有模型的基础上训练就行。这次就不需要60000张图片,可能5000张足矣。
像这样,在预先训练好的模型基础上,使用有标注的特定任务的数据进一步训练模型,使其适应具体任务或场景的过程,就叫做有监督微调,也就是 SFT(Supervised Fine-Tuning)。我们经常看见的大模型SFT就是在说这件事,比如chatGPT只具备通用的交流能力,并不具备法律知识。于是可以通过准备一批法律相关数据以SFT的方式使其具备法律交流能力。这里SFT所需的数据量级比从零开始训练chatGPT所需的数据量级少多了。
回顾一下上图中的模型结构,它长啥样,每一步产生了什么我们都很清楚,但啥叫模型的不可解释性呢,我认为主要有以下两点:
① 模型的决策方式与人类认知脱节。人类能识别数字9是因为能看到一个圈,又能看到圈旁边有一个竖或者一个弯。但模型的识别却是依赖对像素值进行卷积、池化、全连接运算,这与人类的认知方式完全不同。
② 模型运算的中间结果并不是人类可理解的概念。类比做方便面的步骤:第一步烧水,得到开水;第二步下面,得到煮熟的面;第三步倒调料,得到调味的面;每一步操作的结果,以及这个结果对于整个任务的影响都是人类可直接理解的概念。但模型呢?我们的输入是一张人类可理解的,写有“9”的黑白照片,经过第一步的卷积运算得到了一组数,我们只知道这是一组数,但这组数是什么意思?没人理解,更别说又经过池化,卷积,又池化,又卷积以后的结果。
所以现在回答文章一直没有回答的问题:
接下来介绍搭建模型会用到的三种数学运算,别问为什么,先接受,之后会解释。
解释就是……没有为什么,反正这样做效果就是好……
由此导致的实际影响也很突出。
首当其冲的是调试困难。不像大家熟知的前后端代码,每一步做了什么,得到什么结果,有什么影响都清清楚楚。一旦有问题可以快速溯源到出问题的地方。但模型的输出错误,很难定位到是哪一个参数有问题。
其次是信任问题:正是因为模型的中间结果人类无法理解,所以其最终结果天然就很难让人信服。比如模型通过医疗影像判断病人有病,这个时候怎么跟人解释呢?因为你的X光片进行了2次卷积、2次池化和2次全连接后输出的结果是有病,所以你有病?
因此,在需要强解释性的场景,如医疗、法律,模型的底层原理天然决定了其应用会受阻。但对于图像识别等性能为主的场景,反正最终输出准确率高就行,解释性差就差呗。
总结一下,模型之于现代人类的不可解释性就相当于钻木取火之于原始人类。原始人也不知道为啥钻木就能取到火,也不知道要钻几次才能取到火,但他知道这样做能取到火。同样,我们也不知道为啥模型这么设计就能完成目标,但我们知道这样设计就是能完成目标。
图片的本质一个数字矩阵。人眼中的图片在计算机内实际是一个数字矩阵,这使得我们可以直接利用数学工具对图片进行处理。
三种运算就能给AI开眼。识别图片数字这样高端的任务通过卷积、池化、全连接三种运算方式就能达到令人惊异的准确率。
训练集、数据集、验证集。我们收集到的数据一般会被分成3份来用,一份用来调整模型参数,被称为训练集、一份用来测试模型最终效果,叫做测试集、一份用来调整模型的超参数,叫做验证集。
训练数据打上了标签的训练就叫有监督训练。没有标签就叫无监督训练
GPU 之所以能加速训练是因为模型训练中存在大量并行计算。模型训练中的很多计算任务并不依赖其他计算任务的完成,因此这些计算任务可以被分发给多个计算核心同时进行计算。这些任务虽然也能分发给CPU,但CPU的计算核心在设计时是为了执行更难更复杂的逻辑运算,用来做加减乘除过于大材小用。而GPU 中的计算核心就是专门干这些事儿的。
SFT,模型能力的复用。在预先训练好的模型基础上,使用有标注的特定任务的数据进一步训练模型,使其适应具体任务或场景的过程,就叫做有监督微调,也就是 SFT
模型的不可解释性:模型通过对像素进行运算来认知图片的方式与人类完全不同,且模型运算的中间结果并不是人类可直接理解的概念,由此导致模型的调试非常困难,也很难让人信任其最终输出。
欢迎来到1998文中模型的结构出自1998年的文章《Gradient-Based Learning Applied to Document Recognition》。到此,恭喜你对大模型知识的理解来到了1998年。此时距离DeepSeek-R1发布还有27年。
第一个大规模商用的卷积神经网络。文中为识别手写数字而搭建的模型被称作LeNet-5,来自于1998年由Yann LeCun、Léon Bottou、Yoshua Bengio、和Patrick Haffner发表的《Gradient-Based Learning Applied to Document Recognition》。LeNet-5被美国邮政服务(USPS)用于自动识别信封上的手写邮政编码,实现邮件分拣自动化,显著降低了人工成本,是第一个大规模商用的卷积神经网络。同时它也为 2012 年AlexNet的爆发奠定了基础,推动了深度学习在计算机视觉领域的革命。
Yann LeCun,2018图灵奖获得者,Meta AI首席科学家。LeCun目前为纽约大学教授,同时为Facebook(现Meta)AI首席科学家,2018年与 Geoffrey Hinton、Yoshua Bengio 共同获得计算机科学界最高荣誉——图灵奖,以表彰他们 “对深度学习的奠基性贡献”。他主张 AI 基础设施应开源化,避免少数公司垄断。chatGPT发布后的第一个开源大模型Llama就是由Meta发布的,这和LeCun的开源主张应该有很大关系。
不认同LLM是通向AGI路径。所谓AGI(Artificial General Intelligence,通用人工智能)是指能够像人类一样理解、学习和执行多种复杂任务,并在几乎所有领域达到或超越人类智能水平的人工智能系统,是AI发展的终极目标。chatGPT发布后那令人惊异的自然对话能力让人类似乎看到了AGI实现的曙光。但LeCun却并不认为LLM 是通向 AGI 的路径,理由是LLM缺乏四大关键能力:① 物理世界理解(如物体运动规律);② 长期记忆(无法持续存储和检索信息);③ 推理与规划(只能模仿训练数据中的模式);④ 目标导向行为(依赖固定奖励机制,无自主意图)。
认为AGI的核心是建立 “世界模型” 。LeCun主张的世界模型是指 AI 对真实世界物理规律的建模,机器能运用这一套建模像人类一样理解因果、通过物理规律规划行动。例如:通过视频学习 “推杯子会导致杯子移动” 的物理规律,那么在执行“把沙发搬进家里”的任务时能够立刻知道需要采取的动作是“推”。我感觉这有可能是LLM之后的下一个AI技术风口。
活跃于社交媒体,经常以通俗语言解释 AI 技术原理、批判行业误区,也包括与大佬互怼。比如2022年痛批许多 AI 研究的方法论错误:“太多论文没有区分训练集和测试集,用测试集调参、选特征”
又比如2023年和马斯克互怼。事件背景是 LeCun 反对过度监管AI,认为AI毁灭人类纯属无稽之谈, 而马斯克认为人工智能工具可能“对社会和人类构成深远风险”,还呼吁科技界暂停开发比GPT-4更强大的AI系统。于是在马斯克完成 xAI 60 亿美元的融资并在Twitter上发帖招聘的时候,LeCun 在下面留言嘲讽:
如果你能忍受这样的老板:声称研究明年就能出成果,又说 AI 会毁灭人类要暂停开发,还在自己平台散布阴谋论 —— 请加入 xAI
— 马斯克反击质问:“你过去五年在科学领域做了什么”
— LeCun:晒出 80 篇论文链接
— 马斯克回怼:“这不算啥,你太松懈了,得支棱起来!”
— LeCun:“说得好像你是我老板一样”
Yann LeCun
“他用卷积的笔触在数字荒原上绘出第一朵神经网络之花,从此算法有了识别星辰的眼睛。”
——后记
如果有帮助,还望点个赞,谢谢~
以下是文中为易于理解而表述不严谨之处,可跳过
运算1:全连接(fully connected)。A个数与B个神经元全连接表示对这A个数进行乘法和加法运算后可以得到B个数,且A和B不一定相等。还记得上一篇文章中我们用到的一次函数y=kx+b吗?从输入输出的角度来看,我们可以将一次函数理解为给定一个输入x,在此基础上乘以k之后再加上b从而得到输出。现在我们用下图这种方式来表示这个过程:
我们给红框的部分取一个响亮的名字:神经元,用来表示对输入x乘以k之后再加上b。大名鼎鼎的神经网络中的神经就是指这个。如果有多个输入的情况下,其输出则按照如下的方式进行计算。
实际上神经元除了对输入进行乘k加b的线性运算外,还会再用激活函数(如sigmoid函数)做一次非线性运算。激活函数是神经网络的灵魂,没有它的话不论做多少次线性运算本质上都等价于一次线性运算
这里每个卷积核的尺寸实际应该是6x5x5
这里每个卷积核的尺寸实际应该是120x5x5
本文由 @夜雨思晗 原创发布于人人都是产品经理。未经作者许可,禁止转载
题图来自Unsplash,基于CC0协议
该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务
来源:人人都是产品经理一点号