深度学习与计算机视觉教程(11) | 循环神经网络及视觉应用(CV通关指南·完结)

深度学习与计算机视觉教程:斯坦福CS231n · 全套笔记 本篇内容是组织的系列教程入口,本教程依托于斯坦福Stanford出品的【】方向专业课程,根据课程视频内容与课程笔记,结合补充资料,针对深度学习与计算机视觉方向的主题做了全面梳理与制作,希望给大家提供专业细致而直观易懂的学习教程。等主题。 阅读详情

ShowMeAI研究中心


Recurrent Neural Networks; 深度学习与计算机视觉; Stanford CS231n

本系列为 斯坦福CS231n 《深度学习与计算机视觉(Deep Learning for Computer Vision)》的全套学习笔记,对应的课程视频可以在 这里 查看。更多资料获取方式见文末。


本篇重点

  • RNN的概念与多种形式
  • 语言模型
  • 图像标注、视觉问答、注意力模型
  • RNN梯度流

1.RNN的概念与多种形式

关于RNN的详细知识也可以对比阅读ShowMeAI的以下内容

1.1 形式

普通的神经网络会有1个固定维度的输入(如1张图片、1个向量),经过一系列隐层计算得到1个固定的输出(如不同类别的得分/概率向量)。我们今天提到的循环神经网络(Recurrent Neural Networks)是一种特殊的神经网络,可以对序列数据做很好的建模,RNN很灵活,可以实现输入和输出的不同类型,如下图所示:

RNN; 多种形式

1) 1对1

这种情况,输入输出都是固定的。

2) 1对多

这种情况,输入固定尺寸,比如1张图片;输出是可变长度的序列,比如1段描述文本。文本的单词数可能就会随图片不同而不同,因此输出值的长度需要是一个变量。 (「图片描述/看图说话」image captioning)

3) 多对1

这种情况,输入的尺寸是变化的,输出是固定的。如情感分类任务,输入的一段长度可变的文本序列,得到一个文字情感属性的类别;再比如可以输入时间长度不同的视频,然后判断视频中的活动(固定)。

4) 多对多

这种情况,输入输出的尺寸都是可变的,如机器翻译任务,英文翻译成中文。输入输出的文本长度都是可变的,并且两者长度不要求相同。

5) 多对多(一一对应)

这种情况,输入是可变序列,输出是针对输入的每个元素做出判断。如帧级别视频分类任务,输入是帧数可变的视频,输出对每一帧进行决策。

即使是输入输出尺寸都是固定的情形也可以使用循环神经网络 RNN。

  • 比如1张写满数字的固定尺寸的图片,想要识别上面的数字,可以是经过一系列的观察,观察图片的不同部分,然后做出决策;
  • 再比如生成一张固定尺寸的图片,上面写满了数字,也可以经过一系列的步骤,一次只能生成一部分。

1.2 概念

如下图所示,RNN有一个反复出现的小循环核心单元,输入 x x x 给 RNN,计算得到内部隐状态 hidden state,且其会在每次读取新的输入时进行更新。当模型下一次读取输入时,内部隐状态会将结果反馈给模型。

RNN; 小循环核心单元

通常,我们想让 RNN 在每一个时间步都给出输出,是这样的模式:

  • 读取输入 → 更新隐状态 → 基于隐状态计算得到输出。

RNN; 小循环核心单元

由于输入是一系列 x x x 向量,在每一个时刻绿色的 RNN 部分可以使用循环公式来表示:

h t = f W ( h t − 1 , x t h_t=f_W(h_{t-1}, x_t ht​=fW​(ht−1​,xt​

其中, x t x_t xt​ 是某一时刻输入的向量, h t − 1 h_{t-1} ht−1​ 是该时刻之前的隐状态, f W f_W fW​ 是参数 W W W 的函数, h t h_t ht​ 是更新后的隐状态。这样的结构不断循环。

如果想要在每一个时间步骤得到一个输出,那么可以把更新后的隐状态 h t h_t ht​ 作为输入,经过全连接网络,得到决策。注意: f W f_W fW​ 在每一个时间步都是相同的。

下面是一个最简单的例子,“Vanilla RNN”:

h t = t a n h ( W h h h t − 1 , W x h x t ) h_t=tanh(W_{hh}h_{t-1}, W_{xh}x_t) ht​=tanh(Whh​ht−1​,Wxh​xt​)

y t = W h y h t y_t=W_{hy}h_t yt​=Why​ht​

旧状态和输入 x x x 都是与权重矩阵相乘再求和经过非线性函数 t a n h ( ) tanh() tanh(),输出也是新状态与权重矩阵相乘。每个隐状态都只有一个唯一的 h h h 向量。

1.3 计算图

1) 多对多(xy一一对应)

这里的多对多指的是输入 x x x 和输出 y y y 都是序列,且在时间步上有一一对应关系。如下是一个多对多的计算图:

RNN 计算图; 多对多 many to many

初始状态为 h 0 h_0 h0​,在时间步 t = 1 t=1 t=1 时刻有输入 x 1 x_1 x1​,将 h 0 h_0 h0​、 x 1 x_1 x1​ 带入参数函数 f f f 得到 h 1 h_1 h1​ 更新隐状态作为下一个时刻的状态,这样以此类推得到 x t x_t xt​ 时刻的隐状态 h t h_t ht​。

计算 h t h_t ht​ 的每一步都使用的相同的参数 W W W ,参数函数 f f f 也是完全相同的。这样在反向传播计算梯度时,需要将每一个时刻的梯度累加起来得到最终 W W W 的梯度。

除了更新隐状态,如果每一个时刻都想得到一个输出,可以直接将 h t h_t ht​ 经过计算(比如softmax)得到 y t y_t yt​ ,如果对于输入 x x x 的每一个时刻都对应一个真实标签的话,在计算出 y t y_t yt​ 的同时可以得到每一步的损失 L t L_t Lt​ ,最终的损失也是所有的 L t L_t Lt​ 加起来。

2) 多对一

典型的应用之一是情感分析任务,根据最后一个隐状态得到输出。模型经过迭代,在最后一个隐状态包含了之前所有的信息。

RNN 计算图; 多对一 many to one

3) 一对多

