突破最强算法模型,Transformer !!

news2024/12/29 10:30:24

这几天,大家对于Transformer的问题,还是不少。

今儿再和大家聊聊~

简单来说,Transformer 是一种神经网络模型,在机器翻译、语言理解等任务中表现特别好。它的核心思想是自注意力机制(Self-Attention),能够处理句子中的所有词并理解它们之间的关系。

图片

开始,咱们用一个浅显易懂的例子来说明 Transformer 是怎么工作的。

假设你在读一句话:“小明今天去商店买了一本书。

传统方法的问题

传统的模型(比如循环神经网络,RNN)是按顺序阅读这句话的。也就是说,它先看到“小明”,然后是“今天”,再是“去商店”……每读到一个词,它才记住前面的部分。这种方式虽然有效,但如果句子很长,前面的词就容易被“忘记”,特别是如果你想知道小明到底买了什么,这个“”就很重要,但它离“小明”很远。

那Transformer 如何解决?

Transformer 不按顺序逐个看句子,而是一次性把整个句子都看一遍,它会考虑每个词和其他词之间的关系

举个例子:

1. 自注意力机制: Transformer 会问自己:“句子里的每个词,跟其他词有什么关系?” 比如:

  • “小明”跟“买”有关系,因为小明是买东西的人。
  • “买”和“书”有关系,因为买的东西是书。
  • “今天”和“去商店”有关系,因为今天是去商店的时间。

2. 权重: 这些词的关系是有“权重”的,意思是有的词的关系更重要,比如“买”和“书”之间的关系要比“买”和“今天”之间的关系重要,因为我们更关心买的是什么。

3. 并行处理: Transformer 并不像传统模型那样一步一步处理,而是并行地处理句子中的每个词。它的自注意力机制可以一次就“看到”句子里的所有词,并快速找到它们之间的重要关系。

再举个通俗的例子:

假设 Transformer 是一个正在听朋友讲故事的小学生。故事很长,小学生不能依靠只记住故事开头就理解整个故事。所以他一边听一边在脑中快速建立人物、地点、事件之间的联系:

  • 他知道“小明”是主角,所以听到“小明”做什么事情时特别注意。
  • 他听到“买了书”,就能迅速联系到“小明”是买书的那个人。
  • 他也知道“商店”和“买东西”有关,所以商店的存在也很重要。

这样,即使故事很复杂,小学生依然能通过理解这些联系快速明白故事的意思。这就是 Transformer 的思路!

总之,Transformer 的厉害之处在于它并行处理句子中的所有词,并且通过自注意力机制,理解每个词跟其他词的关系。这样即使句子很长,它也能快速且准确地抓住句子的意思。

下面,咱们详细的聊聊原理、公式以及一个案例代码,这里不使用现成的Python包,重点再原理的理解~

Transformer 公式推导

Transformer 的核心在于自注意力机制位置编码

自注意力机制(Scaled Dot-Product Attention)

自注意力机制是 Transformer 中最重要的部分。它的目标是让每个词(或特征)能够和其他词建立联系。这个过程分为几个步骤:

  • 输入向量:每个词 通过嵌入层得到向量表示 。
  • 生成 Query, Key, Value:对于每个输入向量,我们生成 Query ,Key ,Value :

这里 是可学习的权重矩阵。

  • 注意力得分:计算 Query 和 Key 之间的相似度,使用点积来衡量:

其中 是向量的维度,确保点积的规模不会过大或过小,softmax 将得分归一化为概率分布。

位置编码

由于 Transformer 不像 RNN 那样按顺序处理输入,它通过位置编码给每个词的位置加上位置信息。位置编码的公式如下:

案例构建

我们使用一个简化的 Transformer 进行文本分类任务。为了避免使用高级框架,让大家更容易理解其原理。咱们零开始实现自注意力机制和模型的训练。

Kaggle 数据集

我们使用 Kaggle 上的 “IMDb Movie Reviews” 数据集进行文本分类任务(正面/负面情感)。

我们先加载数据集并进行预处理:

import numpy as np
import pandas as pd
import re
from sklearn.model_selection import train_test_split

# 加载 IMDb 数据集
df = pd.read_csv('IMDB Dataset.csv')

# 数据预处理(简单清理)
def clean_text(text): 
    text = re.sub(r'<.*?>', '', text)    
    text = re.sub(r'[^a-zA-Z\s]', '', text)    
    text = text.lower()    
    return text

