赞
踩
Transformer是一种神经网络结构,由Vaswani等人在2017年的论文“Attention Is All You Need”中提出,用于处理机器翻译、语言建模和文本生成等自然语言处理任务。
Transformer与传统NLP特征提取类模型的区别主要在以下两点:
以上的处理带来了几个优点:
注意力机制便是在判断词在句子中的重要性,我们通过注意力分数来表达某个词在句子中的重要性,分数越高,说明该词对完成该任务的重要性越大。
计算注意力分数时,我们主要参考三个因素:query、key和value。
query
:任务内容key
:索引/标签(帮助定位到答案)value
:答案一般在文本翻译中,我们希望翻译后的句子的意思和原始句子相似,所以进行注意力分数计算时,query
一般和目标序列,即翻译后的句子有关,key
则与源序列,即翻译前的原始句子有关。
计算注意力分数,即为计算query
与key
的相似度。常用的计算注意力分数的方式有两种:additive attention
和scaled dot-product attention
,在这里我们主要介绍第二种方法。
在几何角度,点积(dot product)表示一个向量在另一个向量方向上的投影。换句话说,从几何角度上解读,点积代表了某个向量中的多少是和另一个向量相似的。
使用mindscope实现的代码部分
- import mindspore
- from mindspore import nn
- from mindspore import ops
- from mindspore import Tensor
- from mindspore import dtype as mstype
-
-
- class ScaledDotProductAttention(nn.Cell):
- def __init__(self, dropout_p=0.):
- super().__init__()
- self.softmax = nn.Softmax()
- self.dropout = nn.Dropout(1-dropout_p)
- self.sqrt = ops.Sqrt()
-
-
- def construct(self, query, key, value, attn_mask=None):
- """scaled dot product attention"""
-
- embed_size = query.shape[-1]
- scaling_factor = self.sqrt(Tensor(embed_size, mstype.float32))
-
-
- attn = ops.matmul(query, key.swapaxes(-2, -1) / scaling_factor)
-
-
- if attn_mask is not None:
- attn = attn.masked_fill(attn_mask, -1e9)
-
- attn = self.softmax(attn)
-
- attn = self.dropout(attn)
-
- output = ops.matmul(attn, value)
-
- return (output, attn)
-
- def get_attn_pad_mask(seq_q, seq_k, pad_idx):
- """注意力掩码:识别序列中的<pad>占位符
- Args:
- seq_q (Tensor): query序列,shape = [batch size, query len]
- seq_k (Tensor): key序列,shape = [batch size, key len]
- pad_idx (Tensor): key序列<pad>占位符对应的数字索引
- """
- batch_size, len_q = seq_q.shape
- batch_size, len_k = seq_k.shape
-
- pad_attn_mask = ops.equal(seq_k, pad_idx)
-
- pad_attn_mask = pad_attn_mask.expand_dims(1)
-
- pad_attn_mask = ops.broadcast_to(pad_attn_mask, (batch_size, len_q, len_k))
-
- return pad_attn_mask
-
-
- q = k = Tensor([[1, 1, 0, 0]], mstype.float32)
- pad_idx = 0
- mask = get_attn_pad_mask(q, k, pad_idx)
- print(mask)
- print(q.shape, mask.shape)
学习下来十分顺畅,在理解的同时还能直接运行代码,十分推荐
有一定编程基础可以直接上手学习,十分丝滑
继续完成transformer其余部分的学习,后期完成大模型课程其余内容的学习及笔记更新
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。