继续创造,加快成长!这是我参与「日新计划 6 月更文挑战」的第7天,点击检查活动概况
- 作者:韩信子@ShowMeAI
- 教程地址:www.showmeai.tech/tutorials/3…
- 本文地址:www.showmeai.tech/article-det…
- 声明:版权一切,转载请联络平台与作者并注明出处
- 保藏ShowMeAI检查更多精彩内容
本系列为 斯坦福CS231n 《深度学习与核算机视觉(Deep Learning for Computer Vision)》的全套学习笔记,对应的课程视频能够在 这儿 检查。更多材料获取办法见文末。
本篇关键
- RNN的概念与多种方式
- 言语模型
- 图画标示、视觉问答、注意力模型
- RNN梯度流
1.RNN的概念与多种方式
关于RNN的具体常识也能够比照阅览ShowMeAI的以下内容
1.1 方式
一般的神经网络会有1个固定维度的输入(如1张图片、1个向量),经过一系列隐层核算得到1个固定的输出(如不同类其他得分/概率向量)。咱们今日说到的循环神经网络(Recurrent Neural Networks)是一种特别的神经网络,能够对序列数据做很好的建模,RNN很灵敏,能够完成输入和输出的不同类型,如下图所示:
1) 1对1
这种状况,输入输出都是固定的。
2) 1对多
这种状况,输入固定尺度,比方1张图片;输出是可变长度的序列,比方1段描绘文本。文本的单词数可能就会随图片不同而不同,因而输出值的长度需求是一个变量。 (「图片描绘/看图说话」image captioning)
3) 多对1
这种状况,输入的尺度是改动的,输出是固定的。如情感分类使命,输入的一段长度可变的文本序列,得到一个文字情感特点的类别;再比方能够输入时刻长度不同的视频,然后判别视频中的活动(固定)。
4) 多对多
这种状况,输入输出的尺度都是可变的,如机器翻译使命,英文翻译成中文。输入输出的文本长度都是可变的,并且两者长度不要求相同。
5) 多对多(一一对应)
这种状况,输入是可变序列,输出是针对输入的每个元素做出判别。如帧等级视频分类使命,输入是帧数可变的视频,输出对每一帧进行决议计划。
即使是输入输出尺度都是固定的景象也能够运用循环神经网络 RNN。
- 比方1张写满数字的固定尺度的图片,想要辨认上面的数字,能够是经过一系列的调查,调查图片的不同部分,然后做出决议计划;
- 再比方生成一张固定尺度的图片,上面写满了数字,也能够经过一系列的进程,一次只能生成一部分。
1.2 概念
如下图所示,RNN有一个反复出现的小循环中心单元,输入 xx 给 RNN,核算得到内部隐状况 hidden state,且其会在每次读取新的输入时进行更新。当模型下一次读取输入时,内部隐状况会将成果反馈给模型。
通常,咱们想让 RNN 在每一个时刻步都给出输出,是这样的方式:
- 读取输入 → 更新隐状况 → 依据隐状况核算得到输出。
由于输入是一系列 xx 向量,在每一个时刻绿色的 RNN 部分能够运用循环公式来表明:
其中, xtx_t 是某一时刻输入的向量,ht−1h_{t-1} 是该时刻之前的隐状况, fWf_W 是参数 WW 的函数, hth_t 是更新后的隐状况。这样的结构不断循环。
假如想要在每一个时刻进程得到一个输出,那么能够把更新后的隐状况 hth_t 作为输入,经过全连接网络,得到决议计划。注意: fWf_W 在每一个时刻步都是相同的。
下面是一个最简略的比如,”Vanilla RNN”:
旧状况和输入 xx 都是与权重矩阵相乘再求和经过非线性函数 tanh()tanh(),输出也是新状况与权重矩阵相乘。每个隐状况都只要一个仅有的 hh 向量。
1.3 核算图
1) 多对多(xy一一对应)
这儿的多对多指的是输入 xx 和输出 yy 都是序列,且在时刻步上有一一对应关系。如下是一个多对多的核算图:
初始状况为 h0h_0,在时刻步 t=1t=1 时刻有输入 x1x_1,将 h0h_0、x1x_1 带入参数函数 ff 得到 h1h_1 更新隐状况作为下一个时刻的状况,这样以此类推得到 xtx_t 时刻的隐状况 hth_t。
核算 hth_t 的每一步都运用的相同的参数 WW ,参数函数 ff 也是彻底相同的。这样在反向传达核算梯度时,需求将每一个时刻的梯度累加起来得到终究 WW 的梯度。
除了更新隐状况,假如每一个时刻都想得到一个输出,能够直接将 hth_t 经过核算(比方softmax)得到 yty_t ,假如关于输入 xx 的每一个时刻都对应一个实在标签的话,在核算出 yty_t 的一起能够得到每一步的丢失 LtL_t ,终究的丢失也是一切的 LtL_t 加起来。
2) 多对一
典型的运用之一是情感分析使命,依据终究一个隐状况得到输出。模型经过迭代,在终究一个隐状况包括了之前一切的信息。
3) 一对多
一对多的景象会承受固定长度的输入项,输出不定长的输出项,这个固定长度的输入项会用来初始化初始隐状况,然后 RNN 会对输出的单元逐一处理,终究会得到不定长的输出序列,输出的每个元素都得以展示。
4) 多对多
输入输出都是不定长序列的景象,典型运用如机器翻译使命,能够看作是多对一与一对多的组合。首要输入一个不定长的 xx,将这个序列编码成一个独自的向量,然后作为输入,输入到一对多的模型中,得到输出序列,可能是用另一种言语表述的相同意思的句子。
然后对这个不定长的输出,每一个时刻步都会做出猜测,比方接下来运用什么词。幻想一下整个练习进程和核算图的打开,对输出序列的丢失求和,然后像之前一样反向传达。
2.言语模型
关于言语模型的具体常识也能够比照阅览ShowMeAI的以下内容
深度学习教程 | 吴恩达专项课程 全套笔记解读 中的文章 序列模型与RNN网络 中关于RNN的解说。
自然言语处理教程中的文章 NLP教程(5) – 言语模型、RNN、GRU与LSTM 和 斯坦福NLP课程 | 第6讲 – 循环神经网络与言语模型
在言语模型(Language Model)问题中,咱们让模型读取许多语料句子,让神经网络在必定程度上学会字词的组合规律并能生成自然言语。
举个字符层面上的比如(即对语料中的内容以字符粒度进行学习),比方网络会读取一串字符序列,然后模型需求猜测这个字符流的下一个字符是什么。咱们有一个很小的字符表 [h, e, l, o]
包括一切字母,以及有一个练习序列 hello
,运用循环公式:
在言语模型的练习阶段,咱们将练习序列作为输入项,每一个时刻步的输入都是一个字符,首要需求做的是在神经网络中表明这个单词。
咱们在这儿运用长为4的独热向量来表明每个字符(只要字符对应的方位是 11,其他方位为00)。比方 h
能够用向量 [1000][1 0 0 0] 表明,l
运用 [0010][0 0 1 0] 表明。现在在第一个时刻步中,网络会接收输入 h
,进入第一个RNN单元,然后得到输出 y1y_1,作为对接下来的字符的一个猜测,也便是网络认为的接下来应该输入的字符。
由于第一个输入的是 h
,所以接下来输入的应该是 e
,可是模型只是在做猜测,如下图所示,模型可能认为接下来要输入的是 o
。在这种过错猜测下,咱们能够依据 softmax 核算丢失来衡量咱们对猜测成果的不满意程度。
鄙人一个时刻步,咱们会输入 e
,运用这个输入和之前的隐状况核算出新的隐状况,然后运用新的隐状况对接下来的字符进行猜测,咱们希望下一个字符是 l
,但这儿模型可能也猜测错了,这儿又能够核算丢失。这样经过不断的练习,模型就会学会如何依据当时的输入猜测接下来的输入。
在言语模型测验阶段,咱们想用练习好的模型测验样本或者生成新的文本(相似于练习时运用的文本)。
办法是输入文本的前缀来测验模型,上述比如中的前缀是 h
,现在在RNN的第一步输入 h
,它会发生依据词库一切字母得分的一个 softmax 概率散布,然后运用这个概率散布猜测接下来的输出(这个进程叫做sample/采样),假如咱们足够走运得到了字符 e
,然后把这个得到的 e
重新写成 0101 向量的方式反馈给模型,作为下一个时刻步的输入,以此类推。
2.1 切断反向传达(Truncated Backpropagation )
在前向传达中需求遍历整个序列累加核算丢失,在反向传达中也需求遍历整个序列来核算梯度。咱们能够幻想一下,假如咱们的语料库十分大(例如维基百科中一切文本),那么时刻花费以及内存占用都是巨大的,如下图所示。
实际运用中,通常运用沿时刻的切断反向传达(Truncated Backpropagation),这样输入的序列能够接近无量。
前向传达时不再运用整个序列核算丢失,而是运用序列的一个块,比方 100 个时刻步,核算出丢失值,然后反向传达核算梯度。然后依据第 2 批数据再次核算和更新。
如上的进程循环操作,「切断」使得开支大大减小。
这个进程的完整完成代码:点击这儿
2.2 RNN言语模型运用
- 运用莎士比亚的文集对言语模型进行练习,然后生成新的文本。成果能够生成莎士比亚风格的文章(当然,成果不是完美的,其中有些部分有过错),如下图所示
- 运用拓扑学教材,能够主动生成一些定理、公式甚至能够画图,尽管都没有意义,但能够学会这些结构。
- 运用 linux 源码进行练习。能够生成 C 代码,有缩进有变量声明甚至会写注释等等,看起来十分像 C 代码(当然代码逻辑不必定正常,编译会有许多过错)。
2.3 RNN言语模型解说
在 RNN 中有躲藏向量,每一步都会更新,咱们在这些躲藏向量中寻觅能够解说的单元。
比方在言语模型练习中调查隐向量中的某一个元素值,元素值会随着每一个时刻步进行改动。大多数的元素值改动都是乱七八糟的,好像在进行一些初级的言语建模。可是有一些元素却有特别的表现:
- 蓝色方位数值低,赤色方位数值高
- 比方某些元素遇到引号后,元素值会变得很低,然后一向保持很低直到下一个引号处被激活,元素值变大,然后保持到下一个引号再变低。所以有可能是检测引号的神经元
- 还有某些神经元在核算回车符前的字符数量,即字符有多少时会主动换行。某一行开端处元素的值很低,然后渐渐增大,到达必定值后主动变成0,然后文本换行。
- 在练习代码的比如中,有些神经元好像在判别是否在
if
句子,是否在注释内,以及表明不同的缩进层级。
上述细节内容能够看出,在练习文本的进程中,RNN 学到一些文本的结构。(尽管这些已经不是核算机视觉的内容了)
3.看图说话、视觉问答、注意力模型
之前提过许多次 图片描绘/看图说话(Image Captioning),即练习一个模型,输入一张图片,然后得到它的自然言语语义描绘。这儿输出的成果文本可能长度不同,单词字符数不同,这个使命天然生成适合RNN模型建模。
如下图的一个比如,图画标示模型练习阶段一般都先经过卷积神经网络处理图画生成图画向量(用其作为图画内容的表征),然后输入到RNN言语模型的第一个时刻步中,RNN 会核算调整隐状况,从而依据softmax 得到成果并核算丢失,后续言语模型在每个时刻步都生成1个组成描绘文本的单词。
测验阶段/推理阶段和之前字符级的言语模型相似。
- 咱们把测验图画输入到卷积神经网络,经过 CNN 得到模型终究1个全连接层之前的1个图画向量,作为整张图画的内容表征。
- 之后会给言语模型输入一个开端标志,告知模型开端生成以这个图画为条件的文本。不同于以往的隐状况公式,在这个使命中咱们会把图画信息输入到每个时刻步用于更新隐状况:
- 现在就能够依据图画的内容生成一个词汇表(有许多词汇)中一切单词的一个 softmax 得分概率散布,sample/取样之后作为下一个时刻步的输入。
- 直到取样到「结束符号」整个猜测进程结束,文本也生成结束。
这些练习后的模型在测验时对和练习集相似的片会表现的很好,对和练习集差距大的图片可能变现欠安,比方对一些没见过的物体进行误判,以及分不清扔球仍是接球等。
3.1 依据注意力的「看图说话」模型
下面咱们来看看依据「注意力机制」的 图片描绘/看图说话 模型,这个模型包括的 RNN 在生成单词时,会将注意力放在图画不同的部分。
在这个模型中,CNN处理图画后,不再回来一个独自的向量,而是得到图画不同方位的特征向量,比方 LL 个方位,每个方位的特征有 DD 维,终究回来的CNN成果数据是一个 LDL \times D 的特征图。(幻想CNN的中间层得到的特征图)
这样在 RNN 的每一个时刻步,除了得到词汇表的采样,还会得到依据图片方位的散布,它代表了 RNN 想要调查图画的哪个部分。这种方位散布,便是 RNN 模型应该调查图画哪个方位的「注意力」。
在第1个隐状况会核算依据图片方位的散布 a1a_1,这个散布会回来到图画特征图 LDL \times D,给得出一个单一的具有核算性质的 DD 维特征向量,即把注意力集中在图画的一部分。这个特征向量会作为下一个时刻步的额定输入,另一个输入是单词。然后会得到两个输出,一个是依据词汇的散布,一个是依据方位的散布。这个进程会一向继续下去,每个进程都有两个输入两个输出。
整个进程如下图所示:
上图 zz 的核算公式能够是:
pip_i 便是依据方位的散布,viv_i 便是 LL 个特征向量中的一个,终究得到一个核算向量 z z。
这种结合一切特征的散布办法称为软注意力(Soft attention),与之对应的是硬注意力(Hard attention)。
硬注意力每次只发生一个独自的特征向量,不是一切特征的组合,但它反向传达比较杂乱,因为(区域)挑选的进程自身不是一个可微的函数。
这样模型会自己学习每一个时刻步应该主要把注意力集中在图片的什么方位得到什么词汇,作用通常也很好。如下图所示:
这个结构的模型也能够用于其他使命,比方视觉问答(Visual Question Answering)。
在视觉问答使命中,会有两个输入,一个是图画,一个是关于图画的用自然言语描绘的问题。模型从一些答案中挑选一个正确的。
这是一个多对一模型,咱们需求将问题作为序列输入,针对序列的每一个元素树立 RNN,能够将问题归纳成一个向量。然后把图画也归纳成一个向量,现在将两个向量结合经过 RNN 编程猜测答案。结合办法能够是直接连接起来也能够是进行杂乱的运算。
4.RNN梯度流
4.1 多层RNN(Multilayer RNNs)
咱们之前看到的朴素RNN,隐状况只要1层,在「多层RNN」中隐状况有3层。一次运行得到 RNN 第1个隐状况的序列,然后作为第2个隐状况的输入。如下图所示:
4.2 一般RNN梯度流
咱们来看看一般RNN的梯度流,在前向传达进程中核算 hth_t :
反向传达梯度流从 hth_t 到 ht−1h_{t-1} 需求乘 WhhTW_{hh}^T
有一个问题,在上述 RNN 练习进程中,从终究一个隐状况传到第一个隐状况,中间要乘许多次权重,如下图所示。
假如累计相乘的值频频大于 11,就可能会梯度爆破;假如频频小于 11,梯度就可能会渐渐趋近 00(梯度消失)。
关于梯度爆破,一种处理办法是给梯度设置一个阈值,假如梯度的 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 的网络结构更加杂乱。
LSTM 在每一个时刻步都会保持两个隐状况:
- hth_t 和一般 RNN 中的一起,是 RNN 网络的隐状况;
- 单元状况向量 ctc_t ,是保留在 LSTM 内部的隐状况,不会彻底露出到外部去。核算公式能够看出,LSTM会运用输入和之前的隐状况来更新四个组成 ctc_t 的门,然后运用 ctc_t 来更新 hth_t .
与一般 RNN 不同的是,LSTM 不直接将权重矩阵 WW 乘 xtx_t 和 ht−1h_{t-1} 拼接成的向量再经过 tanh()tanh() 函数得到隐状况 hth_t 。
LSTM 中的权重矩阵核算会得到 4 个与隐状况 hh 大小相同的向量,然后分别经过不同的非线性函数就得到了单元状况 ct c_t 的四个门: i,f,o,gi, f, o, g
- ii 是输入门(Input gate) ,表明有多少内容被写到单元状况;
- ff 是忘记门(Forget gate),表明对之前的单元状况的忘记程度;
- oo 是输出门(Output gate) ,表明单元状况输出多少给隐状况;
- gg 是门值门(Gate gate ) ,操控写入到单元状况的信息。
从 ctc_t 的核算公式来看,之所采用不同的非线性函数,能够这么了解:
- ff 是对之前的单元状况的忘记,假如是 00 全部忘记,假如是 11 就全部保留,那个圆圈加点的符号表明逐元素相乘;
- ii 和 gg 一起操控写入到单元状况向量的信息,ii 在 0∼10 \sim1 之间,gg 在 −1-1 到 11 之间,这样每个时刻步,单元状况向量的每个元素最大自增 11 或最小自减 11。
- 这样 ctc_t 能够看成是对 [−11][-1 \quad 1] 的按时刻步计数。然后 ctc_t 经过 tanh()tanh() 将这个计数压缩到 [01][0 \quad 1] 规模,然后 oo 来操控将多少单元状况的信息输出给隐状况 hth_t 。
LSTM梯度流
如下图所示,咱们用灰色的线表明 LSTM 前向传达,彻底按照公式来的,圆圈加点运算符表明两个向量逐元素相乘,不是矩阵的乘法。这样从 ctc_t 到 ct−1c_{t-1} 的反向传达进程,只会与 ff 进行逐元素相乘,与乘 WW 相比要简略许多。
LSTM不同的时刻步 ff 的值都不同,不像一般 RNN 每次都乘相同的 WW,这样就必定程度防止梯度爆破或锐减。而且 ff 的值也是在 [0,1][0, 1] 性质十分好。
当多个单元连起来的时分,就会为梯度在单元状况间活动提供了一条高速公路(这种方式与残差网络相似)。
4.4 GRU(Gated Recurrent Unit)
关于LSTM的具体解说也能够比照阅览ShowMeAI的深度学习教程 | 吴恩达专项课程 全套笔记解读中的文章序列模型与RNN网络中关于GRU的解说。
另一个改进一般RNN的办法得到「门循环单元(GRU)」模型,它总体和LSTM相似,也是运用了这种逐元素相乘与加法结合的方式,这样梯度也能高速活动。
5.引荐学习
能够点击 B站 检查视频的【双语字幕】版本
- 【课程学习指南】斯坦福CS231n | 深度学习与核算机视觉
- 【字幕+材料下载】斯坦福CS231n | 深度学习与核算机视觉 (2017全16讲)
- 【CS231n进阶课】密歇根EECS498 | 深度学习与核算机视觉
- 【深度学习教程】吴恩达专项课程 全套笔记解读
- 【Stanford官网】CS231n: Deep Learning for Computer Vision
6.关键总结
- RNN 是一种输入输出都很灵敏的网络结构;
- Vanilla RNNs 很简略,可是作用不好;比较普遍的是运用 LSTM 和 GRU,能有用的改进梯度流;
- RNN 反向传达梯度爆破能够给梯度设置阈值,而梯度锐减能够运用杂乱的网络,比方 LSTM;
- RNN 的运用:图画标示、视觉问答,都是将 CNN 与 RNN 结合起来;
- 了解言语模型与注意力模型;
ShowMeAI 斯坦福 CS231n 全套解读
- 深度学习与核算机视觉教程(1) | CV导言与根底 @CS231n
- 深度学习与核算机视觉教程(2) | 图画分类与机器学习根底 @CS231n
- 深度学习与核算机视觉教程(3) | 丢失函数与最优化 @CS231n
- 深度学习与核算机视觉教程(4) | 神经网络与反向传达 @CS231n
- 深度学习与核算机视觉教程(5) | 卷积神经网络 @CS231n
- 深度学习与核算机视觉教程(6) | 神经网络练习技巧 (上) @CS231n
- 深度学习与核算机视觉教程(7) | 神经网络练习技巧 (下) @CS231n
- 深度学习与核算机视觉教程(8) | 常见深度学习框架介绍 @CS231n
- 深度学习与核算机视觉教程(9) | 典型CNN架构 (Alexnet, VGG, Googlenet, Restnet等) @CS231n
- 深度学习与核算机视觉教程(10) | 轻量化CNN架构 (SqueezeNet, ShuffleNet, MobileNet等) @CS231n
- 深度学习与核算机视觉教程(11) | 循环神经网络及视觉运用 @CS231n
- 深度学习与核算机视觉教程(12) | 方针检测 (两阶段, R-CNN系列) @CS231n
- 深度学习与核算机视觉教程(13) | 方针检测 (SSD, YOLO系列) @CS231n
- 深度学习与核算机视觉教程(14) | 图画分割 (FCN, SegNet, U-Net, PSPNet, DeepLab, RefineNet) @CS231n
- 深度学习与核算机视觉教程(15) | 视觉模型可视化与可解说性 @CS231n
- 深度学习与核算机视觉教程(16) | 生成模型 (PixelRNN, PixelCNN, VAE, GAN) @CS231n
- 深度学习与核算机视觉教程(17) | 深度强化学习 (马尔可夫决议计划进程, Q-Learning, DQN) @CS231n
- 深度学习与核算机视觉教程(18) | 深度强化学习 (梯度战略, Actor-Critic, DDPG, A3C) @CS231n
ShowMeAI 系列教程引荐
- 大厂技能完成:引荐与广告核算解决方案
- 大厂技能完成:核算机视觉解决方案
- 大厂技能完成:自然言语处理职业解决方案
- 图解Python编程:从入门到通晓系列教程
- 图解数据分析:从入门到通晓系列教程
- 图解AI数学根底:从入门到通晓系列教程
- 图解大数据技能:从入门到通晓系列教程
- 图解机器学习算法:从入门到通晓系列教程
- 机器学习实战:手把手教你玩转机器学习系列
- 深度学习教程:吴恩达专项课程 全套笔记解读
- 自然言语处理教程:斯坦福CS224n课程 课程带学与全套笔记解读
- 深度学习与核算机视觉教程:斯坦福CS231n 全套笔记解读