昇思大模型平台打卡体验活动:项目5基于MindSpore实现Transformer机器翻译

首先仍然是先登录大模型体验平台
https://xihe.mindspore.cn/my/clouddev
启动!!

image.png
image.png

进入环境之后,即可开始运行notebook,

Transformer 模型与实现

Transformer 是一种由 Vaswani 等人在 2017 年提出的神经网络结构(论文“Attention Is All You Need”),专门用于自然语言处理中的机器翻译、语言建模和文本生成任务。与传统的 NLP 特征提取类模型不同,Transformer 主要通过以下特性来实现:

  • 基于自注意力机制多头注意力机制的模型结构;
  • 由于没有 RNN 模型的时序特性,Transformer 通过位置编码来为数据添加位置信息。

这种处理方式带来了显著优势:

  • 便于并行化,训练效率更高;
  • 在处理长序列任务时表现优越,能够快速捕捉长距离的依赖关系。

注意力机制

注意力机制模仿了人类在阅读时聚焦于重点部分的方式。在自然语言处理中,不同任务可能对句子中某些词的关注度有所不同。注意力机制通过注意力分数来表示词在句子中的重要性,分数越高,表明该词对于任务的完成越重要。

Query、Key 和 Value

计算注意力分数时主要参考三个因素:

  • query:任务内容;
  • key:索引或标签,用于定位答案;
  • value:答案。

例如,对于“情感分类”任务,“情感分类”即为query,而每个词的出现位置或关联内容为key,这些内容最终帮助模型得到相应的答案(即value)。

query-key-value

在文本翻译中,翻译后的句子应与原始句子意思相似,因此query通常与目标序列相关,key与源序列相关。

Scaled Dot-Product Attention

为了计算querykey的相似度,通常采用点积方式。点积用于衡量两个向量间的相似度,反映一个向量在另一个向量方向上的投影。为了避免querykey的大小对相似度计算的影响,需对点积结果进行缩放,具体公式如下:

Attention Score ( Q , K ) = Q K T d m o d e l \text{Attention Score}(Q, K) = \frac{QK^T}{\sqrt{d_{model}}} Attention Score(Q,K)=dmodel QKT

最终,我们将相似度分数范围限制在 0 到 1 之间,并作用于value上:

Attention ( Q , K , V ) = softmax ( Q K T d m o d e l ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_{model}}}\right)V Attention(Q,K,V)=softmax(dmodel QKT)V

以下代码实现了 scaled dot-product attention 的计算,返回加权后的value(output)以及注意力权重(attn)。

image.png

自注意力机制(Self-Attention)

在自注意力机制中,我们关注的是句子本身,每个词对其上下文的重要性。例如,句子 “The animal didn’t cross the street because it was too tired” 中,“it”指代 “The animal”,因此自注意力会赋予“The”和“animal”更高的注意力分值。

图片来源:The Illustrated Transformer by Jay Alammer

在自注意力机制中,计算方式与之前相同,但querykeyvalue均来自句子本身的不同权重映射。公式如下:

Attention ( Q , K , V ) = softmax ( Q K T d m o d e l ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_{model}}}\right)V Attention(Q,K,V)=softmax(dmodel QKT)V

多头注意力机制(Multi-Head Attention)

多头注意力机制通过不同方式关注输入序列的不同部分,从而提升模型的效果。它对输入的嵌入乘以不同的权重参数 W Q W^{Q} WQ W K W^{K} WK W V W^{V} WV,映射到多个小维度空间(即“头”),每个头部并行计算自注意力分数。公式如下:

head i = Attention ( Q W i Q , K W i K , V W i V ) = softmax ( Q i K i T d k ) V i \text{head}_i = \text{Attention}(QW^Q_i, KW^K_i, VW^V_i) = \text{softmax}\left(\frac{Q_iK_i^T}{\sqrt{d_k}}\right)V_i headi=Attention(QWiQ,KWiK,VWiV)=softmax(dk QiKiT)Vi

得到多组自注意力分数后,将结果拼接得到最终的多头注意力输出:

