96SEO 2026-02-19 11:16 22
href="https://www.cnblogs.com/ljbguanli/p/19623518"

aria-level="2">深入解析:Transformer
xmlns="http://www.w3.org/2000/svg"> style="-webkit-tap-highlight-color: 0)">d="M5,0
rgba(0,
的序列数据与序列模型
神经元结构
RNN
的长序列依赖问题
LSTM
的致命缺陷
id="_4">序列数据
序列是数据点或事件的有序列表。
与独立的图像或表格数据不同,序列数据中的元素具有内在的顺序和时间依赖性。
典型的例子包括:自然语言文本、语音、视频、股票价格、天气读数或传感器数据等。
在
领域,文本翻译、语音识别等场景都离不开对序列数据的处理。
传统的
CNN(卷积神经网络)在处理这类数据时会遇到根本性的困难,因为它们假设所有输入都是相互独立的,所以无法捕捉到数据点之间的时序关系。
比如在处理一个句子时,FNN
会孤立地看待每个单词,从而丢失了至关重要的上下文信息。
为了解决这个问题,我们需要一种能够
src="https://i-blog.csdnimg.cn/direct/22f3042b84c94d8a97dacd84a0c21939.png">
FNN(前馈神经网络)是一种全连接神经网络,每一层的神经元都和上下两层的每一个神经元完全连接。
并且信息只能沿着输入到输出的方向单向传播,不存在循环或反馈连接。
也就是说,数据从输入层进入,经过中间的隐藏层逐层处理后,最终由输出层输出结果,层与层之间的连接是
src="https://i-blog.csdnimg.cn/direct/4505b0d902e547c692364819f83db769.png">
而
领域的应用场景包括:
如:机器翻译、情感分析、聊天机器人。
值得注意的是,Sequence
的目标是发现序列数据中的模式和依赖关系,从而进行预测、分类,甚至生成新的序列。
当下经典的序列模型结构包括:RNN、LSTM、GRU、Transformer
任务所需要处理的文本往往是序列,因此专用于处理序列、时序数据的
任务中(尤其是在处理超长序列时)表现出了更强的性能和更好的并行性,但
它们在计算效率、对实时流数据的处理以及在某些特定任务上的表现依然具有优势。
src="https://i-blog.csdnimg.cn/direct/28d0658e9bbc4dfd816019af2498c2a7.png">
id="RNN_33">RNN(循环神经网络)
1990
Networks,循环神经网络)序列模型。
它开启了对序列数据和序列模型的研究,开创了模型能够
src="https://i-blog.csdnimg.cn/direct/7664db0774794f93bf6f0040b02a98dd.png">
RNN
个关键特性:
能够学习到序列元素之间的长距离依赖关系的前提。
Loop)
:通过在隐藏层的每个节点上添加一个反馈循环连接,使得它在处理序列中的每个元素(如一个词、一个时间点的数据)时,它不仅要考虑当前的输入,还要考虑它从之前所有步骤中计算并保留下来的“历史记忆”。
所以这个状态会随着网络处理输入序列中的每个元素而更新,就像是不断被刷新的
有限且无法长期保存。
的目的是捕捉序列数据中随时间分布的依赖关系和模式。
但受限于梯度消失,仅能有效学习短距离依赖,无法处理长序列(如超过
src="https://i-blog.csdnimg.cn/direct/fda0e1d83cfb4c839cc50fd7a95586ab.png">
在
模型中,时间步是处理序列元素的基本单位,一个时间步处理的就是一个序列元素。
所以一个序列由多个时间步(元素)组成,每个
神经元展开(Unfold)后,就成为了一个链式的结构,每一个环节表示一个时间步处理一个序列元素。
每个时间步(t)不仅会接收当前的输入
src="https://i-blog.csdnimg.cn/direct/72109e5aff0e42b48bcc8912a108099e.png">
src="https://i-blog.csdnimg.cn/direct/2f75e88125004a1a8bf807be7f15ab6b.png">
简单
的核心计算可以用以下两个公式来描述:
punctuation">)
start="2">
其中:
的输入向量,如文本中的词向量。
的隐藏状态,即:历史信息,是核心的记忆载体。
W_hy:分别是输入层到隐藏层、隐藏层到自循环隐藏层、隐藏层到输出层的权重矩阵。
作为共享参数,在所有时间步中是共享的。
隐藏层维度
1
Softmax(分类)或线性激活(回归)
src="https://i-blog.csdnimg.cn/direct/5b2af53bb3844bc89d5fb332a9190299.png">
RNN
计算,然后将梯度从最后一个时间步开始,沿着时间序列反向传播,并用这些梯度来更新共享的
src="https://i-blog.csdnimg.cn/direct/7f0512c32ff34014b82ffb20edf8e5aa.png">
class-name">SimpleRNN punctuation">. punctuation">( punctuation">. W_hy:分别是输入层到隐藏层、隐藏层到自循环隐藏层、隐藏层到输出层的权重矩阵。 作为共享参数,在所有时间步中是共享的。class="token
class="token
class="token
class="token
punctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
hidden_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
hidden_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
output_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
hidden_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
output_dimpunctuation">.
hidden_dimpunctuation">.
output_dim时间步:在序列模型中,时间步是处理序列数据的基本单位。
它代表了模型按顺序处理输入数据的一个
punctuation">.
zerospunctuation">.
hidden_dimpunctuation">(
x_seqpunctuation">.
shapepunctuation">.
unsqueeze计算序列输出,仅使用了最后一个隐藏状态来计算最终输出的分类结果
punctuation">.
log_softmaxpunctuation">(
y_finalpunctuation">(
vocab步骤2:训练数据,使用空格作为词元的分隔符,并且进行了数据的手动标注。
function">text2onehot punctuation">. 生成One-Hot向量(输入维度=vocab_size)class="token
class="token
punctuation">.zeros punctuation">( punctuation">[ punctuation">. punctuation">( punctuation">. punctuation">( punctuation">( punctuation">. 使用负对数似然损失计算方法,对应log_softmax的损失函数class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
punctuation">(model punctuation">. punctuation">( punctuation">. punctuation">[ punctuation">( 关键修改:先squeeze去掉最后一维→[2],再reshape为[1,2](batch_size=1,类别数=2)class="token
class="token
class="token
class="token
class="token
class="token
punctuation">.squeeze punctuation">. 计算损失(现在维度完全匹配:input[1,2],target[1])class="token
class="token
punctuation">(
y_pred_reshapedpunctuation">.
zero_gradpunctuation">.
backwardpunctuation">{
epochpunctuation">}
punctuation">{
total_losspunctuation">(
train_datapunctuation">}
punctuation">.
no_gradpunctuation">(
x_seqpunctuation">.
squeezepunctuation">.
reshapepunctuation">.
argmaxpunctuation">(
y_pred_reshapedpunctuation">}
punctuation">{
emotionpunctuation">}
punctuation">{
pred_labelpunctuation">}
punctuation">(
predictpunctuation">(
predictpunctuation">(
predict局限示例(>5个词/含矛盾语义,分类失败)
punctuation">(
predictpunctuation">(
predictpunctuation">(
predict真实情感:中性/偏负面,纯RNN会分类错误
执行输出:
id="_PyTorch__2__RNN_283">
使用的容量大,能拟合更复杂的序列规律,比如长文本的上下文依赖。
这是一个
先经过第一层过滤器提取基础特征,再经过第二层(甚至更多层)提取更抽象的特征,最后
punctuation">.replace
class="token
punctuation">.
replaceclass="token
punctuation">(
charsclass="token
punctuation">(
charsclass="token
punctuation">(
charsclass="token
function">build_data
class="token
punctuation">.
tensorclass="token
punctuation">[
char2idxclass="token
punctuation">.
tensorclass="token
punctuation">[
char2idxclass="token
punctuation">(
vocab_sizeclass="token
punctuation">.
appendclass="token
punctuation">(
x_onehotclass="token
punctuation">(
train_dataclass="token
class-name">SimpleTwoLayerRNN
class="token
punctuation">.
Moduleclass="token
punctuation">.
__init__class="token
punctuation">.
Parameterclass="token
punctuation">(
torchclass="token
punctuation">.
randnclass="token
punctuation">(
hidden_dim1class="token
punctuation">.
Parameterclass="token
punctuation">(
torchclass="token
punctuation">.
randnclass="token
punctuation">(
hidden_dim1class="token
punctuation">.
Parameterclass="token
punctuation">(
torchclass="token
punctuation">.
zerosclass="token
punctuation">(
hidden_dim1class="token
punctuation">.
Parameterclass="token
punctuation">(
torchclass="token
punctuation">.
randnclass="token
punctuation">(
hidden_dim2class="token
punctuation">.
Parameterclass="token
punctuation">(
torchclass="token
punctuation">.
randnclass="token
punctuation">(
hidden_dim2class="token
punctuation">.
Parameterclass="token
punctuation">(
torchclass="token
punctuation">.
zerosclass="token
punctuation">(
hidden_dim2class="token
punctuation">.
Parameterclass="token
punctuation">(
torchclass="token
punctuation">.
randnclass="token
punctuation">(
output_dimclass="token
punctuation">.
Parameterclass="token
punctuation">(
torchclass="token
punctuation">.
zerosclass="token
punctuation">(
output_dimclass="token
punctuation">.
zerosclass="token
punctuation">.
W_hh1class="token
punctuation">.
shapeclass="token
punctuation">.
zerosclass="token
punctuation">.
W_hh2class="token
punctuation">.
shapeclass="token
punctuation">(
x_seqclass="token
punctuation">.
shapeclass="token
punctuation">.
unsqueezeclass="token
punctuation">(
torchclass="token
punctuation">.
matmulclass="token
punctuation">.
W_hh1class="token
punctuation">.
matmulclass="token
punctuation">.
W_xh1class="token
punctuation">(
torchclass="token
punctuation">.
matmulclass="token
punctuation">.
W_hh2class="token
punctuation">.
matmulclass="token
punctuation">.
W_h1h2class="token
punctuation">.
matmulclass="token
punctuation">.
log_softmaxclass="token
punctuation">.
squeezeclass="token
punctuation">.
appendclass="token
punctuation">.
stackclass="token
punctuation">(
all_predsclass="token
punctuation">(
vocab_sizeclass="token
punctuation">.
NLLLossclass="token
punctuation">(
modelclass="token
punctuation">.
parametersclass="token
训练轮次500,每100轮打印loss(更清晰看到训练趋势)
punctuation">.
zero_gradclass="token
punctuation">(
predsclass="token
punctuation">.
backwardclass="token
每100轮打印一次loss(减少冗余输出,聚焦趋势)
punctuation">(
epochclass="token
punctuation">(
train_dataclass="token
punctuation">{
epochclass="token
punctuation">}
class="token
punctuation">{
avg_lossclass="token
punctuation">}
class="token
function">generate_text
class="token
punctuation">(
prefixclass="token
punctuation">.
no_gradclass="token
punctuation">(
prefixclass="token
punctuation">.
zerosclass="token
punctuation">(
hidden_dim1class="token
punctuation">.
zerosclass="token
punctuation">(
hidden_dim2class="token
punctuation">(
vocab_sizeclass="token
punctuation">[
char2idxclass="token
punctuation">.
unsqueezeclass="token
punctuation">(
torchclass="token
punctuation">.
matmulclass="token
punctuation">(
modelclass="token
punctuation">.
W_hh1class="token
punctuation">.
matmulclass="token
punctuation">(
modelclass="token
punctuation">.
W_xh1class="token
punctuation">(
torchclass="token
punctuation">.
matmulclass="token
punctuation">(
modelclass="token
punctuation">.
W_hh2class="token
punctuation">.
matmulclass="token
punctuation">(
modelclass="token
punctuation">.
W_h1h2class="token
逐字符生成(生成长度从10→20,更能体现效果)
punctuation">(
vocab_sizeclass="token
punctuation">[
char2idxclass="token
punctuation">[
last_charclass="token
punctuation">.
unsqueezeclass="token
punctuation">(
torchclass="token
punctuation">.
matmulclass="token
punctuation">(
modelclass="token
punctuation">.
W_hh1class="token
punctuation">.
matmulclass="token
punctuation">(
modelclass="token
punctuation">.
W_xh1class="token
punctuation">(
torchclass="token
punctuation">.
matmulclass="token
punctuation">(
modelclass="token
punctuation">.
W_hh2class="token
punctuation">.
matmulclass="token
punctuation">(
modelclass="token
punctuation">.
W_h1h2class="token
punctuation">.
matmulclass="token
punctuation">(
modelclass="token
punctuation">.
argmaxclass="token
punctuation">[
next_idxclass="token
punctuation">.
appendclass="token
punctuation">(
next_charclass="token
punctuation">(
prefixclass="token
punctuation">{
prefixclass="token
punctuation">}
class="token
punctuation">{
gen_resultclass="token
punctuation">}
class="token
punctuation">)
执行输出:
生成:千山月月,万径人踪灭。
孤舟蓑笠翁,独钓寒
src="https://i-blog.csdnimg.cn/direct/fda0e1d83cfb4c839cc50fd7a95586ab.png">
通常适合用于以下任务:
src="https://i-blog.csdnimg.cn/direct/9e87097cfc9542c19a194a868e51d165.png">
1-N1-N
就是一张图片,输出就是一段图片的描述文字。
可以有两种方式实现
src="https://i-blog.csdnimg.cn/direct/f4848fbe253a4a568a6cf458420c1be9.png">
src="https://i-blog.csdnimg.cn/direct/8172b52ccb3141a785424b8437bf8474.png">
y。
适合用于以下任务:
src="https://i-blog.csdnimg.cn/direct/d06d90d7b6ed4353ac104be306ace59b.png">
的设计在理论上能够捕捉任意长度的序列依赖关系,但在实践中,RNN
训练的输入序列太长时,早期时间步的梯度会逐渐消失,导致模型无法记住早期信息,例如:在句子
id="_482">梯度消失
梯度消失(Vanishing
反向传播过程中,梯度随着时间步或隐藏层数的增加而指数级衰减,导致远离输出层的参数几乎无法得到有效更新。
最早在
网络中进行反向传播时,他会发现前面隐藏层的权重参数几乎不更新了,因为这时的梯度几乎为零。
梯度消失的根本原因是
的权重矩阵。
经过多个时间步后,梯度就会越来越小,几乎接近于零。
继而导致网络无法更新前面层的权重,推理时会表现出
末步梯度”,即:序列开始位置的梯度远远地小于结束位置。
如下所示:
梯度消失的数学原理在反向传播的梯度计算链式法则上,链式法则的连乘导致了早期梯度的
punctuation">)
start="2">
- 反向传播中的梯度链式法则:
punctuation">(tanh'
class="token
punctuation">(
tanh'class="token
1,那么早期梯度会出现指数级的衰减。
“历史记忆”
实际上是短暂的,这限制了它在需要理解长篇文本或分析长期时间序列等任务中的应用。
梯度爆炸
梯度爆炸(Exploding
Gradients):和梯度消失相反,如果权重矩阵的值很大,梯度在反向传播过程中可能会指数级增长,导致数值溢出(FP32/16)和训练过程的不稳定。
梯度爆炸可以通过梯度裁剪(Gradient
Clipping)等技术相对容易地解决,相对的梯度消失问题则更为棘手。
id="LSTM_534">LSTM(长短期记忆网络)
1997
年,Sepp
RNN,它通过使用专门的记忆单元和门控机制来序列数据中的长期依赖关系,能够学习到
“何时”
id="_540">模型结构与数学表达
LSTM
的核心思想是随时间选择性地记住或遗忘信息,通过记忆单元的线性传递路径(类似信息高速公路)和门控机制,避免梯度在长序列中衰减,相当于为梯度传递安装了中继器。
LSTM
RNN
中的隐藏层单元换成了一种具有特殊记忆功能的循环体结构,在隐藏层状态
h_t
梯度消失的问题。
State)。
个关键的门,它们互相协作共同更新当前时间步的记忆单元状态(如图最上方连线)。
门的本质是一个由
表示保留部分信息。
src="https://i-blog.csdnimg.cn/direct/7aeedf4385d84935855bc974b35880fe.png">
punctuation">)
start="2">
C̃_t,该向量可以被添加到记忆单元状态中。
punctuation">)
中的门控机制约束了哪些信息是可以遗忘的、哪些信息是可以记住的、哪些信息是可以输出的。
其独特的
的值,从而允许梯度在许多时间步内几乎无衰减地流动,这样就解决了
“基石”,以简单的循环结构开创了历史信息复用的思路,但受限于梯度消失无法处理长序列;LSTM
则通过记忆细胞和门控机制的创新,从梯度传递路径上解决了长期依赖问题,成为长序列任务的经典方案。
RNN
优势:
RNN
劣势:
LSTM
优势:
LSTM
劣势:
src="https://i-blog.csdnimg.cn/direct/06e8b042648f435cae05435ad439b4db.png">
下面是一个
LSTM,对比结果如下:
LSTM
收敛更快,且最终损失更低,表明其对序列建模更有效。
LSTM
预测波动性较大。
LSTM
预测散点图
LSTM
点更集中在理想线附近,说明相关性更高。
src="https://i-blog.csdnimg.cn/direct/2f8ea0ac4c944c2bab72a4f3f017247c.png">
punctuation">.preprocessing
punctuation">.
utilsclass="token
punctuation">.
randomclass="token
punctuation">.
manual_seedclass="token
punctuation">.
arangeclass="token
punctuation">.
randomclass="token
punctuation">.
normalclass="token
punctuation">(
scaleclass="token
punctuation">.
DataFrameclass="token
punctuation">.
fit_transformclass="token
class-name">TimeSeriesDataset
class="token
punctuation">(
Datasetclass="token
punctuation">.
seq_length
punctuation">.
seq_length
function">__getitem__
class="token
punctuation">.
seq_lengthclass="token
punctuation">.
seq_lengthclass="token
punctuation">.
FloatTensorclass="token
punctuation">.
FloatTensorclass="token
punctuation">.
valuesclass="token
punctuation">:
train_sizeclass="token
punctuation">.
valuesclass="token
punctuation">[
train_size
punctuation">(
train_dataclass="token
punctuation">(
test_dataclass="token
punctuation">(
train_datasetclass="token
punctuation">(
test_datasetclass="token
class-name">RNNModel
class="token
punctuation">.
Moduleclass="token
punctuation">(
RNNModelclass="token
punctuation">.
__init__class="token
punctuation">(
input_sizeclass="token
punctuation">.
Linearclass="token
punctuation">(
hidden_sizeclass="token
punctuation">.
unsqueezeclass="token
class-name">LSTMModel
class="token
punctuation">.
Moduleclass="token
punctuation">(
LSTMModelclass="token
punctuation">.
__init__class="token
punctuation">(
input_sizeclass="token
punctuation">.
Linearclass="token
punctuation">(
hidden_sizeclass="token
punctuation">.
unsqueezeclass="token
function">train_model
class="token
punctuation">(
modelclass="token
punctuation">.
MSELossclass="token
punctuation">.
optimclass="token
punctuation">(
modelclass="token
punctuation">.
parametersclass="token
punctuation">(
num_epochsclass="token
punctuation">.
zero_gradclass="token
punctuation">(
x_batchclass="token
punctuation">(
outputclass="token
punctuation">.
backwardclass="token
punctuation">.
appendclass="token
punctuation">(
modelclass="token
punctuation">.
no_gradclass="token
punctuation">(
x_batchclass="token
punctuation">.
appendclass="token
punctuation">.
appendclass="token
punctuation">(
y_batchclass="token
punctuation">.
arrayclass="token
punctuation">(
predictionsclass="token
punctuation">.
arrayclass="token
punctuation">(
actualsclass="token
punctuation">(
rnn_modelclass="token
punctuation">(
lstm_modelclass="token
punctuation">(
rnn_modelclass="token
punctuation">(
lstm_modelclass="token
punctuation">.
inverse_transformclass="token
punctuation">(
rnn_predsclass="token
punctuation">.
reshapeclass="token
punctuation">.
flattenclass="token
punctuation">.
inverse_transformclass="token
punctuation">(
lstm_predsclass="token
punctuation">.
reshapeclass="token
punctuation">.
flattenclass="token
punctuation">.
inverse_transformclass="token
punctuation">(
lstm_actualsclass="token
punctuation">.
reshapeclass="token
punctuation">.
flattenclass="token
punctuation">.
figureclass="token
punctuation">(
figsizeclass="token
punctuation">.
subplotclass="token
punctuation">(
rnn_lossesclass="token
punctuation">(
lstm_lossesclass="token
string">'mediumseagreen'
class="token
punctuation">.
titleclass="token
string">'训练损失随Epoch变化图'
class="token
punctuation">.
xlabelclass="token
punctuation">.
ylabelclass="token
punctuation">.
legendclass="token
punctuation">.
subplotclass="token
punctuation">(
actuals_invclass="token
punctuation">(
rnn_preds_invclass="token
string">'darkorange'
class="token
punctuation">(
lstm_preds_invclass="token
string">'dodgerblue'
class="token
punctuation">.
titleclass="token
string">'测试集预测结果比较'
class="token
punctuation">.
xlabelclass="token
punctuation">.
ylabelclass="token
punctuation">.
legendclass="token
punctuation">.
subplotclass="token
punctuation">(
rnn_errorclass="token
punctuation">(
lstm_errorclass="token
punctuation">.
titleclass="token
string">'预测误差分布直方图'
class="token
punctuation">.
xlabelclass="token
punctuation">.
ylabelclass="token
punctuation">.
legendclass="token
punctuation">.
subplotclass="token
punctuation">.
scatterclass="token
punctuation">(
actuals_invclass="token
punctuation">.
scatterclass="token
punctuation">(
actuals_invclass="token
punctuation">(
actuals_invclass="token
punctuation">.
titleclass="token
punctuation">.
xlabelclass="token
punctuation">.
ylabelclass="token
punctuation">.
legendclass="token
punctuation">.
tight_layoutclass="token
punctuation">)
2014
相当性能的同时,结构更简单,参数更少,计算效率更高。
id="_946">模型结构和数据表达
src="https://i-blog.csdnimg.cn/direct/6d2db80b8d144fafb236020988543bfc.png">
GRU
Gate),并且它还合并了记忆单元状态和隐藏状态。
GRU
只有两个门:
Gate)
:决定了应该在多大程度上保留前一个时间步的信息,以及在多大程度上接收新生成的信息。punctuation">)
start="2">
Gate)
:决定了在计算新的候选隐藏状态时,应该忽略多少过去的信息。punctuation">)
start="3">
src="https://i-blog.csdnimg.cn/direct/8f33fe7d43a6425290e2b4c813ce49b7.png">
class-name">SimpleGRU punctuation">. punctuation">( punctuation">. 权重初始化用*0.1避免梯度爆炸,偏置初始化为0(GRU最佳实践)class="token
class="token
class="token
class="token
更新门(z_t):融合遗忘门+输入门,控制旧/新信息的保留比例
punctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
hidden_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
hidden_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
zerospunctuation">(
hidden_dim重置门(r_t):控制计算候选状态时,忽略多少过去的隐藏状态
punctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
hidden_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
hidden_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
zerospunctuation">(
hidden_dim候选隐藏状态(h̃_t):生成待融合的新隐藏状态
punctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
hidden_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
hidden_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
zerospunctuation">(
hidden_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
randnpunctuation">(
output_dimpunctuation">.
Parameterpunctuation">(
torchpunctuation">.
zerospunctuation">(
output_dimpunctuation">.
hidden_dimpunctuation">.
output_dimGRU前向传播(序列级分类:仅用最后一个时间步的隐藏状态输出)
核心:仅维护隐藏状态h(GRU无细胞状态c,结构比LSTM更简洁)
punctuation">.
zerospunctuation">.
hidden_dimpunctuation">(
x_seqpunctuation">.
shapepunctuation">.
unsqueezez_t越接近1:越倾向于使用新的候选状态h̃_t;越接近0:越倾向于保留旧状态h_prev
punctuation">.sigmoid r_t越接近0:越忽略旧状态h_prev,仅用当前输入x_t计算候选状态;越接近1:越保留旧状态class="token
punctuation">.sigmoid 核心:重置门r_t按元素乘h_prev,控制旧状态对候选状态的影响class="token
序列级分类:用最后一个时间步的隐藏状态计算输出(和原LSTM/RNN逻辑一致)
punctuation">.log_softmax punctuation">( punctuation">( function">text2onehot punctuation">. punctuation">. punctuation">( punctuation">[ punctuation">. punctuation">( punctuation">. punctuation">( punctuation">( 核心修改:SimpleLSTM→SimpleGRUclass="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
punctuation">.NLLLoss punctuation">( punctuation">. punctuation">( punctuation">. punctuation">[ punctuation">( punctuation">. punctuation">. punctuation">( punctuation">. punctuation">. punctuation">{ punctuation">} punctuation">{ punctuation">( punctuation">} punctuation">. punctuation">( punctuation">. punctuation">. punctuation">. punctuation">( punctuation">} punctuation">{ punctuation">} punctuation">{ punctuation">} punctuation">( punctuation">( punctuation">( 复杂示例(GRU能正确分类,效果和LSTM相当,结构更简洁)class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
punctuation">(
predictpunctuation">(
predictpunctuation">(
predict只含有两个门控结构,结构更为简单,参数更少,收敛速度更快。
但因为
的适用场景不同:
的强大记忆能力可以发挥优势。
例如,处理长篇文章的情感分析、机器翻译等任务。
例如:我们分析的是一篇长篇博客文章,其中前半部分描述了一个积极的事件,而后半部分充满了负面情感。
要准确捕捉这种情感转变,LSTM
可能是更好的选择,因为它能够通过遗忘门和记忆单元,逐步积累并更新情感信息,从而做出更精确的情感判断。
通常是更好的选择。
它的计算效率更高,且在短期依赖场景下表现优异。
例如:在分析推特或短句子的情感时,GRU的效率优势更加明显。
GRU能快速处理短文本的情感特征,并及时提供预测结果,这对实时分析推特流的情感趋势尤其重要。
在某些场景下,可以尝试混合使用
GRU,取长补短。
例如:在情感分析任务中,如果希望获得高效且准确的模型,可以考虑使用
处理长篇文本情感。
通过这种组合方式,可以兼顾速度和准确性,提升整体模型表现。
另外,除了适用场景之外,在选择
时,需要考虑以下因素:
的表现也可以达到满意水平。
具有更少的参数和更简洁的结构,因此在计算效率方面更优。
可能更适合,因为它具有更强的表达能力。
而对于小规模数据,GRU
的表现也可以达到满意水平。
至今为止,GRU
在序列处理场景中的价值已经得到了验证,它们两者各有优缺点。
理解它们的区别和适用场景,能够帮助你在不同任务中做出更优的选择。
id="RNN_EncoderDecoder_1143">RNN
仅适用于输入和输出等长的任务。
但实际中很多任务的序列的长度是不固定的,例如机器翻译中,源语言和目标语言的句子长度是不一样的;再例如对话系统中,问题和答案的句子长度也是不一样的。
2014
的问题。
比如:翻译场景中,英文句子长、中文句子短;摘要场景中,原文长、摘要短等等。
RNN
src="https://i-blog.csdnimg.cn/direct/4cc7781645f04b70b2264cd241c903bf.png">
Encoder(编码器):用于编码
向量包含了可供计算与学习的、代表句子语言特点和含义的特征信息,是输入的浓缩摘要。
具体逻辑为:
会对输入句子的每个词进行处理,处理每个词之后会产生一个隐藏状态。
每个时刻的输入都是上一个时间步的隐藏状态和输入的新单词。
输出的最后一个时间步的隐藏状态就是编码了整个句子语义的语义上下文(Context),这是一个固定长度的高维特征向量
C,输入句子每个时间步的信息都包含在了这个上下文中。
Decoder(解码器):用于解码输出序列的信息。
得到上下文信息向量
学习到的特征信息再转化为相应的句子。
具体逻辑为:
的每个预测都受到先前输出词和隐藏状态的微妙影响。
接着用新的隐藏状态和第一个输出词作为联合输入来计算第二个输出词,以此类推,直到解码器产生一个
Service,序列结束)标记或者达到预定序列长度的边界。
隐状状态(Hidden
src="https://i-blog.csdnimg.cn/direct/c7bcd46cee484daeae9adca28f8aeb64.gif">
RNN
架构在短句子上有非常好的表现。
但是一个关键问题在于,Encoder
处理长句子,尤其是那些比训练语料中的句子还长的句子。
随着输入句子长度的增加,Encoder-Decoder
src="https://i-blog.csdnimg.cn/direct/33a59b094e5c4a5390921fa072a9d7ec.png">
RNN在
架构在通用序列任务的适配性,让架构更具泛化性。
两者虽然有不同的作者,但他们提出了同源的思想和架构。
后来,Seq2Seq
“Seq2Seq(Encoder–Decoder)模型”。
虽然具有捕捉时序信息、适合序列生成的优点,却有两个难以弥补的缺陷:
无法并行化:序列依序计算的模式能够很好地模拟时序信息,但限制了计算机并行计算的能力。
由于序列需要依次输入、依序计算,GPU
为基础架构的模型虽然参数量不算特别大,但计算时间成本却很高;
超长距离依赖问题:在
需要将整个序列读入内存依次计算,也限制了序列的长度。
第一个词的隐藏状态信息在经过几十个甚至几百个时间步的传递后,会逐渐衰减甚至丢失。
虽然
中通过门机制对此进行了一定优化,但对于较远距离相关关系的捕捉,RNN
依旧是不如人意的。
如下图所示,BLEU(Bilingual
Understudy)是一种自动评价机器翻译质量的指标,得分一般在
之间。
得分越高,表示机器翻译结果与参考翻译越接近,质量越好。
可见
src="https://i-blog.csdnimg.cn/direct/260b010011ef47379d84bda8e8882042.png">
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback