本文最后更新于:2025年2月7日 上午

人工智能是近几年的热点概念,本文对相关概念进行解读澄清,并介绍相关基础知识。

AI

定义

人工智能(英语:artificial Intelligence,简称为AI)是一个广博的领域,涵盖许多不同的学科,包括计算机科学、数据分析和统计、硬件和软件工程、语言学、神经学,甚至哲学和心理学。它企图了解智能的实质,并生产出一种新的能以与人类智能相似的方式做出反应的智能机器

维基百科

人工智能,称机器智能,指由人制造出来的机器所表现出来的智慧。通常人工智能是指用普通电脑程序来亦表现为人类智能的技术。该词也指出研究这样的智能系统是否能够实现,以及如何实现。

教材定义

人工智能於教材中的定义是“智慧主体(intelligent agent)的研究与设计”,智慧主体指一个可以观察周遭环境并作出行动以达致目标的系统。

安德烈亚斯·卡普兰

将人工智能定义为“系统正确解释外部数据,从这些数据中学习,并利用这些知识通过灵活适应实现特定目标和任务的能力。

1
人工智能可以定义与人类思维相关的认知功能的机器或计算机,如学习和解决问题。人工智能是计算机科学的一个分支,人类利用其环境并采取行动,最大限度地提高成功机会。此外,人工智能能够从过去的经验中学习,做出合理的决策,并据此作出。,人工智能研究人员的快速科学目标是通过构建象征意义的推理或具有计算机程序的推理来理解智慧。

功能性定义

  • 模拟人类智能:人工智能是指由人工制造的系统所表现出来的智能行为,包括学习、推理、理解、决策、感知、语言交流等人类智能活动。
  • 执行智能任务:人工智能是使计算机能够执行通常需要人类智能才能完成的任务,如视觉识别、语言翻译、数据分析、游戏对弈等

技术性定义

  • 智能行为的实现:人工智能是研究和开发用于模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的一门学科。
  • 智能系统的设计:人工智能是设计和构建能够感知环境、学习经验、推理决策并采取行动以实现特定目标的智能系统的过程。

性能水平定义

  • 弱人工智能(Narrow AI) :指在特定领域或任务上表现出智能行为的人工智能系统,如语音识别、图像识别等。它只能在有限的范围内执行特定的任务,是经过训练并专注于执行特定任务的人工智能。当前,我们周围的大部分人工智能都属于弱人工智能。
  • 强人工智能(General AI) :强人工智能由通用人工智能 (AGI) 和超人工智能 (ASI) 组成。指具有广泛认知能力的人工智能系统,能够在任何领域中表现出与人类相似的智能行为,具有自我意识、情感、创造力等人类智能的全部特征。通用人工智能 (AGI) 或通用 AI 是人工智能的一种理论形式,其中,机器将具有与人类相同的智能;它会有自我意识,有能力解决问题、学习和规划未来。超人工智能 (ASI),也称为超智能,将超越人脑的智力和能力。

组成

主要组成部分是:

  • 机器学习:包括评估小范围的解决方案,并可能涉及一些猜测,找到接近的最佳解决方案;
  • 自然语言处理:在自然语言中实现人机之间的交流;
  • 计算机视觉:自动生成识别形状和功能的能力。
  • 专家系统:作为专家处理正在审查的情况,并产生预期或预期的绩效;

AI、机器学习与深度学习

机器学习属于人工智能的分支之一,且处于核心地位。顾名思义,机器学习的研究旨在让计算机学会学习,能够模拟人类的学习行为,建立学习能力,实现识别和判断。机器学习使用算法来解析海量数据,从中找出规律,并完成学习,用学习出来的思维模型对真实事件做出决策和预测。这种方式也称为“训练”。

深度学习是机器学习的一种实现技术,深度学习遵循仿生学,源自神经元以及神经网络的研究,能够模仿人类神经网络传输和接收信号的方式,进而达到学习人类的思维方式的目的。

简而言之,机器学习是一种实现人工智能的方法,深度学习是一种实现机器学习的技术。

机器学习

定义

机器学习(Machine Learning)是人工智能(AI)的一个分支,是实现人工智能的一个途径之一,即以机器学习为手段,解决人工智能中的部分问题。

机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。

机器学习是一门开发算法和统计模型的科学,计算机系统使用这些算法和模型,在没有明确指令的情况下,依靠既有模式和推理来执行任务。计算机系统使用机器学习算法来处理大量历史数据,并识别数据模式。这可让计算机系统根据给出的输入数据集更准确地预测结果。

工作原理

机器学习的核心思想是任意输入和输出数据组合之间的现有数学关系。机器学习模型事先不知道这种关系,但如果给出足够的数据集,它可以猜测出来。这意味着每个机器学习算法都是围绕一个可修改的数学函数构建的。基本原理可以这样理解:

  1. 我们为算法提供了以下输入/输出 (i,o) 组合来“训练”算法 – (2,10)、(5,19) 和 (9,31)

    ground_truth: $o=3i+4$

    构建线性模型: $o=ai+b$

  2. 算法计算出输入和输出之间的关系为:$o=3i+4$

  3. 我们为算法提供输入 7,并要求算法预测输出。算法会自动确定输出为 25。

