当前位置:   article > 正文

昇思MindSpore技术公开课-transformer(1)_mindspore上用transform

mindspore上用transform

 学习总结

Transformer是一种神经网络结构,由Vaswani等人在2017年的论文“Attention Is All You Need”中提出,用于处理机器翻译、语言建模和文本生成等自然语言处理任务。

Transformer与传统NLP特征提取类模型的区别主要在以下两点:

  • Transformer是一个纯基于注意力机制的结构,并将自注意力机制和多头注意力机制的概念运用到模型中;
  • 由于缺少RNN模型的时序性,Transformer引入了位置编码,在数据上而非模型中添加位置信息;

以上的处理带来了几个优点:

  • 更容易并行化,训练更加高效;
  • 在处理长序列的任务中表现优秀,可以快速捕捉长距离中的关联信息。

学习心得

注意力机制便是在判断词在句子中的重要性,我们通过注意力分数来表达某个词在句子中的重要性,分数越高,说明该词对完成该任务的重要性越大。

计算注意力分数时,我们主要参考三个因素:querykeyvalue

  • query:任务内容
  • key:索引/标签(帮助定位到答案)
  • value:答案

一般在文本翻译中,我们希望翻译后的句子的意思和原始句子相似,所以进行注意力分数计算时,query一般和目标序列,即翻译后的句子有关,key则与源序列,即翻译前的原始句子有关。

计算注意力分数,即为计算querykey的相似度。常用的计算注意力分数的方式有两种:additive attentionscaled dot-product attention,在这里我们主要介绍第二种方法。

在几何角度,点积(dot product)表示一个向量在另一个向量方向上的投影。换句话说,从几何角度上解读,点积代表了某个向量中的多少是和另一个向量相似的。

经验分享

使用mindscope实现的代码部分

  1. import mindspore
  2. from mindspore import nn
  3. from mindspore import ops
  4. from mindspore import Tensor
  5. from mindspore import dtype as mstype
  6. class ScaledDotProductAttention(nn.Cell):
  7. def __init__(self, dropout_p=0.):
  8. super().__init__()
  9. self.softmax = nn.Softmax()
  10. self.dropout = nn.Dropout(1-dropout_p)
  11. self.sqrt = ops.Sqrt()
  12. def construct(self, query, key, value, attn_mask=None):
  13. """scaled dot product attention"""
  14. embed_size = query.shape[-1]
  15. scaling_factor = self.sqrt(Tensor(embed_size, mstype.float32))
  16. attn = ops.matmul(query, key.swapaxes(-2, -1) / scaling_factor)
  17. if attn_mask is not None:
  18. attn = attn.masked_fill(attn_mask, -1e9)
  19. attn = self.softmax(attn)
  20. attn = self.dropout(attn)
  21. output = ops.matmul(attn, value)
  22. return (output, attn)
  23. def get_attn_pad_mask(seq_q, seq_k, pad_idx):
  24. """注意力掩码:识别序列中的<pad>占位符
  25. Args:
  26. seq_q (Tensor): query序列,shape = [batch size, query len]
  27. seq_k (Tensor): key序列,shape = [batch size, key len]
  28. pad_idx (Tensor): key序列<pad>占位符对应的数字索引
  29. """
  30. batch_size, len_q = seq_q.shape
  31. batch_size, len_k = seq_k.shape
  32. pad_attn_mask = ops.equal(seq_k, pad_idx)
  33. pad_attn_mask = pad_attn_mask.expand_dims(1)
  34. pad_attn_mask = ops.broadcast_to(pad_attn_mask, (batch_size, len_q, len_k))
  35. return pad_attn_mask
  36. q = k = Tensor([[1, 1, 0, 0]], mstype.float32)
  37. pad_idx = 0
  38. mask = get_attn_pad_mask(q, k, pad_idx)
  39. print(mask)
  40. print(q.shape, mask.shape)

课程反馈

学习下来十分顺畅,在理解的同时还能直接运行代码,十分推荐

使用MindSpore昇思的体验和反馈

有一定编程基础可以直接上手学习,十分丝滑

未来展望

继续完成transformer其余部分的学习,后期完成大模型课程其余内容的学习及笔记更新

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/883541
推荐阅读
相关标签
  

闽ICP备14008679号