一对多的情形会接受固定长度的输入项,输出不定长的输出项,这个固定长度的输入项会用来初始化初始隐状态,然后 RNN 会对输出的单元逐个处理,最终会得到不定长的输出序列,输出的每个元素都得以展现。

RNN 计算图; 一对多 one to many

4) 多对多

输入输出都是不定长序列的情形,典型应用如机器翻译任务,可以看作是多对一与一对多的组合。首先输入一个不定长的 x x x,将这个序列编码成一个单独的向量,然后作为输入,输入到一对多的模型中,得到输出序列,可能是用另一种语言表述的相同意思的句子。

然后对这个不定长的输出,每一个时间步都会做出预测,比如接下来使用什么词。想象一下整个训练过程和计算图的展开,对输出序列的损失求和,然后像之前一样反向传播。

RNN 计算图; 多对多 many to many

2.语言模型

关于语言模型的详细知识也可以对比阅读ShowMeAI的以下内容

在语言模型(Language Model)问题中,我们让模型读取大量语料语句,让神经网络在一定程度上学会字词的组合规律并能生成自然语言。

举个字符层面上的例子(即对语料中的内容以字符粒度进行学习),比如网络会读取一串字符序列,然后模型需要预测这个字符流的下一个字符是什么。我们有一个很小的字符表 [h, e, l, o] 包含所有字母,以及有一个训练序列 hello ,使用循环公式:

h t = t a n h ( W h h h t − 1 , W x h x t ) h_t=tanh(W_{hh}h_{t-1}, W_{xh}x_t) ht​=tanh(Whh​ht−1​,Wxh​xt​)

在语言模型的训练阶段,我们将训练序列作为输入项,每一个时间步的输入都是一个字符,首先需要做的是在神经网络中表示这个单词。

语言模型; 训练阶段

我们在这里使用长为4的独热向量来表示每个字符(只有字符对应的位置是 1 1 1,其他位置为 0 0 0)。比如 h 可以用向量 [ 1000 ] [1 0 0 0] [1000] 表示,l 使用 [ 0010 ] [0 0 1 0] [0010] 表示。现在在第一个时间步中,网络会接收输入 h,进入第一个RNN单元,然后得到输出 y 1 y_1 y1​,作为对接下来的字符的一个预测,也就是网络认为的接下来应该输入的字符。

由于第一个输入的是 h,所以接下来输入的应该是 e,但是模型只是在做预测,如下图所示,模型可能认为接下来要输入的是 o。在这种错误预测下,我们可以基于 softmax 计算损失来度量我们对预测结果的不满意程度。

在下一个时间步,我们会输入 e,利用这个输入和之前的隐状态计算出新的隐状态,然后利用新的隐状态对接下来的字符进行预测,我们希望下一个字符是 l,但这里模型可能也预测错了,这里又可以计算损失。这样经过不断的训练,模型就会学会如何根据当前的输入预测接下来的输入。

在语言模型测试阶段,我们想用训练好的模型测试样本或者生成新的文本(类似于训练时使用的文本)。

语言模型; 测试阶段

方法是输入文本的前缀来测试模型,上述例子中的前缀是 h,现在在RNN的第一步输入 h,它会产生基于词库所有字母得分的一个 softmax 概率分布,然后使用这个概率分布预测接下来的输出(这个过程叫做sample/采样),如果我们足够幸运得到了字符 e,然后把这个得到的 e 重新写成 01 01 01 向量的形式反馈给模型,作为下一个时间步的输入,以此类推。

2.1 截断反向传播(Truncated Backpropagation )

在前向传播中需要遍历整个序列累加计算损失,在反向传播中也需要遍历整个序列来计算梯度。我们可以想象一下,如果我们的语料库非常大(例如维基百科中所有文本),那么时间花费以及内存占用都是巨大的,如下图所示。

语言模型; 截断反向传播

实际应用中,通常使用沿时间的截断反向传播(Truncated Backpropagation),这样输入的序列可以接近无穷。

