WarcraftHelper优化指南:解决1.24e版本兼容性问题的系统方法

核心内容摘要

Java项目用了JSQParser,但它用的是LGPL-2.1-only许可证,这会有哪些合规隐患?怎么安全替换或规避?
**新手写小说软件2025推荐,从零到一轻松上手创作**

解析“帮我吧”一体化平台如何支撑万家企业个性化服务管理

目录

Seq2Seq

基本概念

2.

编码器

2.

解码器

2.

注意力机制(可选)

工作原理

3.

模型训练

3.

模型验证

3.

完整代码本文来源:极客时间vip课程笔记注:后续技术类文章会同步到我的公众号里,搜索公众号小志的博客感兴趣的读友可以去找来看看。

Seq2SeqSeq2Seq(Sequence-to-Sequence),顾名思义是从一个序列到另一个序列的转换。

它不仅仅能理解单词之间的关系,而且还能把整个句子的意思打包,并解压成另一种形式的表达。

如果说 Word2Vec 是让我们的机器学会了理解词汇的话,那 Seq2Seq 则是教会了机器如何理解句子并进行相应地转化。

在这个过程中,我们会遇到两个核心的角色:编码器(Encoder)和解码器(Decoder)。

编码器的任务是理解和压缩信息,就像是把一封长信函整理成一个精简的摘要;而解码器则需要将这个摘要展开,翻译成另一种语言或形式的完整信息。

这个过程有一定的挑战,比如如何确保信息在这次转换中不丢失精髓,而是以新的面貌精准地呈现出来,这就是我们接下来要探索的内容之一。

基本概念Seq2Seq 也是一种神经网络架构,模型的核心由两部分组成:编码器(Encoder)和解码器(Decoder)。

你可以看一下这个架构的示意图。

2.

编码器编码器的任务是读取并理解输入序列,然后把它转换为一个固定长度的上下文向量,也叫作状态向量。

这个向量是输入序列的一种内部表示,捕捉了序列的关键信息。

编码器通常是一个循环神经网络(RNN)或其变体,比如长短期记忆网络(LSTM)或门控循环单元(GRU),它们能够处理不同长度的输入序列,并且记住序列中的长期依赖关系。

2.

解码器解码器的任务是接收编码器生成的上下文向量,并基于这个向量生成目标序列。

解码过程是一步步进行的,每一步生成目标序列中的一个元素,比如一个词或字符,直到生成特殊的结束符号,表示输出序列的结束。

解码器通常也是一个 RNN、LSTM 或 GRU,它不仅依赖于编码器的上下文向量,还可能依赖于自己之前的输出,来生成下一个输出元素。

2.

注意力机制(可选)在编码器和解码器之间,可能还会有一个注意力机制(Attention Mechanism)。

注意力机制使解码器能够在生成每个输出元素时“关注”输入序列中的不同部分,从而提高模型处理长序列和捕捉复杂依赖关系的能力。

编码器、解码器、注意力机制之间是怎样协作的呢?

你可以看一下我给出的示意图。

工作原理我们先从模型的训练开始,Seq2Seq 的训练和 Word2Vec 不太一样,因为我们讲解的是中英文翻译场景,所以训练的时候,训练数据是中英文数据对。

Seq2Seq 的训练会比 Word2Vec 更加复杂一些。

上节课的 Word2Vec,我们使用的是 gensim 库提供的基础模型,直接进行训练,这节课我们完全从头写起,训练一个 Seq2Seq 模型。

3.

模型训练我们先准备训练数据,可以在网上找公开的翻译数据集,我们用的是 AIchallenger 2017,这个数据集有 1000 万对中英文数据,不过因为电脑配置问题,我直接从里面中文和英文的部分各取了 10000 条进行训练。

数据集名称是 train_1w.zh和 train_1w.en。

cn_sentences=[]zh_file_path="train_1w.zh"# 使用Python的文件操作逐行读取文件,并将每一行的内容添加到列表中withopen(zh_file_path,"r",encoding="utf-8")as file:forline in file:# 去除行末的换行符并添加到列表中 cn_sentences.append(line.strip())en_sentences=[]en_file_path="train_1w.en"# 使用Python的文件操作逐行读取文件,并将每一行的内容添加到列表中withopen(en_file_path,"r",encoding="utf-8")as file:forline in file:# 去除行末的换行符并添加到列表中 en_sentences.append(line.strip())接下来,基于训练数据集构建中文和英文的词汇表,将每个词映射到一个唯一的索引(integer)。

# cn_sentences 和 en_sentences 分别包含了所有的中文和英文句子 cn_vocab=build_vocab(cn_sentences,tokenize_cn,max_size=10000,min_freq=

en_vocab=build_vocab(en_sentences,tokenize_en,max_size=10000,min_freq=

我们再来看 biild_vocab 的源码。

defbuild_vocab(sentences,tokenizer,max_size,min_freq):token_freqs=Counter()forsentence in sentences:tokens=tokenizer(sentence)token_freqs.update(tokens)vocab={token:idx+4foridx,(token,freq)inenumerate(token_freqs.items())iffreq=min_freq}vocab['unk']=0vocab['pad']=1vocab['sos']=2vocab['eos']=3returnvocab思路就是把所有的句子读进去,循环分词,放入字典,放的时候要判断一下是否大于等于 min_freq,用来过滤掉出现频率较低的词汇,最后构建出来的词汇表如下:vocab={'unk':0,'pad':1,'sos':2,'eos':3,'i':4,'like':5,'learning':6,'machine':7,'is':8,'very':9,'interesting':10,...}我们来看一下里面比较重要的几个部分。

unk :未知单词,表示在训练数据中没有出现过的单词。

当模型在处理输入文本时遇到未知单词时,会用这个标记来表示。

pad:填充单词,用于将不同长度的序列填充到相同的长度。

在处理批次数据时,由于不同序列的长度可能不同,因此需要用这个标记把短序列填充到与最长序列相同的长度,以便进行批次处理。

sos:句子起始标记,表示句子的开始位置。

在 Seq2Seq 模型中,通常会在目标句子的开头添加这个标记,以指示解码器开始生成输出。

eos:句子结束标记,表示句子的结束位置。

在 Seq2Seq 模型中,通常会在目标句子的末尾添加该标记,以指示解码器生成结束。

创建训练数据集,将数据处理成方便训练的格式:语言序列,比如 [1,2,3,4]。

dataset=TranslationDataset(cn_sentences,en_sentences,cn_vocab,en_vocab,tokenize_cn,tokenize_en)train_loader=DataLoader(dataset,batch_size=32,collate_fn=collate_fn)然后检测是否有显卡:# 检查是否有可用的GPU,如果没有,则使用CPUdevice=torch.device("cuda"iftorch.cuda.is_available()else"cpu")print("训练设备为:",device)创建模型,参数的解释可以参考代码注释。

# 定义一些超参数 INPUT_DIM=10000# 输入语言的词汇量 OUTPUT_DIM=10000# 输出语言的词汇量 ENC_EMB_DIM=256# 编码器嵌入层大小,也就是编码器词向量维度 DEC_EMB_DIM=256# 解码器嵌入层大小,解码器词向量维度 HID_DIM=512# 隐藏层维度 N_LAYERS=2# RNN层的数量 ENC_DROPOUT=

5# 编码器神经元输出的数据有50%会被随机丢掉 DEC_DROPOUT=

5# 解码器同上 enc=Encoder(INPUT_DIM,ENC_EMB_DIM,HID_DIM,N_LAYERS,ENC_DROPOUT)dec=Decoder(OUTPUT_DIM,DEC_EMB_DIM,HID_DIM,N_LAYERS,DEC_DROPOUT)model=Seq2Seq(enc,dec,device).to(device)# 假定模型已经被实例化并移到了正确的设备上 model.to(device)# 定义优化器和损失函数 optimizer=optim

17.c.13.nom-17.c-起草口在哪-17.c.13.nom-17.c-起草口在哪应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123