零基础认识大语言模型工作原理

[目录]

  1. 什么是文字接龙?
  2. 大模型如何做文字接龙?
    • 什么是Token词元?
    • 什么是Vocabulary词表?
    • 什么是概率分布?
    • 内部接龙流程
  3. 什么是Token计费
  4. 大模型训练方式和步骤
  5. 大模型有思考推理能力吗?
  6. 大模型擅长和不擅长的任务
  7. 大模型在Agent中扮演的角色

大语言模型(Large Language Model, LLM)听起来高深莫测,但如果剥去其复杂的外壳,它的核心逻辑其实非常朴素。本文将从七个维度,带你一步步揭开它的神秘面纱。注意本文以“大语言模型(LLM)”为例分析大模型工作原理,这类模型的输入输出皆为文本格式,对于其他支持多种格式(图片视频等)作为输入输出的“多模态大模型(MLLM)”的工作原理与之类似。

1. 什么是文字接龙?

如果要用一句话概括大语言模型的本质,那就是:它是一个超级强大的“文字接龙”游戏玩家。文字接龙是一种简单又有趣的游戏,你写一个字、一个词或者一句话,下一步接着续写下去,尽量让语句合理连贯。举个例子:

(1) 玩家 A: “今天天气真好,”

(2) 玩家 B: “好想去公园散步,”

(3) 玩家 C: “步伐轻快,心情愉悦。”

每个人都是根据前面内容进行接龙,完成文字接龙游戏须具备两个前提:

(1) 玩家掌握基本的文法知识,比如熟悉中文语法、英文语法等,不至于在接龙过程中出现病句。

(2) 玩家掌握基本常识,熟悉世界知识,比如知道“天气好意味着适合外出散步”,否则各个玩家完全不同频,游戏无法进行。

大语言模型其实就是在做类似的“文字接龙”游戏,只不过规模大了无数倍(不限接龙主题、不限接龙语言、不限接龙领域,给什么接什么):

输入:你给大模型一段文字(Prompt/提示词)。

任务:它预测下一个最可能出现的字、词或符号是什么。

输出:把预测的字、词或符号加到原文后面作为输入,继续预测再下一个,直到出现结束符号。

如此循环往复,一个字一个字地蹦出来,最终形成了一篇通顺的文章、一段代码或一个故事。它并不真正“理解”输出文字的含义,它只是精通统计规律,知道在当前语境下(即Context),哪些字、词、符号组合在一起最“像”人类说的话。

2. 大模型如何做文字接龙

既然大模型是在做接龙,那它是如何具体操作的呢?这里有几个关键概念:Token(词元) 和 概率分布等。

(1) 什么是 Token?

