注意力机制中的QKV代表什么,Bert中的CLS代表什么

前言

皆为粗浅的理解,作为记录使用。

注意力

人类的注意力成为一种商品,销售者买广告吸引消费者的注意力,消费者买会员消除广告让自己的注意力集中在想看的内容上面。大概来讲我们的注意力是"双组件框架"的,即由非自主性提示和自主性提示组成的。

非自主性提示

当我们看这个世界时,会不自觉地关注某些东西,这就是非自主性提示,例如颜色鲜艳的,大的东西。

自主性提示

当我们主观的去看世界时,我们会格外关注某些东西,例如一个留学生会刻意更关注别人的穿着而不是内涵。当然了,这个行为成为习惯后会成为他自己的非自主性提示。

总的来说,自主性和非自主性的注意力揭示了人们的注意力方式。

引入一:心理学哲学理解

我们可以把自主性提示当成(query,Q)作为一种观察世界的主观意识(证据),我们观察这个世界称为感官的输入把它当为(value,V)。此时我们就知道,如果我们既有Q又有V,那么就可以通过Q去发现V中的类Q,从而看看我们主观意识可视化后的样子。

引入二:形象理解

另一种更形象的说法是,Q就相当于一个单词,V就相当于一个字典,我们希望在字典里找到这个单词。

关于Key(K)的理解是众说纷纭。我的理解是,首先K的数量和V是一致的,如果以引入一的视角来看,K就相当于一个意识和现实的链接。引入二的视角来看,K有点类似于把字典变成另一本全是同义词的字典。

公式

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_{k}}})V Attention(Q,K,V)=softmax(dk QKT)V

点积表示相似度,除以 d k \sqrt{d_{k}} dk 是防止在高维空间中计算softmax时的梯度消失问题。对缩放后的点积结果应用softmax函数。Softmax可以将点积转换成概率分布,这些概率表明在每个位置上应该给予其他位置多少“注意力”。换句话说,这个步骤决定了每个元素应该在多大程度上关注序列中的其他元素。最后,将softmax的输出(注意力权重)与Value相乘。这意味着每个Value都会根据计算出的注意力权重进行加权。如果一个元素的Key与另一个元素的Query更相似,则在最终输出中它的Value会被赋予更高的权重。

自注意力机制

如果不是自注意力机制,例如我想通过文本查找图像中的部分图像,那么文本就是我们观察图像的证据,也就是Q,图像就是一个V相当于一个搜索库。

自注意力机制只有单源数据本身,例如一个句子,我们需要在句子内部做各种运算,具体来说就是把这个句子乘3个矩阵得到QKV,自己对自己进行搜索。

CLS

[CLS]是Bert输入句子时的开头嵌入,相当于一种概括,或是一种证据。我们认为[CLS]包含了句子的总结性信息(概括),在分类任务中可以直接拿出来分类。

import torch
import torch.nn as nn

class TransformerWithClsToken(nn.Module):
    def __init__(self, embed_size, num_heads, num_layers, num_classes):
        super(TransformerWithClsToken, self).__init__()
        # 初始化 <cls> 向量
        self.cls_token = nn.Parameter(torch.randn(1, 1, embed_size))
        self.transformer = nn.Transformer(
            d_model=embed_size, nhead=num_heads, num_layers=num_layers
        )
        self.fc = nn.Linear(embed_size, num_classes)

    def forward(self, x):
        # 假设 x 的形状为 [batch_size, seq_length, embed_size]
        batch_size = x.shape[0]
        # 复制 <cls> 向量到每个样本中
        cls_tokens = self.cls_token.expand(batch_size, -1, -1)
        # 将 <cls> 向量和序列拼接
        x = torch.cat((cls_tokens, x), dim=1)
        # 通过 Transformer
        x = self.transformer(x)
        # 使用 <cls> 向量的输出进行分类
        cls_output = x[:, 0, :]
        out = self.fc(cls_output)
        return out

实际操作中,把变成整个网络可学习的一部分,这样就可以后续直接拿出来分类。所以其实可以被视为一种表示学习,就是通过不断的学习把输入数据进行了降维。

总结

Attention通过一系列计算增加了模型的可学习能力(增加了很多没那么冗余的参数),让模型能学到更多的东西。至于有没有真的关注到想关注的,目前我还没有更多的理解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值