df['clean_review'] = df['review'].apply(clean_text)
df['label'] = df['sentiment'].map({'positive': 1, 'negative': 0})

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df['clean_review'], df['label'], test_size=0.2, random_state=42)

# 简单的词汇表构建
from collections import Counter
vocab = Counter()
for text in X_train: 
    vocab.update(text.split())    

vocab_size = 5000
vocab = dict(vocab.most_common(vocab_size))

# 构建词向量
word2idx = {word: idx for idx, (word, _) in enumerate(vocab.items(), 1)}
word2idx['<UNK>'] = 0

# 将文本转为索引
def text_to_sequence(text): 
    return [word2idx.get(word, 0) for word in text.split()]

X_train_seq = [text_to_sequence(text) for text in X_train]
X_test_seq = [text_to_sequence(text) for text in X_test]

自注意力机制实现

class ScaledDotProductAttention:
    def __init__(self, d_k):    
        self.d_k = d_k        
        
    def attention(self, Q, K, V):    
        scores = np.dot(Q, K.T) / np.sqrt(self.d_k)        
        attention_weights = np.exp(scores) / np.sum(np.exp(scores), axis=1, keepdims=True)        
        return np.dot(attention_weights, V)

# 示例输入,假设我们已经有了词向量
Q = np.random.rand(10, 64)  # 10个词,64维度
K = np.random.rand(10, 64)
V = np.random.rand(10, 64)

attention = ScaledDotProductAttention(64)
output = attention.attention(Q, K, V)

可视化分析与复杂图形

我们现在对数据集进行一些可视化分析,比如词频分布、模型的训练损失等。下面展示了如何生成颜色鲜艳的图形:

import matplotlib.pyplot as plt
import seaborn as sns

# 词频分布
word_counts = pd.DataFrame(vocab.items(), columns=['word', 'count']).sort_values(by='count', ascending=False).head(20)

plt.figure(figsize=(12, 6))
sns.barplot(x='count', y='word', data=word_counts, palette='rainbow')
plt.title('Top 20 Words by Frequency')
plt.show()

图片

在这里插入图片描述

在这里插入图片描述

整体代码:

import numpy as np
import pandas as pd
import re
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split

# 加载 IMDb 数据集
df = pd.read_csv('dataset/IMDB Dataset.csv')

# 数据预处理(简单清理)
def clean_text(text): 
    text = re.sub(r'<.*?>', '', text)    
    text = re.sub(r'[^a-zA-Z\s]', '', text)    
    text = text.lower()    
    return text

df['clean_review'] = df['review'].apply(clean_text)
df['label'] = df['sentiment'].map({'positive': 1, 'negative': 0})

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df['clean_review'], df['label'], test_size=0.2, random_state=42)

# 简单的词汇表构建
from collections import Counter

vocab = Counter()
for text in X_train:   
    vocab.update(text.split())

vocab_size = 5000
vocab = dict(vocab.most_common(vocab_size))

# 构建词向量
word2idx = {word: idx for idx, (word, _) in enumerate(vocab.items(), 1)}
word2idx['<UNK>'] = 0

# 将文本转为索引
def text_to_sequence(text): 
    return [word2idx.get(word, 0) for word in text.split()]

X_train_seq = [text_to_sequence(text) for text in X_train]
X_test_seq = [text_to_sequence(text) for text in X_test]

class ScaledDotProductAttention:
    def __init__(self, d_k):   
        self.d_k = d_k    
        
    def attention(self, Q, K, V):     
        scores = np.dot(Q, K.T) / np.sqrt(self.d_k)        
        attention_weights = np.exp(scores) / np.sum(np.exp(scores), axis=1, keepdims=True)        
        return np.dot(attention_weights, V)

# 示例输入,假设我们已经有了词向量
Q = np.random.rand(10, 64)  # 10个词,64维度
K = np.random.rand(10, 64)
V = np.random.rand(10, 64)

attention = ScaledDotProductAttention(64)
output = attention.attention(Q, K, V)

# 词频分布
word_counts = pd.DataFrame(vocab.items(), columns=['word', 'count']).sort_values(by='count', ascending=False).head(20)

plt.figure(figsize=(12, 6))
sns.barplot(x='count', y='word', data=word_counts, palette='rainbow')
plt.title('Top 20 Words by Frequency')
plt.show()

