算法面试八股文『 模型详解篇 』

说在前面

这是本系列的第二篇博客,主要是整理了一些经典模型的原理和结构,面试有时候也会问到这些模型的细节,因此都是需要十分熟悉的。光看原理还不够,最好是能用代码试着复现,可以看看李沐老师深度学习的教材,我也有参考部分沐神的思想。

具体模型

LeNet5

LeNet5有3个卷积层,2个池化层,2个全连接层。卷积层的卷积核都为5*5,stride=1,池化层都为Max pooling,激活函数为Sigmoid,具体网络结构如下图:
图片

Input

输入图像统一归一化为28×28。

C1卷积层

经过(5×5×1)×6卷积核,stride=1, 生成featuremap为28×28×6。

S2池化层

经过(2×2)采样核,stride=2,生成featuremap为14×14×6。

C3卷积层

经过(5×5×6)×16卷积核,stride=1,生成featuremap为10×10×16。

S4池化层

经过(2×2)采样核,stride=2,生成featuremap为5×5×6。

C5卷积层

经过(5×5×16)×120卷积核,stride=1, 生成featuremap为1×1×120。

F6全连接层

输入为1×1×120,输出为1×1×84,总参数量为120×84。

Output全连接层

输入为1×1×84,输出为1×1×10,总参数量为84×10。10就是分类的类别数。

在这里插入图片描述

AlexNet

2012年,Imagenet比赛冠军—Alexnet (以第一作者Alex命名)直接刷新了ImageNet的识别率,奠定了深度学习在图像识别领域的优势地位。网络结构如下图:

图片

Input

输入图像为224×224×3。

Conv1

经过(11×11×3)×96卷积核,stride=4, (224-11)/4+2=55,生成featuremap为55×55×96。

Pool1

经过3×3的池化核,stride=2,(55-3)/2+1=27,生成featuremap为27×27×96。

Norm1

local_size=5,生成featuremap为27×27×96。

Conv2

经过(5×5×96)×256的卷积核,pad=2,group=2,(27+2×2-5)/1+1=27,生成featuremap为27×27×256。

Pool2

经过3×3的池化核,stride=2,(27-3)/2+1=13,生成featuremap为13×13×256。

Norm2

local_size=5, 生成featuremap为13×13×256。

Conv3

经过(3×3×256)×384卷积核,pad=1, (13+1×2-3)/1+1=13,生成featuremap为13×13×384。

Conv4

经过(3×3×384)×384卷积核,pad=1,(13+1×2-3)/1+1=13,生成featuremap为13×13×384。

Conv5

经过(3×3×384)×256卷积核,pad=1,(13+1×2-3)/1+1=13,生成featuremap为13×13×256。

Pool5

经过(3×3)的池化核,stride=2,(13-3)/2+1=6,生成featuremap为6×6×256。

Fc6

输入为(6×6×256)×4096全连接,生成featuremap为1×1×4096。

Dropout6

在训练的时候以1/2概率使得隐藏层的某些神经元的输出为0,这样就丢掉了一半节点的输出,BP的时候也不更新这些节点,以下Droupout同理。

Fc7

输入为1×1×4096,输出为1×1×4096,总参数量为4096×4096。

Dropout7

生成featuremap为1×1×4096。

Fc8

输入为1×1×4096,输出为1000,总参数量为4096×1000。

在这里插入图片描述

总结:

  1. AlexNet比LeNet更深,包括5个卷积层和3个全连接层;

  2. 使用ReLU激活函数,收敛很快,解决了Sigmoid在网络较深时出现的梯度弥散问题;

  3. 加入了dropout层,防止过拟合;

  4. 使用了LRN归一化层,对局部神经元的活动创建竞争机制,抑制反馈较小的神经元放大反应大的神经元,增强了模型的泛化能力;

  5. 使用裁剪、翻转等操作做数据增强,增强了模型的泛化能力;

  6. 分块训练,当年的GPU没有这么强大,Alexnet创新地将图像分为上下两块分别训练,然后用全连接层合并在一起;

  7. 总体的数据参数大概为240M。

VGGNet

VGGNet主要的贡献是利用带有很小卷积核(3×3)的网络结构对逐渐加深的网络进行评估,结果表明通过加深网络深度至16-19层可以极大地改进前人的网络结构。这些发现也是参加2014年ImageNet比赛的基础,并且在这次比赛中,分别在定位和分类跟踪任务中取得第一名和第二名。VGGNet的网络结构如下图:

