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

news2025/1/15 19:19:55

        自注意力机制(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.coloradmin.cn/o/2250793.html

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

相关文章

Web 表单开发全解析:从基础到高级掌握 HTML 表单设计

文章目录 前言一、什么是 Web 表单?二、表单元素详解总结前言 在现代 Web 开发中,表单 是用户与后端服务交互的重要桥梁。无论是用户登录、注册、搜索,还是提交反馈,表单都无处不在。在本文中,我们将从基础入手,全面解析表单的核心知识点,并通过示例带你轻松掌握表单开…

HCIE:详解OSPF,从基础到高级特性再到深入研究

目录 前言 一、OSPF协议基本原理 简介 基本原理 OSPF路由器类型 OSPF网络类型 OSPF报文类型和封装 OSPF邻居的建立的维护 DR和BDR的选举 伪节点 LSDB的更新 OSPF的配置 二、OSPF的高级特性 虚连接(Virtual-Link) OSPF的LSA和路由选择 OSPF…

C#读取本地图像的方法总结

前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在C#开发C#程序的时候,有时候需要读取本地图像,下面进行详…

scrapy爬虫框架小案例

豆瓣案例 一、scrapy安装二、scrapy的基本使用(爬虫项目创建->爬虫文件创建->运行 爬虫项目结构 response的属性和方法🌟)1、创建项目2、创建爬虫文件3、scrapy项目的结构4、运行爬虫文件5、response的属性和方法(爬虫的处…

服务器实现ssh证书登录

1.生成公钥和私钥 ssh-keygen -t rsa 提示默认生成位置为/root/.ssh/id_rsa ,直接回车。(也可以自己修改) 提示输入证书的密码,可以留空,建议输入,如果输入了,则需要再次确认,记住这个证书密码(证书再加…

css:转换

转换 移动 /* transform: translate(100px, 200px); */transform: translateX(100px);transform: translateY(100px); /*一个意思*/ 如果后面跟百分数的意思是移动盒子自身x/y方向长度的百分比,可以用作子绝父相控制盒子水平居中垂直居中 translate里的xy值是相对…

音视频相关的一些基本概念

音视频相关的一些基本概念 文章目录 音视频相关的一些基本概念RTTH264profile & levelI帧 vs IDRMP4 封装格式AAC封装格式TS封装格式Reference RTT TCP中的RTT指的是“往返时延”(Round-Trip Time),即从发送方发送数据开始,到…

Flink--API 之Transformation-转换算子的使用解析

目录 一、常用转换算子详解 (一)map 算子 (二)flatMap 算子 (三)filter 算子 (四)keyBy 算子 元组类型 POJO (五)reduce 算子 二、合并与连接操作 …

工业公辅车间数智化节能头部企业,蘑菇物联选择 TDengine 升级 AI 云智控

小T导读:在工业节能和智能化转型的浪潮中,蘑菇物联凭借其自研的灵知 AI 大模型走在行业前沿,为高能耗设备和公辅能源车间提供先进的 AI 解决方案。此次采访聚焦于蘑菇物联与 TDengine 的合作项目,通过 AI 云智控平台的建设&#x…

TensorFlow实战:黄文坚版Python代码详解

本文还有配套的精品资源,点击获取 简介:本书由黄文坚撰写,深入介绍了TensorFlow的使用方法。TensorFlow是谷歌开发的开源库,用于数值计算和机器学习,特别是在深度学习方面。书中通过丰富的实例和详细解释&#xff0c…

Java项目中加缓存

Java项目中加缓存 1.更新频率低;但读写频率高的数据很适合加缓存; 2.可以加缓存的地方很多:浏览器的缓存;CDN的缓存;服务器的缓存; 本地内存;分布式远端缓存; 加缓存的时候不要…

Elasticearch索引mapping写入、查看、修改

作者:京东物流 陈晓娟 一、ES Elasticsearch是一个流行的开源搜索引擎,它可以将大量数据快速存储和检索。Elasticsearch还提供了强大的实时分析和聚合查询功能,数据模式更加灵活。它不需要预先定义固定的数据结构,可以随时添加或修…

PyMOL操作手册

PyMOL 操作手册 The man will be silent, the woman will be tears. – itwangyang ​ 翻译整理:itwangyanng 2024 年 11月 29 日 目录 初识 PyMOL… 5 0.1 安装 PyMOL… 5 0.1.1 Windows 系统开源版 PyMOL 的安装… 5 0.1.2 教育版 PyMOL 的下载安装……

RabbitMQ原理架构解析:消息传递的核心机制

文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1、简单模式3.2、工作模式3.3、发布订阅3.4、路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1、单机部署5.2、集群部署(镜像模式)5.3、K8s部署…

《白帽子讲Web安全》15-16章

《白帽子讲Web安全》15-16章 《白帽子讲Web安全》15章15、Web Server配置安全15.1、Apache安全15.2、Nginx安全15.3、jBoss远程命令执行15.4、Tomcat远程命令执行15.5、HTTP Parameter Pollution15.6、小结 第四篇 互联网公司运营安全《白帽子讲Web安全》16章16、互联网业务安全…

使用R语言进行美国失业率时空分析(包括绘图)

今天写一篇利用R语言,针对面板数据的简单分析与绘图。让我们直接开始把。 一、数据准备 这次的示例数据非常简单,只有一个shp格式的美国区县矢量数据,我们在QGIS中打开数据查看一下它的属性表。事实上我们需要的数据都在属性表的字段中。 二…

计算机毕业设计Python+LSTM天气预测系统 AI大模型问答 vue.js 可视化大屏 机器学习 深度学习 Hadoop Spark

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

YOLOv8实战无人机视角目标检测

本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对无人机目标数据集进行训练和优化,该数据集包含丰富的无人机目标图像…

uniapp App端在renderjs层渲染echarts获取不到service层id的问题

报错信息:Cannot read properties of undefined (reading id) at app-view.js 这样的写法App端有时在renderjs视图层获取不到server逻辑层的数据 server层 renderjs层 解决方法:需要把数据(id)通过server层向renderjs层传值 server层 renderjs层

【数据湖仓】-- 阿里云 EMR 和 AWS EMR 工具对比

目录 1. 基础设施和集成生态 阿里云 EMR: AWS EMR: 2. 性能与可扩展性 阿里云 EMR: AWS EMR: 3. 成本对比 阿里云 EMR: AWS EMR: 4. 易用性和用户体验 阿里云 EMR: AWS EMR: 5. 总结对比 阿里云 EMR(Elastic MapReduce)和 AWS EMR(Amazon Elas…