AI开发 - GPT之魂 用Python 演示chatGPT的自注意力机制 - 机器学习

        自注意力机制(Self-Attention)就是让模型在处理每个词时,学会“关注重点”,而不是平均地对每个词一视同仁。这种机制让 GPT 能更聪明地理解句子的上下文和语义之间的关系。

        自注意力机制是 GPT 的核心,它帮助模型在理解句子时关注到重要的词或信息。

        2017年,Google机器翻译团队发表的《Attention is all you need》中大量使用了自注意力(self-attention)机制来学习文本表示。

        这篇论文的地址在这里:https://arxiv.org/abs/1706.03762

Self-Attention可以称之为 GPT之魂,因为:

  1. 核心作用:自注意力机制(Self-Attention)是Transformer架构的核心,而Transformer正是GPT系列模型的基础。自注意力机制使得模型能够在处理文本时,考虑到序列中所有位置的信息,从而捕捉到更加丰富的上下文关系。这种能力是GPT能够理解和生成高质量文本的根本所在。因此,形容它为“GPT之魂”突出了它在GPT模型中的重要性。

  2. 理解上下文的能力:自注意力机制使模型能够在生成每个词语时,依据输入序列的所有其他词语的关系来调整自己的输出。这种全局视野和动态的上下文感知能力是GPT模型强大语言理解和生成能力的基础。可以说,它赋予了GPT模型对语言的“生命力”和深度理解。

  3. 灵活性与表达力:与传统的RNN或LSTM等序列模型相比,Transformer和自注意力机制的引入,使得模型可以并行处理序列中的所有词语,并且能够灵活地捕捉长程依赖关系,这种高效的表达能力正是GPT系列能够处理复杂语言任务的原因。

        这张图展示了一个注意力机制(Attention Mechanism)的例子,特别关注于长距离依赖(Long-Distance Dependencies)在编码器自注意力(Encoder Self-Attention)中的表现。具体来说,这是在第5层(共6层)的注意力机制的示例。

        图中展示了一段文本,其中每个单词都被标注了颜色,这些颜色代表了不同的注意力头(Attention Heads)。注意力头是注意力机制的一部分,它们帮助模型关注输入序列中的不同部分,以更好地理解上下文。

        在这张图中,注意力机制特别关注了动词“making”,并完成了短语“making...more difficult”。图中只展示了“making”这个词的注意力分布。不同的颜色代表了不同的注意力头,这些头在处理输入序列时关注了不同的部分。

        这种机制对于处理自然语言处理任务中的长距离依赖关系非常重要,因为它允许模型在处理文本时考虑更远的上下文信息,而不仅仅是相邻的单词。

自注意力机制的通俗解释

        假设你在阅读一段文字,遇到一句话:

"猫跳过篱笆后,开始追逐一只蝴蝶。"

        你想弄清楚“追逐”的主语是谁。这时候,你会把注意力集中到“猫”这个词上,而不是“篱笆”或“蝴蝶”。这种集中注意力的行为,就是“注意力”的核心。

        自注意力扩展了这种思想:对于一句话中的每个词,模型会同时关注这句话中所有其他词的相关性,从而决定该词的意义。例如,“追逐”这个词可能会特别关注“猫”和“蝴蝶”,因为它们与动作直接相关,而对“篱笆”的关注较少。

自注意力的核心步骤

  1. 表示词的特征:用向量表示每个词。
  2. 计算相似性(注意力分数):用词与词之间的内积表示它们的相关性。
  3. 分配权重:用 Softmax 把相关性分数转为概率。
  4. 计算加权表示:用权重对每个词的特征进行加权求和,得到新的特征表示。

Python演示:简易自注意力模型

我们是否可以用Python来演示一个最简单的自注意力机制呢?

当然可以,以下是步骤:

下面逐行解释你提供的代码:

1. 导入库

import numpy as np
  • import numpy as np:导入 NumPy 库并使用 np 作为别名。NumPy 是一个强大的科学计算库,提供了支持大规模、多维数组和矩阵运算的功能。我们在这里使用它来处理词向量和矩阵运算。

2. 模拟输入:三个词的特征表示 (向量大小为4)

words = np.array([[1, 0, 1, 0],  # Word 1[0, 1, 0, 1],  # Word 2[1, 1, 1, 1],  # Word 3
])
  • words:这是一个形状为 (3,4)(3, 4) 的 NumPy 数组,表示三个词的特征向量,每个词用 4 维向量表示。
    • 第一行 [1, 0, 1, 0] 代表词 1。
    • 第二行 [0, 1, 0, 1] 代表词 2。
    • 第三行 [1, 1, 1, 1] 代表词 3。
  • 每个词向量是一个 4 维向量,特征表示了词的某些特性(例如词义、词性等,具体取决于向量化方法)。这里只是手动定义的简化示例。
  • 你可以把1 2 3 想象成任何词汇,它在这里只代表某个句子中的三个词。

3. 计算相似性分数 (点积)

attention_scores = np.dot(words, words.T)  # shape: (3, 3)
  • np.dot(words, words.T):计算 words 矩阵和其转置 words.T 的点积。words.T 的形状是 (4,3)(4, 3),因此 attention_scores 的形状是 (3,3)(3, 3)。
    • 这个点积操作会生成一个 3×33 \times 3 的相似性矩阵,表示句子中每对词之间的相关性(相似性分数)。
    • 点积的结果是通过计算词向量之间的内积得到的,内积越大表示两个词越相似。
    • 例如,attention_scores[0][1] 就表示词 1 和词 2 之间的相似性。

4. 定义 Softmax 函数

def softmax(x):exp_x = np.exp(x - np.max(x))  # 防止溢出return exp_x / exp_x.sum(axis=-1, keepdims=True)
  • softmax(x):定义了一个 Softmax 函数,用于将相似性分数转化为概率值,使得它们的和为 1。Softmax 函数广泛用于神经网络的输出层,常用于分类问题中的概率预测。
    • np.exp(x - np.max(x)):对输入矩阵 x 做指数运算,并减去最大值 np.max(x) 来防止数值溢出(避免 exp 结果过大)。
    • exp_x / exp_x.sum(axis=-1, keepdims=True):将指数化的结果除以每行的总和,确保每行的元素和为 1。这样就得到了归一化后的注意力权重。

5. 计算注意力权重

attention_weights = softmax(attention_scores)
  • attention_weights:使用 softmax 函数对 attention_scores 进行归一化处理,得到每个词对于其他词的注意力权重。每个值表示一个词对另一个词的关注程度。通过 Softmax 函数,注意力分数被转化为权重,使得每个权重是一个介于 0 和 1 之间的数,且每行的权重和为 1。

6. 加权求和得到新的表示

new_representation = np.dot(attention_weights, words)
  • np.dot(attention_weights, words):对 words 进行加权求和,即将每个词向量加权求和,得到新的表示。
    • 加权求和:将每个词向量根据其对应的注意力权重进行加权求和,从而生成一个新的表示。
    • attention_weights @ words:点积的计算方式等同于对每个词向量按照注意力权重进行加权平均,得到新的词表示。

完整的代码:

import numpy as np# 模拟输入:三个词的特征表示 (向量大小为4)
words = np.array([[1, 0, 1, 0],  # Word 1[0, 1, 0, 1],  # Word 2[1, 1, 1, 1],  # Word 3
])# 1. 计算相似性分数 (点积)
attention_scores = np.dot(words, words.T)  # shape: (3, 3)# 2. 计算注意力权重 (Softmax)
def softmax(x):exp_x = np.exp(x - np.max(x))  # 防止溢出return exp_x / exp_x.sum(axis=-1, keepdims=True)attention_weights = softmax(attention_scores)# 3. 加权求和得到新的表示
# Attention applied: weights @ words
new_representation = np.dot(attention_weights, words)print("原始词向量:")
print(words)
print("\n注意力分数:")
print(attention_scores)
print("\n注意力权重:")
print(attention_weights)
print("\n新的词表示:")
print(new_representation)