机器学习通过让计算机从大量数据中学习模式和规律来做出决策和预测。

  • 首先,收集并准备数据,然后选择一个合适的算法来训练模型。
  • 然后,模型通过不断优化参数,最小化预测错误,直到能准确地对新数据进行预测。
  • 最后,模型部署到实际应用中,实时做出预测或决策,并根据新的数据进行更新。

机器学习是一个迭代过程,可能需要多次调整模型参数和特征选择,以提高模型的性能。

  1. Labeled Data(标记数据)::图中蓝色区域显示了标记数据,这些数据包括了不同的几何形状(如六边形、正方形、三角形)。
  2. Model Training(模型训练)::在这个阶段,机器学习算法分析数据的特征,并学习如何根据这些特征来预测标签。
  3. Test Data(测试数据)::图中深绿色区域显示了测试数据,包括一个正方形和一个三角形。
  4. Prediction(预测)::模型使用从训练数据中学到的规则来预测测试数据的标签。在图中,模型预测了测试数据中的正方形和三角形。
  5. Evaluation(评估)::预测结果与测试数据的真实标签进行比较,以评估模型的准确性。

分类

在机器学习或者人工智能领域,有几种主要的学习方式:监督式学习、无监督式学习、强化学习

1. 监督式学习

监督式学习 是从有标签训练集中学到或建立一个模式,并根据此模式推断新的实例。通过已有的一部分输入数据与输出数据之间的对应关系,生成一个函数,将输入映射到合适的输出。

训练集由输入数据(通常是向量)和预期输出标签所组成。当函数的输出是一个连续的值时称为回归分析,当预测的内容是一个离散标签时,称为分类。

举例:高考试题是在考试前就有标准答案的,在学习和做题的过程中,可以对照答案,分析问题找出方法。学生在老师和教材的指导下学习(建立模式),在高考的时候,将考题作为输入,根据学到的模式输出结果。

2. 无监督式学习

无监督式学习是另外一种比较常用的学习方法,与监督式学习不同的是,它没有准确的样本标签数据进行训练,并不需要人力来输入标签,适用于聚类,把相似的东西聚在一起,而无须考虑这一类到底是什么。

举例:比如我们去看画展,如果我们对艺术一无所知,是很难直接区分出艺术品的流派的。但当我们浏览完所有的画作,则可以有一个大概的分类,即使不知道这些分类对应的准确绘画风格是什么,也可以把观看过的某两个作品归为一个类型。

2.5 半监督学习

顾名思义,该方法结合了有监督学习和无监督学习。该技术使用少量已标注数据和大量未标注数据来训练系统。首先,标注的数据用于部分训练机器学习算法。然后,部分训练后的算法本身会为未标注数据添加标注。此流程被称为伪标注。然后,该模型在没有明确编程的情况下,根据生成的数据组合进行重新训练。

该方法的优势在于,您不需要大量的标注数据。当处理像长文档这样的数据时,它非常方便,因为人工处理这些数据太费时了,难以阅读和标注。

3. 强化学习

强化学习是另外一种重要的机器学习方法,强调如何基于环境而行动,以取得最大化的预期利益。在这种模式下,输入的样本数据也会对模型进行反馈,不过不像监督式学习那样直接告诉正确的分类,强化学习的反馈仅仅检查模型的对错,模型会在接收到类似于奖励或者惩罚的刺激后,逐步做出调整。

相比于监督式学习,强化学习更加专注于规划,需要在探索未知领域和遵从现有知识之间找到一个合理的平衡点。

强化学习是在算法必经的多个阶段附加奖励值的方法。因此,该模型的目标是积累尽可能多的奖励积分,并实现最终目标。在过去的 10 年间,强化学习的大多实际应用都在电子游戏领域。先进的强化学习算法在经典和现代游戏中都取得了令人印象深刻的结果,往往大大超越人类的能力。

State and action

State可以理解成状态(环境状态),当我们在玩超级玛丽我们可以认为当前的状态就是下图中,超级玛丽游戏的画面,当然这样说不太严谨,我们观测的observation和state未必是相同的东西,为了方便我们理解,我们认为这张图片就是当前的状态,我们玩超级玛丽的时候观测到屏幕上的状态,就可以操纵马里奥做出相应的动作,马里奥做的动作就是action,假设马里奥会做三个动作,向左走、向右走和向上跳,这个例子里面马里奥就是agent,如果在自动驾驶的领域中汽车就是agent,总之在一个应用里面动作是谁做的谁就是agent,agent通常被翻译为智能体。

policy

下面一个概念policy记为 π函数,policy是什么意思呢就是我们观测到屏幕上这个画面的时候,你该让马里奥做什么样的action呢,是往上还是左还是右,policy的意思就是根据观测到的状态来进行决策,来控制agent运动。
  在数学上policy函数π是这样定义的,这个policy函数π是个概率密度函数:
$$
\pi(a|s)=P(A=a|S=s)
$$
观测到马里奥这张图片agent(马里奥)会做出三种动作中的一种,把这张图片输入到policy函数π它会告诉我向左的概率为0.2,向右的概率为0.1,向上跳的概率为0.7。如果你让这个policy函数自动操作它就会做一个随机抽样,以0.2的概率向左走,0.1的概率向右走,0.2的概率向上跳

reward

Agent做出一个动作,游戏就会给一个奖励,这个奖励通常需要我们来定义,奖励定义的好坏非常容易影响强化学习的结果,如何定义奖励就见人见智了,我举个例子:
  马里奥吃到一个金币奖励R=+1,如果赢了这场游戏奖励R=+10000,我们应该把打赢游戏的奖励定义的大一些,这样才能激励学到的policy打赢游戏而不是一味的吃金币,如果马里奥碰到敌人Goomba,马里奥就会死,游戏结束,这时奖励就设为R=-10000,如果这一步什么也没发生,奖励就是R=0,强化学习的目标就是使获得的奖励总和尽量要高。

状态转移

当前状态下,马里奥做一个动作,游戏就会给出一个新的状态,比如马里奥跳一下,屏幕上下一个画面就不一样了,也就是状态变了,这个过程就叫做State transition(状态转移)状态转移可以是固定的也可以是随机的,通常我们认为状态转移是随机的,如果你学过马尔科夫链状态转移的随机性应该很容易理解,状态转移的随机性是从环境里来的。环境是什么呢?在这里环境就是游戏的程序,游戏程序决定下一个状态是什么

$$ p(s^{\prime}|s,a)=P(S^{\prime}=s^{\prime}|S=s,A=a) $$

这是一个条件概率密度函数,意思是如果观测到当前的状态s以及动作a,p函数输出s’的概率,我举的这个例子里,马里奥跳到上面,Goomba往左的概率为0.8,往右为0.2,但是我们不知道这个状态转移函数,我知道Goomba可能往左也可能往右,但是我不确定它往左或者往右的概率有多大,这个概率转移函数只有环境自己知道,我们玩家是不知道的。

agent与环境交互

agent是马里奥,状态St是环境告诉我们的,在超级玛丽的例子里面,我们可以把当前屏幕上显示的图片看做状态St,agent看到状态St之后要做出一个动作at,动作可以是向左走、向右走和向上跳,agent做出动作at之后环境会更新状态St+1,同时环境还会给agent一个奖励rt,
要是吃到金币奖励是正的,要是赢了游戏奖励就是一个很大的正数,要是马里奥over了奖励就是一个很大的负数。

机器学习常用算法

监督学习算法

  1. 线性回归(Linear Regression):用于预测连续值。
  2. 逻辑回归(Logistic Regression):用于分类问题,尽管名字中有“回归”,它实际上是一种分类算法。
  3. 支持向量机(Support Vector Machines, SVM):用于分类和回归分析。
  4. 决策树(Decision Trees):通过一系列的判断规则来进行分类或回归。
  5. 随机森林(Random Forests):由多个决策树组成,用于分类和回归。
  6. 梯度提升决策树(Gradient Boosting Decision Trees, GBDT):例如 XGBoost, LightGBM,用于分类和回归。
  7. K-最近邻(K-Nearest Neighbors, KNN):根据最近的“K”个训练样本的投票来进行分类或回归。
  8. 朴素贝叶斯(Naive Bayes):基于贝叶斯定理,假设特征之间相互独立。
  9. 神经网络(Neural Networks):模仿人脑的处理方式,常用于深度学习。

无监督学习算法

  1. K-均值聚类(K-Means Clustering):将数据点分为K个簇。
  2. 层次聚类(Hierarchical Clustering):构建一个簇的层次树。
  3. 主成分分析(Principal Component Analysis, PCA):用于降维,通过提取最重要的特征来减少数据集的维度。
  4. 自编码器(Autoencoders):神经网络的一种,用于数据编码和降维。
  5. DBSCAN(Density-Based Spatial Clustering of Applications with Noise):基于密度的聚类算法,可以找出任意形状的簇。

半监督学习算法

  1. 标签传播(Label Propagation):利用已标记数据的标签信息去预测未标记数据的标签。
  2. 自训练(Self-Training):使用已标记数据训练模型,然后用模型去标记未标记数据中置信度高的样本。

强化学习算法

  1. Q-Learning:值迭代算法,用于求解最优策略。
  2. SARSA(State-Action-Reward-State-Action):与Q-Learning类似,但它是一种基于策略的方法。
  3. 深度Q网络(Deep Q-Network, DQN):结合了Q-Learning和深度学习。
  4. 策略梯度方法(Policy Gradient Methods):直接优化策略而不是值函数。
  5. 演员-评论家方法(Actor-Critic Methods):结合了策略梯度和价值函数方法。

深度学习

概念

深度学习(英语:deep learning)是机器学习的分支,是一种以人工神经网路为架构,对数据进行表征学习的算法,主要关注于使用神经网络(尤其是深度神经网络)进行数据建模和分析。

