Transformer 算法模型详解

24243dbee268d39fb766ed28b698992e.jpeg

 核心点:完整讲解Transformer模型!

让我们用简单的语言来解释:想象一下,你正在阅读一本书,书中的每个字都很重要。但如果你每次只能关注一个字,理解整本书就会变得很慢。而Transformer模型就像是赋予你超能力,让你一次性查看整页的所有字,并根据上下文判断哪些字更重要。这样,你就能更快、更准确地理解书的内容。


基本概念

Transformer模型是一种用于处理语言数据的神经网络模型,非常适合用于翻译、文本生成和理解等任务。它是在2017年由谷歌的研究团队提出的,已经成为自然语言处理(NLP)领域的主流方法。Transformer模型通过引入围绕自注意力机制的新颖方法,重塑了自然语言处理(NLP)的格局。

下面,从是什么?结构组成、注意力机制、多头注意力先进行解释~

是什么?

Transformer是一种深度学习模型,用于处理和生成自然语言。它能理解人类语言并生成类似的文本,成为AI领域的重要突破。

结构组成

"Transformer模型,其核心元素包括编码器(Encoder)和解码器(Decoder),各自扮演着读取与生成文本的重任。它们的协同工作主要通过一种独特的“注意力机制”(Attention Mechanism)实现,使得机器能够精准理解并回应输入信息。"

注意力机制

注意力机制,作为Transformer模型的精髓所在,赋予其独特的“关注”能力。这种机制让模型能全面审视输入数据,而非逐一处理词汇。譬如,面对一句长句,模型能同时顾及其中的每一个字,从而提高处理效率。

"Transformer模型的卓越之处在于其独创的“多头注意力”机制。这一机制使得模型能够从多个并行的关注视角进行运算,极大地增强了信息的捕捉能力。这就如同拥有多个独立的观察者,每个都能够发现不同的细节,从而为我们提供了全面、深入的理解。"

那么,为什么 Transformer如此重要?!

首先是,高效处理长文本

优化后的文章:
"Transformer模型以并行处理和注意力机制,摒弃了传统RNN在处理长文本时的低效性,从而提升了对长文本的处理效率。"

其次,更好的表现

Transformer模型在NLP任务中大放异彩,如机器翻译、文本摘要和问答系统等。其速度与准确率兼具优势。

Transformer模型凭借其独特的注意力机制和结构设计,在处理自然语言方面相较于传统方法更具高效性和准确性,成为现代NLP任务中至关重要的关键技术。

a46c84c30367039f199a717245c08d81.jpeg

理论基础

为了便于理解,下面我们会分为以下几个部分进行讲解:

  • 输入表示
  • 注意力机制
  • 多头注意力
  • 前馈神经网络
  • 位置编码
  • 整个Transformer整体架构

1. 输入表示(Input Representation)

将文本转换为向量形式是处理自然语言的关键步骤。我们通常使用词嵌入技术来表示每个单词。假设输入句子的长度为$n$,词嵌入的维度为$d$,那么输入可以表示为一个$n \times d$的矩阵。

2. 注意力机制(Attention Mechanism)

注意力机制,作为Transformer的灵魂,通过计算三个矩阵:查询矩阵、键矩阵和值矩阵,实现对输入序列的深入理解。

  • 查询矩阵 
  • 键矩阵 
  • 值矩阵 

其中, 、 和  是可训练的权重矩阵。

2.1 计算注意力得分

注意力得分通过点积计算得到:

2.2 详细步骤
  1. 计算点积: 
  2. 除以 : 
  3. 应用 softmax: ,得到注意力权重矩阵
  4. 加权求和: 

3. 多头注意力机制(Multi-head Attention)


多头注意力机制是一种将输入分成多个头进行独立计算的机制,然后将结果拼接起来并投影到输出空间。这种机制可以提高模型的性能和效率。

3.1 分头计算

假设有  个头,每个头的维度为 :

每个头独立计算注意力:

3.2 拼接与线性变换

将所有头的输出拼接起来:

其中  是可训练的投影矩阵。

4. 前馈神经网络(Feed Forward Neural Network)

"注意力头的产出,经由前馈神经网络深化处理。该网络结构包含两个线性变换和ReLU激活函数。"