# 模型训练过程中的损失变化(假设我们有训练的 loss 记录)
losses = np.random.rand(100)  # 假设有 100 轮训练的损失
plt.figure(figsize=(12, 6))
plt.plot(losses, color='magenta')
plt.title('Training Loss Over Time')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()

这几个重点,大家可以注意下~

  • 使用基础 Python 实现了一个简化版的 Transformer,并应用了自注意力机制的核心概念。
  • 选择了 IMDb 数据集来做情感分类任务,进行了词频可视化和训练损失曲线的绘制。
  • 接下来的步骤可以继续扩展,如实现多头注意力、完整的前馈网络,进一步改进模型的表现。

整体案例通过自底向上的方式构建 Transformer,尽可能帮助大家深入理解其原理,尤其是注意力机制的核心思想。

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

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

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

相关文章

el-image(vue 总)

一 加载静态资源 在第一次使用vue3开发项目时&#xff0c;使用require&#xff08;‘图片路径’&#xff09;&#xff0c;结果浏览器报错&#xff1a; Uncaught (in promise) ReferenceError: require is not defined 因为require是webpack提供的一种加载能力&#xff0c;但…

经典文献阅读之--Multi S-Graphs(一种高效的实时分布式语义关系协同SLAM)

0. 简介 协作同时定位与建图&#xff08;CSLAM&#xff09;对于使多个机器人能够在复杂环境中操作至关重要。大多数CSLAM技术依赖于原始传感器测量或低级特征&#xff0c;如关键帧描述符&#xff0c;这可能由于缺乏对环境的深入理解而导致错误的闭环。此外&#xff0c;这些测量…

[SDK]-菜单 和 树控件

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解菜单和树控件的相关知识 菜单 认识菜单 及 创建自定义菜单栏 资源文件 -> 项目名.rc ->Menu 这是系统提供的默认菜单&#xff0c;也可以往里面添加修改内容 以下是 自定义菜单栏&#xff1a; 创…

如何通过Autoscaler实现Kubernetes的伸缩?

本文将介绍如何在流量高峰之前使用KEDA和Cron scaler主动调整工作负载规模。 在设计Kubernetes集群时&#xff0c;我们可能经常需要回答以下问题&#xff1a; 集群伸缩需要多长时间&#xff1f;在新Pod创建之前需要等待多长时间&#xff1f; 有四个主要因素会影响集群的伸缩…

Windows环境下 VS2022 编译 OGG 源码

OGG OGG音频编码格式&#xff0c;全称为Ogg Vorbis&#xff0c;是一种开源且无专利限制的音频压缩格式。它被设计用来提供高质量的音频存储和传输&#xff0c;同时保持较小的文件大小。OGG Vorbis支持多声道音频&#xff0c;并且可以处理可变比特率&#xff0c;这意味着它可以根…

分享从零开始学习网络设备配置--任务6.3 使用基本ACL限制网络访问

任务描述 某公司构建了互联互通的办公网&#xff0c;为保护公司内网用户数据的安全&#xff0c;该公司实施内网安全防范措施。公司分为经理部、财务部和销售部&#xff0c;分属3个不同的网段&#xff0c;3个部门之间用路由器进行信息传递。为了安全起见&#xff0c;公司领导要求…

npm 清除缓存

npm cache clean --forcenpm cache verify# 安装依赖 npm install# 建议不要直接使用 cnpm 安装依赖&#xff0c;会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 npm install --registryhttps://registry.npmmirror.com npm彻底清理缓存_npm cache verify-CSD…

OpenCV仿射变换和透视变换函数(C++)

文章目录 引言图像仿射变换 warpAffine()图像的旋转仿射变换 透视变换 warpPerspective()透视变换例子参考文献 **仿射变换相关函数** cv::transform()&#xff1a;对一组点进行仿射变换 cv::warpAffine()&#xff1a;对整幅图像进行仿射变换 cv::getAffineTransform()&#xf…

[基于 Vue CLI 5 + Vue 3 + Ant Design Vue 4 搭建项目] 01 安装 nodejs 环境

文章目录 下载安装测试 这里让我们去看看如何安装一下 nodejs 的环境 下载 通过官网进行下载安装包 官网 https://nodejs.org/zh-cn点击 下载 Node.js (LTS) 开始下载 安装 下载完成之后&#xff0c;双击进行安装 开始进行安装了 这样&#xff0c;node.js 就安装好了 测试 …

Ubuntu下使用Cron定时任务