逻辑解释

  1. 输入表示

    • 模拟了一个简单的句子,包含三个词,每个词用 4 维向量表示。
  2. 相似性分数

    • 用点积计算每个词与其他词的相关性。
    • attention_scores[i][j] 表示第 i 个词和第 j 个词的相关性。
  3. 注意力权重

    • 使用 Softmax 把分数归一化成概率形式,使得每行的权重之和为 1。
  4. 新的表示

    • 对每个词的向量进行加权求和,生成新的特征表示。
    • 新的表示包含了全局上下文信息。

输出解读

  • 注意力分数:展示了每个词与其他词的原始相似性。
  • 注意力权重:归一化的分数,用于加权求和。
  • 新的词表示:结合了全句上下文的信息,是“更聪明的词向量”。

通过这种方式,自注意力帮助模型理解词与词之间的关联,从而更好地理解句子整体语义!

 我们还可以用一个更加直观的案例来演示:

我们可以用简单的词向量表示这个句子中的词,然后演示自注意力机制如何运作。以下是代码和解释:


句子与词向量

假设句子是:

"猫跳过篱笆后,开始追逐一只蝴蝶。"

为了简单起见,我们用手动定义的低维向量表示每个词(实际模型中用更复杂的嵌入,如 Word2Vec、BERT 等生成向量)。

Python代码实现

import numpy as np# 模拟词向量 (每个词用 4 维向量表示)
words = {"猫": [1, 0, 0, 0],"跳过": [0, 1, 0, 0],"篱笆": [0, 0, 1, 0],"后": [0, 0, 0, 1],"开始": [1, 1, 0, 0],"追逐": [0, 1, 1, 0],"一只": [0, 0, 1, 1],"蝴蝶": [1, 0, 0, 1]
}# 按句子顺序构造输入矩阵
sentence = ["猫", "跳过", "篱笆", "后", "开始", "追逐", "一只", "蝴蝶"]
input_vectors = np.array([words[word] for word in sentence])  # shape: (8, 4)# 1. 计算相似性分数 (点积)
attention_scores = np.dot(input_vectors, input_vectors.T)  # shape: (8, 8)# 2. 计算注意力权重 (Softmax)
def softmax(x):exp_x = np.exp(x - np.max(x))  # 防止溢出return exp_x / exp_x.sum(axis=-1, keepdims=True)attention_weights = softmax(attention_scores)  # shape: (8, 8)# 3. 加权求和得到新的表示
new_representations = np.dot(attention_weights, input_vectors)  # shape: (8, 4)# 打印结果
print("原始词向量:")
for word, vec in zip(sentence, input_vectors):print(f"{word}: {vec}")print("\n注意力分数矩阵 (部分):")
print(attention_scores)print("\n注意力权重矩阵 (部分):")
print(attention_weights)print("\n新的词表示:")
for word, vec in zip(sentence, new_representations):print(f"{word}: {vec}")

输出结果解释

原始词向量

展示了每个词的初始表示。比如,"猫" 的向量是 [1, 0, 0, 0]

注意力分数矩阵

是一个 8x8 的矩阵,每个值表示句子中两个词之间的相似性。例如:

  • attention_scores[0][5] 表示 "猫" 和 "追逐" 的相似性。
  • 数值越高,说明两个词越相关。
注意力权重矩阵

对注意力分数矩阵应用 Softmax,每一行表示当前词对其他词的注意力分布。例如:

  • 如果 "追逐" 的权重主要集中在 "猫" 和 "蝴蝶" 上,说明它主要关注这些词。
新的词表示

每个词的新表示综合了全句上下文。例如:

  • "追逐" 的新表示可能更接近 "猫" 和 "蝴蝶",因为它和它们语义关联更强。

输出示例