其中,  和  是权重矩阵,  和  是偏置。

5. 位置编码(Positional Encoding)

Transformer模型中的位置编码是一种将词向量中添加位置信息的技术,可以让Transformer模型理解序列中每个词的相对位置,提高模型对文本的理解能力。位置编码可以通过正弦和余弦函数生成。

对于输入位置  和维度 :

将位置编码添加到输入嵌入向量中:

6. Transformer整体架构

一个完整的Transformer模型由多个编码器层和解码器层组成。

6.1 编码器层(Encoder Layer)

每个编码器层包括以下几个步骤:

  1. 多头注意力机制: 
  2. 残差连接和层归一化: 
  3. 前馈神经网络: 
  4. 残差连接和层归一化: 
6.2 解码器层(Decoder Layer)

每个解码器层与编码器层类似,但多了一个编码器-解码器注意力层:

  1. 自注意力机制(Masked MultiHead Attention): 
  2. 残差连接和层归一化: 
  3. 编码器-解码器注意力机制: (这里  是解码器的输出,  和  是编码器的输出)
  4. 残差连接和层归一化: 
  5. 前馈神经网络: 
  6. 残差连接和层归一化: 

7. 总结

  • 输入嵌入:将输入文本转化为嵌入向量,加上位置编码。
  • 多头注意力机制:计算查询、键和值的注意力,捕捉输入的不同部分。
  • 前馈神经网络:通过两个线性变换和ReLU激活处理注意力输出。
  • 残差连接和层归一化:保持网络的稳定性和信息流动。

这种架构让Transformer模型在处理自然语言任务方面大放异彩,轻松应对长文本并生成高质量的输出。

完整案例

Transformer是一种基本的框架,它在自然语言处理领域中被广泛应用。下面是一些关键代码,可以帮助你开始构建和理解Transformer。

import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

df = pd.read_csv('IMDB Dataset.csv')

# 数据预处理
df['text'] = df['review'].str.lower()  # 将文本转换为小写
df['text']&nbsp;=&nbsp;df['text'].str.replace('<br&nbsp;/>',&nbsp;'&nbsp;')&nbsp;&nbsp;#&nbsp;清洗HTML标签

#&nbsp;划分训练集和测试集
train_texts,&nbsp;val_texts,&nbsp;train_labels,&nbsp;val_labels&nbsp;=&nbsp;train_test_split(df['text'],&nbsp;df['sentiment'],&nbsp;test_size=0.2,&nbsp;random_state=42)

数据处理

在Transformer模型中,将文本转换为数字序列以便处理。Tokenizer在此过程中发挥关键作用,实现文本向量化。

#&nbsp;设定参数
max_len&nbsp;=&nbsp;200&nbsp;&nbsp;#&nbsp;句子的最大长度
vocab_size&nbsp;=&nbsp;10000&nbsp;&nbsp;#&nbsp;词汇表的大小
embedding_dim&nbsp;=&nbsp;128&nbsp;&nbsp;#&nbsp;词嵌入的维度

#&nbsp;实例化和拟合Tokenizer
tokenizer&nbsp;=&nbsp;Tokenizer(num_words=vocab_size,&nbsp;oov_token='<OOV>')
tokenizer.fit_on_texts(train_texts)

#&nbsp;序列化文本
train_sequences&nbsp;=&nbsp;tokenizer.texts_to_sequences(train_texts)
val_sequences&nbsp;=&nbsp;tokenizer.texts_to_sequences(val_texts)

#&nbsp;填充序列
train_padded&nbsp;=&nbsp;pad_sequences(train_sequences,&nbsp;maxlen=max_len,&nbsp;padding='post',&nbsp;truncating='post')
val_padded&nbsp;=&nbsp;pad_sequences(val_sequences,&nbsp;maxlen=max_len,&nbsp;padding='post',&nbsp;truncating='post')

构建Transformer模型

这是一个精简的Transformer模型示例,包括自注意力层、前馈神经网络层和残差连接,以提高文本生成的效果。

from&nbsp;tensorflow.keras.layers&nbsp;import&nbsp;Input,&nbsp;Dense,&nbsp;Embedding,&nbsp;GlobalAveragePooling1D,&nbsp;Dropout
from&nbsp;tensorflow.keras.layers&nbsp;import&nbsp;LayerNormalization,&nbsp;MultiHeadAttention,&nbsp;Dense,&nbsp;GlobalAveragePooling1D
from&nbsp;tensorflow.keras.models&nbsp;import&nbsp;Model

class&nbsp;MultiHeadSelfAttention(tf.keras.layers.Layer):
&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;embed_dim,&nbsp;num_heads=8):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(MultiHeadSelfAttention,&nbsp;self).__init__()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.embed_dim&nbsp;=&nbsp;embed_dim
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.num_heads&nbsp;=&nbsp;num_heads
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.head_dim&nbsp;=&nbsp;embed_dim&nbsp;//&nbsp;num_heads
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert&nbsp;embed_dim&nbsp;%&nbsp;num_heads&nbsp;==&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.query_dense&nbsp;=&nbsp;Dense(embed_dim)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.key_dense&nbsp;=&nbsp;Dense(embed_dim)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.value_dense&nbsp;=&nbsp;Dense(embed_dim)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.combine_heads&nbsp;=&nbsp;Dense(embed_dim)
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;call(self,&nbsp;inputs):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query&nbsp;=&nbsp;self.query_dense(inputs)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;self.key_dense(inputs)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;self.value_dense(inputs)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query&nbsp;=&nbsp;self.split_heads(query)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;self.split_heads(key)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;self.split_heads(value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scaled_attention&nbsp;=&nbsp;self.self_attention(query,&nbsp;key,&nbsp;value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scaled_attention&nbsp;=&nbsp;tf.transpose(scaled_attention,&nbsp;perm=[0,&nbsp;2,&nbsp;1,&nbsp;3])
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;original_shape&nbsp;=&nbsp;tf.shape(scaled_attention)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scaled_attention&nbsp;=&nbsp;tf.reshape(scaled_attention,&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(original_shape[0],&nbsp;original_shape[1],&nbsp;self.embed_dim))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputs&nbsp;=&nbsp;self.combine_heads(scaled_attention)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;outputs
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;split_heads(self,&nbsp;x):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;batch_size&nbsp;=&nbsp;tf.shape(x)[0]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;tf.reshape(x,&nbsp;(batch_size,&nbsp;-1,&nbsp;self.num_heads,&nbsp;self.head_dim))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;tf.transpose(x,&nbsp;perm=[0,&nbsp;2,&nbsp;1,&nbsp;3])
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;self_attention(self,&nbsp;query,&nbsp;key,&nbsp;value):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matmul_qk&nbsp;=&nbsp;tf.matmul(query,&nbsp;key,&nbsp;transpose_b=True)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;depth&nbsp;=&nbsp;tf.cast(tf.shape(key)[-1],&nbsp;tf.float32)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logits&nbsp;=&nbsp;matmul_qk&nbsp;/&nbsp;tf.math.sqrt(depth)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attention_weights&nbsp;=&nbsp;tf.nn.softmax(logits,&nbsp;axis=-1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output&nbsp;=&nbsp;tf.matmul(attention_weights,&nbsp;value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;output

class&nbsp;TransformerBlock(tf.keras.layers.Layer):
&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;embed_dim,&nbsp;num_heads,&nbsp;ff_dim,&nbsp;rate=0.1):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(TransformerBlock,&nbsp;self).__init__()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.att&nbsp;=&nbsp;MultiHeadSelfAttention(embed_dim,&nbsp;num_heads)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ffn&nbsp;=&nbsp;tf.keras.Sequential([
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dense(ff_dim,&nbsp;activation='relu'),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dense(embed_dim)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;])
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.layernorm1&nbsp;=&nbsp;LayerNormalization(epsilon=1e-6)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.layernorm2&nbsp;=&nbsp;LayerNormalization(epsilon=1e-6)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.dropout1&nbsp;=&nbsp;Dropout(rate)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.dropout2&nbsp;=&nbsp;Dropout(rate)
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;call(self,&nbsp;inputs,&nbsp;training=None):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attn_output&nbsp;=&nbsp;self.att(inputs)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attn_output&nbsp;=&nbsp;self.dropout1(attn_output,&nbsp;training=training)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out1&nbsp;=&nbsp;self.layernorm1(inputs&nbsp;+&nbsp;attn_output)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ffn_output&nbsp;=&nbsp;self.ffn(out1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ffn_output&nbsp;=&nbsp;self.dropout2(ffn_output,&nbsp;training=training)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self.layernorm2(out1&nbsp;+&nbsp;ffn_output)


#&nbsp;构建Transformer模型
embed_dim&nbsp;=&nbsp;embedding_dim
num_heads&nbsp;=&nbsp;8
ff_dim&nbsp;=&nbsp;128

inputs&nbsp;=&nbsp;Input(shape=(max_len,))
embedding_layer&nbsp;=&nbsp;Embedding(vocab_size,&nbsp;embed_dim)(inputs)
transformer_block&nbsp;=&nbsp;TransformerBlock(embed_dim,&nbsp;num_heads,&nbsp;ff_dim)(embedding_layer)
pooling_layer&nbsp;=&nbsp;GlobalAveragePooling1D()(transformer_block)
outputs&nbsp;=&nbsp;Dense(1,&nbsp;activation='sigmoid')(pooling_layer)

model&nbsp;=&nbsp;Model(inputs=inputs,&nbsp;outputs=outputs)

训练和评估模型

import&nbsp;tensorflow&nbsp;as&nbsp;tf
from&nbsp;tensorflow.keras.callbacks&nbsp;import&nbsp;ModelCheckpoint

#&nbsp;编译模型
model.compile(optimizer='adam',&nbsp;loss='binary_crossentropy',&nbsp;metrics=['accuracy'])

#&nbsp;定义回调函数
callbacks&nbsp;=&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;tf.keras.callbacks.EarlyStopping(patience=3,&nbsp;monitor='val_loss'),
&nbsp;&nbsp;&nbsp;&nbsp;ModelCheckpoint('./transformer_model.weights.h5',&nbsp;save_best_only=True,&nbsp;save_weights_only=True)
]

#&nbsp;训练模型时使用这些回调函数
history&nbsp;=&nbsp;model.fit(train_padded,&nbsp;train_labels,&nbsp;epochs=20,&nbsp;batch_size=32,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validation_data=(val_padded,&nbsp;val_labels),&nbsp;callbacks=callbacks)

#&nbsp;评估模型
model.evaluate(val_padded,&nbsp;val_labels)

可视化训练过程

import&nbsp;matplotlib.pyplot&nbsp;as&nbsp;plt

#&nbsp;绘制训练&nbsp;&&nbsp;验证的准确率值
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model&nbsp;accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train',&nbsp;'Val'],&nbsp;loc='upper&nbsp;left')
plt.show()

#&nbsp;绘制训练&nbsp;&&nbsp;验证的损失值
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model&nbsp;loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train',&nbsp;'Val'],&nbsp;loc='upper&nbsp;left')
plt.show()

在这段代码中,我们构建了一个简约的Transformer模型,并在IMDB数据集上进行了文本分类实践。

您可以根据实际需求进行深入优化,例如调整超参数、增加层数、探索更复杂的数据集等,以提升模型性能。

模型分析

在IMDb电影评论情感分析案例中,我们采用了Transformer模型。以下将总结Transformer的优点和缺点,并与其他相似算法进行对比,探讨何时选择Transformer以及何时考虑其他方案。

Transformer模型的优缺点

优点
  1. Transformer模型,凭借其不受序列长度限制的特点,能有效捕捉长距离依赖关系,为处理长文本提供优势。
  2. "Transformer模型的并行计算特性,摒弃了递归结构,让输入数据得以平行处理,从而大幅提升训练效率。"
  3. Transformer模型,适应性强:无论数据集大小或计算资源有限,通过堆叠层数和注意力头数,轻易提升效能。
  4. "微调预训练的Transformer模型(如BERT、GPT等),轻松应对各类任务,卓越表现令人叹为观止。"
缺点
  1. "Transformer模型的卓越性能依赖于海量训练数据,对于稀缺数据任务,可能无法发挥其最大潜力。"

与其他算法的对比

RNN(循环神经网络)
  • 优点
    • 能够处理变长序列数据。
    • 模型参数较少,适合小规模数据集和较短序列。
  • 缺点
    • 难以捕捉长距离依赖关系。
    • 训练时无法并行,速度较慢。
    • 易于出现梯度消失和梯度爆炸问题。
LSTM(长短期记忆网络)和 GRU(门控循环单元)
  • 优点
    • 能够捕捉较长的依赖关系,比RNN效果好。
    • 在一定程度上缓解梯度消失问题。
  • 缺点
    • 仍然无法与Transformer的并行计算相比,训练速度较慢。
    • 模型复杂度较高,训练资源需求大。
CNN(卷积神经网络)
  • 优点
    • 可以捕捉局部特征,适合图像和一些文本任务。
    • 计算效率高,可以并行计算。
  • 缺点
    • 难以捕捉长距离依赖关系。
    • 通常需要固定大小的输入,对于变长序列不够灵活。

何时使用Transformer模型

  1. Transformer模型在追求高性能任务中表现卓越,特别是预训练模型(如BERT、GPT等),为准确率和性能带来最佳结果。

最后

Transformer模型在NLP任务中独领风骚,尤其适用于冗长文本、高精度需求和计算资源丰富场景。尽管训练过程漫长且消耗大量资源,但其卓越性能和并行计算优势使其成为NLP领域的翘楚。然而,对于资源有限、数据集规模较小或实时性要求高的任务,传统的RNN、LSTM及轻量级CNN可能更具优势。

&nbsp;

-对此,您有什么看法见解?-

-欢迎在评论区留言探讨和分享。-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/434333.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从密码学看盲拍合约:智能合约的隐私与安全新革命!

文章目录 前言一、什么是盲拍合约&#xff1f;二、盲拍合约的优势1.时间压力的缓解2.绑定与秘密的挑战 三、盲拍合约的工作原理1.提交盲出价2.披露出价3.结束拍卖4.退款机制 四、代码示例总结 前言 随着区块链技术的发展&#xff0c;智能合约在各种场景中的应用越来越广泛。盲…

基于Hive和Hadoop的病例分析系统

本项目是一个基于大数据技术的医疗病历分析系统&#xff0c;旨在为用户提供全面的病历信息和深入的医疗数据分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

Linux入门2——初识Linux权限

目录 0. Linux下的用户 1.文件访问者的分类 2.文件类型和访问权限 3. 文件权限值的表示方法 4.文件访问权限的相关设置方法 4.1 修改文件的访问权限 4.2修改文件的拥有者和所属组 0. Linux下的用户 在学习Linux权限之前&#xff0c;我们要先来了解Linux下的用户&#x…

vue+UEditor附件上传问题

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

端口隔离配置的实验

端口隔离配置是一种网络安全技术&#xff0c;用于在网络设备中实现不同端口之间的流量隔离和控制。以下是对端口隔离配置的详细解析&#xff1a; 基本概念&#xff1a;端口隔离技术允许用户将不同的端口加入到隔离组中&#xff0c;从而实现这些端口之间的二层数据隔离。这种技…

算法记录——链表

2.链表 2.1判断是否是回文链表 1.方法一&#xff1a;利用栈反转链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode…

Invalid Executable The executable contains bitcode

Invalid Executable The executable contains bitcode 升级xcode16后&#xff0c;打包上传testflight时三方库报错&#xff1a;Invalid Executable - The executable ***.app/Frameworks/xxx.framework/xxx contains bitcode. 解决方案&#xff1a; 执行一下指令删除该framew…

软件测试学习路线图

软件测试工程师是专门从事软件、系统或产品测试和评估的技术专业人士&#xff0c;确保它们符合既定标准并无任何缺陷。通过精心设计和执行测试计划&#xff0c;软件测试工程师发现 Bug、故障和需要改进的领域&#xff0c;从而提高最终产品的可靠性和性能。 软件测试工程师在软…

Awcing 799. 最长连续不重复子序列

Awcing 799. 最长连续不重复子序列 解题思路: 让我们找到一个数组中&#xff0c;最长的 不包含重复的数 的连续区间的长度。 最优解是双指针算法&#xff1a; 我们用 c n t [ i ] cnt[i] cnt[i]记录 i i i 这个整数在区间内出现的次数。(因为每个数的大小为 1 0 5 10^5 105, …

状态模式原理剖析

《状态模式原理剖析》 状态模式&#xff08;State Pattern&#xff09; 是一种行为设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为。换句话说&#xff0c;当对象状态发生变化时&#xff0c;它的行为也会随之变化。 通过状态模式&#xff0c;可以消除通过 if-else…

从“可用”到“好用”,百度智能云如何做大模型的“超级工厂”?

如果说&#xff0c;过去两三年大模型处于造锤子阶段&#xff0c;那么今年&#xff0c;更多的则是考验钉钉子的能力&#xff0c;面对各类业务场景大模型是否能够有的放矢、一击必中&#xff0c;为千行百业深度赋能。 当前市场上&#xff0c;已经有200多把这样的锤子在疯狂找钉子…

【unity进阶知识1】最详细的单例模式的设计和应用,继承和不继承MonoBehaviour的单例模式,及泛型单例基类的编写

文章目录 前言一、不使用单例二、普通单例模式1、单例模式介绍实现步骤&#xff1a;单例模式分为饿汉式和懒汉式两种。 2、不继承MonoBehaviour的单例模式2.1、基本实现2.2、防止外部实例化对象2.3、最终代码 3、继承MonoBehaviour的单例模式3.1、基本实现3.2、自动创建和挂载单…

OCR 行驶证识别 离线识别

目录 正页识别 副页识别 全部识别 OCR 行驶证识别 离线识别 正页识别 副页识别 全部识别

电脑学习通看不到课程解决办法

电脑学习通看不到课程解决办法 查看学习通时发现没有课程 解决方法1: 更改单位 具体见:超星学习通关于PC版无法查看课程问题解决 解决方法二:添加应用 添加应用 点击账号管理 点击应用管理 添加应用、添加首页这个应用 添加完成后查看首页就能看到课程了 然后就OK啦、就可…

pcs集群表决盘故障导致主机reboot

建议重建fence设备并配置 PCSOracle HA实战安装配置参考 - 墨天轮

windows10使用bat脚本安装前后端环境之redis注册服务

首先需要搞清楚redis在本地是怎么安装配置、然后在根据如下步骤编写bat脚本&#xff1a; 思路 1.下载zip格式redis 2.查看windows server服务是否已安装redis 3.启动查看服务是否正常 bat脚本 echo off echo windows10 x64 server redis init REM 请求管理员权限并隐藏窗口 …

【牛Y】3DMAX快速构建低多边形城市建筑和道路插件CityBlocks教程

3DMAX快速构建低多边形城市建筑和道路插件CityBlocks&#xff0c;该插件功能主要分为两部分&#xff1a;一键城市建筑生成和一键城市道路生成。可用于城市配景建模、地图三维建模等使用。内置多种建筑组合方式&#xff0c;可使生成的建筑配景更加丰富、富于变换&#xff01; 【…

经纬恒润全冗余R-EPS助力L4级自动驾驶落地

随着L4级别自动驾驶技术的逐步成熟与商业化进程加速&#xff0c;行业对车辆安全性的要求达到了新的高度。为了确保自动驾驶车辆全天候、全路况下安全运行&#xff0c;冗余系统的研发与应用成为关键。在这一背景下&#xff0c;经纬恒润开发了齿条式全冗余电动助力转向系统R-EPS&…

Python模拟真人鼠标轨迹算法

一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型&#xff0c;如直线或曲线路径。然而&#xff0c;这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现&#xff0c;能够通过深度学习技术&#xff0c;学习并模拟更自然的鼠标移动行为。 二.鼠标轨迹算法实…

8610 顺序查找

### 思路 1. **创建顺序表**&#xff1a;从输入中读取元素个数和元素值&#xff0c;构造顺序表。 2. **顺序查找**&#xff1a;在顺序表中依次查找关键字&#xff0c;找到则返回位置&#xff0c;否则返回0。 ### 伪代码 1. **创建顺序表**&#xff1a; - 动态分配存储空间。…