Ubuntu下使用Cron定时任务 文章目录 Ubuntu下使用Cron定时任务概述Cron 工作原理crontab的基本指令使用Cron 定时任务语法用户的crontab 文件系统的crontab 文件cron 任务设置环境变量1. 直接在 crontab 中声明变量2. 将变量声明为命令的一部分3. 从文件加载变量使用环境变量控…

网络基础入门指南(二)

一、什么是交换机 交换机&#xff0c;Switch 用于将多台计算机/交换机连接到一起&#xff0c;组建网络 交换机负责为其中任意两台计算机提供独享线路进行通信类型&#xff1a; 非网管&#xff08;即插即用&#xff09;&#xff0c;便宜&#xff0c;不可管理 网管&#xff0…

CCF推荐C类会议和期刊总结:(计算机体系结构/并行与分布计算/存储系统领域)

中国计算机学会&#xff08;CCF&#xff09;在计算机体系结构、并行与分布计算、存储系统领域推荐了一系列C类会议和期刊。此汇总涵盖了各期刊和会议的全称、出版社、dblp文献网址及研究领域&#xff0c;为学者和研究人员提供了重要的学术交流资源。列表包括《ACM Journal on E…

Javase复习day21算法、arrays、Lamdba表达式

常见算法 查找算法 基本查找 package search;public class BasicSearchDemo1 {public static void main(String[] args) {//基本算法&#xff08;顺序查找&#xff09;int[] arr {131,23,57,37,95,48,57,43};System.out.println(basicSearch(arr, 43));}public static boo…

基于PINN 进行混合流体中的热量与质量扩散预测

近年来&#xff0c;物理信息神经网络&#xff08;PINN&#xff0c;Physics-Informed Neural Networks&#xff09;成为解决复杂物理问题的一种强大工具。PINN 的核心在于结合物理定律和机器学习的能力&#xff0c;直接从偏微分方程&#xff08;PDEs&#xff09;出发&#xff0c…

LDtk to Unity 大致流程和一些注意点

因为自己也还在探索中&#xff0c;所以有点杂乱&#xff0c;后续有其他的东西还会继续更。 制作 先套用这个模板&#xff0c;确定基础的循环。再去丰富。 LDtk一小时完全入门教程_哔哩哔哩_bilibili To Unity 安装包 LDtk To Unity 输出 图集 在Run after saving运行 ../../Lib…

Arch - 架构安全性_凭证(Credentials)

文章目录 OverView凭证&#xff08;Credentials&#xff09;1. 传统认证授权方式&#xff1a;Cookie-Session 机制2. OAuth2 令牌概述什么是 JWTJWT 令牌 结构HeaderPayloadSignature JWT的优劣势无状态架构的挑战 3. JWT 与 Cookie-Session 的对比 OverView 即使只限定在“软…

rustDesk远程软件,强的可怕

背景 最近在做一个机房的远程运维&#xff0c;对面系统都是windows的&#xff0c;远程本来采用的向日葵&#xff0c;开两三个窗口就不能再多开了&#xff0c;没办法冲了年费瓜子会员&#xff0c;开通会员之后&#xff0c;确实好很多。 随后又增加了一个值班人员&#xff0c;我…

HarmonyOs 应用基础--ArkTS-核心-基础

目录 八. ArkTS-语句-类型进阶与渲染控制 1. 对象进阶 1.1. 定义对象数组 1.2. 使用对象数组 2. 渲染控制 - ForEach 2.1. ForEach语法 2.2. ForEach使用优化代码 2.3. 案例-学生档案 实现思路 3. Math对象 4. 综合案例 -- 抽奖卡案例 4.1. 初始页面布局&#xff08;静…

手机到了外地ip地址就变了吗

手机到了外地IP地址就变了吗&#xff1f;随着智能手机的普及&#xff0c;人们越来越频繁地使用手机进行各种网络活动。然而&#xff0c;关于手机IP地址是否会随着地理位置的变化而改变&#xff0c;许多用户仍心存疑惑。本文将深入探讨这一问题&#xff0c;揭示IP地址变化的奥秘…

【C++ 09】继承

文章目录 &#x1f308; 一、继承的概念及定义⭐ 1. 继承的概念⭐ 2. 继承的定义&#x1f319; 2.1 定义格式&#x1f319; 2.2 继承方式和访问限定符&#x1f319; 2.3 继承父类成员访问方式的变化&#x1f319; 2.4 默认继承方式 &#x1f308; 二、父类和子类对象赋值转换⭐…