假设运行后的注意力分布结果如下:

  • "追逐" 关注最多的是 "猫" 和 "蝴蝶",它的新的向量可能是它们的加权组合。
  • "后" 的注意力可能分布得更平均,因为它是个连接词,和所有词的关联性较弱。

通过这种方式,模型能够根据上下文动态调整每个词的表示,更好地理解句子语义。

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

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

相关文章

将自定义 AWS S3 快照存储库连接到 Elastic Cloud

作者:来自 Elastic Annie Hansen, Stef Nestor 在本博客中,我们将介绍如何通过 Elasticsearch 的快照将我们已提交的集群数据备份到 AWS S3 存储桶中。在 Elastic Cloud(企业版)中,Elastic 在其 found-snapshots 存储…

linux下Qt程序部署教程

文章目录 [toc]1、概述2、静态编译安装Qt1.1 安装依赖1.2 静态编译1.3 报错1.4 添加环境变量1.5 下载安装QtCreator 3、配置linuxdeployqt环境1.1 在线安装依赖1.2 使用linuxdeployqt提供的程序1.3 编译安装linuxdeployqt 4、使用linuxdeployqt打包依赖1.1 linuxdeployqt使用选…

【QT】控件8

1.QDial 通过调节旋钮位置来控制窗口的不透明度&#xff1a; void Widget::on_dial_valueChanged(int value) {qDebug()<<value;this->setWindowOpacity((double)value/100); }效果演示&#xff1a; 2.Date/Time Edit 计算两个日期的差值 ui界面设计 计算按钮按下…

CGAL CGAL::Polygon_mesh_processing::self_intersections解析

CGAL::Polygon_mesh_processing::self_intersections 是用于检测多边形网格&#xff08;Polygon Mesh&#xff09;中的自相交的函数。自相交是指网格中的某些面&#xff08;例如三角形&#xff09;与同一网格中的其他面交叉的情况。这种情况通常是不期望的&#xff0c;因为它会…

[巅峰极客 2021]签到

[巅峰极客 2021]签到 给了我们好多表情&#xff0c;真的是一脸懵逼 注意给我们的关键词 GAME 现在还不知道是什么意思我们去试着解开一下 用这个emoji表情解密器&#xff0c;这里我找了好久才找到一个 emoji-aes 这里的Key值就是GAME 运行后出现flag NSSCTF{10ve_4nd_Peace…

005 MATLAB符号微积分

前言&#xff1a; 在MATLAB中&#xff0c;数值与符号的主要区别在于它们的处理方式和应用场景 数值计算适用于实际的数值计算问题&#xff0c;如矩阵运算、数据分析等。符号计算适用于符号推导、公式化简和符号解析&#xff0c;如理论物理和工程计算。 01 符号对象 1.基本符…

“岗位复合化、技能层次化” 高职大数据技术专业人才培养实践

在全球数字化浪潮的推动下&#xff0c;大数据技术已经成为引领社会进步和经济发展的核心动力。随着《关于深化现代职业教育体系建设改革的意见》等系列指导问文件的发布&#xff0c;我国高职大数据技术专业的教育正迎来全新机遇与挑战。这些政策不仅明确了职业教育改革的方向&a…

51c自动驾驶~合集38

我自己的原文哦~ https://blog.51cto.com/whaosoft/12358456 #GaussianPretrain 万能3D高斯预训练表示&#xff01;爆拉3D检测、Occ、高精地图等四大任务&#xff01; 受Tesla的技术的推动&#xff0c;越来越多的厂商开始走"纯视觉"的路线&#xff0c;多数方案还…

MongoDB集群分片安装部署手册

文章目录 一、集群规划1.1 集群安装规划1.2 端口规划1.3 目录创建 二、mongodb安装&#xff08;三台均需要操作&#xff09;2.1 下载、解压2.2 配置环境变量 三、mongodb组件配置3.1 配置config server的副本集3.1.1 config配置文件3.1.2 config server启动3.1.3 初始化config …

AIGC--------AIGC在医疗健康领域的潜力

AIGC在医疗健康领域的潜力 引言 AIGC&#xff08;Artificial Intelligence Generated Content&#xff0c;人工智能生成内容&#xff09;是一种通过深度学习和自然语言处理&#xff08;NLP&#xff09;等技术生成内容的方式。近年来&#xff0c;AIGC在医疗健康领域展现出了极…

数据结构 (18)数的定义与基本术语

前言 数据结构是计算机科学中的一个核心概念&#xff0c;它描述了数据元素之间的关系以及这些元素在计算机中的存储方式。 一、数的定义 在计算机科学中&#xff0c;“数”通常指的是树形数据结构&#xff0c;它是一种非线性的数据结构&#xff0c;由节点&#xff08;或称为元素…

基于PoE交换机的智慧停车场监控组网应用

伴随城市发展快速&#xff0c;汽车保有量也不断增长&#xff0c;导致停车管理问题也愈发凸显。针对包括路侧停车位、地面停车场、地下停车场等场景的停车管理需求&#xff0c;通常会部署监控设备进行车位监测、现场安全监测等&#xff0c;助力构建智能化停车管理。因此如何为分…

【RocketMQ事务消息如何实现】

贴上一段实现代码, 业务中可以参考使用 Component public class TestIdpSender {public void sendInTransaction(String topic, String tag, String message){Message<String> msg MessageBuilder.withPayload(message).build();String dt topic ":" tag;…

ENSP IPV6-over-IPV4

IPv6是网络层协议的第二代标准协议&#xff0c;一个IPv6地址同样可以分为网络前缀和主机ID两个部分。 可以将IPV4的网络看成IPV6的承载网&#xff0c;只有IPv4网络是连通的&#xff0c;则IPv6网络才有可能连通。所以配置的时候需要先配置IPv4网络的路由功能&#xff0c;再配IP…

vue3透传Attributes

vue3透传Attributes,组件名称上写的事件、style、类名也会生效&#xff1b; 如果是透传事件&#xff0c;点击子组件内部按钮&#xff0c;会执行组件内部&#xff0c;再执行组件名上的 父组件 <script setup> import ChildView from ./ChildView.vuefunction onClick()…

18. C++STL 4(vector的使用, 空间增长, 迭代器失效详解)

⭐本篇重点&#xff1a;vector容器的使用详解 ⭐本篇代码&#xff1a;c学习/08.vector_test 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. vector的介绍 二. vector的使用 2.1 vector的定义 * 2.2 vector的迭代器和遍历 a operator[]访问 b vect…

深入探索机器学习性能优化的关键路径——《特征工程训练营》

通过“特征工程”技术&#xff0c;可优化训练数据&#xff0c;提升机器学习流程的输出效果&#xff01;“特征工程”基于现有数据设计相关的输入变量&#xff0c;由此简化训练过程&#xff0c;增强模型性能。调整超参数或模型的效果都不如特征工程&#xff1b;特征工程通过改变…

吉他初学者学习网站搭建系列(8)——如何练习音阶

文章目录 背景实现吉他面板音阶位置音阶识别 结语 背景 大家好&#xff0c;我是一个爱好音乐的非典型程序员&#xff01;我最近又往自己的网站中集成了一个模块——音阶。下面介绍一下背景。 很多吉他初学者在掌握了一些音阶知识后&#xff0c;可能不知道怎么训练自己的对音阶…

15.三数之和 python

三数之和 题目题目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;题目链接 题解Python 实现解释提交结果 题目 题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满…

tauri使用github action打包编译多个平台arm架构和inter架构包踩坑记录

这些error的坑&#xff0c;肯定是很多人不想看到的&#xff0c;我的开源软件PakePlus是使用tauri开发的&#xff0c;PakePlus是一个界面化将任何网站打包为轻量级跨平台软件的程序&#xff0c;利用Tauri轻松构建轻量级多端桌面应用和多端手机应用&#xff0c;为了实现发布的时候…