MultiHead ( Q , K , V ) = Concat ( head 1 , . . . , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO

image.png

Transformer 的整体结构

Transformer 模型的结构如下图所示。输入序列在进入编码器(encoder)或解码器(decoder)前需进行以下两步预处理:

  1. Word Embedding:将序列转换为词向量表示,包含内容信息。
  2. Positional Encoding:在词向量的基础上添加位置信息。

位置编码(Positional Encoding)

由于 Transformer 不包含 RNN 结构,因此无法记录序列信息。为了弥补这一缺陷,我们在输入数据中添加位置编码。位置编码公式如下:

P E ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i)=sin(100002i/dmodelpos)

P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i+1)=cos(100002i/dmodelpos)

实现位置编码的代码如下:

image.png

编码器(Encoder)

Transformer 的编码器负责处理源序列,将输入信息整合为上下文向量。每个编码器层包含两个子层:多头自注意力(multi-head self-attention)和基于位置的前馈神经网络(position-wise feed-forward network)。子层之间使用残差连接(residual connection)和层规范化(layer normalization)。

image.png

基于位置的前馈神经网络

前馈神经网络由两个线性层组成,用于对输入中的每个位置进行非线性变换:

F F N ( x ) = R e L U ( x W 1 + b 1 ) W 2 + b 2 \mathrm{FFN}(x) = \mathrm{ReLU}(xW_1 + b_1)W_2 + b_2 FFN(x)=ReLU(xW1+b1)W2+b2

image.png

Add & Norm

Add & Norm 采用残差连接和层归一化的组合:

Add&Norm ( x ) = LayerNorm ( x + Sublayer ( x ) ) \text{Add\&Norm}(x) = \text{LayerNorm}(x + \text{Sublayer}(x)) Add&Norm(x)=LayerNorm(x+Sublayer(x))

  • Add:残差连接,帮助缓解网络退化;
  • Norm:层归一化,帮助加速模型收敛。

解码器(Decoder)

解码器将编码器输出的上下文序列转换为目标序列的预测结果,并与真实目标输出计算损失。每个解码器层包含两层多头注意力机制:

  1. 第一层:计算目标序列的注意力分数(掩码多头自注意力);
  2. 第二层:用于计算上下文序列与目标序列的关系。

带掩码的多头注意力

在处理目标序列时,为确保每个时间步仅关注先前的词元,需在第一层注意力中增加时间掩码(subsequent mask):

0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 \begin{matrix} 0 & 1 & 1 & 1 & 1\\ 0 & 0 & 1 & 1 & 1\\ 0 & 0 & 0 & 1 & 1\\ 0 & 0 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 & 0\\ \end{matrix} 0000010000110001110011110

该掩码确保模型在 t 时刻仅关注 t-1
之前的词元。

Transformer 模型代码实现

以下为 Transformer 模型的代码实现,涵盖了从词频统计到词典构建、编码、解码的各个细节。

词典构建(Vocab 类)

通过 Vocab 类实现词典的构建。首先通过词频字典构建词典,并设置一些特殊标记(如 <unk><pad><bos><eos>)。每个词在整个语料库中的频率都会影响词典的生成。常用词通常被分配较小的索引,以节省空间并提高计算效率。

class Vocab:"""通过词频字典构建词典"""special_tokens = ['<unk>', '<pad>', '<bos>', '<eos>']def __init__(self, word_count_dict, min_freq=1):self.word2idx = {}for idx, tok in enumerate(self.special_tokens):self.word2idx[tok] = idx# 筛选出现频率大于等于 min_freq 的词汇构建词典filted_dict = {w: c for w, c in word_count_dict.items() if c >= min_freq}for w, _ in filted_dict.items():self.word2idx[w] = len(self.word2idx)# 生成词汇索引的反向映射self.idx2word = {idx: word for word, idx in self.word2idx.items()}# 设置特殊标记的索引self.bos_idx = self.word2idx['<bos>']self.eos_idx = self.word2idx['<eos>']self.pad_idx = self.word2idx['<pad>']self.unk_idx = self.word2idx['<unk>']def _word2idx(self, word):"""单词映射至数字索引"""return self.word2idx.get(word, self.unk_idx)def _idx2word(self, idx):"""数字索引映射至单词"""if idx not in self.idx2word:raise ValueError('输入索引不在词典中。')return self.idx2word[idx]def encode(self, word_or_list):"""将单个单词或单词列表映射至索引或索引列表"""if isinstance(word_or_list, list):return [self._word2idx(i) for i in word_or_list]return self._word2idx(word_or_list)def decode(self, idx_or_list):"""将单个索引或索引列表映射至单词或单词列表"""if isinstance(idx_or_list, list):return [self._idx2word(i) for i in idx_or_list]return self._idx2word(idx_or_list)def __len__(self):return len(self.word2idx)

词频统计

在构建词典之前,使用 Python 的 collections 模块中的 CounterOrderedDict 统计源语言和目标语言(如德语和英语)中每个单词的出现频率。这样构建出的词频字典可以进一步转换为词典对象:

image.png

其中,源语言(德语)的词典为 de_vocab,目标语言(英语)的词典为 en_vocab。分配索引时,频繁出现的词被分配较小的数值索引以提升空间和计算效率。

image.png

计算 BLEU 分数

在自然语言生成任务中,常用 BLEU 分数来评估生成的文本和参考文本之间的相似度。BLEU 分数是基于词块的重叠计算,是自然语言处理任务中常用的性能指标。以下代码实现了 BLEU 分数的计算逻辑:

image.png

总结

本文从 Transformer 模型的基础概念入手,深入探讨了自注意力、多头注意力、位置编码等核心机制,并通过代码演示了如何构建词典和计算 BLEU 分数。通过这种实现,我们可以更深入理解 Transformer 在自然语言处理中如何捕捉语义信息,从而生成更准确和流畅的翻译或其他语言生成任务的输出。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

‌关于人工智能(AI)的发展现状和未来趋势的详细分析!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日将继续分享关于‌人工智能&#xff08;AI&#x…

提高排名的有效策略与实践指南

内容概要 在现代数字化时代&#xff0c;提高排名不仅是企业营销的关键&#xff0c;更是提升品牌知名度和客户粘性的有效途径。为了更好地理解这一主题&#xff0c;我们从多个方面进行详细分析。首先&#xff0c;明确"排名"的基本概念是非常重要的&#xff0c;它通常…

【Linux】动静态库

目录 1、制作静态库 2、站在使用者角度使用库 3、制作动态库 4、动态库是怎么被加载的 1、制作静态库 之前对动静态库的认识&#xff1a; libXXX.a-----静态库 静态链接&#xff1a;将库当中的代码拷贝到最终的可执行程序里&#xff0c;也就是&#xff0c;自己的源代码会变成…

AI绘画到底怎么画,才能出好图!一文详解

前言 在当今数字化的时代&#xff0c;AI 绘画以其强大的创造力和便捷性&#xff0c;成为了众多艺术爱好者和创作者的新宠。无论是专业画家想要拓展创作思路&#xff0c;还是业余爱好者渴望展现自己的创意&#xff0c;AI 绘画都提供了无限的可能。那么&#xff0c;究竟如何才能…

【React】深入理解 JSX语法

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解 JSX语法1. JSX 简介2. JSX 的基本语法2.1 基本结构2.2 与普通 JavaScr…

Kafka-Eagle 监控 搭建

Kafka-Eagle 框架可以监控 Kafka 集群的整体运行情况&#xff0c;在生产环境中经常使用。 在生产过程中&#xff0c;想创建topic、查看所有topic、想查看某个topic 想查看分区等&#xff0c;都需要写命令&#xff0c;能不能有一个图形化的界面&#xff0c;让我们操作呢&#x…

5位机械工程师如何共享一台工作站的算力?

在现代化的工程领域中&#xff0c;算力已成为推动创新与技术进步的关键因素之一。对于机械工程师而言&#xff0c;强大的计算资源意味着能够更快地进行复杂设计、模拟分析以及优化工作&#xff0c;从而明显提升工作效率与项目质量。然而&#xff0c;资源总是有限的&#xff0c;…

显示器接口种类 | 附图片

显示器接口类型主要包括VGA、DVI、HDMI、DP和USB Type-C等。 VGA、DVI、HDMI、DP和USB Type-C 1. 观察 VGA接口:15针 DP接口&#xff1a;在DP接口旁&#xff0c;都有一个“D”型的标志。 电脑主机&#xff1a;DP(D) 显示器&#xff1a;VGA(15针) Ref https://cloud.tenc…

C++常见概念问题(3)

