A. 模型CNN-RNN-LSTM和GRU简介
深度学习技术自2006年以来风靡全球,其应用广泛,尤其在计算机视觉、语音识别和自然语言处理(NLP)领域。近年来,工业界积极探索其在游戏、内容推荐和广告匹配等更多场景的应用。深度模型架构主要包括三种:卷积神经网络(CNN)、循环神经网络(RNN)和长短时记忆(LSTM)、门控递归单元(GRU)。以下是深度学习模型架构的简介。
深度学习模型架构分为三种:卷积神经网络(CNN)、循环神经网络(RNN)、长短时记忆(LSTM)和门控递归单元(GRU)。其中,CNN在计算机视觉领域影响最大,RNN允许随时间在一系列向量上操作,LSTM和GRU则提供了解决长序列问题的机制。
在深度学习中,人工神经网络或一般神经网络由多层感知器组成,每层包含多个隐藏单元。具有多层感知器的NN模型包括一个或多个隐藏层,具有线性组合器和激活函数。神经元接收输入信号,计算线性组合并应用非线性激活函数以产生输出。神经元功能可以数学表示为:输出 = φ(∑权重×输入 + 偏移)。
训练深度神经网络涉及学习率的选择,常数、因子和指数衰减是常用的方法。梯度下降法用于寻找目标函数的局部最小值,随机梯度下降(SGD)方法用于训练DNN。反向传播(BP)算法和SGD用于深度NN的训练。
动量和权重衰减是训练深度学习模型的辅助方法,动量加速训练过程,权重衰减作为L2正则化方法防止过度拟合。批处理归一化(BN)通过线性转换输入样本,加速深度学习过程,防止梯度消失问题。
CNN架构包括特征提取和分类器,由卷积层、最大池化层和分类层组成。特征提取层接收前一层的输出,生成特征图,分类层使用全连接网络计算类别得分。CNN的反向传播更新卷积层的滤波器,计算参数数量衡量模型复杂性。
RNN允许信息在时间步骤之间传递,Elman架构使用隐层输出和正常输入,Jordan网络使用输出单元的输出作为隐藏层输入。LSTM和GRU提供了解决长序列问题的机制,其中LSTM包含单元状态和门机制,GRU则简化了LSTM的计算成本和复杂性。
在深度学习领域,不同架构各具优势,选择模型需考虑问题性质、数据规模和计算资源。理解模型架构和参数选择对深度学习应用至关重要。
B. 高效实现最大池化
探索高效最大池化技术:提升特征提取效率的关键
在深度学习的世界里,池化(Pooling)是一项不可或缺的技术,它犹如神经网络的减压阀,通过智能地降低卷积神经网络(CNN)和循环神经网络(RNN)的特征图维度,实现了参数减少、过拟合的预防和计算效率的提升。其中,最大池化(Max Pooling)凭借其独特的优势,成为了众多实践者们的首选。
最大池化的核心在于,它对每个子区域内的特征值进行评估,然后挑选出其中的最大值,这一过程就像是为图像数据进行了“滤镜”般的处理,保留了最具代表性的特征。例如,如果一个池化核大小为2x2,步幅为2,那么每个子区域将被分为4个小单元,其中最大的一个像素值会被保留下来,其余则被忽略。
在Python的实践中,我们可以用简单函数实现这一过程,如下面的示例所示:
通过这种方式,原始数据经过最大池化后,不仅尺寸缩小,而且每个位置的特征被转化为其区域内的强度指标,这对于图像分类和特征提取至关重要。
在PyTorch中,MaxPool2d函数是实现最大池化的关键工具,其参数如kernel_size(窗口大小)、stride(滑动步长)、padding(边缘填充)以及dilation(孔径大小)等,为用户提供了一定的灵活性。例如,对一张16x16的图片进行池化,设置pool_size=2和stride=2,最终输出的特征图会缩小到8x8。这在处理高分辨率图像时,如读取"output.jpg"并应用于"example_pool.jpg",能显着降低存储需求和计算负载。
然而,最大池化并非唯一的选择,还有Average Pooling(计算窗口的平均值)和Adaptive Pooling(自适应调整窗口大小),它们根据场景和需求灵活调整池化策略。了解并灵活运用这些池化方法,可以帮助我们更高效地提取和处理数据,从而提升模型的性能。
C. Pytorch | RNN 和CNN的区别
卷积神经网络(CNN)
卷积神经网络(CNN)是深度学习的代表算法之一,具备表征学习能力,能对输入信息进行平移不变分类。其结构包括卷积层、池化层和全连接层,适用于监督学习和非监督学习。在处理图像等格点化特征时,CNN以较小的计算量实现稳定效果,无需额外特征工程。输入数据需标准化处理,如将像素值归一化至0-1区间,以提升学习效率。
隐含层包含卷积层、池化层和全连接层,常见构筑顺序为:输入-卷积层-池化层-全连接层-输出。公式计算特征图大小,池化层通过预设定的函数进行特征选择和信息过滤。全连接层将特征图展开为向量,传递至下一层。
输出层结构与传统前馈神经网络相同,对于图像分类问题,使用逻辑函数或softmax函数输出分类标签;在物体识别问题中,输出层设计为物体的中心坐标、大小和分类;在图像语义分割中,直接输出每个像素的分类结果。
循环神经网络(RNN)
循环神经网络(RNN)是一种节点定向连接成环的人工神经网络,适用于处理任意时序的输入序列,如手写识别、语音识别等。RNN利用内部记忆处理时间序列信息,每一刻输出依赖于前一刻的输出值加权结果。然而,RNN在长期记忆输出上受限,可能导致权重累加过大,运算效率低下。
为解决RNN的长期记忆问题,长短期记忆网络(LSTM)应运而生,其核心结构包含异或门和与门。通过异或门和与门的运算,LSTM能减少数据量,遗忘重复信息,记录未知信息,并更新结果后输出。
RNN Regressor
时间步长(timestep)是序列的长度,RNN Regressor经过多个时间步得到输出,适用于序列预测任务。
D. 几种常见的循环神经网络结构RNN、LSTM、GRU
传统文本处理任务的方法中一般将TF-IDF向量作为特征输入。显而易见,这样的表示实际上丢失了输入的文本序列中每个单词的顺序。在神经网络的建模过程中,一般的前馈神经网络,如卷积神经网络,通常接受一个定长的向量作为输入。卷积神经网络对文本数据建模时,输入变长的字符串或者单词串,然后通过滑动窗口加池化的方式将原先的输入转换成一个固定长度的向量表示,这样做可以捕捉到原文本中的一些局部特征,但是两个单词之间的长距离依赖关系还是很难被学习到。
循环神经网络却能很好地处理文本数据变长并且有序的输入序列。它模拟了人阅读一篇文章的顺序,从前到后阅读文章中的每一个单词,将前面阅读到的有用信息编码到状态变量中去,从而拥有了一定的记忆能力,可以更好地理解之后的文本。
其网络结构如下图所示:
由图可见,t是时刻,x是输入层,s是隐藏层,o是输出层,矩阵W就是隐藏层上一次的值作为这一次的输入的权重。
如果反复把式 2 带入到式 1,将得到:
其中f和g为激活函数,U为输入层到隐含层的权重矩阵,W为隐含层从上一时刻到下一时刻状态转移的权重矩阵。在文本分类任务中,f可以选取Tanh函数或者ReLU函数,g可以采用Softmax函数。
通过最小化损失误差(即输出的y与真实类别之间的距离),我们可以不断训练网络,使得得到的循环神经网络可以准确地预测文本所属的类别,达到分类目的。相比于卷积神经网络等前馈神经网络,循环神经网络由于具备对序列顺序信息的刻画能力,往往能得到更准确的结果。
RNN的训练算法为:BPTT
BPTT的基本原理和BP算法是一样的,同样是三步:
1.前向计算每个神经元的输出值;
2.反向计算每个神经元的误差项值,它是误差函数E对神经元j的加权输入的偏导数;
3.计算每个权重的梯度。
最后再用随机梯度下降算法更新权重。
具体参考: https://www.jianshu.com/p/39a99c88a565
最后由链式法则得到下面以雅可比矩阵来表达的每个权重的梯度:
由于预测的误差是沿着神经网络的每一层反向传播的,因此当雅克比矩阵的最大特征值大于1时,随着离输出越来越远,每层的梯度大小会呈指数增长,导致梯度爆炸;反之,若雅克比矩阵的最大特征值小于1,梯度的大小会呈指数缩小,产生梯度消失。对于普通的前馈网络来说,梯度消失意味着无法通过加深网络层次来改善神经网络的预测效果,因为无论如何加深网络,只有靠近输出的若干层才真正起到学习的作用。 这使得循环神经网络模型很难学习到输入序列中的长距离依赖关系 。
关于RNN梯度下降的详细推导可以参考: https://zhuanlan.hu.com/p/44163528
梯度爆炸的问题可以通过梯度裁剪来缓解,即当梯度的范式大于某个给定值时,对梯度进行等比收缩。而梯度消失问题相对比较棘手,需要对模型本身进行改进。深度残差网络是对前馈神经网络的改进,通过残差学习的方式缓解了梯度消失的现象,从而使得我们能够学习到更深层的网络表示;而对于循环神经网络来说,长短时记忆模型及其变种门控循环单元等模型通过加入门控机制,很大程度上弥补了梯度消失所带来的损失。
LSTM的网络机构图如下所示:
与传统的循环神经网络相比,LSTM仍然是基于xt和ht−1来计算ht,只不过对内部的结构进行了更加精心的设计,加入了输入门it 、遗忘门ft以及输出门ot三个门和一个内部记忆单元ct。输入门控制当前计算的新状态以多大程度更新到记忆单元中;遗忘门控制前一步记忆单元中的信息有多大程度被遗忘掉;输出门控制当前的输出有多大程度上取决于当前的记忆单元。
在经典的LSTM模型中,第t层的更新计算公式为
其中it是通过输入xt和上一步的隐含层输出ht−1进行线性变换,再经过激活函数σ得到的。输入门it的结果是向量,其中每个元素是0到1之间的实数,用于控制各维度流过阀门的信息量;Wi 、Ui两个矩阵和向量bi为输入门的参数,是在训练过程中需要学习得到的。遗忘门ft和输出门ot的计算方式与输入门类似,它们有各自的参数W、U和b。与传统的循环神经网络不同的是,从上一个记忆单元的状态ct−1到当前的状态ct的转移不一定完全取决于激活函数计算得到的状态,还由输入门和遗忘门来共同控制。
在一个训练好的网络中,当输入的序列中没有重要信息时,LSTM的遗忘门的值接近于1,输入门的值接近于0,此时过去的记忆会被保存,从而实现了长期记忆功能;当输入的序列中出现了重要的信息时,LSTM应当把其存入记忆中,此时其输入门的值会接近于1;当输入的序列中出现了重要信息,且该信息意味着之前的记忆不再重要时,输入门的值接近1,而遗忘门的值接近于0,这样旧的记忆被遗忘,新的重要信息被记忆。经过这样的设计,整个网络更容易学习到序列之间的长期依赖。
GRU是在LSTM上进行简化而得到的,GRU的网络结构如下所示:
Zt代表更新门,更新门的作用类似于LSTM中的遗忘门和输入门,它能决定要丢弃哪些信息和要添加哪些新信息。
Rt代表重置门,重置门用于决定丢弃先前信息的程度。
要注意的是,h只是一个变量,因此在每个时刻,包括最后的线性组合,h都是在用以前的自己和当前的备选答案更新自己。举例来说,这一个变量好比一杯酒,每次我们要把一部分酒倒出去,并把倒出去的酒和新加入的原料混合,然后在倒回来,这里的reset控制的就是要倒出去的,并且混合好之后再倒回来的酒的比例,而update控制的则是用多大的比例混合新原料和倒出来的之前调制好的酒。同理,也可以以此理解LSTM,LSTM的遗忘门功能上和reset相似,而输入门与update相似,不同之处在于LSTM还控制了当前状态的exposure,也就是输出门的功能,这是GRU所没有的。
1.百面机器学习
2. https://zhuanlan.hu.com/p/45649187
3. https://www.jianshu.com/p/39a99c88a565