前向传播时不再使用整个序列计算损失,而是使用序列的一个块,比如 100 个时间步,计算出损失值,然后反向传播计算梯度。然后基于第 2 批数据再次计算和更新。

如上的过程循环操作,「截断」使得开销大大减小。

语言模型; 截断反向传播

这个过程的完整实现代码:点击这里

2.2 RNN语言模型应用

  • 使用莎士比亚的文集对语言模型进行训练,然后生成新的文本。结果可以生成莎士比亚风格的文章(当然,结果不是完美的,其中有些部分有错误),如下图所示

语言模型; RNN 语言模型应用

  • 使用拓扑学教材,可以自动生成一些定理、公式甚至可以画图,虽然都没有意义,但可以学会这些结构。

语言模型; RNN 语言模型应用

  • 使用 linux 源码进行训练。可以生成 C 代码,有缩进有变量声明甚至会写注释等等,看起来非常像 C 代码(当然代码逻辑不一定正常,编译会有很多错误)。

语言模型; RNN 语言模型应用

2.3 RNN语言模型解释

在 RNN 中有隐藏向量,每一步都会更新,我们在这些隐藏向量中寻找可以解释的单元。

比如在语言模型训练中观察隐向量中的某一个元素值,元素值会随着每一个时间步进行改变。大多数的元素值变化都是杂乱无章的,似乎在进行一些低级的语言建模。但是有一些元素却有特殊的表现:

  • 蓝色位置数值低,红色位置数值高
  • 比如某些元素遇到引号后,元素值会变得很低,然后一直保持很低直到下一个引号处被激活,元素值变大,然后保持到下一个引号再变低。所以有可能是检测引号的神经元

语言模型; RNN 语言模型解释

  • 还有某些神经元在统计回车符前的字符数量,即字符有多少时会自动换行。某一行开始处元素的值很低,然后慢慢增大,达到一定值后自动变成0,然后文本换行。

语言模型; RNN 语言模型解释

  • 在训练代码的例子中,有些神经元似乎在判断是否在 if 语句,是否在注释内,以及表示不同的缩进层级。

语言模型; RNN 语言模型解释

上述细节内容可以看出,在训练文本的过程中,RNN 学到一些文本的结构。(虽然这些已经不是计算机视觉的内容了)

3.看图说话、视觉问答、注意力模型

之前提过很多次 图片描述/看图说话(Image Captioning),即训练一个模型,输入一张图片,然后得到它的自然语言语义描述。这里输出的结果文本可能长度不同,单词字符数不同,这个任务天生适合RNN模型建模。

如下图的一个例子,图像标注模型训练阶段一般都先通过卷积神经网络处理图像生成图像向量(用其作为图像内容的表征),然后输入到RNN语言模型的第一个时间步中,RNN 会计算调整隐状态,进而基于softmax 得到结果并计算损失,后续语言模型在每个时间步都生成1个组成描述文本的单词。

看图说话 ; image captioning 图像标注训练阶段

测试阶段/推理阶段和之前字符级的语言模型类似。

  • 我们把测试图像输入到卷积神经网络,通过 CNN 得到模型最后1个全连接层之前的1个图像向量,作为整张图像的内容表征。
  • 之后会给语言模型输入一个开始标志,告诉模型开始生成以这个图像为条件的文本。不同于以往的隐状态公式,在这个任务中我们会把图像信息输入到每个时间步用于更新隐状态:

h = t a n h ( W x h ∗ x + W h h ∗ h + W i h ∗ v ) h = tanh(Wxh \ast x + Whh \ast h + Wih \ast v) h=tanh(Wxh∗x+Whh∗h+Wih∗v)

  • 现在就可以根据图像的内容生成一个词汇表(有很多词汇)中所有单词的一个 softmax 得分概率分布,sample/取样之后作为下一个时间步的输入。
  • 直到取样到「结束符号」整个预测过程结束,文本也生成完毕。

看图说话; 图像描述测试阶段

这些训练后的模型在测试时对和训练集类似的片会表现的很好,对和训练集差距大的图片可能变现不佳,比如对一些没见过的物体进行误判,以及分不清扔球还是接球等。

3.1 基于注意力的「看图说话」模型

下面我们来看看基于「注意力机制」的 图片描述/看图说话 模型,这个模型包含的 RNN 在生成单词时,会将注意力放在图像不同的部分。

在这个模型中,CNN处理图像后,不再返回一个单独的向量,而是得到图像不同位置的特征向量,比如 L L L 个位置,每个位置的特征有 D D D 维,最终返回的CNN结果数据是一个 L × D L \times D L×D 的特征图。(想象CNN的中间层得到的特征图)

这样在 RNN 的每一个时间步,除了得到词汇表的采样,还会得到基于图片位置的分布,它代表了 RNN 想要观察图像的哪个部分。这种位置分布,就是 RNN 模型应该观察图像哪个位置的「注意力」。

在第1个隐状态会计算基于图片位置的分布 a 1 a_1 a1​,这个分布会返回到图像特征图 L × D L \times D L×D,给得出一个单一的具有统计性质的 D D D 维特征向量,即把注意力集中在图像的一部分。这个特征向量会作为下一个时间步的额外输入,另一个输入是单词。然后会得到两个输出,一个是基于词汇的分布,一个是基于位置的分布。这个过程会一直持续下去,每个步骤都有两个输入两个输出。

整个过程如下图所示:

看图说话; 基于注意力的看图说话模型

上图 z z z 的计算公式可以是:

z = ∑ i = 1 L p i v i z = \sum_{i=1}^L {p_iv_i} z=i=1∑L​pi​vi​

p i p_i pi​ 就是基于位置的分布, v i v_i vi​ 就是 L L L 个特征向量中的一个,最后得到一个统计向量 $ z$。

这种结合所有特征的分布方式称为软注意力(Soft attention),与之对应的是硬注意力(Hard attention)。

硬注意力每次只产生一个单独的特征向量,不是所有特征的组合,但它反向传播比较复杂,因为(区域)选择的过程本身不是一个可微的函数。

看图说话; 软注意力与硬注意力

这样模型会自己学习每一个时间步应该主要把注意力集中在图片的什么位置得到什么词汇,效果通常也很好。如下图所示:

看图说话; 模型结果

这个结构的模型也可以用于其他任务,比如视觉问答(Visual Question Answering)。

视觉问答; Visual Question Answering

在视觉问答任务中,会有两个输入,一个是图像,一个是关于图像的用自然语言描述的问题。模型从一些答案中选择一个正确的。

这是一个多对一模型,我们需要将问题作为序列输入,针对序列的每一个元素建立 RNN,可以将问题概括成一个向量。然后把图像也概括成一个向量,现在将两个向量结合通过 RNN 编程预测答案。结合方式可以是直接连接起来也可以是进行复杂的运算。

4.RNN梯度流

4.1 多层RNN(Multilayer RNNs)

我们之前看到的朴素RNN,隐状态只有1层,在「多层RNN」中隐状态有3层。一次运行得到 RNN 第1个隐状态的序列,然后作为第2个隐状态的输入。如下图所示:

RNN 梯度流; 多层 RNN

4.2 普通RNN梯度流

我们来看看普通RNN的梯度流,在前向传播过程中计算 h t h_t ht​ :

h t = t a n h ( W h h h t − 1 + W x h x t ) = t a n h ( ( W h h W x h ) ( h t − 1 x t ) ) = t a n h ( W ( h t − 1 x t ) ) \begin{aligned} h_t & = tanh(W_{hh}h_{t-1}+W_{xh}x_t) \\ & = tanh \bigl (\bigl (\begin{matrix}W_{hh} \\ &W_{xh} \end{matrix}\bigr)\bigl(\begin{matrix}h_{t-1}\\x_{t} \end{matrix}\bigr)\bigr) \\ & =tanh\bigl(W\bigl(\begin{matrix}h_{t-1}\\ x_{t} \end{matrix}\bigr)\bigr) \end{aligned} ht​​=tanh(Whh​ht−1​+Wxh​xt​)=tanh((Whh​​Wxh​​)(ht−1​xt​​))=tanh(W(ht−1​xt​​))​

反向传播梯度流从 h t h_t ht​ 到 h t − 1 h_{t-1} ht−1​ 需要乘 W h h T W_{hh}^T WhhT​

RNN 梯度流; LSTM 梯度流

有一个问题,在上述 RNN 训练过程中,从最后一个隐状态传到第一个隐状态,中间要乘很多次权重,如下图所示。

如果累计相乘的值频繁大于 1 1 1,就可能会梯度爆炸;如果频繁小于 1 1 1,梯度就可能会慢慢趋近 0 0 0(梯度消失)。

RNN 梯度流; LSTM 梯度流

对于梯度爆炸,一种处理方法是给梯度设置一个阈值,如果梯度的 L2 范式超过这个阈值就要减小梯度,代码如下:

grad_num = np.sum(grad * grad)
if grad_num > threshold:
    grad *= (threshold / grad_num)

对于梯度消失问题,我们可以改造 RNN 网络结构,得到更适合长距离建模的结构,如下面要展开讲解到的 LSTM 和 GRU。

4.3 LSTM(Long Short Term Memory )

关于LSTM的详细讲解也可以对比阅读ShowMeAI的 深度学习教程 | 吴恩达专项课程 · 全套笔记解读 中的文章 序列模型与 RNN 网络 中对于LSTM的讲解。

LSTM(长短期记忆)网络就是用来解决「梯度爆炸」和「梯度消失」问题的,与其在输出上限制梯度,LSTM 的网络结构更加复杂。

( i f o g ) = ( σ σ σ tanh ⁡ ) W ( h t − 1 x t ) c t = f ⊙ c t − 1 + i ⊙ g h t = o ⊙ tanh ⁡ ( c t ) \begin{aligned} \left(\begin{array}{l} i \\ f \\ o \\ g \end{array}\right) &=\left(\begin{array}{c} \sigma \\ \sigma \\ \sigma \\ \tanh \end{array}\right) W\left(\begin{array}{c} h_{t-1} \\ x_{t} \end{array}\right) \\ c_{t} &=f \odot c_{t-1}+i \odot g \\ h_{t} &=o \odot \tanh \left(c_{t}\right) \end{aligned} ⎝ ⎛​ifog​⎠ ⎞​ct​ht​​=⎝ ⎛​σσσtanh​⎠ ⎞​W(ht−1​xt​​)=f⊙ct−1​+i⊙g=o⊙tanh(ct​)​

LSTM 在每一个时间步都会维持两个隐状态:

  • h t h_t ht​ 和普通 RNN 中的一致,是 RNN 网络的隐状态;
  • 单元状态向量 c t c_t ct​ ,是保留在 LSTM 内部的隐状态,不会完全暴露到外部去。计算公式可以看出,LSTM会使用输入和之前的隐状态来更新四个组成 c t c_t ct​ 的门,然后使用 c t c_t ct​ 来更新 h t h_t ht​ .

与普通 RNN 不同的是,LSTM 不直接将权重矩阵 W W W 乘 x t x_t xt​ 和 h t − 1 h_{t-1} ht−1​ 拼接成的向量再经过 t a n h ( ) tanh() tanh() 函数得到隐状态 h t h_t ht​ 。

LSTM 中的权重矩阵计算会得到 4 个与隐状态 h h h 大小相同的向量,然后分别通过不同的非线性函数就得到了单元状态 $ c_t$ 的四个门: i , f , o , g i, f, o, g i,f,o,g

  • i i i 是输入门(Input gate) ,表示有多少内容被写到单元状态;
  • f f f 是遗忘门(Forget gate),表示对之前的单元状态的遗忘程度;
  • o o o 是输出门(Output gate) ,表示单元状态输出多少给隐状态;
  • g g g 是门值门(Gate gate ) ,控制写入到单元状态的信息。

从 c t c_t ct​ 的计算公式来看,之所采用不同的非线性函数,可以这么理解:

  • f f f 是对之前的单元状态的遗忘,如果是 0 0 0 全部遗忘,如果是 1 1 1 就全部保留,那个圆圈加点的符号表示逐元素相乘;
  • i i i 和 g g g 共同控制写入到单元状态向量的信息, i i i 在 0 ∼ 1 0 \sim1 0∼1 之间, g g g 在 − 1 -1 −1 到 1 1 1 之间,这样每个时间步,单元状态向量的每个元素最大自增 1 1 1 或最小自减 1 1 1。
  • 这样 c t c_t ct​ 可以看成是对 [ − 1 1 ] [-1 \quad 1] [−11] 的按时间步计数。然后 c t c_t ct​ 通过 t a n h ( ) tanh() tanh() 将这个计数压缩到 [ 0 1 ] [0 \quad 1] [01] 范围,然后 o o o 来控制将多少单元状态的信息输出给隐状态 h t h_t ht​ 。

RNN 梯度流; LSTM

LSTM梯度流

如下图所示,我们用灰色的线表示 LSTM 前向传播,完全按照公式来的,圆圈加点运算符表示两个向量逐元素相乘,不是矩阵的乘法。这样从 c t c_t ct​ 到 c t − 1 c_{t-1} ct−1​ 的反向传播过程,只会与 f f f 进行逐元素相乘,与乘 W W W 相比要简单很多。

LSTM不同的时间步 f f f 的值都不同,不像普通 RNN 每次都乘相同的 W W W,这样就一定程度避免梯度爆炸或锐减。而且 f f f 的值也是在 [ 0 , 1 ] [0, 1] [0,1] 性质非常好。

RNN 梯度流; LSTM 梯度流

当多个单元连起来的时候,就会为梯度在单元状态间流动提供了一条高速公路(这种形式与残差网络类似)。

RNN 梯度流; LSTM 梯度流

4.4 GRU(Gated Recurrent Unit)

关于LSTM的详细讲解也可以对比阅读ShowMeAI的深度学习教程 | 吴恩达专项课程 · 全套笔记解读中的文章序列模型与RNN网络中对于GRU的讲解。

另一个改进普通RNN的方法得到「门循环单元(GRU)」模型,它总体和LSTM相似,也是应用了这种逐元素相乘与加法结合的形式,这样梯度也能高速流动。

r t = σ ( W x r x t + W h r h t − 1 + b r ) z t = σ ( W x z x t + W h z h t − 1 + b z ) h ~ t = tanh ⁡ ( W x h x t + W h h ( r t ⊙ h t − 1 ) + b h ) h t = z t ⊙ h t − 1 + ( 1 − z t ) ⊙ h ~ t \begin{aligned} r_{t} &=\sigma\left(W_{x r} x_{t}+W_{h r} h_{t-1}+b_{r}\right) \\ z_{t} &=\sigma\left(W_{x z} x_{t}+W_{h z} h_{t-1}+b_{z}\right) \\ \tilde{h}_{t} &=\tanh \left(W_{x h} x_{t}+W_{h h}\left(r_{t} \odot h_{t-1}\right)+b_{h}\right) \\ h_{t} &=z_{t} \odot h_{t-1}+\left(1-z_{t}\right) \odot \tilde{h}_{t} \end{aligned} rt​zt​h~t​ht​​=σ(Wxr​xt​+Whr​ht−1​+br​)=σ(Wxz​xt​+Whz​ht−1​+bz​)=tanh(Wxh​xt​+Whh​(rt​⊙ht−1​)+bh​)=zt​⊙ht−1​+(1−zt​)⊙h~t​​