“深度学习”和“神经网络”这两个术语往往会交替使用,这可能会造成混淆。因此,值得注意的是,深度学习中的“深度”仅指神经网络中层的深度。一个由超过三层(包括输入层和输出层)构成的神经网络可以被视为一个深度学习算法。只有两层或三层的神经网络只是一个基本的神经网络。

优势

自动化

可以自动执行工作流和流程,也可以不依靠人工团队来独立自主地开展工作。例如,AI 可以通过持续监控和分析网络流量来帮助自动执行信息安全的各个方面。同样,智能工厂可能使用数十种不同类型的 AI,例如机器人使用计算机视觉在工厂车间移动或检查产品是否存在缺陷、创建数字孪生体,或使用实时分析来衡量效率和产量。

减少人为错误

可以通过每次都遵循相同流程的自动化功能和算法来消除数据处理、分析、制造装配和其他任务中的人为错误。

消除重复任务

可用于执行重复任务,从而让人力资源能够空出手来解决影响较大的问题。AI 可用于自动执行流程,例如验证文档、转写电话或回答“你们几点关门?”之类的简单客户问题。机器人通常用于代替人类执行“枯燥、肮脏或危险”的任务。

快速准确

与人类相比,深度学习可以更快地处理更多信息,从而查找模式并发现人类可能错过的数据关系。

无限可用性

不受时段、休息需求或其他人类负担的限制。在云端运行时,可以“始终开启”,从而持续处理分配的任务。

应用和使用场景

语音识别

自动将语音转换为文字。

图像识别

识别图片的各个方面并将其分类。

翻译

将书面或语音内容从一种语言翻译成另一种语言。

预测性建模

挖掘数据,以高粒度预测特定结果。

数据分析

针对商业智能寻找数据中的模式和关系。

信息安全

独立自主地扫描网络以检测是否存在网络攻击和威胁。

神经元

人为什么能够思考?科学家发现,原因在于人体的神经网络,人脑中的神经网络由大量连接的神经元组成。

  1. 外部刺激通过神经末梢,转化为电信号,转导到神经细胞(又叫神经元)。
  2. 无数神经元构成神经中枢。
  3. 神经中枢综合各种信号,做出判断。
  4. 人体根据神经中枢的指令,对外部刺激做出反应。

抽象模型

  • 树突:用来接收别的神经元传递的信息,对应数学模型的输入,多个输入有不同的权重
  • 细胞核:用来处理所接收的信息,对应数学模型的sum求和+激活函数f,意味着:当信号大于一定阈值时,
  • 神经元处于激活状态。
  • 轴突:用来将信息传递给其它神经元。对应数学模型的输出。

感知器

既然思考的基础是神经元,如果能够"人造神经元"(artificial neuron),就能组成人工神经网络,模拟思考。上个世纪六十年代,提出了最早的"人造神经元"模型,叫做"感知器"(perceptron),直到今天还在用。

上图的圆圈就代表一个感知器。它接受多个输入(x1,x2,x3…),产生一个输出(output),好比神经末梢感受各种外部环境的变化,最后产生电信号。

感知器示例

为了简化模型,我们约定每种输入只有两种可能:1 或 0。如果所有输入都是1,表示各种条件都成立,输出就是1;如果所有输入都是0,表示条件都不成立,输出就是0。

城里正在举办一年一度的游戏动漫展览,小明拿不定主意,周末要不要去参观。

他决定考虑三个因素。

  1. 天气:周末是否晴天?
  2. 同伴:能否找到人一起去?
  3. 价格:门票是否可承受?

这就构成一个感知器。上面三个因素就是外部输入,最后的决定就是感知器的输出。如果三个因素都是 Yes(使用1表示),输出就是1(去参观);如果都是 No(使用0表示),输出就是0(不去参观)。

权重和阈值

如果某些因素成立,另一些因素不成立,输出是什么?比如,周末是好天气,门票也不贵,但是小明找不到同伴,他还要不要去参观呢?

现实中,各种因素很少具有同等重要性:某些因素是决定性因素,另一些因素是次要因素。因此,可以给这些因素指定权重(weight),代表它们不同的重要性。

  • 天气:权重为8
  • 同伴:权重为4
  • 价格:权重为4

上面的权重表示,天气是决定性因素,同伴和价格都是次要因素。

如果三个因素都为1,它们乘以权重的总和就是 8 + 4 + 4 = 16。如果天气和价格因素为1,同伴因素为0,总和就变为 8 + 0 + 4 = 12。

这时,还需要指定一个阈值(threshold)。如果总和大于阈值,感知器输出1,否则输出0。假定阈值为8,那么 12 > 8,小明决定去参观。阈值的高低代表了意愿的强烈,阈值越低就表示越想去,越高就越不想去。

上面的决策过程,使用数学表达如下。