大模型并不是以“汉字”或“单词”作为最小单位来做文字接龙的,而是以另外一种叫做Token的结构。Token与汉字、单词、符号等并没有严格意义上的一对一关系。在英文中,一个Token 可能是一个完整的单词(如”apple”),也可能是词根(如”unchanged”中的前缀”un”),甚至是部分字母。在中文里,一个Token通常对应一个汉字(如“你”),也可能是常见的多字词(如“助手”、“是多少”),甚至一个汉字占2个Token。对于符号而言,可以与后面单词一起组成一个Token(如Python代码中常见的”__init”可以是一个独立的Token),也可以多个符号一起组成一个Token(如Python代码中的注释”####”可以是一个单独的Token)。还有一些特殊标记也被当做独立的Token(如句子开始,句子结束)。总之,在大模型领域中,Token是一种全新的结构,与我们常见的字、词、符号没有对应关系。

为什么要这么分? 因为这样能更高效地压缩信息,任何种类的语言文本可以被灵活组合拆分,让模型处理更长、更复杂的序列。你可以把Token理解为大模型眼中的“最小语义积木”,不同大模型的Token划分规则并不相同,比如LLama3中一共包含128000种Token,代表它每次预测输出可以有128000种可能。对于ChatGPT大模型,OpenAI提供一个在线工具可以查看它是如何划分Token的(https://platform.openai.com/tokenizer),任意输入一段文本,工具可以输出对应Token数量以及用颜色区分每个Token:

上面这段文本在GPT-5.X中被划分成88个Tokens进行处理,每个Token已用颜色区分。

(2) 什么是Vocabulary?

不同大模型的Token划分规则并不相同,所以每种大模型支持输出的Token种类总数也不相同。LLama3能够输出128000种Token,Qwen2.5能够输出256000种Token,我们把模型能够输出的Token种类集合叫做词表(Vocabulary)。

如果对词表中的每个Token进行顺序编号,从零开始,LLama3的词表Token IDs取值范围为0~127999。在GPT-5.X中,刚才那段文本被划分成了88个Tokens进行处理,那么对应的Token IDs为(点击界面左下角Token IDs按钮):

我们可以看到,在GPT-5.X中,这段文本开头的‘Video’作为一个独立的Token,它在词表中的ID为11046,即排在11047位(ID从零开始)。文本结尾‘).’被当做一个独立的Token,它在词表中的ID为741,排在742位。下面是词表示意图,蓝底为Token IDs,白底为对应Tokens:

词表除了反映大模型能够输出哪些Token之外,还能辅助大模型对输入进行预处理。比如我们要给模型输入“水的沸点是多少?”时,由于大模型本身无法直接处理这些Unicode字符,所以需要我们先将这些文本拆分成Tokens,然后参考词表将它们映射成Token IDs,最后再送入大模型,示意图如下(注意是示意图,实际大模型可能并非输出类似答案):

总之,词表对于大模型的输入和输出环节都至关重要。输入环节要参考词表,输出环节也要参考词表。那么大模型的输出格式是什么呢?每次是直接输出Token ID,然后我们再做一次后处理:根据词表将Token ID映射成具体的Token吗?答案是否定的。要了解大模型的输出格式,我们需要先理解概率分布这个概念。

(3) 什么是概率分布?

假如要设计一种算法或者系统,根据各种条件阈值,负责从有限集合范围内选择一个最符合预期的目标,你会如何设计这种系统的输出?在深度学习领域中,这种任务一般被称为“分类”任务,有限集合的大小即称作“分类数”。对于分类任务,深度学习算法一般输出一个概率分布(一组概率值,通常用一个数组表示),数组的大小即为分类数,这些概率之和为一,概率值越大、代表该分类命中的可能性越高。

如上图所示,分类1(深蓝色部分)的概率值最大(0.59),因此根据概率分布的结果来看,分类1命中可能性最高,因此针对这个四分类任务,算法本次预测的结果是:分类1。

对CV计算机视觉熟悉的童鞋可能已经看出来了,CV中的图像分类是一种典型的“分类”任务,在基于深度学习的CV领域中,大部分用于图像分类的神经网络算法最终输出都是一个概率分布,即经过Softmax函数处理过后的概率向量,向量各维度概率之和为一(图片分类网络可以参考:http://www.videopipe.cool/index.php/2024/11/15/1-6/)。如果该分类算法用于ImageNet任务,那么它的分类数为1000,输出概率向量维度也为1000。下面是一个三分类的图像分类任务(猫/狗/鸡):

再回头来看大模型做文字接龙的这个任务,它本质上是一个Token分类任务。特别之处在于:

(1) 目标分类数非常之大,Llama3的词表大小为128000,所以分类数为128000。因此大模型每次都要输出一个超级大的概率向量,向量维度大小为128000。

(2) 用于Token分类的神经网络结构比较特殊,目前主流大模型均采用Transformer结构或其变种。同时由于目标分类数很大(意味着是一个复杂任务),神经网络包含超级大规模的参数量,通常需要用B(十亿)为单位来衡量,而传统小模型一般用M(百万)作为参数单位。

上图显示将“水的沸点是多少?”输入到Llama3模型中,模型单次推理输出第一个Token的结果示意图。它会输出一个超级大的概率向量,向量维度大小为Llama3词表大小,即128000,代表模型接龙输出Token的概率分布。那么,最终我们如何获取最终输出的Token呢?是直接取概率值最大的Token ID再映射回Token吗?直观上判断确实可以这样去做,但是为了提升大模型输出内容的多样性和灵活性(对于同一个输入,大模型每次推理输出不尽相同),实际并不是直接选取概率值最大的Token ID映射回Token,而是根据事先配置,选取概率值从大到小前Top K个Token IDs再根据一定规则“摇骰子”从中选取最终要输出的Token。正是因为这个机制,我们在使用豆包、ChatGPT等语言大模型的时候,对于同一个问题,每次回答都不一样。我们如果规定K为1,那么对于同一个输入,大模型每次的回答都相同(摇骰子失效)。

注意,由于大模型经过了大量数据进行Pre-Train预训练,因此我们选取的前Top K个Token IDs从统计经验规律来看,都可以当做正确Token被大模型输出,最终的输出内容看上去也都是合理连贯的。其实这很好理解,任何文字接龙本身并没有唯一答案,“摇骰子”这个动作正好实现了这个效果。

大模型每次推理输出一个Token,将每次输出的Token接在原来输入的尾部,再继续作为模型的输入,可以源源不断地得到连续的Tokens,直到模型输出【结束】标记。最后我们将所有的Tokens拼接在一起,作为模型的最终输出,可以是一句话、一首诗、甚至是一篇文章。

(4) 接龙的内部流程

当你向大模型输入一段文本时(支持各种语言),会执行以下步骤:

词元化:根据模型预设词表,将文本拆分成单独的Tokens,然后再转换成Token IDs序列,这一步一般由Tokenizer完成,它是一种工具跟大模型本身无关。

向量化:所有的Token IDs被映射成对应的特征向量(Token Embedding)。这些特征向量捕捉了词语之间的语义关系(比如“国王”和“王后”在向量空间里的距离,与“男人”和“女人”的距离非常相似),Token Embedding由模型训练时期决定,属于大模型参数权重的一部分。关于特征向量的作用可以参考这里:http://www.videopipe.cool/index.php/2024/11/04/2/

注意力机制(Attention):这是大模型的“大脑核心”。针对每个Token,它会回头看前面所有的Tokens,计算当前要预测的Token与之前所有Tokens的相关性(下图中每个白色方块代表一个计算单元,每个计算单元的输入由它前面的Tokens共同决定)。例子:在句子“苹果很好吃,因为它很____”中,模型会注意到“苹果”和“好吃”,从而推断空白处填“甜”或“脆”的概率高于填“粉色”或“圆”,更要高于“蓝色”或“可爱”。

计算概率:模型会在其庞大的词表(可能有几十万个Tokens)中,为每个可能的下一个 Token 计算一个概率分数,得到概率分布。

采样选择:最后不会永远只选概率最高的那个Token(那样说话会很死板),而是根据概率分布进行“采样”(前面说的摇骰子)。有时候它会选概率第二、第三高的词(甚至其他,主要取决于你的配置),这让生成的文本更具多样性和创造性。

循环运行:将模型单次预测输出的Token接在原来输入的结尾,当做新的输入,给到大模型后,继续开始下一次Token接龙。直到大模型输出【结束】标记。需要注意的是,大模型每次接龙只能输出一个Token,对于需要输出大段文本的场合,大模型需要完成成千上万次接龙。显而易见,这里会出现一个性能问题,单次接龙已经很消耗算力了,成千上万次、而且输入Token数量越来越多,大模型如何应对这个问题?答案是利用键值缓存机制(KV Cache),因为每次接龙都是在上次的输入结尾增加一个新Token,其余的不变,所以大模型会缓存上一次接龙的部分计算结果,下一次接龙的时候直接使用缓存,避免每次重复计算,关于KV Cache概念本文不做太多讲述。

需要注意的是,上面举的例子都是给大模型输入一个完整问题(以问号结尾),让大模型输出问题答案。这主要是为了让大家直观理解接龙过程。实际上,大模型做文字接龙并不要求输入是一个完整的问题,输入任何内容都可以。比如给模型输入“今天天”,模型可以接“今天天气真好”,或者“今天天空有很多雾霾!”等等,至于接什么,要看具体的上下文(Prompt/Context),换句话说,大模型可以基于任何输入去续写后面的内容。

3. 什么是Token计费?

平时手机等移动设备使用5G上网,需要向网络服务提供商(电信/联通/移动)购买流量,流量单位一般使用MB和GB等,比如5元/GB。GB这种单位最开始是用来衡量计算机系统中文件(或数据)占用磁盘(或内存)空间大小,之后也用来表示网络数据传输多少。

与网络服务提供商类似,现在一些大模型公司(OpenAI/谷歌/阿里等)提供大模型基座服务,扮演大模型服务提供商的角色,为个人/公司/政府组织提供大模型能力,人们向模型提供商付费,使用事先定义好的接口协议获取大模型能力(给模型提供输入、获取模型的输出),从而为自己的软件系统、工作或生活赋能。大模型服务提供商一般以Token消耗数量来计费,比如10元/100万Tokens,当然也有包月套餐,这个跟5G流量包月类似。

大模型的开发、训练、部署推理等基建门槛要求过高(技术/数据/算力),一般公司无法胜任,这也是为什么会出现类似的垄断性质的大模型服务提供商。需要注意的是,Token消耗量的统计并不完全透明,不同模型的词表规则并不相同,对于同一个输入和输出,A模型可能计算消耗100 Tokens,而B模型计算消耗120 Tokens。并且,Token消耗量完全由模型提供商给出,一般人很难通过自己的历史输入输出调用记录,去核实他们统计的准确性,因为对于那些频繁使用模型的人来讲,数据量太大导致这项工作实在太复杂。

4. 大模型的训练方式和步骤

大模型并非生来就聪明,它是通过“海量阅读”和“严格家教”训练出来的。训练过程通常分为三个主要阶段:

第一阶段:预训练(Pre-Training)—— 博览群书

(1) 目标:学习语言的基本语法规律、世界知识和逻辑结构,比如知道:“形容词后面接名词”、“一般用蓝色形容天空”、“1+1=后面接2比较合适”(注意不是计算)等等这些。

(2) 数据:互联网上的公开文本(网页、书籍、代码、论文等),数据量高达万亿级 Token。

(3) 方式:监督学习。不需要人工标注答案。模型阅读前文,不断猜测下一个出现的词是什么,猜错则调整参数,猜对则强化记忆。这就像通过做无数道填空题,内化了语言和知识。这个原理跟深度学习领域中训练其他模型类似。

(4) 结果:得到一个“基座模型”(Base Model)。它“懂”很多知识,能续写(接龙)文字,但还不太会听话,可能会胡言乱语或无法遵循指令。

第二阶段:有监督微调(SFT, Supervised Fine-Tuning)—— 学习规矩

(1) 目标:让模型学会如何回答用户的问题,遵循指令。

(2) 数据:由高质量的人类专家编写的“问答对”数据集(例如:如何煮鸡蛋?给出回答详细的步骤)。与预训练相比,SFT需要的数据量要小得多,在万/十万数量级即可,核心要求是数据集的高质量。

(3) 方式:告诉模型,“当用户这样问时,你应该这样答”。

(4) 结果:模型变成了一个“助手”(Instruct/Chat Model),能够完成对话、总结、翻译等任务。

第三阶段:人类反馈强化学习(RLHF)—— 对齐价值观

(1) 目标:让模型的回答更符合人类的偏好(有用、诚实、无害)。

(2) 方式:模型生成多个回答。人类评估员对这些回答进行排名(哪个更好,哪个有偏见,哪个不安全)。训练一个“奖励模型”来模仿人类的评判标准。利用强化学习算法,根据奖励模型的反馈进一步优化大模型。

(3) 结果:模型变得更安全、更有礼貌,且更符合人类的道德和法律规范。

阶段一称为预训练Pre-Train,阶段二和三(或者还有其他手段)一般统称为后训练Post-Train。研究普遍认为,模型的知识储备和“智力”上限主要由预训练阶段的数据规模和质量决定。SFT和RLHF阶段主要作用是“解锁”这些能力,并将其引导至符合人类需求的行为模式上。可以说,预训练决定了模型“有多聪明”,而后训练决定了模型“有多好用”,在预训练阶段没有接触过的资料知识(比如某个特定领域),一般很难通过后训练让模型掌握。

5. 大模型有思考推理能力吗?

很多人以为大模型像人一样“思考”,其实它的本质是统计预测,不是像人类有意识的思考:

(1) 模型做的是概率计算:基于已有文本(输入Context),计算后面每个Token出现的概率,选择最可能的输出。

(2) 表现像推理:当模型回答问题或写文章时,它会参考大量训练经验(由模型参数权重决定),生成符合逻辑的文本,看起来像“推理”。

(3) 局限性:模型不会真正理解世界,也不会有自我意识,它的“推理”仅仅是模式匹配和概率计算的结果。

可以把它想象成一个非常聪明的模仿者:它能模拟合理逻辑,但不是真的在思考。大模型本质上一直在做文字接龙(续写),而且只能根据统计规律去完成这个游戏,比如当它遇到“1+1=”的时候,会根据统计规律输出“2”,并不像人类那样在脑子里面通过四则运算、或者推演得出结果。这也是为什么大模型不擅长处理需要精准计算的任务,比如分析一张复杂的Excel数据报表、以及完成高维的数独游戏,因为这些任务每一步都涉及到精确计算,大模型一步接龙出错,后面会步步错。反观其他任务,比如让大模型写诗,“僧__月下门”中间填“推”和“敲”都可以,无伤大雅,如果没有其他上下文作为限制时,甚至还可以填“关”。

需要注意的是,本文提到的“思考推理”是指类似人类高级动物具备的能力,大模型当然可以“表现”出思考推理过程,比如当你选择Thinking模式,在正式输出结果之前,它会先输出一大段所谓的CoT(Chain Of Thought),像是模型的内心戏,但这仍然是基于概率统计在做文字接龙,内心戏会进一步丰富输入Context,有利于后面正式输出时的文字接龙,从而提升输出结果的合理性,这与人类思考过程完全不是一个东西。

6. 大模型所擅长/不擅长的任务

根据前面介绍的大模型工作原理,其实很好归纳它的优劣势,从而判断它擅长和不擅长的任务:

擅长的任务:

(1) 写文章、编故事、写邮件、写代码

(2) 总结文章、提取信息

(3) 语言翻译、句子改写润色

(4) 对话聊天、生成连贯回复

(5) 做方案、制定计划

不擅长的任务:

(1) 真正的因果推理和科学推导

(2) 精确计算或逻辑推理验证

(3) 需要基于训练数据之外的信息(外部数据/实时信息/模型训练时没接触到的知识)

注意上面不擅长的任务不代表模型完全不能做,而是受限于模型工作机制原理,大模型很难做好这些任务。其中第三条,大模型无法知道在它训练数据之外的信息,比如一个模型在2025年10月份训练完成(模型权重参数已确定,用于统计规律的经验已经固化),它掌握的信息最晚到2025年10月份。因此你问它关于2025年10月份之后发生的新闻事件,它可能也会给你一个回答,但是大概率是错的。或者问它跟天气、股票相关的实时信息,大模型本身也无法准确回答这类问题,这时候就需要借助外部工具,比如Browser Use、Computer Use之类的工具,通过这类工具收集实时天气、股票信息作为输入上下文(Context)一起给到模型,提升后续大模型文字接龙的正确性。前几年很流行的RAG(检索增强生成)技术就是为了更好的弥补大模型这种先天性不足的缺陷。

总之,大模型想要做好一件事,必须有两个前提:

(1) 不能超出文字接龙这个规则,比如需要精准计算的就不太行,它不是光靠基于统计规律的文字接龙就能搞得定的

(2) 不能超出模型训练时所掌握的信息范围,否则就要想办法提供丰富的输入上下文一起给到模型

关于如何让大模型发挥更大功能和作用,弥补其先天性缺陷,参见本文后面介绍智能体的相关内容。

7. 大模型在AI智能体(AI Agent)中扮演的角色

在大模型(如 ChatGPT3.5)流行之后一段时间,AI 应用逐渐从简单的“对话问答”模式,演进到更加复杂的“任务执行”模式。在 2022 年底到 2023 年期间,大模型主要以聊天界面的形式出现,用户通过“一问一答”的方式与模型交互。为了提升输出的准确性与稳定性(更好地完成接龙),人们开始研究如何设计更有效的输入,这也催生了所谓的“Prompt 提示词工程”。然而,随着应用的深入,人们逐渐发现:尽管大模型在语言理解和生成方面表现出色,但它本质上仍然只是一个“推理与生成引擎”。它可以给出建议、提供思路,却缺乏与外部环境交互和实际执行任务的能力,对于自己不擅长的任务无能为力(参见本文前面介绍)。它无法主动访问互联网获取最新信息,也无法直接调用工具处理数据或完成具体操作。

在这样的背景下,“AI智能体(AI Agent)”这一范式开始受到广泛关注。可以将其理解为一种以大模型为核心的应用系统:其中,大模型相当于“决策中枢”,负责理解任务、制定计划和做出判断;而智能体系统则负责调用工具、访问数据、执行操作,并将结果反馈作为输入给大模型,形成一个“感知—决策—执行—反馈”的闭环。

例如,在一个典型的智能体系统中,大模型可以判断是否需要联网搜索信息,是否需要调用代码执行环境分析数据,或者是否需要读取本地文件。智能体将每一步执行的结果都会再次输入给模型,用于决定下一步行动,从而逐步完成复杂任务。

此外,作为工程化系统,AI智能体通常还具备“记忆(Memory)”和“状态管理(State Management)”能力,可以在多轮任务中保留上下文信息。这种机制在很大程度上将原本依赖人工设计的 Prompt 工程进行了系统化封装,使开发者可以更专注于任务本身。

总体来看,AI智能体并不是取代大模型,而是在其基础上进行能力扩展,使其从一个“对话工具”演变为一个能够理解目标、规划步骤并执行任务的智能助手。

关于VideoPipe适配不同AI硬件平台的流程

VideoPipe视频分析框架开源至今受到了很多人的好评,也有很多成功的商业落地案例。Github仓库中的Sample代码默认只支持CPU和英伟达两种硬件类型(推理部分基于OpenCV::DNN和TensorRT后端),由于某些保密原因,其他硬件平台的适配代码没有公开。随着国产信创化的需求越来越多,国产硬件也是今后AI算法部署落地的新趋势。本篇文章简要介绍如何将VideoPipe移植、适配到不同AI硬件平台,比如华为昇腾、寒武纪、瑞芯微等。

框架移植到不同硬件平台的工作主要涉及到两大块:编解码和模型推理,这两块需要对应的硬件加速。

1、VideoPipe中的编解码部分默认采用Gstreamer管道实现,由OpenCV创建和加载Gstreamer编解码插件,如果你要适配的目标硬件平台本身有对应的GStreamer硬编解码插件,那么编解码移植这块的工作比较简单,直接替换原来软编解码插件为目标平台的硬编解码插件即可。如果没有现成的硬编解码插件可用(大部分时候是这种情况),那么你要做的工作就是参考仓库中/nodes/ffio这个目录中的代码(该目录基于FFmpeg实现了收流、拆包、解码、编码、封包、推流等逻辑),基于目标硬件平台的Codec编解码SDK,去实现自己的硬编、硬解逻辑,封装成VideoPipe中的一个SRC/DES Node即可,然后基于新的SRC/DES节点去构建VideoPipe中的Pipeline。

2、VideoPipe中的模型推理部分默认采用OpenCV::DNN模块实现,它可以加载主流深度学习框架导出的模型格式(如ONNX/Tensorflow/Caffe等),而且支持英伟达平台CUDA加速。当然针对英伟达平台,仓库中还提供了基于TensorRT推理后端的参考实现。如果你要适配其他硬件平台,那么需要基于对应硬件平台的推理Runtime去实现自己的推理逻辑,比如瑞芯微的RKNN、华为的CANN等等。这块其实很简单,直接参考硬件平台厂家提供的推理Demo代码,将其封装成VideoPipe中的一个推理Node即可,然后基于新的推理节点去构建VideoPipe中的Pipeline。

除了编解码和模型推理需要适配移植之外,其他比如OSD画图、颜色格式转换、图片缩放等环节可能也需要使用目标硬件平台的硬件加速API,这块可以参考模型推理移植的步骤,基于目标硬件平台提供的加速API实现对应逻辑即可(如瑞芯微平台的RGA图像处理加速库,专门处理图像缩放裁剪、格式转换等)。整个移植适配的工作其实相当简单,前提是你对适配的目标硬件平台要足够熟悉和了解。

大/小模型在视频分析领域中的联合应用

CV领域小模型发展

自2012年AlexNet在ImageNet大规模视觉识别挑战赛(ILSVRC)中以显著优势夺冠以来,计算机视觉(CV)领域进入了深度学习驱动的新纪元。AlexNet首次大规模使用卷积神经网络(CNN)进行图像分类,其成功标志着传统手工特征方法的终结,开启了基于数据驱动的深度模型时代。

随后几年,小模型在结构设计上不断优化,追求更高的精度与更低的计算成本。2014年,牛津大学提出的VGG网络通过堆叠3×3小卷积核实现了更深的网络结构,提升了分类性能;同年,Google提出的Inception结构引入多尺度卷积并行处理,显著提高了参数利用效率。

2015年,微软提出的ResNet(残差网络)通过“跳跃连接”解决了深层网络中的梯度消失问题,使得网络可以扩展到上百层,并在ImageNet上取得了超越人类水平的分类准确率。这一突破推动了小模型向更深、更高效的方向演进。

进入2016—2018年,轻量化模型成为研究热点。SqueezeNet证明了在保持精度的同时大幅压缩模型体积的可能性;MobileNet系列(v1/v2/v3)采用深度可分离卷积,在移动端实现了高效的图像分类和目标检测;ShuffleNet则通过通道混洗机制提升轻量模型的表达能力,广泛应用于边缘设备。

在目标检测方面,从Faster R-CNN到SSD,再到YOLO系列(尤其是YOLOv3、v4、v5),小模型逐步实现了从高精度到实时性的跨越。YOLOv5和YOLOv8等版本不仅精度高,且推理速度快,适合部署在摄像头、无人机、机器人等资源受限设备上。

分割任务中,FCN、U-Net、DeepLab系列也不断优化,出现了如BiSeNet、Fast-SCNN等专为实时语义分割设计的小模型,广泛应用于自动驾驶、工业质检等场景。

总体来看,2012—2022年间,CV领域的小模型经历了从“追求精度”到“兼顾效率”的转变,形成了分类、检测、分割三大任务下的成熟轻量级模型体系,为后续边缘智能和实时视频分析奠定了基础。

CV领域小模型瓶颈

尽管小模型在效率和部署便捷性方面表现优异,但在复杂真实场景下的视频分析任务中仍面临诸多挑战:

(1)环境敏感性强

小模型通常依赖于训练数据分布,在光照变化剧烈(如夜间、逆光、雾霾)、天气恶劣或动态背景干扰下,检测与识别性能显著下降。例如,白天表现良好的行人检测模型在夜间可能漏检率上升30%以上。

(2)泛化能力有限

小模型多为单任务专用模型(如仅做人脸识别或车辆检测),对未知类别或新出现的目标类型缺乏识别能力。例如,传统YOLO模型无法识别训练集中未包含的新物体(如新型电动车、特殊工程车辆)。

(3)上下文理解缺失

小模型多基于局部像素信息进行判断,缺乏对场景语义、时空上下文的理解。例如,在拥挤人群中难以区分“正常行走”与“异常聚集”,也无法判断某人是否在“徘徊”或“丢弃物品”。

(4)鲁棒性不足

面对遮挡、尺度变化、姿态变化等情况,小模型容易产生误检或漏检。例如,部分遮挡的目标检测准确率可能下降50%以上。

这些局限性使得仅依赖小模型难以满足高安全要求的视频分析场景(如安防监控、交通管理、工业安全)中对准确性、鲁棒性和语义理解的综合需求。

大模型(多模态)优劣势

2022年底OpenAI发布的GPT3.5迅速掀起了全球大模型浪潮,与此同时(2022年前后)以CLIP、Flamingo、BLIP、Qwen-VL、InternVL等为代表的多模态大模型迅速崛起,成为提升视觉理解能力的重要技术路径。

优势:

(1)强大的语义理解能力

大模型通过海量图文对预训练,具备跨模态对齐能力,能理解图像内容与自然语言之间的深层关联。例如,给定查询“一个穿红衣服的人正在翻越护栏”,大模型可直接从视频帧中定位并判断该行为是否存在。

(2)零样本/少样本识别能力强

得益于大规模预训练,大模型无需微调即可识别数千类未见过的对象或行为,极大提升了系统灵活性。例如,CLIP可在不重新训练的情况下识别“外卖电动车”“共享滑板车”等新兴目标。

(3)上下文与推理能力突出

大模型能结合时间序列、空间关系和语言指令进行逻辑推理。例如,判断“一个人将包留在车站后离开”是否构成可疑遗留物,需结合动作、时间、位置等多维信息。

(4)统一架构支持多任务

一个大模型可同时完成分类、检测、描述生成、问答等多种任务,减少系统复杂度。

劣势:

(1)计算资源消耗巨大

典型多模态大模型参数量达数十亿甚至上百亿,单次推理需高性能GPU(如A100/H100),功耗高、成本大,难以部署在边缘设备。

(2)推理延迟高,难以满足实时性要求

大模型前向推理耗时通常在百毫秒级以上,无法满足视频流每秒30帧的实时分析需求,尤其在高并发场景下性能瓶颈明显。

(3)训练与微调门槛极高

训练大模型需要PB级数据、千卡级算力集群和专业团队,中小企业难以独立完成。

(4)存在“幻觉”风险

大模型可能生成不符合事实的描述或误判,尤其在低质量图像或模糊场景中。

因此,尽管大模型在准确性与智能性上远超小模型,但其高资源消耗与低实时性限制了其在实际视频分析系统中的直接广泛应用。

大小模型联合应用方式

为兼顾效率与智能,“小模型+大模型”协同推理架构逐渐成为视频分析领域的主流解决方案。其核心思想是:由小模型负责高效初筛,大模型负责精准复核与语义理解,实现性能与成本的最优平衡。

常见的联合应用方式包括:

(1)两级级联推理架构

第一级:小模型快速过滤

使用轻量级模型(如YOLOv8、MobileNet-SSD)对视频流进行实时目标检测与初步分类,筛选出感兴趣区域(ROI)或异常事件候选帧。

第二级:大模型精细分析

将候选帧送入多模态大模型(如Qwen-VL、InternVL)进行深度语义解析、行为理解或自然语言问答,确认事件真实性与具体含义。

示例:在地铁监控中,小模型检测到“有人倒地”,触发告警;大模型结合上下文(是否有人搀扶、是否有打斗前兆)判断是否为真实跌倒事件,避免误报。

(2)主动学习与增量更新机制

小模型在运行中遇到置信度低或无法识别的样本时,自动提交给大模型进行标注;

大模型输出结果作为“伪标签”,用于后续小模型的在线微调或增量训练,形成闭环优化。

(3)知识蒸馏(Knowledge Distillation)

利用大模型作为“教师模型”,指导小模型(“学生模型”)学习其输出分布或中间特征表示;

在保持小模型轻量化的同时,提升其语义理解能力。

(4)任务分工协作

小模型负责结构化任务(如人脸检测、车牌识别、人数统计);

大模型负责非结构化任务(如事件描述、意图推断、开放域问答);

两者通过中间接口(如消息队列、API服务)协同工作。

这种“分工明确、各司其职”的架构既能发挥小模型的实时性优势,又能调用大模型的智能决策能力。

大小模型联合应用案例

近年来,多个行业已成功落地大小模型协同的视频分析系统,取得了显著成效。以下是几个典型案例:

✅ 案例一:智慧安防中的异常行为识别(某一线城市地铁系统)

背景:地铁站每日客流量超百万人次,需实时监测跌倒、打架、滞留、逆行等异常行为。

方案:

1. 前端摄像头部署YOLOv8 + DeepSort进行实时人体检测与轨迹跟踪;

2.当检测到异常轨迹(如突然倒地、长时间静止)时,截取前后5秒视频片段;

3.视频片段上传至云端大模型(基于Qwen-VL定制)进行语义分析:“此人是否受伤?”“是否有同伴施救?”“是否为醉酒?”

效果:

1.异常事件识别准确率从72%提升至94%;

2.误报率下降60%,显著减轻人工复核压力;

3.平均每路视频日均仅触发3~5次大模型调用,算力成本可控。

✅ 案例二:工业园区安全监管(某化工企业)

背景:需检测工人是否佩戴安全帽、是否进入禁区、是否存在违规操作。

方案:

1.边缘设备部署轻量分割模型(BiSeNet)实时检测人员与装备;

2.若检测到“未戴安全帽”或“进入高危区”,则触发告警;

3.告警帧送入本地部署的裁剪版CLIP模型进行二次验证,排除误检(如头盔反光、阴影遮挡);

4.支持自然语言查询:“今天有几个没戴安全帽的人进入了反应车间?”

效果:

1.安全违规识别准确率达96.5%;

2.实现零云依赖本地闭环处理,满足数据安全要求;

3.支持开放语义查询,提升管理人员交互体验。

✅ 案例三:零售门店顾客行为分析(连锁便利店)

背景:需分析顾客动线、热区分布、商品关注度,优化陈列。

方案:

1.小模型(MobileNet-SSD)实时检测顾客位置与动作(拿取、放下、停留);

2.每分钟汇总一次结构化数据(如某货架前停留人数);

3.每小时将汇总数据与关键帧发送至大模型(BLIP-2)生成可视化报告:“今日最受欢迎商品是矿泉水,主要购买时段为12:00–13:00”;

4.支持语音提问:“昨天下午谁偷拿了商品?” → 大模型结合轨迹与动作分析可疑行为。

效果:

1.数据分析自动化程度提升80%;

2.店长可通过自然语言快速获取洞察,决策效率提高;

3.大模型调用频率低,整体系统稳定高效。

大小模型联合应用效果

某省高速监控视频分析系统累计接入视频路数超过2万路,针对部分传统AI小模型识别难度极大并影响道路安全的突发异常事件(汽车自燃、烟雾、抛洒物、边坡塌方),在引入多模态大模型之后,整体识别效果提升明显。下面是烟雾和道路抛洒物的识别案例(2万路视频样本基数下,准确率趋近99%):

(右键->新标签打开图片查看原图)

结语

大小模型的联合应用正在重塑视频分析的技术范式。小模型以其高效、低延迟的特点承担“哨兵”角色,实现全天候实时监控;大模型则作为“大脑”,提供深层次语义理解与智能决策支持。二者协同,既避免了大模型的算力黑洞,又弥补了小模型的认知局限。

未来,随着大模型轻量化技术(如MoE架构、量化压缩)、边缘计算能力提升以及多模态推理框架的成熟,大小模型融合将更加紧密,向“端-边-云”一体化智能视频分析系统演进,广泛应用于智慧城市、自动驾驶、工业互联网等领域,真正实现“看得清、看得懂、反应快”的智能视觉感知体系。

VideoPipe中集成多模态大模型做视频(图片)分析

VideoPipe是一个用于视频分析和结构化的框架,采用 C++ 编写、依赖少、易上手。它像管道一样,其中每个节点相互独立并可自行搭配,VideoPipe可用来构建不同类型的视频分析应用,适用于视频结构化、图片搜索、人脸识别、交通/安防领域的行为分析(如交通事件检测)等场景。

VideoPipe项目仓库中已经提供了50多个集成传统AI算法模型的Sample源码,涉及到车牌识别、人脸识别、违章检测、图搜、OCR、AI变脸、目标检测、图像分类、图像分割等各个领域。在大模型逐渐成为主流的今天(多模态大模型赋能传统AI视觉算法领域中表现优秀),VideoPipe也支持大模型集成啦,这次重点介绍VideoPipe如何集成多模态大模型来完成视频(图片)分析相关任务。

快速开始
下面基于VideoPipe和阿里云qwen-vl多模态大模型实现一个简单的图片理解的功能:从本地磁盘读取图片序列(现实场景中可以从网络获取图片或视频数据),大模型根据事先定义的Prompt提示词,对图片进行识别理解,依次对图片进行标签化,然后将标签化结果叠加到图片下方,最后显示结果。

1、创建VideoPipe节点类型(事先准备好aliyun大模型服务api_key)
2、将节点串起来,组成Pipeline管道
3、启动管道(一共55行代码)

运行效果

管道运行起来之后,大模型分析节点根据事先定义好的参数(模型名称、提示词、api_key)访问大模型服务,并解析大模型输出,随后显示节点将大模型输出绘制到图片中,并在控制台实时打印。VideoPipe目前支持的大模型后端有:OpenAI协议兼容服务、Ollama/vLLM本地部署服务。

VideoPipe在高速场景中的应用效果演示

-1-

-2-

-3-

-4-

-5-

-6-

-7-

-8-

-9-

-10-

什么是RAG?

RAG全称Retrieval-Augmented Generation,翻译成中文是“检索增强生成”。其中检索指的是“文本相似性检索”,生成指的是“基于大语言模型的生成型算法”,比如OpenAI的GPT系列,以及阿里的通义千问系列等等。完整去理解这个术语应该是:用文本语义相似性检索的结果,来丰富大语言模型的输入上下文,以此提升大语言模型的输出效果。RAG技术之所以重要,近几年热度持续上升,其主要原因还是受大语言模型影响,尤其大语言模型技术在实际使用过程中本身存在的一些缺陷。

大语言模型的缺陷

除去模型的复杂性对数据和算力的要求太高(这顶多算是门槛高,造成一般中小型公司无法入坑),大语言模型(LLM)在实际应用过程中有两个缺陷:

(1)知识的局限性

CV领域中常见的YOLO系列检测算法,模型参数量大概在百万~千万级别。而大语言模型参数量通常十亿起步,更复杂的甚至达到了千亿万亿级别。更多的参数量意味着模型能存储(学习)更多的知识,无论从知识深度还是广度都比传统的“小”模型要更优。但是,这个世界是复杂的,不同行业的知识千差万别,俗话说:隔行如隔山,这个在大模型技术中尤为突出。通常一些公司在训练大模型时,采用的数据主要来源于互联网,大部分都是公开的知识数据,模型从这些公开的数据中学习当前数据的基本规律,但是对于那些由于各种原因没有公开到网络上的垂直细分领域的知识数据,大模型在训练过程中完全无法接触到,这也导致模型在实际应用推理过程中,对特定领域问题回答效果不佳、甚至完全一本正经的胡说八道。下面是我向ChatGPT询问“车道收费软件程序无法正常运行如何处理?”,可以看到,ChatGPT在这种专业问题中表现不足,虽然回答的条理清晰(第一张图),但是并不是我们想要的答案(第二张图)。

<ChatGPT回答结果↑>

<标准答案↑>

(2)知识的实时性

大模型掌握的知识受限于训练它用到的数据,模型训练(迭代)一次消耗的时间相对较长(几个月甚至一年),很多知识数据虽然是公开的,但是由于时间关系,并不能及时被大模型掌握。比如前几天(2024/12/3)网络上出现了韩国总统尹锡悦突然发动戒严的新闻,你如果向一个11月份就上线的大模型问韩国的相关历史事件,这个戒严事件肯定不在回答之列,原因很简单,因为模型在训练过程中并没有相关数据。下面是我向ChatGPT询问“韩国近现代有哪些主要的政治事件?”,在它给出的回答中,可以看到回答的主要事件截止时间在2022年尹锡悦上台后不久,回答中没有更新的数据。

<ChatGPT关于韩国近代历史事件的回答↑>

提示工程的重要性

在2022年底ChatGPT刚出来不久,GitHub上就有一个非常火爆的项目仓库叫awesome-chatgpt-prompts(截止2024/12/15已经有114K星星),这个仓库核心就是一个README文件,里面包含了我们在使用ChatGPT时常用到的一些“提示词”。提示词的作用是告诉大模型一些上下文背景,让模型能够根据你的提示词来给出想要的回答。提示词完全使用自然语言编写,好的提示词能够得到更加准确的回答。下面给出两个例子,第一个是让ChatGPT充当Linux操作系统命令行终端(类似ssh工具),响应用户输入的Linux命令;第二个是让通义千问充当一个关键信息提取器,将两个人语音对话中的关键信息提取出来然后按指定格式输出。

<ChatGPT扮演Linux终端↑>

<给通义千问设置提示词↑>

<通义千问根据提示词给出的回答↑>

可以说如何用好大模型,提示词是关键。提示词的设计可以复杂,比如提供一些输入输出的示例,让大模型参考,也可以提供“思考”逻辑或者方向,给大模型提供一些回答问题的思路,当然也可以交代一些背景知识,让大模型“实时”去消化。

既然提示词如此重要,它能够丰富大模型问答上下文,让模型了解更多的背景知识,从而提升大模型的使用效果。那么我们能否使用类似提示词这种方式去弥补前面提到的那些大模型应用缺陷呢?答案是肯定的,这就是RAG采用的技术思路。针对“知识的局限性”和“知识的实时性”问题,我们可以借用类似“提示词”之手告诉大模型,让它能够在“外部补充数据”的上下文环境中,给出我们想要的答案,从而规避知识的局限性和实时性问题。

为了让大模型能够掌握额外的背景知识,我们引进了“外部补充数据”,那么我们应该如何获取这个外部补充数据呢?很明显这个获取的过程很关键,有两个原因:

1、外部补充数据一定要与用户query有关,而且相关性越高越好,否则就是误导模型思考,补充数据越详细越好,模型获取的外部信息就越充足。

2、我们事先并不知道用户需要query什么问题,所以获取外部补充数据一定是一个检索的过程,从一个大规模特定领域的非结构化数据集合中检索与query相关的部分,这个检索是实时性的,针对不同的query可能都需要这个操作。

现在我们将上一张图更新一下,大概可以修改成这样:

针对用户的每个query,我们先从“知识库”(大规模特定领域的非结构化数据集合,可随时更新)检索出与query相关的信息,然后再和原始query一起合并输入到大模型。目前这里的检索方式通常采用“文本语义相似性检索”,这个跟CV领域图像相似性检索类似,一般基于高维特征去做相似度匹配。

文本语义相似性检索

一般在讲语义相似性检索的时候,通常也会提到关键字检索,这是两种不同的文本检索方式。下面是两种方式特点:

1、语义相似性检索。基于文本内容含义去做匹配,算法能够理解句子(词语)的内在含义,然后找出意义与之相似的内容。比如“这个产品令人眼前一亮”和“这个产品设计很新颖”虽然文本内容本身不尽相同,但是其意义相似,那么算法认为它们相似度很高。类似的,“汽车”和“轿车”相似度很高,“跑步鞋”和“耐克”相似度很高,“晴朗的天”和“万里无云”相似度很高。

2、关键字检索。基于文本内容本身去做匹配,算法只匹配句子(词语)内容本身,“晴朗的天”和“万里无云”如果从关键字去匹配的话,相似度基本为零。在学习《数据结构和算法

》课程的时候,里面提到的“汉明距离”可以算作关键字匹配的一种方式,主要用来计算字符串之间的相似度。

我们从上面的解释可以了解到,语义相似性检索方式显得更加“聪明”,更贴近人类思考的方式,所以在RAG技术栈中,一般采用语义相似性检索的方式去获取前面提到的“外部补充数据”。文本的语义相似性检索一般基于“高维特征”去完成,大概思路就是事先对知识库中的文本内容进行特征编码,生成高维特征向量(通常128/256/512维度),最后存入专用向量数据库(比如Faiss/Milvus向量数据库),形成底库。在检索阶段,先对query文本使用相同的特征编码算法生成特征向量,然后使用该向量去向量数据库中检索前TOP N个相似特征,最后映射回前TOP N个原始文本内容。那么得到的这些原始文本内容,就和query文本在语义上存在很高的相似度。

上面图中,A和B是特征向量底库,C是query特征向量,最终C和A之间的相似度要比C和B之间更高,所以“今天万里无云,天气很好”可以匹配到“真是一个晴朗的天”。那么如何衡量特征向量之间的相似度呢?以2维向量为例(3维或更高维类似),可以把特征向量看做是二维坐标系中的一个点,最后计算两点之间的距离,通常有两种距离计算方式,一个叫“欧氏距离(直线距离)”,一个叫“余弦距离”。

欧氏距离越小,两个点越靠近,代表越相似(图中红色);余弦距离代表的是点与原点连线之间的夹角,夹角越小(余弦值越大,图中紫色),代表越相似。(关于特征编码,以及特征相似度计算可以参考之前的文章)。目前网络已经有很多开源的文本特征编码模型,针对不同国家语言,可以为其提取文本特征标识。下面是我对鲁迅的《故乡》全文做特征编码,然后去检索“我情不自禁地伤心起来。”这句话的例子,最后返回TOP 10个与之语义相似的句子,可以看到整体表现还算可以,尤其排名靠前的几个结果,基本和query句子的含义比较接近。

从“单阶段推理”到“两阶段推理”

我们现在回顾一下大语言模型的工作流程,基本上就是用户提供query问题输入(可以携带一些简单的上下文,比如历史对话记录),大模型直接给出回答,注意这里大模型完全基于训练时积累的经验给出的答案。这个可以看做是一个“端到端”的推理过程,我们称之为“单阶段推理”(可以类比CV领域中经典的YOLO系列检测算法)。那么相比较而言,RAG就是“两阶段推理”,问答系统先要从知识库中检索与用户query有关的信息,然后再与query一起,传入大模型,之后的流程就和单阶段推理一致。以此可以看出,RAG指的并不是具体哪一个算法或者技术,而是一套解决问题的技术方案,它需要用到文本特征编码算法、向量数据库、以及大语言模型等等。Github上有很多RAG相关的框架,都提供了灵活的接口,可以适配不同的文本编码模型、不同的向量数据库、不同的大语言模型。

总结RAG的优劣势和应用场景

1、RAG的优势

可以有效解决单纯使用大语言模型时碰到的一些问题,比如知识的局限性和实时性,能够解决大模型在垂直细分领域落地的难题,让大模型更接地气、给出的回答更贴近标准答案而不是一本正经的胡说八道。同时,让中小型企业可以基于开源大模型快速搭建自己的知识库问答(建议)系统,而无需对其进行二次训练或微调(算力和数据,包括大模型的训练门槛都是相当之高)。

2、RAG的劣势

引入了更多的技术栈,提升了系统的复杂性,无论开发还是后期维护工作量更高。同时,由于前期引入了“语义检索”的流程,涉及到准确性问题,一旦前期检索环节出问题,直接影响后面大模型效果。

3、RAG应用场景

RAG可以用在垂直细分领域的知识问答(建议)场景,对数据隐私要求比较高,同时对知识库实时更新有要求。当然除了本文介绍的这种基于知识库问答系统,类似的还可以用在基于数据库、基于搜索引擎等问答系统,原理基本类似。

 

什么是神经网络

(2019年文章)

大部分介绍神经网络的文章中概念性的东西太多,而且夹杂着很多数学公式,读起来让人头疼,尤其没什么基础的人完全get不到作者想要表达的思想。本篇文章尝试零公式(但有少量数学知识)说清楚什么是神经网络,并且举例来说明神经网络能干什么。另外一些文章喜欢举“根据历史交易数据预测房子价值”或者“根据历史数据来预测未来几天是否下雨”的例子来引入“机器学习/深度学习/神经网络/监督学习”的主题,并介绍他们的作用,这种例子的样本(输入X输出Y)都是数值,数字到数字的映射,简单易懂,但是现实应用中还有很多场景并非如此,比如本文后面举的“图像分类”例子,输入是图片并不是简单的数值输入。

分类和回归

我们平时讨论的机器学习/深度学习/神经网络大部分时候说的是“监督学习”范畴,监督学习应用最为广泛,也是神经网络发挥巨大作用的领域,因此,本文所有内容都是基于监督学习。从带有标签的样本数据中学习“经验”,最后将经验作用于样本之外的数据,得到预测结果,这就是监督学习。监督学习主要解决两大类问题:

(1)分类

分类很好理解,就是根据输入特征,预测与之对应的分类,输出是离散数值,比如明天是否下雨(下雨/不下雨)、短信是否是垃圾短信(是/否)、图片中包含的动物是猫、狗还是猴子(猫/狗/猴子)等等。分类模型的输出一般是N维向量(N为分类数),每个向量值代表属于此分类的概率。

如上图,根据样本数据(黄色圆形、蓝色正方形、绿色棱形),监督学习可以确定两条边界线,对于任何样本之外的数据(图中灰色正方形),可以预测它所属分类为B,对应的预测输出可以是[0.04, 0.90, 0.06],代表属于A类的概率为0.04,属于B类的概率为0.90,属于C类的概率为0.06,属于B类的概率最大,因此我们可以认为它的分类为B。请注意图中用来划分类型区域的两条虚线,同类样本并没有完全按照虚线分割开来,有黄色的圆形被划分到B类中,也有蓝色的正方形被划分到A类中。这种情况之所以出现,是因为监督学习得到的经验应该具备一定程度的泛化能力,所以允许学习过程中出现一定的误差,这样的学习才是有效的。

(2)回归

与分类相反,回归主要解决一些输出为具体数值的问题,比如明天的气温(20、21、30等)、明天股票开盘价(100、102、200等)。回归模型的输出一般是具体数值(包含向量,向量中包含每个具体的数值)。

如上图,根据样本数据(图中蓝色正方形,平面坐标系点),监督学习可以确定一条直线y=1.5x+1,对于任何样本之外的输入(Xn),可以预测对应的输出Y为1.5*Xn+1。请注意通过监督学习得到的直线y=1.5*x+1,事实上并不是每个样本都刚好落在该条直线上,大部分分布在直线周围。原因跟上面提到的一样,监督学习过程允许出现一定的误差,这样才是有效的学习。

学习的过程

不管是分类还是回归问题,监督学习都是从样本数据中学习经验,然后将经验应用到样本之外的数据。那么这个经验具体指什么?学习的本质是什么呢?

以上面回归问题为例,我们得到直线y=1.5*x+1的过程如下:

(1)确定样本数据呈直线分布(近似直线分布);

(2)设定一个目标函数:y=w*x+b;

(3)调整w和b的值,使样本数据点尽可能近地分布在直线周围(可以使用最小二乘法);

(4)得到最优的w和b的值。

以上是4步完成学习的过程,这个也是最简单的监督学习过程。至于其中“如何确定样本呈直线分布”、“如何判断目标函数为y=w*x+b”以及“如何去调整w和b的值,可以使样本数据点尽可能近的分布在直线周围”这些问题,后面一一介绍。

我们经常听到的深度学习中模型训练,其实指的就是学习的过程,最后输出的模型中主要包含的就是w和b的值,换句话说,训练的过程,主要是确定w和b的值,可以称这些参数为“经验”。

监督学习的过程就是找出X->Y的映射关系,这里的输入X可以称之为“特征”,特征可以是多维的,实际上X大多数情况都是多维向量,类似[1, 1.002, 0.2, …],输出Y称为“预测值”,预测值也可以是多维的,类似[0.90, 0.08, 0.02],比如前面提到的分类问题中,输出Y为多维向量,每个向量值代表预测对应分类的概率大小。

全连接神经网络

全连接神经网络由许许多多的“神经元”连接而成,每个神经元可以接收多个输入,产生一个输出,类似前面提到的X->Y的映射,如果输入是多维的,格式就是[x1, x2, …, xn]->Y(对于单个神经元来讲,输出都是一个数值)。多个神经元相互连接起来,就形成了神经网络,神经元的输入可以是来自其他多个神经元的输出,该神经元的输出又可以作为其他神经元的输入(的一部分)。下图为一个神经元的结构:

如上图所示,一个神经元接收[x1, x2, …, xn]作为输入,对于每个输入Xi,都会乘以一个权重Wi,将乘积结果相加再经过函数f作用后,产生输出Y。多个神经元相互连接之后,得到神经网络:

如上图,多个神经元相互连接起来组成全连接神经网络(图中只包含w参数,省略了b),图中神经网络一共包含3层(Layer1,Layer2和Layer3),上一层每个神经元的输出全部作为后一层每个神经元的输入,这种网络叫“全连接神经网络”(顾名思义,全连接的意思)。图中黄色部分就是两个完整的神经元结构,第一个神经元有三个输入(x1,x2和x3),分别乘以对应的权重w31,w32和w33,第二个神经元有四个输入(分别来自于Layer1层中的4个输出)。该神经网络可以接受一个3维向量作为输入(格式为[x1, x2, x3]),从左往右计算,最后输出一个2维向量(格式为[y1, y2])。对应它学习到的经验,可以用来处理符合如下映射关系的“分类”或者“回归”问题:

全连接神经网络是结构最简单的神经网络,相邻两层之间的神经元每个之间都有连接,因为结构最简单,因此通常以它作为入口来介绍其他结构更复杂的网络。注意,大部分神经网络并不是每个神经元都有连接关系,而且有些并不是严格遵从“数据从左往右移动”这种顺序。

神经网络中的矩阵计算

对于单个神经元的计算过程而言,是非常简单的,分三步:

(1)计算每个输入参数Xi和对应权重Wi的乘积;

(2)将乘积加起来,再加上一个偏移值b;

(3)最后将函数f作用在(2)中的结果上,得到神经元的输出。

但是对于神经网络这种包含大量的神经元而言,如何可以更加方便、代码中更简洁地去实现呢?答案是使用矩阵,线性代数搞忘记的同学也不要紧,这里仅仅是利用了“矩阵相乘”和“矩阵相加”的规则。

(1)矩阵相加

矩阵相加要求两个矩阵维度相同,矩阵中对应的数字直接相加即可,生成一个新的矩阵,维度跟之前一样:

(2)矩阵相乘

矩阵相乘要求第一个矩阵包含的列数和第二个矩阵包含的行数相同,M*N的矩阵乘以N*T的矩阵,得到M*T的一个新矩阵:

第一个矩阵A的第一行每个元素与第二个矩阵B的第一列各个元素相乘然后加起来,作为结果矩阵C中的第一行第一列,第一个矩阵A的第一行每个元素与第二个矩阵B的第二列各个元素相乘然后加起来,作为结果矩阵C中的第一行第二列,以此类推。上图中3*3的矩阵乘以3*2的矩阵,得到一个3*2的新矩阵。如果将上图7中A矩阵换成神经网络中的参数W(W11,W12,W22…),将B矩阵换成输入X特征(X1, X2, X3…),那么全连接神经网络中每一层(可以包含多个神经元)的计算过程可以用矩阵表示成:

如上图,使用矩阵我们可以批量操作。对于图4中第一层(Layer1)所有神经元的计算过程,可以通过图8一次性计算完成。图中W矩阵先和X矩阵相乘,再加上偏移值B矩阵,得到一个中间结果(也是一个矩阵),然后再将中间结果传给函数f,输出另外一个新矩阵Y,那么这个Y就是神经网络第一层Layer1的输出,它会作为下一层Layer2的输入,后面以此类推。注意,函数f接受一个矩阵为参数,并作用于矩阵中每个元素,返回一个维度一样的新矩阵,后面会提到。可以看到,之前需要计算4次f(w*x+b),现在只需要一次就可以了。

通过前面的介绍,可以得知,神经网络的训练过程就是找到最合适的W矩阵(多个)和最合适的b矩阵(多个)使得神经网络的输出与真实值(标签)最接近,这个过程也叫做模型训练或者调参(当然模型训练远不止这样,还有其他诸如超参数的确定)。

非线性变换

即使输入是高维向量,经过简单的W*X+b这样处理之后,输出和输入仍然呈线性关系。但是现实场景中大部分待解决的问题都不是线性模型,因此我们需要在输入和输出之间增加一个非线性变换,也就是前面多次提到的f函数(又称为激活函数)。由于各种原因(这里涉及到神经网络具体的训练过程,反向传播计算权重值,暂不过多解释),常见可用的激活函数并不多,这里举两个函数为例:

(1)Sigmoid函数

Sigmoid函数能将任意实数映射到(0, 1)之间,具体函数图像如下:

上图中Sigmoid函数将任意输入映射到(0, 1)之间的值,因此Sigmoid函数又经常被称为逻辑函数,常用于二分类预测问题,假设有两个分类A和B,对于任何输入特征X,Sigmoid返回值越趋近于1,那么预测分类为A,反之则为B。

(2)ReLu函数

ReLu函数很简单,返回值为max(x, 0),具体函数图像为:

上图中ReLu函数将任意输入的负数转换为0,其他输入原样输出。ReLu函数是目前深度学习中应用最多的激活函数,具体原因这里不做解释。这里需要说一下,深度学习/神经网络中有些东西并没有非常充足的理论依据,完全靠前人经验总结而来,比如这里的ReLu函数看似简单为什么在大部分场合下效果最好,或者神经网络训练中神经元到底如何组织准确性最高等等问题。

神经网络解决分类问题

经过前面的介绍不难得出,神经网络可以解决复杂映射关系的“分类”问题。将特征输入到神经网络,经过一系列计算得到输出。下图举一个形象的例子来说明神经网络如何解决分类问题:

上图显示一个和全连接神经网络同样结构的管道网状结构,从上到下有多个阀门可以调节控制液体走向(图中①),经过事先多次样本液体训练(使用不同品牌、不同酒精度、不同子型号的白酒),我们将阀门调节到最佳状态。随后将一杯白酒从最顶部倒入网状结构,最后经过管道所有液体会分别流进三个玻璃杯中(图中③)。如果我们将一杯五粮液倒入管道,理论情况所有的液体应该完全流进第一个玻璃杯中(图中左侧),但是实际上由于神经网络具备泛化能力,对于任何输入(包括训练样本),大部分时候不会跟正确结果100%一致,最终只会保证第一个玻璃杯中的液体最多(比如占85%),其余两个玻璃杯同样存在少量液体(图中右侧)。

那么现在有个问题,神经网络最后输出的是数值(或多维向量,向量包含具体数值),结果是如何体现“分类”的概念呢?本文最开始讲到过,分类问题最后都是通过概率来体现,某个分类的概率最高,那么就属于该分类,下图显示如何将数值转换成概率:

如上图所示,对于2分类问题,我们通常使用前面提到的Sigmoid函数将其转换成(0,1)之间的概率值,然后再根据概率值划分类别。对于N分类(N也可以为2),我们要使用另外一个函数Softmax,该函数接受一个向量作为参数,返回一个新向量,维度跟输入一致,新向量的每个值均分布在在(0, 1)之前,并且所有概率之和为1。注意该函数作用在整个向量上,向量中的每个值之间相互有影响,感兴趣的同学上网查一下公式。

图像分类任务

图像分类又称为图像识别,给定一张图,要求输出图中包含的目标类型,比如我们常见的“微软识花”、“识别猫还是狗”等等,这是计算机视觉中最典型的“分类”问题。图像分类是其他诸如“目标检测”、“目标分割”的基础。

(1)图像的定义

数字图像本质上是一个多维矩阵,常见的RGB图像可以看作是3个二维矩阵,矩阵中每个值表示对应颜色通道上的值(0~255),还有其他比如灰度图,可以看作是是1个二维矩阵,矩阵中每个值表示颜色的像素值(0~255)。

如上图所示,一张RGB全彩数字图片大小为180*200,对应3个矩阵,大小都是180*200,矩阵中的数值范围都在0~255。对于单通道灰度图而言,对应1个矩阵,大小也是180*200:

(2)使用全连接神经网络做图像分类

前面已经讲到如何使用全连接神经网络解决“分类”的问题,图像分类同样属于分类问题,因此也可以使用神经网络的方式解决,唯一的区别是前面提到的都是数值特征输入[x1, x2, x3, …],那么对于图像而言,该将什么输入给神经网络呢?答案是图像矩阵,图像矩阵中包含数值,将一个M*N的二维矩阵展开后,得到一个M*N维向量,将该向量输入神经网络,经过神经网络计算,输出各个分类概率。下面以“手写数字图像识别”为例,介绍全连接神经网络如何做图像分类。手写数字图像识别是深度学习中的一个HelloWorld级的任务,大部分教程均以此为例子讲解图像识别,下图为手写数字图片:

上图显示4张手写数字图片,分别为“5”、“0”、“4”、“1”,每张图片大小为28*28,即长宽都为28像素,图片都是灰度图像,也就是说每张图片对应1个28*28维矩阵,将该矩阵展开得到一个28*28维向量,直接输入到全连接神经网络中。从0到9一共10个分类,因此神经网络的输出是一个10维向量。

如上图所示,原始输入图片大小为28*28,将其展开成[784*1]的特征X传入神经网络。神经网络一共包含两层,第一层W矩阵大小为[1000*784],W*X之后得到大小为[1000*1]的输出,该输出作为第二层的输入X,第二层W矩阵大小为[10*1000],W*X之后得到大小为[10*1]的输出,该输出(经过Softmax作用后)即为数字0~9的概率。

注意上面定义的神经网络结构中,只包含两层(图中蓝色和绿色,黄色部分不算),第一层的W矩阵尺寸为[1000*784],这里的1000是随意设定的,可以是500甚至2000,它和神经元数量保持一致。第二层的W矩阵尺寸为[10*1000],这里的1000跟前面一样,这里的10是分类数,因为一共10个分类,所以为10,如果100分类,这里是100。神经网络的层数和每层包含的神经元个数都可以调整,这个过程就是我们常说的“修改网络结构”。

通过上面的方式做手写数字图片识别的准确性可能不高(我没有试验过),即使已经很高了它也不是一种非常好的方式,这种方式也许对于手写数字图片识别的任务很有效,但是对于其他图片比如猫、狗识别仍然很有效吗?答案是否定的,原因很简单:直接将整张图片的数据完全输入到神经网络中,包含的特征太复杂,或者噪音太多,这种现象可能在手写数字这种简单的图片中有效,一旦换成复杂的图片后可能就不行了。那么针对一般图像分类的任务,在将数据传到神经网络进行分类之前,我们还需要做什么呢?

(3)图像特征

图像特征在计算机视觉中是一个非常非常重要的概念,它在一定程度上可以当作图片的特定标识,每张图片都包含一些人眼看不到的特征。关于图像特征的介绍,大家可以参考我之前的一篇博客:https://www.cnblogs.com/xiaozhi_5638/p/11512260.html

在使用神经网络对图片进行分类之前,我们需要先提取图像特征,然后再将提取到的特征输入到全连接神经网络中进行分类,因此解决图像分类问题的正确神经网络结构应该是这样的:

如上图所示,在全连接神经网络之前增加了一个模块,该模块也是神经网络的一部分,同样由许许多多的神经元组成,但是可能不再是全连接这种结构了,它可以自动提取图片特征,然后将特征输入到后面的全连接网络进行分类,我们通常把这里的全连接网络称为“分类器”(是不是似曾相识?)。这样一来,全连接网络的输入特征大小不再是[784*1]了(图中黄色部分),而应该根据前面的输出来定。图中这种由全连接神经网络(分类器)和特征提取部分组合起来的神经网络有一个专有名词,叫“卷积神经网络”,之所以叫“卷积”,因为在提取特征的时候使用了卷积操作,具体后面介绍。

卷积神经网络

卷积神经网络中包含一个特征提取的结构,该结构主要负责对原始输入数据(比如图像,注意还可以是其他东西)进行特征提取、抽象化、降维等操作,它主要包括以下几个内容:

(1)卷积层

卷积层主要负责特征提取,它使用一个卷积核(一个小型矩阵)以从左到右、从上到下的顺序依次作用于原始输入矩阵,然后生成一个(或多个)新矩阵,这些新矩阵我们称之为feature maps。具体操作过程如下图:

如上图所示,图中绿色部分为原始输入矩阵,黄色矩阵为卷积核(一个3*3的矩阵),经过卷积操作后生成一个新的矩阵(粉色),该矩阵称为feature map。卷积核可以有多个,每个卷积核不同,同一个输入矩阵经过不同的卷积核处理之后会得到不同的feature map。因此在卷积层中,存在多个卷积核处理之后就会生成多个feature maps,这些feature map各不相同,每个都代表一定的特征。

如果原始输入矩阵是一张图片,经过卷积核处理之后,生成的多个feature maps虽然仍然是矩阵的形式,但是不能再把它们当作图片来对待。下图显示一张图片经过两个不同的卷积核处理之后生成的两个feature maps,我们用工具将这两个feature maps以图片的形式显示出来:

如上图所示,一张原始图片经过一次卷积处理之后,生成的feature map以图片的方式显示出来之后似乎还是可以人眼识别出来。但是,如果经过多次卷积处理之后,那么最终的feature map就无法人眼识别了。上图还可以看出,不同的卷积核处理同一张输入图片后,生成的feature map之间有差别。

这里再次强调,虽然经过卷积操作得到的feature maps仍然可以以图片的形式显示出来,但是它不在是我们通常理解中的“图片”了。虽然人眼看不再有任何意义,但是对于计算机来讲,意义非常重大。卷积层可以存在多个,一个卷积层后面可以紧跟另外一个卷积层,前一层的输出是下一层的输入。卷积层中的一些参数,比如卷积核矩阵中的具体数值,都需要通过训练得到,这个道理跟前面提到的W和b参数一样,也是需要通过训练去拟合。

(2)非线性变换(激活函数)

和前面讲全连接神经网络一样,经过卷积层处理之后生成的feature maps仍然需要进行非线性转换,这里的方式跟前面一样,使用常见的激活函数,比如ReLu函数作用在feature map上的效果如下图:

如上图,feature map经过激活函数处理之后,得到另外一个矩阵,我们称之为 Rectified feature map。根据前面介绍ReLu的内容,我们可以得知,该激活函数(max(0, x))将原feature map矩阵中的所有负数全部变成了0。

(3)池化层

只有卷积操作和激活处理还是不够,因为到目前为止,(Rectified) feature maps包含的特征数据还是太大,为了让模型具备一定的泛化能力,我们需要对feature maps进行降维,这个过程称之为池化:

如上图,池化层在原始feature maps上进行操作,还是按照“从左往右从上到下”的顺序,选择一个子矩阵(图中圆圈部分2*2,类似前面的卷积核),选取该子矩阵范围内最大的值作为新矩阵中的值,依次处理后最后组成一个全新矩阵,这个全新矩阵尺寸比原来的小。除了取最大值外,还有取平均值和求和的做法,但是经过前人实践证明,取最大值(最大池化)效果最好。

经过池化层处理之后的feature maps仍然可以以图片的方式显示出来,还是和前面一样,人眼已经分不清是啥了,但是对于计算机来讲意义重大。

如上图所示,一张feature map经过两种方式池化,取最大值求和,分别得到不同的新矩阵,然后将新矩阵以图片的方式显示出来,可以看到差别还是非常大(虽然人眼已经分不清内容)。

通常情况下,卷积层后面不需要都紧跟一个池化层,可以经过多个卷积层之后再加一个池化层,也就是说,卷积和池化可以不按照1:1的比例进行组合。卷积神经网络中特征提取部分就是使用卷积层、激活处理、池化层等组合而成,可以根据需要修改相应网络层的数量(通常所说的“调整网络结构”)。最后一个池化层输出的结果就是我们提取得到的图像特征,比如最后一个池化层输出T个矩阵(feature maps),每个大小为M*N,那么将其展开后得到一个T*M*N维向量,那么这个向量就是图像特征。到这里应该就很清楚了,我们如果将这个特征向量传到一个“分类器”中,通过分类器就可以得到最终的分类结果,分类器可以使用前面讲到的全连接神经网络。

(4)全连接层(分类器)

其实看到这里的同学,如果前面的内容都看懂了,这块就不难了。图像特征已经得到了,直接将它输入到全连接神经网络中去,就可以得到最终分类结果。下图显示将一个手写数字图片传入卷积神经网络中的过程,先分别经过两个卷积层和两个池化层(交叉相连而成,图中忽略了激活处理等其他操作),然后将最后一个池化层的输出先展开再作为全连接网络的输入,经过两个全连接层,最终得到一个10*1的输出结果。

关于卷积神经网络的配图均来自:https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/

关于模型训练

一些深度学习框架会帮我们去做模型训练的具体工作,比如上面提到的w和b的确定,找出最合适的w和b尽量使预测值与真实值之间的误差最小。下面举个例子,使用tensorflow来优化 loss=4*(w-1)^2这个函数,找到最合适的w使loss最小:

如上图所示,我们学过的数学知识告诉我们,w等于1时loss最小,这个过程可以通过求导得出(导数等于0的时候)。那么使用tensorflow来帮我们确定w该是怎样呢?下面是使用tensorflow来优化该函数,确定最有w的值:

w = tf.get_variable(“w”, initializer = 3.0)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
for i in range(5):
  optimizer.minimize(lambda: 4*(w-1)*(w-1))
  print(w.numpy())
使用梯度下降优化算法去寻找最合适的w,最后的输出是:

1.4
1.0799999
1.016
1.0032
1.00064

我们可以看到,经过5次寻找,我们得到最优的w为1.00064,已经非常接近1了。这个过程其实就是深度学习框架训练模型的简单版本

注意:

  1. 本篇文章没有涉及到具体模型训练的原理,也就是求W和b矩阵的具体过程,因为该过程比较复杂而且涉及到很多数学公式,读者只需要知道:模型训练的本质就是使用大量带有标签的样本数据找到相对比较合适的W和b矩阵,之后这些矩阵参数可以作用于样本之外的数据。
  2. 深度学习很多做法缺乏实际理论依据,大部分还是靠经验,比如到底多少层合适,到底用什么激活函数效果更好,很多时候针对不同的数据集(或者问题)可能有不同的答案。
  3. 除了名字相同外,深度学习中的神经网络跟人脑神经网络工作原理没有关系,之前以为有关系,所以取了一个类似的名字,后来科学家发现好像没什么关系,因为人脑太复杂。