当前位置 : 主页 > 编程语言 > java >

RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法

来源:互联网 收集:自由互联 发布时间:2022-06-30
1. CNN算法 ​​CNN算法原理​​ 2. RNN算法 最早CNN算法和普通算法类似,都是从由一个输入得到另一个输出,不同的输入之间没有联系,无法实现一些场景(例如:对电影每个时间点的时

1. CNN算法

​​CNN算法原理​​

2. RNN算法

最早CNN算法和普通算法类似,都是从由一个输入得到另一个输出,不同的输入之间没有联系,无法实现一些场景(例如:对电影每个时间点的时间类型进行分类,因为时间是连续的,每一个时间点都是由前面的时间点影响的,也就是说输入之间有关联)

2.1 典型的序列数据

  • 文章里文字内容
  • 语音里音频内容
  • 股票市场中价格走势
  • 2.2 基本原理

    RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。如下图所示
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_深度学习
    在上面的示例图中 神经网络的模块 A 正在 取某个 入 x_i 并 
    出一个值 h_i。循环可以使得信息可以从当前步传 到下一步。 些循
    环使得 RNN 看起来非常神秘。然  如果你仔细想想  样也不比一
    个正常的神经网络 于理 。RNN 可以 看做是同一神经网络的多次
    赋值 每个神经网络模块会把消息传 给下一个。所以 如果我们将 
    个循环展开

    实现公式如下:

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_02

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_深度学习_03
    实现如下,这里以,用户说了一句“what time is it?”我们需要先对这句话进行分词:
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_04

    3. RCNN算法

    RCNN(Region with CNN feature)是卷积神经网络应用于目标检测问题的一个里程碑的飞跃。CNN具有良好的特征提取和分类性能,采用RegionProposal方法实现目标检测问题。
    算法可以分为三步(1)候选区域选择。(2)CNN特征提取。(3)分类与边界回归。

    接下来我将详细的介绍一下每一过程如何实现,及其里面的一些tricks。

    (1)候选区域选择:区域建议Region Proposal是一种传统的区域提取方法,基于启发式的区域提取方法,用的方法是ss,查看现有的小区域,合并两个最有可能的区域,重复此步骤,直到图像合并为一个区域,最后输出候选区域。然后将根据建议提取的目标图像标准化,作为CNN的标准输入可以看作窗口通过滑动获得潜在的目标图像,在RCNN中一般Candidate选项为1k2k个即可,即可理解为将图片划分成1k2k个网格,之后再对网格进行特征提取或卷积操作,这根据RCNN类算法下的分支来决定。然后基于就建议提取的目标图像将其标准化为CNN的标准输入。

    (2)CNN特征提取:标准卷积神经网络根据输入执行诸如卷积或池化的操作以获得固定维度输出。也就是说,在特征提取之后,特征映射被卷积和汇集以获得输出。

    (3)分类与边界回归:实际上有两个子步骤,一个是对前一步的输出向量进行分类(分类器需要根据特征进行训练); 第二种是通过边界回归框回归(缩写为bbox)获得精确的区域信息。其目的是准确定位和合并完成分类的预期目标,并避免多重检测。在分类器的选择中有支持向量机SVM,Softmax等等;边界回归有bbox回归,多任务损失函数边框回归等 。

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_数据_05

    4. LSTM算法

    LSTM是一种RNN特殊的类型,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。

    4.1 LSTM算法原理

    下图为LSTM简单的结构,可以同RNN算法进行对比
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_06
    详细算法结构如下:
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_数据_07

    4.2 下面对结构中的各个部分拆解解释:

    1.

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_08
    如上图红框的流程,称之为门,是由sigmoid函数实现,实现结果为0~1,结果为0代表这条路不能通过,1代表这条可以通过

    2.

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_数据_09

    3.

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_10

    4.

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_深度学习_11

    5.

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_12

    5. CTC算法

    CTC全称Connectionist temporal classification,是一种常用在语音识别、文本识别等领域的算法,用来解决输入和输出序列长度不一、无法对齐的问题。在CRNN中,它实际上就是模型对应的损失函数。

    传统监督学习算法面临的问题:
    假设输入序列为x=[x1,x2,x3,…,xt],对应的输出序列y=[y1,y2,y3,…,yt]

    • x和y的长度是可变的
    • x和y的长度比例也是可变的
    • x和y对应元素之间不能找到严格的对齐关系

    CTC算法解决以下问题其算法原理如下:

    5.1 Alignment对齐

    CTC的输入和输出可以是不同长度的。对于给定输入,CTC通过求和所有alignments计算其输出的概率,首先理解什么是alignment?
    首先看一个简单的例子。假设输入串的长度是6,Y=[c,a,t]。我们需要一个长度为6的alignment与输入相对应,同时要能唯一映射到输出cat。一个最简单的方式是重复字符c或者a或者t,如下图所示。
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_13
    但是,这种方式有个问题:我们无法区分连续的相同字符,例如,对于一个alignment=[h, h, e, l, l, l, o],我们会把它映射到‘helo’而不是‘hello’。为了解决这个问题,引入了空字符 ,它没有任何含义,映射到输出是会被简单移除。 我们可以从alignment映射到Y通过先合并重复字符再移除 的方式,如下图所示。 如果Y有两个连续的相同字符,那么必须有一个 在他们中间,这样我们就可以区分helo和hello了。

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_14

    5.2 Loss Function损失函数

    CTC alignment为我们提供了一个很自然的方法,可以将每个时间步长的概率转换为输出序列的概率。下图展示了大致的整个流程。
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_深度学习_15
    对于一对输入输出(X,Y)来说,CTC的目标是将下式概率最大化

    解释一下,对于RNN+CTC模型来说,RNN输出的就是概率RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_数据_16,t表示的是RNN里面的时间的概念。乘法表示一条路径的所有字符概率相乘,加法表示多条路径。因为上面说过CTC对齐输入输出是多对一的,例如RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_深度学习_17RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_深度学习_18对应的都是“hello”,这就是输出的其中两条路径,要将所有的路径相加才是输出的条件概率
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_数据_19
    但是对于一个输出,路径会非常的多,这样直接计算概率是不现实的,CTC算法采用动态规划的思想来求解输出的条件概率,如下图所示,该图想说明的是通过动态规划来进行路径的合并(看不懂也没关系,下面有详细的解释)
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_20
    假设我们现在有输入音频X对应的标定输出Y为单词“ZOO”,为了方便解释下面动态规划的思想,现在每个字符之间还有字符串的首位插入空白占位符RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_21,得到下面结果
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_数据_22

    为了便于说明,先定义好下图的横纵坐标轴的含义,横轴是的时间片单位为t,纵轴为Z序列单位为s。根据CTC的对齐方式的三个特征,输入有9个时间片,标签内容是“ZOO”,P(Y|X)的所有可能的合法路径如下图

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_23
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_24表示对齐结果合并后(如图3.png)节点的概率。RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_25表示上图中坐标为(s,t)节点的概率,该点的概率计算分为下面两种情况:

    5.3 Case1

    1)如果RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_深度学习_26RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_25则只能由前一个字符RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_28或者本身RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_深度学习_29得到
    2)如果RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_25不等于RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_21,但是RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_25为连续字符的第二个,即RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_33,则RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_25只能由一个空白符RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_28或者RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_深度学习_29其本身得到,而不能由前一个字符得到。

    上述两种情况中,RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_25可以由下式算出,其中RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_38表示在时刻t输出字符的概率。
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_39

    5.4 Case2

    如果RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_25不等于RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_21,则RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_25可以由RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_深度学习_29RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_28以及RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_深度学习_45得来,可以表示为

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_46

    从上图可以看到,合法路径由两个起始点,输出两个终止点,最后输出的条件概率为两个终止点输出概率的和。使用这种计算方法就能高效的计算损失函数,下一步的工作表示计算梯度用于训练模型。由于P(Y|X)的计算只涉及加法和乘法,因此是可导的。对于训练集D,模型优化的目标是最小化负对数似然函数

    5.4 Inference预测

    当我们训练好一个RNN模型时,给定一个输入序列 X,我们需要找到最可能的输出,也就是求解

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_47

    求解最可能的输出有两种方案,一种是Greedy Search,第二种是beam search

    5.4.1 Greedy Search

    每个时间片均取该时间片概率最高的节点作为输出:

    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_时间片_48

    这个方法最大的缺点是忽略了一个输出可能对应多个对齐方式.

    5.4.2 Beam Search

    Beam Search是寻找全局最优值和Greedy Search在查找时间和模型精度的一个折中。一个简单的beam search在每个时间片计算所有可能假设的概率,并从中选出最高的几个作为一组。然后再从这组假设的基础上产生概率最高的几个作为一组假设,依次进行,直到达到最后一个时间片,下图是beam search的宽度为3的搜索过程,红线为选中的假设。
    RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法_特征提取_49

    6. pytorch实现LSTM算法

    定义LSTM参数:

    import torch.nn as nn
    rnn=nn.LSTM(input_size,hidden_size,numlayers,bias,batch_first,dropout)
    • input_size:输入数据X的特征值的数目。
    • hidden_size:隐藏层的神经元数量,也就是层的特征数
    • num_layers:循环神经网络的层数,默认值是 2。
    • bias:默认为True,如果为 false 则表示神经元不使用 bias偏移参数。
    • batch_first:如果设置为True,则输入数据的维度中第一个维度就是 batch 值,默认为False。默认情况下第一个维度是序列的长度,第二个维度才是 batch 第三个维度是特征数目。
    • dropout:如果不为空,则表示最后跟一个dropout层抛弃部分分数据,抛弃数据的比例由该参数指定。

    实现LSTM输入数据输出数据:

    output,(h_n,c_n)=LSTM(input,(h0,c0))

    输入参数:

    • input:输入数据input一个三维向量
    • h_0:隐藏层初始权重
    • c_0:隐藏层的初始状态
      输出数据:
    • output:输出数据
    • h_n:隐藏层的输出权重
    • c_n:隐藏层输出状态

    6.1 实例

    import torch
    impoort torch.nn as nn
    from torch.autograd import Variable

    rnn=nn.LSTM(10,20,2)
    input=Variable(torch.randn(5,3,10))
    h0=Variable(torch.randn(2,3,20))
    c0=Variable(torch.randn(2,3,20))
    output,hn=rnn(input,(h0,c0))


    网友评论