图片

类型从A到E。此处只讨论VGG16,即图中的类型D。如图中所示,共有13个卷积层,3个全连接层。其全部采用3×3卷积核,步长为1,和2×2最大池化核,步长为2。

Input层

输入图片为224×224×3。

CONV3-64

经过(3×3×3)×64卷积核,生成featuremap为224×224×64。

CONV3-64

经过(3×3×64)×64卷积核,生成featuremap为224×224×64。

Max pool

经过(2×2)max pool核,生成featuremap为112×112×64。

CONV3-128。

经过(3×3×64)×128卷积核,生成featuremap为112×112×128。

CONV3-128

经过(3×3×128)×128卷积,生成featuremap为112×112×128。

Max pool

经过(2×2)maxpool,生成featuremap为56×56×128。

CONV3-256

经过(3×3×128)×256卷积核,生成featuremap为56×56×256。

CONV3-256

经过(3×3×256)×256卷积核,生成featuremap为56×56×256。

CONV3-256

经过(3×3×256)×256卷积核,生成featuremap为56×56×256。

Max pool

经过(2×2)maxpool,生成featuremap为28×28×256

CONV3-512

经过(3×3×256)×512卷积核,生成featuremap为28×28×512

CONV3-512

经过(33512)512卷积核,生成featuremap为2828*512。

CONV3-512

经过(3×3×512)×512卷积核,生成featuremap为28×28×512。

Max pool

经过(2×2)maxpool,生成featuremap为14×14×512。

CONV3-512

经过(3×3×512)×512卷积核,生成featuremap为14×14×512。

CONV3-512

经过(3×3×512)×512卷积核,生成featuremap为14×14×512。

CONV3-512

经过(3×3×512)×512卷积核,生成featuremap为14×14×512。

Max pool

经过2×2卷积,生成featuremap为7×7×512。

FC-4096

输入为7×7×512,输出为1×1×4096,总参数量为7×7×512×4096。

FC-4096

输入为1×1×4096,输出为1×1×4096,总参数量为4096×4096。

FC-1000

输入为1×1×4096,输出为1000,总参数量为4096×1000。

总结:

  1. 共包含参数约为550M;
  2. 全部使用3×3的卷积核和2×2的最大池化核;
  3. 简化了卷积神经网络的结构。

RNN

RNN实际上有两种,一种是Recurrent Neural Networks,即循环神经网络,一种是Recursive Neural Networks,即递归神经网络。循环神经网络是首先被提出的,它是一种时间上进行线性递归的神经网络,也就是我们通常所说的RNN。

递归神经网络被视为循环神经网络的推广,这是一种在结构上进行递归的神经网络,常用于自然语言处理中的序列学习,它的输入数据本质不一定是时序的,但结构却往往更加复杂,我们这里只说循环神经网络。一个RNN的结构如下:

图片

左侧就是模型的基本结构,右侧就是它在时间上进行展开的示意图。xt是时刻t的输入,相应的ht,ot分别是对应时刻t的隐藏层和输出层。

上面我们可以看出,一个RNN的输入包括了两个:一个是当前时刻输入xt,用于实时更新状态,另一个是上一时刻隐藏层的状态ht-1,用于记忆状态,而不同时刻的网络共用的是同一套参数。

RNN中常用的激活函数是tanh,所以上面的式子写成公式,就是:
h t = tanh ⁡ ( W ( x t h t − 1 ) ) \begin{equation} h_t=\tanh \left(\mathrm{W}\left(\begin{array}{c} x_t \\ h_{t-1} \end{array}\right)\right) \end{equation} ht=tanh(W(xtht1))
w就是要学习的权重。用几句代码表示RNN为:

class RNN: def step(self, x): self.h = np.tanh(np.dot(self.W_hh, self.h) + np.dot(self.W_xh, x))  # 更新隐藏层y = np.dot(self.W_hy, self.h)  # 得到输出return y

普通卷积神经网络的优化使用的是反向传播,RNN使用的还是反向传播,不过是带时序的版本,即BPFT(backpropagation through time),它与BP的原理是完全一样的,只不过计算过程与时间有关。与普通的反向传播算法一样,它重复地使用链式法则,区别在于损失函数不仅依赖于当前时刻的输出层,也依赖于下一时刻。所以参数W在更新梯度时,必须考虑当前时刻的梯度和下一时刻的梯度,传播示意图如下:

图片

LSTM

LSTM(长短时记忆网络,Long Short-Term Memory)是RNN的变种,用于处理序列数据,特别是对于长序列和处理长期依赖性非常有效。LSTM设计的目的是解决传统RNN在处理长序列时产生的梯度消失和梯度爆炸问题,通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息,而不像普通的RNN那样只有一种记忆叠加方式。用最简洁的话讲就是,网络决定要记住/忘记什么→有选择地更新单元状态值→网络决定当前状态的哪一部分可以输出。

preview

长短期记忆递归神经网络(Long short-term memory, LSTM)相比RNN多了一个状态cell state。这个cell state承载着之前所有状态的信息,每到新的时刻,就有相应的操作来决定舍弃什么旧的信息以及添加什么新的信息。这个状态与隐藏层状态h不同,在更新过程中,它的更新是缓慢的,而隐藏层状态h的更新是迅速的。LSTM的网络结构图如下,输入包括ht-1,xt,输出ht,状态为ct-1,ct。

图片

遗忘门与遗忘阶段

遗忘门决定了要从上一个状态中舍弃什么信息,它输入上一状态的输出ht-1、当前状态输入信息xt到一个Sigmoid函数中,产生一个介于0到1之间的数值,与上一个时刻的状态ct-1相乘之后来确定舍弃(保留)多少信息。0 表示“完全舍弃”,1 表示“完全保留”,这个阶段完成了对上一个节点cell state进行选择性忘记,遗忘门和它的输出公式如下:
f t = σ ( w f x t + u f h t − 1 ) \begin{equation} f_t=\sigma\left(w^f x_t+u^f h_{t-1}\right) \end{equation} ft=σ(wfxt+ufht1)

f t ∘ C t − 1 \begin{equation} f_t \circ C_{t-1} \end{equation} ftCt1

输入门与选择记忆阶段

选择记忆阶段,也就是对输入有选择性地进行“记忆”,重要的记录下来,不重要的少记一些,它决定了要往当前状态中保存什么新的信息。它输入上一状态的输出ht-1、当前输入信息xt到一个Sigmoid函数中,产生一个介于0到1之间的数值it来确定需要保留多少的新信息。“候选新信息”则通过输入上一状态的输出、当前状态输入信息和一个tanh激活函数生成。有了遗忘门和输入门之后,就得到了完整的下一时刻的状态Ct,它将用于产生下一状态的隐藏层ht,也就是当前单元的输出。输入门、候选新信息、新状态的公式分别如下:
i t = σ ( w i x t + u i h t − 1 ) \begin{equation} i_t=\sigma\left(w^i x_t+u^i h_{t-1}\right) \end{equation} it=σ(wixt+uiht1)

C t ~ = tanh ⁡ ( w C x t + u C h t − 1 ) \begin{equation} \widetilde{C_t}=\tanh \left(w^C x_t+u^C h_{t-1}\right) \end{equation} Ct =tanh(wCxt+uCht1)

C t = f t ∘ C t − 1 + C t ~ ∘ i t \begin{equation} C_t=f_t \circ C_{t-1}+\widetilde{C_t} \circ i_t \end{equation} Ct=ftCt1+Ct it

输出门与输出阶段

输出门决定了要从cell state中输出什么信息。 与之前类似,会先有一个Sigmoid函数产生一个介于0到1之间的数值Ot来确定我们需要输出多少cell state中的信息。 cell state的信息在与Ot相乘时首先会经过一个tanh层进行“激活”,得到的就是这个LSTM block的输出信息ht。输出门和输出信息的公式如下:
O t = σ ( w o x t + u o h t − 1 ) \begin{equation} O_t=\sigma\left(w^o x_t+u^o h_{t-1}\right) \end{equation} Ot=σ(woxt+uoht1)

h t = O t ∘ tanh ⁡ ( C t ) \begin{equation} h_t=O_t \circ \tanh \left(C_t\right) \end{equation} ht=Ottanh(Ct)

ResNet

ResNet即残差神经网络,引入残差学习的思想。传统的卷积网络或者全连接网络在信息传递的时候或多或少会存在信息丢失,损耗等问题,同时还有导致梯度消失或者梯度爆炸,导致很深的网络无法训练。ResNet在一定程度上解决了这个问题,通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络只需要学习输入、输出差别的那一部分,简化学习目标和难度。ResNet最大的区别在于有很多的旁路将输入直接连接到后面的层,这种结构也被称为shortcut或者skip connections,示意图如下:

图片

可以使用一个非线性变化函数来描述一个网络的输入输出,即输入为X,输出为F(x),F通常包括了卷积,激活等操作。当我们强行将一个输入添加到函数的输出的时候,虽然我们仍然可以用G(x)来描述输入输出的关系,但是这个G(x)却可以明确的拆分为F(x)和X的线性叠加。这就是skip connect的思想,将输出表述为输入和输入的一个非线性变换的线性叠加,没用新的公式,没有新的理论,只是换了一种新的表达。

正常块和残差块的对比:

在这里插入图片描述

ResNet沿用了VGG完整的3×3卷积层设计。 残差块里首先有2个有相同输出通道数的3×3卷积层。 每个卷积层后接一个批量规范化层和ReLU激活函数。 然后我们通过跨层数据通路,跳过这2个卷积运算,将输入直接加在最后的ReLU激活函数前。 这样的设计要求2个卷积层的输出与输入形状一样,从而使它们可以相加。 如果想改变通道数,就需要引入一个额外的1×1卷积层来将输入变换成需要的形状后再做相加运算。

包含以及不包含1×1卷积层的残差块:

在这里插入图片描述

ResNet的前两层跟之前介绍的GoogLeNet中的一样: 在输出通道数为64、步幅为2的7×7卷积层后,接步幅为2的3×3的最大汇聚层。 不同之处在于ResNet每个卷积层后增加了批量规范化层。GoogLeNet在后面接了4个由Inception块组成的模块。 ResNet则使用4个由残差块组成的模块,每个模块使用若干个同样输出通道数的残差块。 第一个模块的通道数同输入通道数一致。 由于之前已经使用了步幅为2的最大汇聚层,所以无须减小高和宽。 之后的每个模块在第一个残差块里将上一个模块的通道数翻倍,并将高和宽减半。

img

结束

下一篇还没想好更什么内容,目前打算更AIGC或者大模型相关的题目,或者是手推系列,但是手推挺花时间的,往后拖拖也不一定🤔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

沁恒CH32V30X学习笔记11---使用外部时钟模式2采集脉冲计数

使用外部时钟模式2采集脉冲计数 使用外部触发模式 2 能在外部时钟引脚输入的每一个上升沿或下降沿计数。将 ECE 位置位时,将使用外部时钟源模式 2。使用外部时钟源模式 2 时,ETRF 被选定为 CK_PSC。ETR 引脚经过可选的反相器(ETP),分频器(ETPS)后成为 ETRP,再经过滤波…

自动化上位机开发C#100例:如何用面向对象的方式封装雷赛运动控制卡EtherCAT总线卡(C#代码)

自动化上位机开发C#100例:雷赛运动控制卡EtherCAT总线卡C#封装类 文章目录 LTDMC.dll下载LTDMC.cs LTDMC.dll C#调用封装下载ICard.cs 运动控制卡接口Card.cs 运动控制卡抽象类CardLTDMC.cs 雷赛运动控制卡EtherCAT总线卡实现类CardList.cs 总线卡列表封装 LTDMC.dll下载 最新…

人工智能|机器学习——基于机器学习的舌苔检测

代码下载: 基于深度学习的舌苔检测毕设留档.zip资源-CSDN文库 1 研究背景 1.1.研究背景与意义 目前随着人们生活水平的不断提高,对于中医主张的理念越来越认可,对中医的需求也越来越多。在诊断中,中医通过观察人的舌头的舌质、苔…

基于STM32F407的coreJSON使用教程

目录 概述 工程建立 代码集成 函数介绍 使用示例 概述 coreJSON是FreeRTOS中的一个组件库,支持key查找的解析器,他只是一个解析器,不能生成json数据。同时严格执行 ECMA-404 JSON 标准。该库用 C 语言编写,设计符合 ISO C90…

基于Java SSM框架实现生鲜食品o2o商城系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现生鲜食品o2o商城系统演示 摘要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 生鲜食品o2o商城系统,主要的模块包括查看管理员;首页、个人中心、用户…

数学建模:BP神经网络(含python实现)

原理 BP 神经网络,也称为多层感知机(Multilayer Perceptron,MLP),是一种常见的神经网络模型,用于解决各种机器学习问题,包括分类和回归。BP 代表“反向传播”(Backpropagation&#…

领域驱动设计(Domain Driven Design)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、场景和要求二、领域模型关键词1.领域2.子域3.通用语言4.限界上下文5.领域模型6.实体和值对象7.聚合根8.领域服务9.领域事件 总结 前言 Domain Driven Desi…

备战蓝桥杯---动态规划(应用1)

话不多说,直接看题: 首先我们考虑暴力,用二维前缀和即可,复杂度为o(n^4). 其实,我们不妨枚举任意2行,枚举以这个为边界的最大矩阵。 我们把其中的每一列前缀和维护出来,相当于把一个矩阵压缩成…

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK 全部学习汇总: g_FreeRTOS: FreeRTOS学习笔记 (gitee.com) 上面是涉及到的源代码,而这次需要分析的就是78、79行的两个中断。首先,需要确认NVIC_SYSPRI2寄存器的作用。 进一…

PostgreSQL使用session_exec和file_fdw实现失败次数锁定用户策略

使用session_exec 、file_fdw以及自定义函数实现该功能。 缺陷:实测发现锁用户后,进去解锁特定用户。只能允许一次登陆,应该再次登陆的时候,触发函数,把之前的日志里的错误登陆的信息也计算到登录次数里了。而且foreig…

macOS上使用VScode编译配置C++语言开发环境

本文介绍macOS上使用VScode编译配置C语言开发环境 1.准备工作 安装C/C插件 2.配置c_cpp_properties.json文件 [⇧⌘P]打开命令模式,选择[C/Cpp: Edit Configurations(JSON)]命令,回车后会自动生成一个.vscode目录,目录下有一个c_cpp_prope…

数学在现代经济学研究中的作用

数学在现代经济学研究中的作用 The Role of Mathematics in Modern Economic Research 经济学,作为一门研究人类如何在资源有限的情况下做出选择的社会科学,历来都与数学有着紧密的联系。随着科技的发展,特别是在信息时代数据量的爆炸性增长&…

【漏洞复现】H3C 路由器多系列信息泄露漏洞

Nx01 产品简介 H3C路由器是一款高性能的路由器产品,具有稳定的性能和丰富的功能。它采用了先进的路由技术和安全机制,可以满足不同用户的需求,广泛应用于企业、运营商和数据中心等领域。 Nx02 漏洞描述 H3C路由器多系列存在信息泄露漏洞&…

林浩然与杨凌芸的Java奇遇记:Map世界的恋爱攻略

林浩然与杨凌芸的Java奇遇记:Map世界的恋爱攻略 The Java Adventure of Lin Haoran and Yang Lingyun: Love Strategy in the Map World 在一个充满代码香气的世界里,男主角林浩然,一个热衷于Java编程的程序员大侠,以其深厚的内功…

K8s进阶之路-核心概念/架构:

架构:Master/Node Master组件--主控节点{ 负责集群管理(接收用户事件转化成任务分散到node节点上)} Apiserver: 资源操作的唯一入口,提供认证、授权、API注册和发现等机制 Scheduler : 负责集群资源调度&am…

【CentOS】Linux 文件与目录管理

目录 1、目录的切换、新增和删除 (1)cd (change directory,切换目录) (2)pwd (显示目前所在的目录) (3)mkdir (make directory,建立新目录 ) (4)rmdir (…

基于SSM的疫情期间学生信息管理平台的设计与实现(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的疫情期间学生信息管理平台的设计与实现(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

CSS 实现 3D 书本展开动效

一、前言 本文将使用纯 CSS 实现一个简单的 3D 书本展开动效。 二、实现思路 实现这么一个书本动效 乍一看可能会感觉有些复杂,实际上并不难,遇到这种组合动效的需求时,我们只要将整体拆分成多个小步骤去做,就很简单了。 1. 拆…

RabbitMQ的安装与使用

RabbitMQ的安装与使用 介绍一、RabbitMQ的安装1 查找镜像2 拉取镜像3 查看镜像4 创建容器5 查看容器6 访问测试 二、RabbitMQ的使用1 创建项目2 配置文件3 队列配置文件4 消费者5 生产者6 测试 三、交换器四、普通队列Demo五、死信队列Demo1 介绍2 示例2.1 配置2.2 生产者2.3 消…

10_Java泛型

一、为什么要有泛型 1.泛型的设计背景 集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分…