$$ {\mathrm{output}}={\left\{\begin{array}{l l}{0}&{{\mathrm{if~}}\sum_{j}w_{j}x_{j}\leq{\mathrm{threshold}}}\\ {1}&{{\mathrm{if~}}\sum_{j}w_{j}x_{j}>{\mathrm{threshold}}}\end{array}\right.} $$

上面公式中,x表示各种外部因素,w表示对应的权重。

全连接层

指的是层中的每个节点都会连接它下一层的所有节点。理论上讲,只要神经元足够多(图中绿色圈),神经网络可以逼近任意函数。

计算公式:

全连接的实质就是矩阵相乘,如下图所示:输入向量X乘以权重矩阵W,加上偏置B得到输出,所以输出向量大小等于权重矩阵的行数。
$$
Y = WX + B
$$

多全连接层

单个的感知器(全连接层)构成了一个简单的决策模型,已经可以拿来用了。真实世界中,实际的决策模型则要复杂得多,是由多个感知器组成的多层网络。

上图中,底层感知器接收外部输入,做出判断以后,再发出信号,作为上层感知器的输入,直至得到最后的结果。

注意:感知器的输出依然只有一个,但是可以发送给多个目标。

激活层

引入激活函数是为了增加神经网络的非线性,如果不用激活函数,每一层都是上一层的线性输入,这样一来,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机。引入激活函数则引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

常见激活函数

多层感知器

全连接层只能解决一些简单的线性问题,面对复杂的非线性问题束手无策,考虑到输入信号需要经过多个神经元处理后,最后得到输出,所以发展出来了多层感知器,引入了多个带有非线性激活层的隐藏层,如下图所示:

多层感知器 = 全连接层 + 激活层,多层感知器理论上可以逼近任意函数。

人工神经网络

人工神经网络(英语:artificial neural network,ANNs)又称类神经网络,简称神经网络(neural network,NNs),在机器学习和认知科学领域,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。

神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统(adaptive system),通俗地讲就是具备学习功能。

神经网络的运作过程

一个神经网络的搭建,需要满足三个条件。

  • 输入和输出
  • 权重(w)和阈值(b
  • 多层感知器的结构

最困难的部分就是确定权重(w)和阈值(b)。目前为止,这两个值都是主观给出的,但现实中很难估计它们的值,必需有一种可以找出答案方法解决这个问题。

模型更新

这种方法就是试错法。其他参数都不变,w(或b)的微小变动,记作Δw(或Δb),然后观察输出有什么变化。不断重复这个过程,直至得到对应最精确输出的那组wb,就是我们要的值。这个过程称为模型的训练。

神经网络的运作过程如下。

  1. 确定输入和输出
  2. 找到一种或多种算法,可以从输入得到输出
  3. 找到一组已知答案的数据集,用来训练模型,估算wb
  4. 一旦新的数据产生,输入模型,就可以得到结果,同时对wb进行校正

损失函数

机器学习中的监督学习本质上是给定一系列训练样本 $(𝑥_𝑖,𝑦_𝑖)$,尝试学习 $𝑥→𝑦$ 的映射关系,使得给定一个 $𝑥$,即便这个$𝑥$ 不在训练样本中,也能够输出 $\hat{𝑦}$,尽量与真实的 $𝑦$ 接近。损失函数是用来估量模型的输出 $\hat{𝑦}$ 与**真实值 **$𝑦$ 之间的差距,给模型的优化指引方向。

均方差损失

$$ J_{M S E}=\frac{1}{N} \sum_{i=1}^N\left(y_i-\hat{y}_i\right)^2 $$

平均绝对误差损失

$$
J_{M A E}=\frac{1}{N} \sum_{i=1}^N\left|y_i-\hat{y}_i\right|
$$

交叉熵损失

$$
N L L(x, y)=J_{C E}=-\sum_{i=1}^N y_i \log \left(\hat{y}_i\right)+\left(1-y_i\right) \log \left(1-\hat{y}_i\right)
$$

反向传播

从左向右进行计算”是一种正方向上的传播,简称为正向传播(forward propagation)。正向传播是从计算图出发点到结束点的传播。既然有正向传播这个名称,当然也可以考虑反向(从图上看的话,就是从右向左)的传播。实际上,这种传播称为反向传播(backward propagation)。

计算图

复合函数的计算图式求导

复合函数是由多个函数构成的函数。比如,函数 $z = (x + y)^2$ 是由下面两个函数式子组成的:
$$
\begin{array}{l}
z = t^2\
t=x+y
\end{array}
$$
复合函数的求导,遵循链式法则,规则是这样:如果某个函数是复合函数,则其导数可以用构成复合函数的各个函数的导数的乘积表示,例如上面公式对x的导数就可以由以下公式推导得出:
$$
{\frac{\partial z}{\partial x}}={\frac{\partial z}{\partial t}}{\frac{\partial t}{\partial x}}=2t.1=2(x+y)
$$

可见,把复合函数分解为几个小的子函数,通过求子函数的导数,然后把它们乘起来,这样大大降低了求导数的难度

反向传播示例

复合函数求导,在神经网络中用的多场合是激活函数和损失函数,这里我们以 激活函数 $sigmoid$ 为例说明,$ sigmoid$ 函数由以下公式表示:
$$
y={\frac{1}{1+e x p(-x)}}
$$
我们可以把 $x$ 理解为神经网络里的信号,信号通过这个计算图最终输出 $y$,这是信号的正向传

按照函数内进行的操作单元分解后,计算图表示如下:

第一步

先看一下反向的信号源头,一般来说在神经网络我们优化的都是损失函数 $Loss$,所以一般从损失函数对输出求导,作为信号起始点,标记为 $\frac{\partial L}{\partial y} $ ,这是一个信号量。首先看这个信号通过 “/” 变成什么?其实,“/”节点表示 $y = \frac {1}{x}$ ,它的导数:

$$ \frac{\partial y}{\partial x}=-\frac{1}{x^2}=-y^2 $$ 所以经过"/"后,信号为: $$ -\frac{\partial y}{\partial x}y^2 $$

第二步

“+”节点将上游的值原封不动地传给下游。计算图如下所示:

第三步

“exp”节点表示 $y = exp(x)$,它的导数由下式表示:
$$
\frac{\partial y}{\partial x}=exp(x)
$$
上游的值乘以正向传播时的输出(这个例子中是exp(−x))后,再传给下游。

第四步

“×”节点将正向传播时的值翻转后做乘法运算。因此,这里要乘以−1。

最终反向传播的输出:
$$
\frac{\partial y}{\partial x}y^2\exp (-x)
$$
$sigmoid$

神经网络训练

MNIST 示例

MNIST 训练 pytorch 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
import torch
import torchvision
from torch.utils.data import DataLoader
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import matplotlib.pyplot as plt

n_epochs = 3
batch_size_train = 64
batch_size_test = 1000
learning_rate = 0.01
momentum = 0.5
log_interval = 10
random_seed = 1
torch.manual_seed(random_seed)

# 获取训练集、测试集数据
train_loader = torch.utils.data.DataLoader(
torchvision.datasets.MNIST('./data/', train=True, download=True,
transform=torchvision.transforms.Compose([
torchvision.transforms.ToTensor(),
torchvision.transforms.Normalize(
(0.1307,), (0.3081,))
])),
batch_size=batch_size_train, shuffle=True)
test_loader = torch.utils.data.DataLoader(
torchvision.datasets.MNIST('./data/', train=False, download=True,
transform=torchvision.transforms.Compose([
torchvision.transforms.ToTensor(),
torchvision.transforms.Normalize(
(0.1307,), (0.3081,))
])),
batch_size=batch_size_test, shuffle=True)

examples = enumerate(test_loader)
batch_idx, (example_data, example_targets) = next(examples)
# print(example_targets)
# print(example_data.shape)

# 显示标注数据
fig = plt.figure()
for i in range(6):
plt.subplot(2, 3, i + 1)
plt.tight_layout()
plt.imshow(example_data[i][0], cmap='gray', interpolation='none')
plt.title("Ground Truth: {}".format(example_targets[i]))
plt.xticks([])
plt.yticks([])
plt.show()

# 定义网络结构
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
self.conv2_drop = nn.Dropout2d()
self.fc1 = nn.Linear(320, 50)
self.fc2 = nn.Linear(50, 10)

def forward(self, x):
x = F.relu(F.max_pool2d(self.conv1(x), 2))
x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
x = x.view(-1, 320)
x = F.relu(self.fc1(x))
x = F.dropout(x, training=self.training)
x = self.fc2(x)
return F.log_softmax(x, dim=1)

# 神经网络模型对象
network = Net()

# 网络结构可视化
try:
from torchviz import make_dot
x = torch.randn(16, 1, 28, 28).requires_grad_(True) # 定义一个网络的输入值
y = network(x) # 获取网络的预测值
MyConvNetVis = make_dot(y, params=dict(list(network.named_parameters()) + [('x', x)]))
MyConvNetVis.format = "png"
# 指定文件生成的文件夹
MyConvNetVis.directory = "data"
# 生成文件
MyConvNetVis.view()
except:
print("torchviz failed.")

# 优化器
optimizer = optim.SGD(network.parameters(), lr=learning_rate, momentum=momentum)

train_losses = []
train_counter = []
test_losses = []
test_counter = [i * len(train_loader.dataset) for i in range(n_epochs + 1)]

# 训练过程
def train(epoch):
network.train()
for batch_idx, (data, target) in enumerate(train_loader):
optimizer.zero_grad()
output = network(data)
# 计算损失
loss = F.nll_loss(output, target)
# 反向传播
loss.backward()
# 更新权重参数
optimizer.step()
# 训练信息可视化
if batch_idx % log_interval == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, batch_idx * len(data),
len(train_loader.dataset),
100. * batch_idx / len(train_loader),
loss.item()))
train_losses.append(loss.item())
train_counter.append((batch_idx * 64) + ((epoch - 1) * len(train_loader.dataset)))
torch.save(network.state_dict(), './model.pth')
torch.save(optimizer.state_dict(), './optimizer.pth')

