梯度消失:梯度趋近于0,网络权重无法更新或更新的很微小,网络训练再久也不会有效果。
梯度爆炸:梯度呈指数级增长,变得非常大,然后导致网络权重大幅更新,使网络变得不稳定。
Sigmoid导数的取值在 0~0.25 之间,而我们初始化的网络权值 w w w 通常都小于 1,因此,当层数增多时,小于 0 的值不断相乘,最后就导致了梯度消失的情况出现。同理,梯度爆炸的问题也就很明显了,就是当权值 w w w 过大时,导致 ∣ σ ′ ( z ) w ∣ > 1 |\sigma'(z) w|>1 ∣σ′(z)w∣>1,最后大于1的值不断相乘,就会产生梯度爆炸。
梯度消失和梯度爆炸本质上是一样的,都是因为网络层数太深而引发的梯度反向传播中的连乘效应。
实现过程:计算训练阶段 mini_batch 数量激活函数前结果的均值和方差,然后对其进行归一化,最后对其进行缩放和平移。
作用:
于数据挖掘和处理类的问题,使用一般的机器学习方法,需要提前做大量的特征工程工作,而且特征工程的好坏会在很大程度上决定最后效果的优劣(也就是常说的一句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已)。
使用深度学习的话,特征工程就没那么重要了,特征只需要做些预处理就可以了,因为它可以自动完成传统机器学习算法中需要特征工程才能实现的任务,特别是在图像和声音数据的处理中更是如此,但模型结构会比较复杂,训练较为麻烦。另一个方面,虽然深度学习让我们可以省去特征工程这一较为繁琐的过程,但也让我们失去了对特征的认识,如特征的重要性等。
如何选择或衡量这两种方法:
各自的优势领域:
使用预训练模型的好处:在于利用训练好的SOTA模型权重去做特征提取,可以节省我们训练模型和调参的时间。
理由:
Dropout可以防止过拟合,在前向传播的时候,让某个神经元的激活值以一定的概率 P P P 停止工作,这样可以使模型的泛化性更强。
Dropout效果跟bagging效果类似(bagging是减少方差variance,而boosting是减少偏差bias)。加入Dropout会使神经网络训练时间长,模型预测时不需要dropout,记得关掉。
具体流程:
卷积核(convolutional kernel):可以看作对某个局部的加权求和;它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整体,而是先从局部开始认识,这就对应了卷积。卷积核的大小一般有 1 × 1 , 3 × 3 , 5 × 5 1\times1,3\times3 ,5 \times5 1×1,3×3,5×5 的尺寸(一般是奇数 × \times × 奇数)。
作用是:
动量其实累加了历史梯度更新方向,所以在每次更新时,要是当前时刻的梯度与历史时刻梯度方向相似,这种趋势在当前时刻则会加强;要是不同,则当前时刻的梯度方向减弱。动量方法限制了梯度更新方向的随机性,使其沿正确方向进行。
Adam等自适应学习率算法对于稀疏数据具有优势,且收敛速度很快;但精调参数的SGD(+Momentum)往往能够取得更好的最终结果。
Adam+SGD 组合策略:先用Adam快速下降,再用SGD调优。
如果模型是非常稀疏的,那么优先考虑自适应学习率的算法;在模型设计实验过程中,要快速验证新模型的效果,用Adam进行快速实验优化;在模型上线或者结果发布前,可以用精调的SGD进行模型的极致优化。
减少网络层参数;更多的非线性变换。
深度残差网络有很多旁路的支线将输入直接连到后面的层,使得后面的层可以直接学习残差,这些支路就叫做 shortcut。传统的卷积层或全连接层在信息传递时,或多或少会存在信息丢失、损耗等问题。ResNet 在某种程度上解决了这个问题,通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络则只需要学习输入、输出差别的那一部分,简化学习目标和难度。
空洞卷积也叫扩张卷积,在保持参数个数不变的情况下增大了卷积核的感受野,同时它可以保证输出的特征映射的大小保持不变。一个扩张率为2的 3 × 3 3\times3 3×3卷积核,感受野与 5 × 5 5\times5 5×5的卷积核相同,但参数数量仅为9个。
k ′ = k + ( k − 1 ) ( r − 1 ) k'=k+(k-1)(r-1) k′=k+(k−1)(r−1)
H ′ / W ′ = H / W − K + 2 P S + 1 H'/W' = \frac{H/W-K+2P}{S}+1 H′/W′=SH/W−K+2P+1
转置卷积(也称为反卷积)是一种与常规卷积相反的操作。它可以用来将低维特征图(如从编码器传递到解码器的特征图)转换为高维特征图,从而实现上采样(upsampling)的效果。
转置卷积的工作方式与普通卷积相反。在普通卷积中,通过将卷积核在输入上滑动以生成输出特征图。而在转置卷积中,卷积核在输出上滑动以生成输入特征图。
H ′ / W ′ = ( H / W − 1 ) × S + K − 2 P H'/W' = (H/W-1)\times S+K-2P H′/W′=(H/W−1)×S+K−2P
RNN 是用来处理序列数据的神经网络,其引入了具有“记忆”性质的结构单元,计算除了本次的输入,还包括上一次的计算结果。经典 RNN 结构示意图:
它的输⼊是 x 1 , x 2 , . . . . . x n x_1, x_2, .....x_n x1,x2,.....xn,输出为 y 1 , y 2 , . . . y n y_1, y_2, ...y_n y1,y2,...yn,也就是说,输⼊和输出序列必须要是等长的。由于这个限制的存在,经典 RNN 的适⽤范围⽐较⼩,但也有⼀些问题适合⽤经典的 RNN 结构建模,如
长期依赖问题(Long-Term Dependency Problem)是指在处理序列数据时,当序列中的某个事件对于当前时刻的预测具有很重要的影响,但由于传统的循环神经网络(RNN)的限制,随着时间的推移,这种影响会逐渐减弱,最终变得无法捕捉到。
这个问题的根本原因在于,在传统的 RNN 中,信息的传递是通过链式结构进行的,每个时间步的隐藏状态只能受到前一个时间步的隐藏状态和当前时间步的输入的影响。这意味着在较长的序列中,早期的信息会被逐渐稀释,导致网络无法捕捉到远处时间步的重要信息。
这对于许多实际问题来说是一个严重的限制,因为许多任务(如语言理解、音乐生成等)需要考虑到长时间内的上下文信息。在这种情况下,传统的 RNN 可能无法有效地学习到正确的模式,导致性能下降。
为了解决这个问题,出现了一些改进的循环神经网络变体,如长短时记忆网络(LSTM)和门控循环单元(GRU)。这些模型通过引入门控机制,允许网络选择性地保留或遗忘信息,从而在处理长序列时更加有效。
长短期记忆网络(Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。
以预测下一个词举个例子,上一个细胞状态 C t − 1 C_{t-1} Ct−1 可能包含了当前主语的性别,如果要预测下一个词是主语的代词 (he, she),那么 C t − 1 C_{t-1} Ct−1 就可以用来决定到底是使用 he 还是 she,此时不应该忘记 C t − 1 C_{t-1} Ct−1。但是如果当前有新的主语,那么就应该忘记 C t − 1 C_{t-1} Ct−1 中的主语信息。
确定什么样的新信息被存放在当前细胞中:
这里有两部分操作。第一部分是通过一个 tanh 层产生一个当前时刻的候选细胞状态 C ~ t \tilde{C}_{t} C~t。第二部分是由 Sigmoid 组成的“输入门”产生的介于 0 到 1 之间的控制信号 I t I_{t} It,来控制 C ~ t \tilde{C}_{t} C~t 的输入程度。
在语言模型中,这个步骤相当于产生新的主语,用于代替旧的主语。
将旧的细胞状态 C t − 1 C_{t-1} Ct−1 更新为当前细胞状态 C ~ t \tilde{C}_{t} C~t:
有了“遗忘门”产生的控制信号 F t F_t Ft 和“输入门”产生的控制信号 I t I_{t} It,tanh 产生的候选细胞状态 C ~ t \tilde{C}_{t} C~t,就可以将 C t − 1 C_{t-1} Ct−1 更新为当前细胞状态 C t C_{t} Ct 。
首先,使用遗忘信号 F t F_{t} Ft 与 C t − 1 C_{t-1} Ct−1 相乘得到上一个细胞状态剩余下的信息;然后再使用输入信号 I t I_{t} It 乘以候选细胞状态 C ~ t \tilde{C}_{t} C~t 得到候选细胞剩余下的信息;最后将这两部分信息相加,就得到了最终当前时刻的细胞状态 C t C_{t} Ct。
确定输出最终值:
先前我们已经确定要传入下一时刻的细胞状态 C t C_{t} Ct,但是还没有决定当前的输出 H t H_t Ht,所以最后我们来决定最终的输出值。这里也包括两部分操作,第一部分就是由sigmoid组成的“输出门”产生的介于0到1之间的控制信号 O t O_t Ot ;第二部分是将最终产生的输出信息 tanh( C t C_t Ct)与控制信号 O t O_t Ot相乘,得到最终的 H t H_t Ht。
类比几个人站成一排,第一个人看一幅画(输入数据),描述给第二个人(隐层)……依此类推,到最后一个人(输出)的时候,画出来的画肯定不能看了(误差较大)。
反向传播就是:把画拿给最后一个人看(求取误差),然后最后一个人就会告诉前面的人下次描述时需要注意哪里(权值修正)。
一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。
目的是更新神经元参数,而神经元参数正是 z = w x + b z=wx+b z=wx+b 中的 ( w , b w,b w,b).对参数的更新,利用损失值loss对参数的导数, 并沿着负梯度方向进行更新。
生成式对抗网络,由一个生成器网络和一个判别器网络组成。判别器的训练目的是能够区分生成器的输出与来自训练集的真实图像,生成器的训练目的是欺骗判别器。值得注意的是,生成器从未直接见过训练集中的图像,它所知道的关于数据的信息都来自于判别器。
Transformer 结构:
Transformer 主要由两部分组成:编码器(Encoder)和解码器(Decoder)。
编码器:
编码器负责将输入序列(例如文本)转换为一系列高维度的隐藏表示。它包括多个相同结构的层堆叠在一起。
编码器可以堆叠多层,从而逐渐提取更丰富的特征。
解码器:
解码器接收编码器的输出(编码后的表示)和目标序列的前缀部分,以生成目标序列的下一个词。
自注意力机制(Self-Attention):类似于编码器,解码器中也使用了自注意力机制,但它会限制注意力只集中在当前位置之前的位置,以避免信息泄漏。
解码器也可以堆叠多层,以逐步生成目标序列。
注意力机制(Attention Mechanism):注意力机制是 Transformer 的关键组成部分,它允许模型在处理序列数据时,动态地关注输入中不同位置的信息,从而可以同时考虑到全局的上下文。
应用:
Transformer 最初是为了解决机器翻译问题而提出的,但它的架构也被广泛应用于各种自然语言处理任务,如文本摘要、问答系统、语言建模等。
GPT(Generative Pre-trained Transformer)的预训练任务指的是在大规模文本数据集上训练一个深度神经网络模型,使其学会理解和建模文本的语言模式、语法、语义等信息。
具体来说,GPT 使用了一个双向的自回归语言模型作为预训练任务。这意味着模型会根据上下文中的历史文本,来预测接下来的一个词或一个字符。在预训练的过程中,模型会在大量的文本数据上进行训练,使其尽可能地理解和捕获自然语言的各种规律和模式。
在预训练任务中,GPT 采用了 Transformer 结构,利用了自注意力机制(Self-Attention)来使模型能够在处理长序列时保持高效的性能。
通过这种预训练方式,GPT 成功地将大量的通用语言知识编码到了模型的参数中。这样,预训练完成后的模型可以用于许多下游任务,如文本生成、机器翻译、情感分析等,只需在预训练模型的基础上进行微调即可,无需从头开始训练一个新的模型。