seq2seq和attention原理详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了seq2seq和attention原理详解相关的知识,希望对你有一定的参考价值。

参考技术A

Seq2seq由两个RNN/LSTM构成,其中encoder RNN产生原始sentence的encoding,decoder RNN将在encoding基础上产生目标sentence。如下图将法语翻译成英语,注意这个过程时两个词袋embedding的,一个是法语的,一个是英语的。

使用backpropagation进行参数最优化,所以这是一个end-to-end模型。

可以看到,在seq2seq模型中,我们强制将所有信息集中在单独一个vector中,如上图的黄框所示,因为这是喂给decoder的唯一的信息,那么这样的话,如果encoder的vector没有包含相关信息的话,decoder也就不会翻译正确,这成为information bottleneck,attention就是用来解决这个问题的。核心思想为使用decoder时,直接关联encoder和并关注原始sequence的某一部分。

其中attention output可以理解为是encoder的加权和,这个权重和原始sequence相关,如下图所示。

公式如下:

更加通俗的解释为:

设给定一组values,单独的向量query,attention就是基于query,计算values的加权和。在上面说的seq2seq中,decoder hidden state就称为query,encoder称为values。

参考来自:

https://www.youtube.com/watch?v=XXtpJxZBa2c&list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&index=9&t=0s
https://zhuanlan.zhihu.com/p/28054589
tensorflow中RNN的实现详述 : //zhuanlan.zhihu.com/p/28196873

ChatGPT中的Attention机制详解

随着自然语言处理技术的不断发展,越来越多的人开始使用聊天机器人来进行自然语言交互。而ChatGPT就是一种常用的聊天机器人模型,它的核心技术之一就是Attention机制。本文将详细介绍ChatGPT中的Attention机制,包括原理、实现方法以及代码示例。

ChatGPT中的Attention机制详解_自然语言处理

原理

Attention机制是一种可以使模型“重点关注”输入序列中某些部分的机制。在自然语言处理中,输入序列通常是一个句子或一个文档。对于这样的输入序列,Attention机制能够使模型集中学习输入序列中与当前任务相关的部分,从而提高模型的性能。

ChatGPT中的Attention机制主要包括三个部分:Query、Key和Value。其中,Query是指当前位置的向量表示,Key是指输入序列的向量表示,Value是指对应输入序列位置的向量表示。具体来说,对于每个Query,模型会计算它与所有Key之间的相似度,然后使用相似度来加权求和Value,从而得到当前位置的输出向量。

实现

下面是ChatGPT中Attention机制的实现方法:

class MultiHeadAttention(nn.Module):
def __init__(self, embed_dim, num_heads):
super(MultiHeadAttention, self).__init__()
self.embed_dim = embed_dim
self.num_heads = num_heads
self.head_dim = embed_dim // num_heads

self.qkv_proj = nn.Linear(embed_dim, embed_dim * 3)
self.out_proj = nn.Linear(embed_dim, embed_dim)

def forward(self, query, key, value):
batch_size = query.shape[0]

# 将Q,K,V分别通过线性变换得到q,k,v
qkv = self.qkv_proj(torch.cat([query, key, value], dim=-1))
q, k, v = torch.chunk(qkv, 3, dim=-1)
q = q.view(batch_size * self.num_heads, -1, self.head_dim)
k = k.view(batch_size * self.num_heads, -1, self.head_dim)
v = v.view(batch_size * self.num_heads, -1, self.head_dim)

# 计算Query和Key之间的相似度
similarity = torch.bmm(q, k.transpose(1, 2)) / math.sqrt(self.head_dim)

# 对相似度进行softmax归一化
attention = F.softmax(similarity, dim=-1)

# 加权求和Value
output = torch.bmm(attention, v).view(batch_size, -1, self.embed_dim)

# 通过线性变换得到最终输出
output = self.out_proj(output)

return output

代码示例

下面是一个使用ChatGPT实现的简单聊天机器人示例:

import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel

tokenizer = GPT2Tokenizer.from_pretrained(gpt2)
model = GPT2LMHeadModel.from_pretrained(gpt2)

def generate_response(text):
input_ids = tokenizer.encode(text, return_tensors=pt)
output = model.generate(input_ids, max_length=50, do_sample=True, temperature=0.7)
return tokenizer.decode(output[0], skip_special_tokens=True)

while True:
text = input(You: )
if text.strip() == :
continue
response = generate_response(text)
print(Bot:, response)

结论

通过本文的介绍,我们了解了ChatGPT中Attention机制的原理、实现方法以及代码示例。对于自然语言处理中的许多任务,Attention机制都是一种非常有效的技术,它可以帮助模型更好地学习输入序列中的相关信息,从而提高模型的性能。如果你正在进行自然语言处理相关的研究或应用开发,那么Attention机制一定会是你非常有用的工具。

以上是关于seq2seq和attention原理详解的主要内容,如果未能解决你的问题,请参考以下文章

Attention is all you need 论文详解(转)

seq2seq+attention解读

ChatGPT中的Attention机制详解

多图详解attention和mask。从循环神经网络transformer到GPT2,我悟了

attention的原理

李宏毅2020机器学习深度学习 Seq2seq 作业详解