# 测试过程
def test():
network.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
output = network(data)
test_loss += F.nll_loss(output, target, reduction='sum').item()
pred = output.data.max(1, keepdim=True)[1]
correct += pred.eq(target.data.view_as(pred)).sum()
test_loss /= len(test_loader.dataset)
test_losses.append(test_loss)
print('\nTest set: Avg. loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))


train(1)

test() # 不加这个,后面画图就会报错:x and y must be the same size
for epoch in range(1, n_epochs + 1):
train(epoch)
test()


# 训练 loss 记录
fig = plt.figure()
plt.plot(train_counter, train_losses, color='blue')
plt.scatter(test_counter, test_losses, color='red')
plt.legend(['Train Loss', 'Test Loss'], loc='upper right')
plt.xlabel('number of training examples seen')
plt.ylabel('negative log likelihood loss')


# 推断结果可视化
examples = enumerate(test_loader)
batch_idx, (example_data, example_targets) = next(examples)
with torch.no_grad():
output = network(example_data)
fig = plt.figure()
for i in range(16):
plt.subplot(4, 4, i + 1)
plt.tight_layout()
plt.imshow(example_data[i][0], cmap='gray', interpolation='none')
plt.title("Prediction: {}".format(output.data.max(1, keepdim=True)[1][i].item()))
plt.xticks([])
plt.yticks([])
plt.show()


# ----------------------------------------------------------- #

continued_network = Net()
continued_optimizer = optim.SGD(network.parameters(), lr=learning_rate, momentum=momentum)

network_state_dict = torch.load('model.pth')
continued_network.load_state_dict(network_state_dict)
optimizer_state_dict = torch.load('optimizer.pth')
continued_optimizer.load_state_dict(optimizer_state_dict)

# 注意不要注释前面的“for epoch in range(1, n_epochs + 1):”部分,
# 不然报错:x and y must be the same size
# 为什么是“4”开始呢,因为n_epochs=3,上面用了[1, n_epochs + 1)
for i in range(4, 9):
test_counter.append(i*len(train_loader.dataset))
train(i)
test()

fig = plt.figure()
plt.plot(train_counter, train_losses, color='blue')
plt.scatter(test_counter, test_losses, color='red')
plt.legend(['Train Loss', 'Test Loss'], loc='upper right')
plt.xlabel('number of training examples seen')
plt.ylabel('negative log likelihood loss')
plt.show()

网络结构

训练过程

常见的人工神经网络类型

一些最常见的人工神经网络类型包括:

前馈神经网络 (FF) 是一种最早的神经网络形式,其中数据单向流过人工神经元层,直到获得输出。在现代,大多数前馈神经网络都被视为具有多个层(以及多个“隐藏”层)的“深度前馈神经网络”。前馈神经网络通常与称为“反向传播算法”的纠错算法配对使用。简单说来,该算法从神经网络的结果开始,然后一直反向工作到开始,从而发现错误以提高神经网络的准确率。许多简单但强大的神经网络都是深度前馈神经网络。

循环神经网络 (RNN) 是一种与前馈神经网络不同的神经网络,它们通常使用时序数据或涉及序列的数据。与在网络的每个节点中使用权重的前馈神经网络不同,循环神经网络对前一层发生的事情具有“记忆”,这取决于当前层的输出。例如,执行自然语言处理时,RNN 可以“记住”一个句子中使用的其他字词。RNN 通常用于语音识别、翻译和图片说明。

长/短期记忆 (LSTM) 是一种高级形式的 RNN,它可以使用记忆来“记住”先前的层中发生的事情。RNN 和 LSTM 之间的区别在于,LSTM 可以通过使用“记忆单元”来记住几层之前发生的事情。LSTM 常用于语音识别和预测。

卷积神经网络 (CNN) 包含现代人工智能中一些最常见的神经网络。CNN 最常用于图像识别,它使用几个不同的层(一个卷积层,然后是一个 pooling 层),这些层在将图像重新组合在一起(在全连接层中)之前过滤图像的不同部分。较早的卷积层可能会寻找图像的简单特征,例如颜色和边缘,然后在附加层中寻找更复杂的特征。

生成对抗网络 (GAN) 涉及两个神经网络,它们在游戏中会相互竞争,最终提高输出的准确率。一个网络(生成器)创建另一个网络(判别器)尝试证明真假的样本。GAN 用于制作逼真的图片,甚至用于制作艺术品。

常见任务类型

深度学习常见的任务类型:

  1. 图像识别与分类:从图像中识别和分类对象。例如,识别照片中的猫和狗。
  2. 物体检测:不仅识别图像中的对象,还定位对象的位置并通常用边界框表示。
  3. 图像分割:将图像划分为多个部分或对象,通常用于医学图像分析。
  4. 语音识别:将语音转换为文本。例如,智能助手和语音到文本服务。
  5. 自然语言处理(NLP)
    • 文本分类:将文本分为不同的类别,如垃圾邮件检测。
    • 情感分析:分析文本中的情感倾向,如正面、负面或中性。
    • 机器翻译:将一种语言的文本翻译成另一种语言。
    • 文本生成:生成连贯的文本,如自动写作或诗歌创作。
  6. 推荐系统:根据用户的历史行为和偏好推荐项目,如电影或商品推荐。
  7. 强化学习:通过与环境的交互来学习达到目标的策略,常见于游戏、机器人控制等领域。
  8. 异常检测:识别不符合正常数据模式的数据点,常用于金融欺诈检测和网络入侵检测。
  9. 生成对抗网络(GANs):生成新的数据,如图像、音频和文本,其质量往往与真实数据难以区分。
  10. 时间序列预测:预测基于时间的数据点,如股票价格、天气数据等。
  11. 医疗影像分析:使用深度学习模型分析医学影像,如X光片、MRI扫描,以辅助诊断。
  12. 自动驾驶:在自动驾驶汽车中,深度学习用于感知环境、做决策和控制车辆。

视觉模型

  1. 图像分类(Image Classification)
    • 识别图像中的主要对象或场景,并将其分类到预定义的类别中。
  2. 对象检测(Object Detection)
    • 识别图像中的多个对象,并为每个对象提供边界框定位和类别标签。
  3. 语义分割(Semantic Segmentation)
    • 将图像中的每个像素分类到预定义的类别中,通常用于理解图像中每个区域的内容。
  4. 实例分割(Instance Segmentation)
    • 不仅对每个像素进行分类,还区分同一类别的不同实例,例如区分图像中的多个人。
  5. 姿态估计(Pose Estimation)
    • 估计图像中人物的身体关节位置,用于动作识别或人机交互。
  6. 人脸识别(Face Recognition)
    • 识别和验证图像中的人脸,通常用于安全和监控系统。
  7. 图像生成(Image Generation)
    • 使用生成对抗网络(GANs)等技术生成新的图像内容。
  8. 图像超分辨率(Image Super-Resolution)
    • 从低分辨率图像中恢复出高分辨率图像。
  9. 图像风格转换(Image Style Transfer)
    • 将一种图像风格应用到另一张图像上,而不改变其内容。
  10. 图像修复(Image Inpainting)
    • 修复图像中的损坏或缺失部分。
  11. 图像检索(Image Retrieval)
    • 根据内容相似性检索图像,用于搜索引擎和数据库管理系统。
  12. 视频分类(Video Classification)
    • 对视频片段进行分类,以识别动作或事件。
  13. 动作识别(Action Recognition)
    • 识别视频中的特定动作或行为。
  14. 视频对象跟踪(Object Tracking)
    • 在视频序列中跟踪特定对象的位置。

前沿技术

  1. 生成式人工智能(Generative AI)
    • 生成式AI技术在2023年取得了重大进展。这些技术通过大量数据训练,能够根据各种提示生成新的内容,如文本、图像、音乐等。
    • OpenAI发布的GPT-4模型是一个典型例子,它提供了前所未有的交互体验和内容生成能力。
  2. 大型语言模型
    • 大型语言模型如GPT-4的推出,标志着AI在自然语言处理方面的巨大进步。这些模型能够进行复杂的文本生成、翻译和情感分析。
  3. 智能体和3D生成技术
    • 智能体技术结合了大型模型,具备了强大的学习和迁移能力,推动了AI技术的应用。
    • 3D生成技术也在AI领域获得了显著发展,被广泛应用于游戏、电影和其他媒体领域。
  4. 自动驾驶技术
    • 自动驾驶技术继续发展,逐步实现从端到端的自动驾驶解决方案。
  5. 空间计算
    • 空间计算技术开始引发终端设备的变革,增强现实(AR)和虚拟现实(VR)技术得到进一步发展。
  6. AI在医疗和生物科技领域的应用
    • AI技术在医疗影像分析、疾病预测和药物研发等方面取得了显著进展。

总结框图

graph TD;
    A((AI 人工智能)) --> B((机器学习));

    subgraph 算法
        D[感知机] --> L[多层感知机];
        L --> K[神经网络];
        E[SVM];
        F[决策树];
        G[随机森林];
        H[逻辑回归];
        I[k - means];
        J[...]
    end

    B --> D;
    B --> E;
    B --> F;
    B --> G;
    B --> H;
    B --> I;
    B --> J;

    subgraph 训练类型
        S[监督学习];
        T[无监督学习];
        U[强化学习];
    end

    B --> S;
    B --> T;
    B --> U;

    subgraph 深度学习
        K[神经网络];
        P[工作原理];
        M[前向传播];
        N[反向传播];
        O[损失函数];
        K --> P;
        P --> M;
        P --> N;
        P --> O;
    end

    subgraph 网络类型
        Q[图像处理];
        R[音频处理];
        V[自然语言处理];
        W[强化学习];
        X[推荐系统];
        Y[生成对抗网络];
        Z[生成模型];
        Z2[...]
    end

    K --> Q;
    K --> R;
    K --> V;
    K --> W;
    K --> X;
    K --> Y;
    K --> Z;
    K --> Z2;

    V1[分类];
    V2[检测];
    V3[分割];

    Q --> V1;
    Q --> V2;
    Q --> V3;

    E1[机器人控制];
    W --> E1;

参考资料



文章链接:
https://www.zywvvd.com/notes/study/deep-learning/ai-tutorial/ai-tutorial/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

初识人工智能
https://www.zywvvd.com/notes/study/deep-learning/ai-tutorial/ai-tutorial/
作者
Yiwei Zhang
发布于
2025年1月10日
许可协议