C常见概念问题&#xff08;3&#xff09; 1. 构造函数的初始化顺序 基类构造函数&#xff1a;在派生类的构造函数中&#xff0c;基类的构造函数在派生类构造函数体执行之前调用。 成员变量初始化&#xff1a;类中的成员变量会按照其在类中声明的顺序进行初始化&#xff0c;而…

Tofu识别跟踪产品视频输入接口汇总

网络视频输入 视频输入默认支持网络RTSP协议视频&#xff0c;分辨率支持480P&#xff0c;720P&#xff0c;1080P&#xff0c;1440P等格式。 目前仅Tofu3支持1440P格式的400万像素视频&#xff0c;可通过升级包支持&#xff0c;400万像素分辨率目前仅支持25601440。 并行数字视…

【WRF工具】WRF 模型输出可视化工具 RIP4

【WRF工具】WRF 模型输出可视化工具 RIP4 1 可视化工具 RIP4 概述1.1 RIP4 的典型工作流程 2 安装 RIP42.1 下载 RIP42.2 编译 RIP4 3 运行 RIP43.1 准备输入文件3.2 运行 RIP 数据预处理程序&#xff08;ripdp_wrfarw&#xff09;3.3 运行 RIP 绘图程序&#xff08;rip&#x…

在Pybullet中加载Cinema4D创建的物体

首先明确我们的目标&#xff0c;是希望在cinema4D中创建自己想要的模型&#xff0c;并生成.obj文件&#xff0c;然后在pybullet中加载.obj文件作为静态物体&#xff0c;可以用于抓取物体&#xff0c;避障物体。&#xff08;本文提到的方法只能实现静态物体的建模&#xff0c;如…

学习方法——看差的书籍

CSAPP证明从1中午2点到下午3&#xff1a;40&#xff0c;但是还是只是推理证明而已&#xff0c;但是想起来了课上老师讲的东西了 还可以知道补码运算的大前提知识&#xff01;&#xff01;&#xff01;

微积分复习笔记 Calculus Volume 1 - 5.2 The Definite Integral

5.2 The Definite Integral - Calculus Volume 1 | OpenStax

SNH48 GROUP燃动杭州 第五届偶像运动会落下帷幕

2024年11月9日&#xff0c;“我们能赢”SNH48 GROUP第五届偶像运动会在杭州运河体育公园盛大开赛&#xff0c;本次运动会由高榕及SNH48郭爽、GNZ48梁娇作为赛事特邀主持人&#xff0c;并于小红书、微信视频号、SNH48 GROUP官方直播APP口袋48及MEET48全程直播。SNH48&#xff08…

35.安卓逆向-壳-Frida脚本脱壳

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。第一…

未来已来!量子计算能否让你成为智商最高的人?

内容概要 在当今时代&#xff0c;量子计算不仅是科技领域的创新标志&#xff0c;更是一个重新定义智能边界的革命性力量。它的运算能力远超传统计算机&#xff0c;这使得复杂的问题在瞬息之间迎刃而解。通过量子比特&#xff08;qubits&#xff09;&#xff0c;信息呈现出一种…

Java爬虫:京东商品SKU信息的“偷心盗贼”

在这个信息爆炸的时代&#xff0c;数据就像是藏在深山里的宝藏&#xff0c;等待着我们这些“数据探险家”去发掘。今天&#xff0c;我们要化身为一名“偷心盗贼”&#xff0c;用Java这把锋利的“剑”&#xff0c;精准地从京东的海洋中窃取商品的SKU信息。别担心&#xff0c;我们…

RWKV 社区 10 月动态速览!

欢迎大家收看《RWKV 社区最新动态》&#xff0c;本期内容收录了 RWKV 社区 2024 年 10 月的最新动态。 10 月动态省流版&#xff08;TL;DR&#xff09; RWKV 社区活动 10 月 13 日&#xff0c;RWKV 团队在北京大学做了《RWKV 技术产品化与生态及模型架构》主题分享 RWKV 学术…

C++:模板之全

目录 前言&#xff1a; 一、函数模板 1.函数模板的原理&#xff1a; 2.函数模板的实例化 2.1.隐式实例化 2.2.显示实例化 2.3.模板参数匹配原则 二、类模板 1.类模板的实例化 三、非类型模板参数 四、模板的特化 五、模板的分离编译 前言&#xff1a; 在C语言中是…