5.推荐学习

可以点击 B站 查看视频的【双语字幕】版本

【字幕+资料下载】斯坦福CS231n | 面向视觉识别的卷积神经网络 (2017·全16讲)

6.要点总结

  • RNN 是一种输入输出都很灵活的网络结构;
  • Vanilla RNNs 很简单,但是效果不好;比较普遍的是使用 LSTM 和 GRU,能有效的改善梯度流;
  • RNN 反向传播梯度爆炸可以给梯度设置阈值,而梯度锐减可以使用复杂的网络,比如 LSTM;
  • RNN 的应用:图像标注、视觉问答,都是将 CNN 与 RNN 结合起来;
  • 理解语言模型与注意力模型;

ShowMeAI 斯坦福 CS231n 全套解读

ShowMeAI 系列教程推荐

showmeai用知识加速每一次技术成长

深度学习知识点总结(持续更新中) 神经网络是深度学习的基础。它由许多层组成,每层包含许多神经元。每个神经元接收来自上一层的输入,并产生一个输出,该输出作为下一层的输入。神经网络通过反向传播算法来学习,并通过权重和偏差来调整每个神经元的输出。 阅读详情

相关推荐

CS231n计算机视觉课程:从零到精通的深度学习实践指南

如果你正在寻找一门真正能带你从零基础入门,并最终掌握计算机视觉核心能力的课程,那么斯坦福大学李飞飞教授主讲的CS231n《面向视觉识别的卷积神经网络》课程,几乎是你无法绕开的必学经典。但问题来了:这门课程内容庞大、涉及数学和编程基础,网上资料虽多却良莠不齐,一个新手该如何高效、系统地学习,并最终能动手实践,而不是仅仅停留在“看过”的层面? 更关键的是,网络上充斥着“斯坦福2026最新版李飞飞亲授”这类标题,容易让人产生误解。事实上,CS231n课程的核心公开视频版本定格在2017年,其理论基石(如卷积神经网

weixin_34110749的博客 464

基于飞桨PaddlePaddle实现BigGAN生成动漫图像——为艺术创作赋能

作为学力不足、码力有余的深度学习业余玩家,笔者在工作中忙里偷闲,借助AI Studio的免费GPU继续自己对于生成对抗网络落地应用的相关研究。尽管深度学习已在工业生成中广泛应用,但作为研究重头的视觉效果极佳的GAN的图像生成,却在应用中遇到了瓶颈。适逢AI Studio组织GAN相关的复现课程,笔者投入其中获取到了BigGAN模型结构的搭建方法,在膜拜于BigGAN强大的视觉表现效果时,开始踏上将国外独立研究者预训练的动漫BigGAN转换到PaddlePaddle中进行更深入探索的道路。因为Paddle..

PaddlePaddle 3511

斯坦福CS231n:深度学习与计算机视觉系统入门指南

斯坦福CS231n,由计算机视觉领域领军人物李飞飞教授主讲,是深度学习与计算机视觉方向公认的必学经典课程。这门课程系统地讲解了从卷积神经网络基础到前沿应用的完整知识体系,包括图像分类、目标检测、语义分割、生成模型等核心内容。对于希望系统入门CV领域,或夯实深度学习理论基础的开发者、学生和研究者而言,这门课程提供了无与伦比的起点。 课程内容扎实,但学习曲线并不平缓。它要求学习者具备一定的Python编程、线性代数和微积分基础。好消息是,得益于开源社区的贡献,现在有非常完善的中文学习资料,包括带中英字幕的课程视

weixin_34292402的博客 404

【深度学习】详解 ViLT

【深度学习】详解 ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision

闻韶 6273

必看论文:计算机视觉助力医学影像诊断的创新技术与案例分析

必看论文:计算机视觉助力医学影像诊断的创新技术与案例分析 ,人工智能,计算机视觉,大模型,AI,本文聚焦计算机视觉助力医学影像诊断,阐述了核心技术如预处理、特征提取、深度学习应用等,分析了在肺部、脑部、眼部等疾病诊断中的案例。还探讨了面临的挑战,如数据、模型可解释性等,以及未来趋势,包括多模态融合等。同时涉及技术发展、应用成效、教育培训、难题突破、不同机构应用差异及国际合作与标准化等内容,展现了该技术在医疗领域的重要作用与发展全貌。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 9万+

LangChain + PlayWright实战:5分钟搞定网页自动化测试(附完整代码)

本文详细介绍了如何利用LangChain与PlayWright构建智能网页自动化测试系统。通过环境配置、核心架构设计、实战Agent构建及性能优化等步骤,开发者可以快速实现高效的Web操作自动化,提升测试效率。文章还提供了完整代码示例和典型问题解决方案。

weixin_27791839的博客 242

sigmoid、 tanh、 tanh、 tanh比较

由上篇文章,我们知道逻辑回归是怎么过渡到神经网络的了 总的来说就一句话——多个逻辑回归模型,前后堆积形成了神经网络! 我引用吴承恩中的一张图,稍微的回顾以下这个过程 对于这张图,它的过程是这样的: 输入1个样本(含3个特征),分别到4个逻辑回归中(中间那一列的4个圈圈) 对于样本的输入,逻辑回归模型分别通过y = wx + b后将y值通过Sigmoid函数映射到01区间内,那么这里就有4个输出的01概率 对于上面输出的4个概率再输入到最后一个逻辑回归模型中,再通过y = wx + b后将y值通过Sigm

YJ语 1495

从零配置EtherCAT IGH主站:手把手教你处理内核版本与实时性优化的那些坑

本文详细指导如何从零配置EtherCAT IGH主站,涵盖内核版本适配、实时性优化及常见问题解决方案。通过精确匹配内核头文件、应用实时补丁和优化网卡驱动,帮助开发者实现微秒级响应,适用于工业自动化、机器人控制等高精度场景。

weixin_30790841的博客 384

​​激活函数:Sigmod&tanh&Softplus&Relu详解

什么是激活函数? 激活函数(Activation functions)对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。 它们将非线性特性引入到我们的网络中。其主要目的是将A-NN模型中一个节点的输入信号转换成一个输出信号。该输出信号现在被用作堆叠中下一个层的输入。 如果我们不运用激活函数的话,则输出信号将仅仅是一个简单的线性函数。线性函数一个一级多项式。现如今,线性方程是很容易解决的,但是它们的复杂性有限,并且从数据中学习复杂函数映射的能力更小。 一个没有激活函数的..

tugouxp的专栏 1622

高通camera:PDAF的配置与测试

确认相关log日志都已经打开了之后,判断是在3A算法中没有应用到PDAF,可能是之前在调试AF效果的时候关闭了PDAF,打开效果文件对应的文件夹,在\kamorta_lce_S5K3P9\Scenario.Default\XML\STATS。在log中搜索af_pdaf_proc_pd_single,这个函数是pdaf算法中的,源码被封装了,这里看不到,因此只能通过log打印出来的参数来分析pd是否正确,主要参数有pd ,defocus,confidence。PDAF的配置与测试。

arvin_xiong的博客 2489

AD5700 HART芯片实战笔记:从时钟检测到数据收发,一个STM32工程师的踩坑实录

本文详细记录了STM32工程师在AD5700 HART芯片开发中的实战经验,涵盖时钟信号检测、RTS切换时序优化及HART数据解析等关键问题。通过硬件设计检查、定时器配置优化和大小端转换方案对比,解决了工业级芯片开发中的典型挑战,为嵌入式开发者提供宝贵参考。

weixin_42715608的博客 164

sigmoid函数,tanh函数,relu函数,softmax函数

sigmoid函数 数学表达式: f(z)=1/(1+e**-z) Sigmoid 函数的输出范围是 0 到 1。由于输出值限定在 0 到 1,因此它对每个神经元的输出进行了归一化; 用于将预测概率作为输出的模型。由于概率的取值范围是 0 到 1,因此 Sigmoid 函数非常合适; 梯度平滑,避免「跳跃」的输出值; 函数是可微的。这意味着可以找到任意两个点的 sigmoid 曲线的斜率; 明确的预测,即非常接近 1 或 0。 Sigmoid 激活函数有哪些缺点? 倾向于梯度消失; 函数输出不是以 0 为

lovekobe1997的博客 2874

2024最新超详细无痛安装PyTorch,包括下载地址、环境配置与各种避坑指南

PyTorch更新很快,2024最新下载安装经验贴,包括anaconda+CUDA+cuDNN+PyTorch四部分的下载和安装。文章详细介绍了下载地址、环境配置、虚拟环境建立的问题,还温馨提示了各种闭坑指南。有需要的友友快过来康康!

qq_43596278的博客 11万+

深度学习与计算机视觉教程:斯坦福CS231n · 全套笔记解读

本教程依托于 Stanford 斯坦福大学的《CS231n:深度学习与计算机视觉》,对深度学习与计算机视觉方向的图像分类、CNN、RNN、目标检测、图像分割、生成模型等各个主题做了体系化的梳理

ShowMeAI研究中心 1万+

【密码专栏】超强进阶:PLONK VS Groth16(上)

前言 前文《天冷了,干了这碗“零知识证明”鸡汤》对「零知识证明学习」作了一个形象化的比喻:炖鸡汤。那么本系列的主要内容可以简单概括为《论高压锅炖鸡汤的一百种方法》之方法二。在学会了“清炖鸡汤”之后,不如来一口“阿胶鸡汤”补补脑细胞吧! 正如鸡汤不同风味之间各具千秋,不同的zk-SNARK方案也各有所长。zk-SNARK方案可以被分为【通用】与【非通用】zk-SNARK,PLONK与Groth16分别是其中的典型代表。通过本系列,我们将对PLONK算法内容作简要介绍,并指出PLONK和Groth16算法思路上

Hyperchain的博客 1807

SAR图像去斑(Despeckling)研究的主流开源数据集

这些数据集专门用于训练监督学习去斑模型,提供了配对的含斑SAR图像和对应的无噪声参考图像(Ground Truth)。这些数据集主要用于目标检测/识别,但包含原始SAR图像,可用于。由于缺乏真实无噪声SAR图像,许多研究采用。

VectorShift的博客 133

【 Emgu CV教程】1.1、Emgu CV 简介及使用

C#利用Emgu CV进行图像、视频处理的简单教程。

活宝的博客 1万+

uniapp - 超详细 H5 网页引入百度地图教程,附地图示例 / 获取当前设备定位的省市区、详细地址、经纬度信息 / 用户当前 IP 属地定位地理位置等等(新手小白快速上手,详细配置及使用全流程)

uniapp百度地图,uniapp百度地图ip属地定位,uniapp百度地图获取省市区详细地址经纬度等,uniapp百度地图当前用户设备定位省份市区详细所在地ip属地等详细教程示例,uniapp网页h5引入百度地图详细教程,uniapp h5网站使用百度地图详细教程,uniappH5端如何接入使用百度地图api,uniapp H5网页端百度地图获取地理位置信息,uniapp h5页面引入百度地图,uniapp h5平台百度地图获取城市信息,uniapp百度地图获取经纬度,uniapp 百度地图拿省市区用什么

🏆 前端领域优质创作者 6220

【完结】有三AI&阿里云的深度学习基础课程暂时完结,欢迎扩散学习

2021年3月份有三AI与阿里天池联合推出了深度学习系列课程, 课程内容包括人工智能与深度学习发展背景,深度学习典型应用,卷积神经网络,循环神经网络,生成对抗网络,深度学习开源框架等内容,...

hacker_long的专栏 867

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

视频教程-深度学习与PyTorch实战-深度学习

深度学习与PyTorch实战 计算机博士,专注于机器学习与计算机视觉领域,深...

weixin_34095286的博客 1365

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

UMich EECS 498-007 / 598-005 深度学习与计算机视觉:一门覆盖 CV 主流模型全发展阶段的实操自学课

本篇指南围绕本仓库「深度学习」板块中的计算机视觉方向课程 UMich EECS 498-007 / 598-005 展开,完整梳理课程的定位、前置要求、六个递进式 Assignment 与 Mini-Project 的实战内容,并给出脱离 Autograder 的自学自检方案与课程资源清单。读完你可以判断它是否适合自己、按怎样的顺序推进,以及如何仅靠开源材料把这门课完整吃透。 ## 课程概况

gitblog_01122的博客 491

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【视频课】零基础免费38课时深度学习+超60小时CV核心算法+15大Pytorch CV实践案例助你攻略CV...

计算机视觉中大大小小可以包括至少30个以上的方向,在基于深度学习的计算机视觉研究方向中,图像分类,图像分割,目标检测无疑是最基础最底层的任务,掌握好之后可以很快的迁移到其他方向,比如目标识...

hacker_long的专栏 2344

从零到精通的《动手学深度学习》全教程,附资料获取,建议收藏!

本文详细介绍沐神的《动手学深度学习》教程,涵盖11个章节从基础到进阶内容,包括各类神经网络、优化算法、CV和NLP等核心知识,理论与实践结合。

Trb701012的博客 1000

深度学习相关概念及术语总结

CV通常指的是“Computer Vision”(计算机视觉)。然而,传统的RNN模型存在梯度消失和梯度爆炸等问题,为了克服这些问题,后来出现了许多改进的RNN变体,如长短时记忆网络(LSTM)和门控循环单元(GRU)等。在学术和工业界,计算机视觉一直是一个活跃的研究领域,并且随着深度学习和大数据的发展,计算机视觉技术取得了显著的进步,为图像和视频分析提供了更准确和高效的解决方案。总的来说,LSTM的设计使其能够更好地处理和记忆序列数据中的长期依赖关系,因此在处理具有长期依赖的序列数据时具有很强的表现力。

weixin_43597208的博客 1893

[译]A guide to deep learning in healthcare 深度学习在医疗健康领域的应用概述--nature论文

本文介绍了医疗保健领域的深度学习技术,重点讨论了计算机视觉(CV)、自然语言处理(NLP)、强化学习(RL)和通用方法方面的深度学习。我们将描述这些计算技术如何影响医学的几个关键领域,并探讨如何构建端到端系统。我们对CV的讨论主要集中在医学成像上,对NLP的描述主要在电子健康记录数据等领域。同样,在机器人辅助手术的背景下也讨论了RL,同时讨论了通用方法的深度学习在基因组学的应用。

github_36597203的博客 8467
上一篇: 深度学习与计算机视觉教程(10) | 轻量化CNN架构 (SqueezeNet,ShuffleNet,MobileNet等)(CV通关指南·完结)
下一篇: 深度学习与计算机视觉教程(12) | 目标检测 (两阶段,R-CNN系列)(CV通关指南·完结)
ShowMeAI
博客等级 码龄5年 6514粉丝 672原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShowMeAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值