Products
GG网络技术分享 2026-04-16 10:54 1
大胆一点... 说实话,写这篇文章的时候我整个人是崩溃的。为什么?主要原因是自这东西,听起来简单,其实吧真的让人头秃。你问我能不能一篇文章搞懂?我只能说试试吧,反正我是尽力了。我们今天就来聊聊这个让无数脱发程序员夜不能寐的东西——自。它到底是什么?它是怎么工作的?为什么它这么重要?还有,为什么代码这么难写?
先说说 我们得明白,自,也称为内部,是一种将单个序列的不同位置关联起来以计算同一序列的表示的.这意味着,对于序列中的每个元素,自会计算该元素与序列中所有其他元素的相关性,生成一个加权的表示,其中权重反映了元素间的相互关系。 简单来说... . 听懂了吗?没听懂就对了我也没太听懂。反正就是自己看自己,然后觉得哪里重要就关注哪里。

不忍直视。 在此之前,循环神经网络及其变体长短期记忆网络和门控循环单元是处理序列数据的主要方法。只是这些模型存在一些固有的局限性,比如难以并行化训练、捕捉长距离依赖关系的能力有限等。还有啊,因为序列长度增加,RNN类模型的表现往往会下降。这简直太糟糕了对吧?你想训练个模型,后来啊它跑得比蜗牛还慢,而且还记不住前面说了什么这谁受得了?
ICU你。 为了解决这些问题, 研究人员开始探索信息。这就好像考试还要看小抄,不够独立。
比一比的话, 自不依赖于任何外部信息源,而是直接关注输入序列内部元素之间的相互作用。这不仅使得模型能够更有效地捕捉序列内部复杂的依赖关系, 还极大地促进了模型的并行化训练,主要原因是每个位置上的计算都可以独立进行。所以呢,自成为构建高效且强大的序列建模工具的关键组件之一。这听起来是不是很厉害?反正我觉得挺厉害的,心情复杂。。
在自中,查询、键和值是三个核心的概念,它们共同参与计算以生成序列的加权表示。别被这些名字吓到了其实就是三个矩阵,或者说是三个向量,探探路。。
查询代表了当前元素在序列中的作用,它用于“询问”序列中的其他元素以获取相关信息。在自中, 每个元素都会生成一个对应的查询向量,该向量用于与序列中的所有键向量进行比较,以确定每个元素的重要性或相关性。就像你在图书馆找书,你的需求就是Query,挺好。。
键向量K包含了序列中每个元素的特征信息,这些信息将用于与查询向量进行匹配。键向量的主要作用是提供一种机制,使得模型能够识别和比较序列中不同元素之间的关系。 原来如此。 在自注意力中,每个元素都会有一个对应的键向量,它与查询向量一起决定了注意力分数。这就像书架上的标签,用来和你的Query比对。
值向量V包含了序列中每个元素的实际信息或特征, 这些信息将到头来用于生成输出的原始数据。 弄一下... 这就是书的内容,匹配到了之后你要把内容拿走。
在自中,输入序列的每个元素先说说被映射到三个向量:查询、键和值。这一过程通常通过与三个权重矩阵的线性变换实现。比如 输入序列X与权重矩阵W^Q、W^K和W^V相乘,得到Q、K和V:,补救一下。
其中,X是输入序列,W^Q、W^K和W^V是可学习的权重矩阵。这些矩阵的维度通常是乘以。 说到点子上了。 Q、K和V的维度是。这全是数学,看着就晕,对吧?
整起来。 自的计算过程可以被分解为几个关键步骤。接下来我们会为第一个输入计算attention score。然后对attention score施行softmax操作。这一步之后 我们会将每个输入的softmaxed score和对应的value相乘,得到3个weighted value。再说说把上一步的weighted value加起来就得到了输出。同样的步骤,我们也会对input#2和input#3施行,得到再说一个两个输出。
这个操作生成了一个注意力得分矩阵,其中每个元素代表对应元素对之间的相似度。为了将注意力得分转换为权重,应用Softmax函数进行归一化。Softmax确保所有输出权重的和为1, 从而使得模型可以学习到每个元素对的重要性:
Softmax函数定义为:
其中,xi是注意力得分矩阵中的元素。这意味着对于每个位置 i, 在计算 我们都曾是... 完 softmax 后我们会获得该位置与其他所有位置的相关性的“概率”。
我们都经历过... 自中,查询向量Q与所有键向量K之间的点积被用来计算注意力得分。为了避免点积后来啊过大导致梯度问题,引入了一个缩放因子1/√dk,其中dk是键向量的维度。缩放后的注意力得分计算如下:
再说说 归一化的注意力权重被用来对值向量V进行加权求和,生成到头来的输出序列。输出序列的每个元素是所有值向量的一个加权和, 权重由对应的注意力权重决定:,我服了。
这一步骤有效地整合了序列内部的信息,使得每个元素的输出表示包含了整个序列的上下文信息。 站在你的角度想... 这真的很神奇,虽然我算不对,但我大受震撼。
我好了。 光说不练假把式,我们来看看代码。这段代码展示了如何定义一个SelfAttention类,并在其中实现自的核心步骤。虽然代码看起来很乱,但这就是我们要面对的现实。
import torch
import as nn
import as F
from math import sqrt
class SelfAttention:
def __init__:
super.__init__
_size = embed_size
= heads
_dim = embed_size // heads
# Ensure embedding size is divisible by number of heads
assert , "Embedding size must be divisible by heads"
# Define linear transformations for queries, keys, and values
=
=
=
_out =
def forward:
N = # Batch size
length = # Sequence length
# Pass inputs through linear layers for queries, keys, and values
values =
keys =
queries =
# Split into multiple heads
values =
keys =
queries =
# Permute dimensions to put heads second
values = #
keys =
queries =
# Compute scaled dot-product attention
energy = #
attention = ), dim=3) # Softmax on last dimension
# Weighted sum
out = .reshape(
N, length, * _dim
) #
return _out
# Example usage
embed_size = 256 # Embedding dimension
heads = 8 # Number of attention heads
x = # Simulate input data
self_attention = SelfAttention
output = self_attention
print # Should print:
搞一下... 这三个变换可以看作是对原始输入的一种重新编码, 目的是从不同角度提取信息,以便后续计算注意力分数时能够更有效地捕捉到元素间的相关性。代码写完了能不能跑起来就是另一回事了反正我是没跑通,总是报错,烦死了。
你以为自注意力只能用来翻译文本吗?太天真了。它还能用来给你推荐商品,让你剁手停不下来。在推荐系统中,个性化推荐的目标是为每个用户提供最符合其兴趣和需求的内容或商品。为了实现这一点,模型需要能够捕捉用户行为模式,并根据这些模式进行预测。自因其强大的建模能力,在这一领域得到了广泛应用。下面我们将进一步细化基于自的个性化推荐系统的构建过程,并提供更加详细的代码示例。
模型选择:SASRec
SASRec 是一种专门为序列化推荐设计的深度学习模型,它利用了自来捕捉用户历史行为之间的复杂依赖关系。该模型可以有效地处理长序列数据,并且能够在不牺牲计算效率的情况下提高推荐质量。这种类型的模型特别适用于那些需要理解用户长期偏好变化的应用场景, 比方说电子商务平台上的商品推荐、社交媒体中的内容推荐等,换言之...。
数据准备
在还需要对物品进行编码,以便输入到模型中,希望大家...。
import pandas as pd
from import LabelEncoder
# 假设我们有一个包含用户行为的数据框 df
df = _csv
# 对用户和物品ID进行编码
user_encoder = LabelEncoder
item_encoder = LabelEncoder
df = user__transform
df = item__transform
# 将数据按用户分组, 并按照时间排序
user_sequences = .apply.reset_index
性价比超高。 接下来我们将定义SASRec模型结构。这里使用 TensorFlow 和 Keras API 来实现。需要注意的是实际应用中可能需要安装额外的库,如 tfrs 或者其他特定于推荐系统的框架。
import tensorflow as tf
from import Embedding, LayerNormalization, Dense
from import Model
import numpy as np
class SASRec:
def __init__:
super.__init__
_embedding = Embedding
_embedding = Embedding
_encoding = _positional_encoding
_layers =
_norms =
= Dense
def get_positional_encoding:
# 创建位置编码矩阵
position =
div_term = * - / d_model))
pe = )
pe =
pe =
return pe
def call:
user_ids, sequences = inputs
seq_emb = _embedding + _encoding, :]
mask = , dtype=32)
for i in range):
seq_emb = _norms)
logits =
return logits
# 初始化SASRec模型
num_users = len
num_items = len
embedding_dim = 128
max_len = 50 # 用户行为序列的最大长度
model = SASRec
训练模型
为了训练,实际应用中应该根据具体情况进行调整。
from import Adam
# 编写简单的负采样函数以生成负样本
def negative_sampling:
neg_samples =
for pos_item in pos_seq:
neg_items =
neg_
return
# 定义损失函数
loss_fn =
# 选择优化器
optimizer = Adam
# 训练模型
for epoch in range:
for batch in data_generator:
with as tape:
user_ids, sequences, labels = batch
predictions = model
loss = loss_fn
gradients =
_gradients)
print}')
推荐预测
一旦模型训练完成,就可以用来为新用户提供推荐服务了。通过给定用户的最新行为序列,模型可以预测下一个最有可能点击的商品。
def recommend_items:
# 对用户行为序列进行填充以匹配最大长度
sequence = , 0), 'constant')
# 获取预测后来啊
predictions =
sorted_indices =
# 返回解码后的商品ID
recommended_items = item__transform
return recommended_
# 示例推荐
user_id = 1234
user_history = # 用户的历史行为记录
recommendations = recommend_items
print # 输出推荐商品ID
看完了代码,我们来看看市面上都有哪些妖魔鬼怪。为了让大家更直观地了解,我随便做了一个表格,数据可能不准,大家看着乐呵就行,太魔幻了。。
| 模型名称 | 核心机制 | 主要应用领域 | 计算复杂度 | 吐槽指数 |
|---|---|---|---|---|
| RNN | 循环处理 | 早期NLP | 低 | ★★★★★ |
| LSTM | 门控机制 | 语音识别 | 中 | ★★★★ |
| Transformer | 自注意力 | 大语言模型 | 高 | ★★★ |
| BERT | 双向Transformer | 文本分类 | 高 | ★★ |
| SASRec | 自注意力序列推荐 | 电商推荐 | 中高 | ★★★☆ |
自的概念最早可以追溯到20世纪70年代的神经网络研究,但直到近年来才在深度学习领域得到广泛关注和发展。现代意义上的自首次出现在2017年的论文《Attention is All You Need》中, 该论文由Google Brain团队提出,并引入了Transformer架构。这一创新迅速改变了自然语言处理领域的格局,我满足了。。
最后说一句。 Transformer以其彻底革新了深度学习,但这一探索并未止步于密集注意力.线性注意力:以高效计算模式施行注意力。.可能降低精度:近似可能丢失细粒度细节。. 这就是技术的代价,想要快就得牺牲精度,想要准就得烧钱买显卡。
我们再来看看BERT。Devlin, J., Chang, M.-W., Lee, K., & Toutanova, K. . BERT: Pre-training of deep bidirectional transformers for language understanding. arXiv preprint arXiv:1810.04805. 这篇论文也是神作, BERT简直就是NLP界的瑞士军刀,什么都能干,我算是看透了。。
import torch
import as nn
from transformers import BertTokenizer, BertModel
# 初始化BERT模型和分词器
tokenizer = _pretrained
model = _pretrained
def translate_sentence:
# 对输入句子进行编码
inputs = tokenizer
# 获取BERT模型的输出
outputs = model
last_hidden_states = _hidden_state
# 这里可以加入额外的解码逻辑, 比方说使用一个预训练好的翻译模型
# 简单起见,我们直接返回再说说一层隐藏状态作为示例
return last_hidden_states
# 示例翻译
sentence = "Hello, how are you?"
translated = translate_sentence
print # 输出形状应为
案例描述使用Transformer架构进行英德双语翻译。Transformer更加准确的目标语言句子。这比以前的翻译模型强太多了虽然有时候还是会翻译出一些莫名其妙的话,摆烂。。
放心去做... 机视觉、语音处理以及推荐系统等多个领域的广泛应用,还结合具体案例和代码示例展示了如何将这一强大工具付诸实践。自凭借其捕捉复杂依赖关系的能力、 并行化处理的优势以及对长序列数据的有效建模,已经成为现代深度学习不可或缺的一部分。
自的重要性在于其灵活性和强大表达能力,特别是在处理长文本或其他类型的序列数据方面表现尤为突出。
再说说我想说写这篇文章太累了脑细胞死了一大片。如果你看懂了那你是个天才;如果没看懂, 换个赛道。 别担心,我也没完全看懂。我们都是在技术的海洋里挣扎的咸鱼。加油吧,打工人!
换言之... Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., ... & Polosukhin, I. . Attention is all you need. In Advances in neural information processing systems .
Dosovitskiy, A., Beyer, L., Kolesnikov, A., Weissenborn, D., Zhai, X., Unterthiner, T., ... & Houlsby, N. . An image is worth 16x16 words: Transformers for image recognition at scale. arXiv preprint arXiv:2010.11929.
Wu, Y., Al-Shedivat, M., Ghasemipour, S., Wang, Y., Abbeel, P., Schwing, A. G., & Finn, C. . Pay less at 弯道超车。 tention with lightweight and dynamic convolutions. International Conference on Learning Representations.
Demand feedback