【Datawhale组队学习:Sora原理与技术实战】Attention

Attention

Attention = 注意力,从两个不同的主体开始。
在这里插入图片描述
论文:https://arxiv.org/pdf/1703.03906.pdf
seq2seq代码仓:https://github.com/google/seq2seq

计算方法:
加性Attention,如(Bahdanau attention):

v a ⊤ tanh ⁡ ( W 1 h t + W 2 h ‾ s ) \boldsymbol{v}_a^{\top} \tanh \left(\boldsymbol{W}_{\mathbf{1}} \boldsymbol{h}_t+\boldsymbol{W}_{\mathbf{2}} \overline{\boldsymbol{h}}_s\right) vatanh(W1ht+W2hs)
乘性Attention,如(Luong attention):

score ⁡ ( h t , h ‾ s ) = { h t ⊤ h ‾ s dot  h t ⊤ W a h ‾ s general  v a ⊤ tanh ⁡ ( W a [ h t ; h ‾ s ] ) concat  \operatorname{score}\left(\boldsymbol{h}_{t}, \overline{\boldsymbol{h}}_{s}\right)=\left\{\begin{array}{ll} \boldsymbol{h}_{t}^{\top} \overline{\boldsymbol{h}}_{s} & \text { dot } \\ \boldsymbol{h}_{t}^{\top} \boldsymbol{W}_{a} \overline{\boldsymbol{h}}_{s} & \text { general } \\ \boldsymbol{v}_{a}^{\top} \tanh \left(\boldsymbol{W}_{a}\left[\boldsymbol{h}_{t} ; \overline{\boldsymbol{h}}_{s}\right]\right) & \text { concat } \end{array}\right. score(ht,hs)= hthshtWahsvatanh(Wa[ht;hs]) dot  general  concat 
来源论文:https://arxiv.org/pdf/1508.04025.pdf

From Attention to SelfAttention

Self Attention

“Attention is All You Need” 这篇论文提出了Multi-Head Self-Attention,是一种:Scaled Dot-Product Attention。

Attention ⁡ ( Q , K , V ) = softmax ⁡ ( Q K T d k ) V \operatorname{Attention}(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V Attention(Q,K,V)=softmax(dk QKT)V

来源论文:https://arxiv.org/pdf/1706.03762.pdf

Scaled

Scaled 的目的是调节内积,使其结果不至于太大(太大的话softmax后就非0即1了,不够“soft”了)。

来源论文: https://kexue.fm/archives/4765

Multi-Head

Multi-Head可以理解为多个注意力模块,期望不同注意力模块“注意”到不一样的地方,类似于CNN的Kernel。

Multi-head attention allows the model to jointly attend to information from different representation
subspaces at different positions.

MultiHead ⁡ ( Q , K , V ) = Concat ⁡ ( head ⁡ 1 , … , head  h ) W O where head  i = Attention ⁡ ( Q W i Q , K W i K , V W i V ) \begin{aligned} \operatorname{MultiHead}(Q, K, V) & =\operatorname{Concat}\left(\operatorname{head}_1, \ldots, \text { head }_{\mathrm{h}}\right) W^O \\ \text { where head }_{\mathrm{i}} & =\operatorname{Attention}\left(Q W_i^Q, K W_i^K, V W_i^V\right) \end{aligned} MultiHead(Q,K,V) where head i=Concat(head1,, head h)WO=Attention(QWiQ,KWiK,VWiV)
来源论文: https://arxiv.org/pdf/1706.03762.pdf

代码实践

Attention

导入库

from dataclasses import dataclass
import torch
import torch.nn as nn
import torch.nn.functional as Ffrom selfattention import SelfAttention

我们只用一个核心的SelfAttention模块(可支持Single-Head或Multi-Head),来学习理解Attention机制。

class Model(nn.Module):def __init__(self, config):super().__init__()self.config = configself.emb = nn.Embedding(config.vocab_size, config.hidden_dim)self.attn = SelfAttention(config)self.fc = nn.Linear(config.hidden_dim, config.num_labels)def forward(self, x):batch_size, seq_len = x.shapeh = self.emb(x)attn_score, h = self.attn(h)h = F.avg_pool1d(h.permute(0, 2, 1), seq_len, 1)h = h.squeeze(-1)logits = self.fc(h)return attn_score, logits
@dataclass
class Config:vocab_size: int = 5000hidden_dim: int = 512num_heads: int = 16head_dim: int = 32dropout: float = 0.1num_labels: int = 2max_seq_len: int = 512num_epochs: int = 10config = Config(5000, 512, 16, 32, 0.1, 2)model = Model(config)x = torch.randint(0, 5000, (3, 30))
x.shape
#torch.Size([3, 30])attn, logits = model(x)
attn.shape, logits.shape
#(torch.Size([3, 16, 30, 30]), torch.Size([3, 2]))

数据

import pandas as pd
from sklearn.model_selection import train_test_splitfile_path = "./data/ChnSentiCorp_htl_all.csv"df = pd.read_csv(file_path)
df = df.dropna()
df.head(), df.shape'''
(   label                                             review0      1  距离川沙公路较近,但是公交指示不对,如果是"蔡陆线"的话,会非常麻烦.建议用别的路线.房间较...1      1                       商务大床房,房间很大,床有2M宽,整体感觉经济实惠不错!2      1         早餐太差,无论去多少人,那边也不加食品的。酒店应该重视一下这个问题了。房间本身很好。3      1  宾馆在小街道上,不大好找,但还好北京热心同胞很多~宾馆设施跟介绍的差不多,房间很小,确实挺小...4      1               CBD中心,周围没什么店铺,说5星有点勉强.不知道为什么卫生间没有电吹风,(7765, 2))
'''df.label.value_counts()
'''
label
1    5322
0    2443
Name: count, dtype: int64
'''

数据不均衡,我们给它简单重采样一下。

df = pd.concat([df[df.label==1].sample(2500), df[df.label==0]])
df.shape
#(4943, 2)df.label.value_counts()
'''
label
1    2500
0    2443
Name: count, dtype: int64
'''
from tokenizer import Tokenizertokenizer = Tokenizer(config.vocab_size, config.max_seq_len)tokenizer.build_vocab(df.review)tokenizer(["你好", "你好呀"])
'''
tensor([[3233,    0],[3233,  955]])
'''def collate_batch(batch):label_list, text_list = [], []for v in batch:_label = v["label"]_text = v["text"]label_list.append(_label)text_list.append(_text)inputs = tokenizer(text_list)labels = torch.LongTensor(label_list)return inputs, labelsfrom dataset import Datasetds = Dataset()
ds.build(df, "review", "label")len(ds), ds[0]
'''
(4943,{'text': '1、酒店环境不错,地理位置佳。到十全街、凤凰街挺方便的。属于闹中取静的那种。2、客房里设施齐全、干净,比较方便。卫浴设施也挺好的。插头挺多的,很好。房间很干净,也挺温馨的。3、自助餐还可以。美中不足之处:1、卫生纸的质量比较差。2、饭店里最好可以提供(自助)洗衣、干衣的服务。3、房间里的小冰箱效果不好,声音也比较响。反正不用,我就关掉了。总体感觉不错,性价比高,下次还来住。','label': 1})
'''train_ds, test_ds = train_test_split(ds, test_size=0.2)
train_ds, valid_ds = train_test_split(train_ds, test_size=0.1)
len(train_ds), len(valid_ds), len(test_ds)
#(3558, 396, 989)
from torch.utils.data import DataLoaderBATCH_SIZE = 8train_dl = DataLoader(train_ds, batch_size=BATCH_SIZE, collate_fn=collate_batch)
valid_dl = DataLoader(valid_ds, batch_size=BATCH_SIZE, collate_fn=collate_batch)
test_dl = DataLoader(test_ds, batch_size=BATCH_SIZE, collate_fn=collate_batch)
len(train_dl), len(valid_dl), len(test_dl)
#(445, 50, 124)
for v in train_dl: breakv[0].shape, v[1].shape, v[0].dtype, v[1].dtype
#(torch.Size([8, 225]), torch.Size([8]), torch.int64, torch.int64)

训练

from trainer import train, testNUM_EPOCHS = 10
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")config = Config(5000, 64, 1, 64, 0.1, 2)
model = Model(config)
model.to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-3)
train(model, optimizer, train_dl, valid_dl, config)test(model, test_dl)
'''
Epoch [1/10]
Iter: 445,  Train Loss: 0.52,  Train Acc: 0.75,  Val Loss: 0.52,  Val Acc: 0.74
Epoch [2/10]
Iter: 890,  Train Loss: 0.51,  Train Acc: 0.75,  Val Loss: 0.51,  Val Acc: 0.76
Epoch [3/10]
Iter: 1335,  Train Loss: 0.50,  Train Acc: 0.62,  Val Loss: 0.52,  Val Acc: 0.78
Epoch [4/10]
Iter: 1780,  Train Loss: 0.51,  Train Acc: 0.62,  Val Loss: 0.49,  Val Acc: 0.79
Epoch [5/10]
Iter: 2225,  Train Loss: 0.56,  Train Acc: 0.62,  Val Loss: 0.45,  Val Acc: 0.81
Epoch [6/10]
Iter: 2670,  Train Loss: 0.64,  Train Acc: 0.88,  Val Loss: 0.41,  Val Acc: 0.82
Epoch [7/10]
Iter: 3115,  Train Loss: 0.58,  Train Acc: 0.88,  Val Loss: 0.38,  Val Acc: 0.84
Epoch [8/10]
Iter: 3560,  Train Loss: 0.52,  Train Acc: 0.75,  Val Loss: 0.36,  Val Acc: 0.85
Epoch [9/10]
Iter: 4005,  Train Loss: 0.45,  Train Acc: 0.75,  Val Loss: 0.37,  Val Acc: 0.86
Epoch [10/10]
Iter: 4450,  Train Loss: 0.34,  Train Acc: 0.88,  Val Loss: 0.38,  Val Acc: 0.87
0.8554189267686065
'''

推理

from inference import infer, plot_attention
import numpy as npsample = np.random.choice(test_ds)
while len(sample["text"]) > 20:sample = np.random.choice(test_ds)print(sample)inp = sample["text"]
inputs = tokenizer(inp)
attn, prob = infer(model, inputs.to(device))
attn_prob = attn[0, 0, :, :].cpu().numpy()
tokens = tokenizer.tokenize(inp)
tokens, prob
'''
{'text': '买东西方便!不错的选择!大家也要选择', 'label': 1}
(['买', '东西', '方便', '!', '不错', '的', '选择', '!', '大家', '也', '要', '选择'], 1)
'''
plot_attention(attn_prob, tokens, tokens)tokenizer.get_freq_of("不")
# 2659

在这里插入图片描述

LLM

准备代码仓

git clone https://github.com/hscspring/llama.np
cd llama.np/

下载模型

# 从这里下载模型 https://hf-mirror.com/karpathy/tinyllamas/tree/main
# 放到llama.np目录
import os# 设置环境变量
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'# 下载模型
os.system('huggingface-cli download --resume-download karpathy/tinyllamas --local-dir /root/datawhale/sora_learn/datawhale/attention-llm/llm/llama.np')

转换格式

python convert_bin_llama_to_np.py stories15M.bin

生成

python main.py "Once upon"

LLaMA

from config import ModelArgs
from model import Llama
from tokenizer import Tokenizer
import numpy as npargs = ModelArgs(288, 6, 6, 6, 32000, None, 256)token_model_path = "./tokenizer.model.np"
model_path = "./stories15M.model.npz"tok = Tokenizer(token_model_path)
llama = Llama(model_path, args)prompt = "Once upon"ids = tok.encode(prompt)
input_ids = np.array([ids], dtype=np.int32)
token_num = input_ids.shape[1]print(prompt, end="")
for ids in llama.generate(input_ids, args.max_seq_len, True, 1.0, 0.9, 0):output_ids = ids[0].tolist()if output_ids[-1] in [tok.eos_id, tok.bos_id]:breakoutput_text = tok.decode(output_ids)print(output_text, end="")

运行结果

**Once uponong end, there wa a girl named Sophie. She wa three year old and loved to explore. She had a different blouse with lot of bright colour.
One day, Sophie wa walking in the park with her mommy. She saw a shiny pedal on the ground. It wa a shiny one, so she picked it up and wa so excited to have found it.
“Mommy, look! I found a new pedal!” she said.
“That’ great, Sophie,” her mommy said. “I know, it look very exciting!”
But then Sophie noticed that her reflection in the bright blade of the pedal seemed very distant. She started to worry.
“Mommy, what’ wrong?” Sophie asked.
“It’ too far away to come back,” her mommy replied.
“Let’ go look for it,” Sophie said.
So they started to look for the pedal. They walked a bit further and eventually, they found it! Sophie wa so happy.
“Mommy, thi pedal i so interesting!” Sophie said.
Her mommy smiled and said, “Ye**

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

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

相关文章

【工商业储能如何选】Acrel工商业储能系统解决方案

市场前景 碳中和:全球应对气候危机重建人与自然和谐关系的共同目标 清洁替代:清洁能源替代化石能源是全球实现碳中和的唯一路径 能量存储:储能技术是解决大比例清洁能源时空分布不平衡的最佳方案 应用场景 随着“双碳”目标下的新型电力…

Python+Selenium使用Page Object实现页面自动化测试

Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通过调用页面类来获取页…

记一次:android学习笔记一(学习目录-不要看无内容)

学习目录如下 B站学习的名称--Android开发从入门到精通(项目案例版) 网址:https://www.bilibili.com/video/BV1jW411375J/ 第0章:安装 android stoid 参考地址https://blog.csdn.net/adminstate/article/details/130542368 第一章:第一个安卓应用 第二章:用户界面设…

OpenCV 4基础篇| OpenCV图像的拆分和合并

目录 1. 通道拆分1.1 cv2.split1.1.1 语法结构1.1.2 注意事项1.1.3 代码示例 1.2 NumPy切片1.2.1 代码示例 2. 通道合并2.1 cv2.merge2.1.1 语法结构2.1.2 注意事项2.1.3 代码示例 1. 通道拆分 1.1 cv2.split 1.1.1 语法结构 b,g,r cv2.split(img[, mv]) #图像拆分为 BGR 通…

【开发工具】GIF 录屏工具推荐 ( GIF123 - 推荐使用 | GifCam | LICEcap )

文章目录 一、GIF 录屏工具推荐1、GIF123 ( 推荐使用 )2、GifCam3、LICEcap 本博客中介绍的 3 款 GIF 录屏工具下载地址 : https://download.csdn.net/download/han1202012/88905642 也可以到对应的官网独立下载 : GIF123 : https://gif123.aardio.com/ ;GifCam : https://bl…

FAST-LIO系列-阅读笔记

近期,阅读了FAST-LIO、FAST-LIO2以及Faster_LIO论文,这三篇论文都属于滤波器的SLAM算法,下面记录一下三个工作的主要贡献和不同。 FAST-LIO 1.提出了一种计算效率高、鲁棒性强的激光雷达-惯性里程测量框架。使用紧密耦合的迭代扩展卡尔曼滤…

报错:/bin/sh: warning: setlocale: LC_ALL: cannot change locale (zh_CN.UTF-8)

解释:这是shell 警告你无法将当前的区域设置(locale)更改为 zh_CN.UTF-8,这个警告可能不会影响 fc-cache 命令的实际运行,但它确实表明系统在某些方面可能无法正确地处理与 zh_CN.UTF-8 相关的内容。 1.检查当前的区域…

2024年口腔护理市场行业未来前景预测:正畸护理用品市场行业分析报告

口腔护理是维护口腔健康的重要步骤,近年来,随着大众口腔健康意识的不断增强,人们对于口腔护理的消费意愿也不断增加,由此,口腔护理市场的市场规模也比较大。 根据鲸参谋电商数据分析平台的相关数据显示,20…

OSCP靶场--Walla

OSCP靶场–Walla 考点(1.hydra http基本认证爆破: 2.sudo -l:python导入外部模块提权 3.Linux内核提权:cve-2021-4034) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.181.97 --min-rate 2000 Starting N…

RT-DETR算法优化改进: 特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

💡💡💡本文独家改进:即结合用梯度路径规划(CSPNet)和(ELAN)设计了一种广义的高效层聚合网络(GELAN),高效结合RT-DETR,实现涨点。 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现涨点 RT-DETR魔术师专栏介绍: https://blog.csdn.net/…

使用postman测试若依登录接口API-2

请求方式 由于登录控制器可知:该请求方式为Post请求 请求地址 在请求路径栏输入请求地址,如下图所示: 参数体 在Body键入所需参数,类型选择raw,数据格式选择"JSON":如下图所示: 认证成功与失败…

香杆箐骑行记,春回大地

2024年3月2日春回大地之际我们校长骑行群再次踏上征程前往香杆箐。这次骑行不仅是一次对身体的锻炼更是一次心灵的洗礼。 清晨的阳光洒满大地我们从郊野公园后门出发踏上了前往香杆箐的道路。沿途的风景如画绿树成荫鲜花盛开让人心旷神怡。我们沿着山路蜿蜒前行感受着大自然的韵…

正则表达式-分组

1、oracle-正则表达式:将09/29/2008 用正则表达式转换成2008-09-29 select regexp_replace(09/29/2008, ^([0-9]{2})/([0-9]{2})/([0-9]{4})$, \3-\1-\2) replace from dual; 解析:regexp_replace-替换, 第一个参数:需要进行处…

Golang Copy()方法学习

前言 主要是涉及到深浅拷贝相关的,但是在看的一个资料过程中发现他有错…并且一系列,复制粘贴他的,也都错了。 错误文章指路 很显然,Copy是深拷贝啊!!! Copy功能 copy的代码很少&#xff0c…

玩转地下管网三维建模:MagicPipe3D系统

地下管网是保障城市运行的基础设施和“生命线”。随着实景三维中国建设的推进,构建地下管网三维模型与地上融合的数字孪生场景,对于提升智慧城市管理至关重要!针对现有三维管线建模数据差异大、建模交互弱、模型效果差、缺乏语义信息等缺陷&a…

Bert Encoder和Transformer Encoder有什么不同

前言:本篇文章主要从代码实现角度研究 Bert Encoder和Transformer Encoder 有什么不同?应该可以帮助你: 深入了解Bert Encoder 的结构实现深入了解Transformer Encoder的结构实现 本篇文章不涉及对注意力机制实现的代码研究。 注:…

详解:npm升级到pnpm对比优化点!!

npm3之前 依赖树层级过深,导致依赖路径过长并且相同依赖模块会被重复安装,占用电脑磁盘空间 npm3之后 修改为扁平化处理 算法复杂存在多项目间依赖相同副本的情况导致没有明确被依赖的包也可以直接引用,管理复杂 pnpm node_modules改成非扁平化结构&a…

微软37页论文逆向工程Sora,得到了哪些结论?

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。 追赶 Sora,成为了很多科技公司当下阶段的新目标。研究者们好奇的是:Sora 是如何被 OpenAI 发掘出来的?未来又有哪些演进和应用方向? Sora 的技术报告披露了一些技术细节&…

找专业人士编辑百度百科,避免审核问题

对于想在百度百科上创建词条或修改现有词条的网友,可能会有一些疑问,比如找第三方代不通过审核创建百度百科。那么,创建百度百科需要多少钱呢?让我们仔细看看。 百度百科创建服务一直存在。为了节省时间,很多人选择专业…

java八股文复习-----2024/03/03

1.接口和抽象类的区别 相似点: (1)接口和抽象类都不能被实例化 (2)实现接口或继承抽象类的普通子类都必须实现这些抽象方法 不同点: (1)抽象类可以包含普通方法和代码块&#x…