multi-head attention理解加代码

2023-11-17

(multi-head attention 用于CNN相关理解)

饭前小菜

在早期的Machine Translation(机器翻译)中,Attention机制与RNN的结合。机器翻译解决的是输入是一串在某种语言中的一句话,输出是目标语言相对应的话的问题,如将中文翻译成英文。通常的配置是encoder-decoder结构,即encoder读入输入的句子并将其转换为一个固定长度的向量,然后decoder再将这个向量翻译成对应的目标语言的文字。
存在的问题:RNN机制实际上存在长梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息,所有随着翻译句子的长度的增加,这种结构的效果会显著下降。
解决办法:那当然就是我们的attention啦!
multi-head attention 是继self-attention之后又一重大研究成果,其出发点是在transformer模型上,改进之前使用的传统attention。本人是将multi-head attention 用于CNN模型当中,踩了不少坑,但是复现代码的人确实是大牛。相关参考参考代码

传统attention

举个例子:
翻译’knowledge’时,只需要将注意力放在源句子中“知识”的部分,当翻译“power”时,只需要将注意力集中在“力量”。这样,当我们的decoder预测目标翻译的时候就可以看到encoder的所有信息,而不仅局限于原来模型中定长的隐向量,并且不会丧失较长的信息
在这里插入图片描述

transformer中的attention

在这里插入图片描述

问题来了

当然,既然attention机制如此的有效,那可不可以去掉模型中的RNN的部分,仅仅利用attention呢?答案是当然可以啦!

// attention
 def _attention(self,inputs, attention_size, time_major=False, return_alphas=False):
        if isinstance(inputs, tuple):
        # In case of Bi-RNN, concatenate the forward and the backward RNN outputs.
            inputs = tf.concat(inputs, 2)

        if time_major:
        # (T,B,D) => (B,T,D)
            inputs = tf.array_ops.transpose(inputs, [1, 0, 2])

        hidden_size = inputs.shape[2].value  # D value - hidden size of the RNN layer

        # Trainable parameters
        W_omega = tf.Variable(tf.random_normal([hidden_size, attention_size], stddev=0.1))
        b_omega = tf.Variable(tf.random_normal([attention_size], stddev=0.1))
        u_omega = tf.Variable(tf.random_normal([attention_size], stddev=0.1))

        # Applying fully connected layer with non-linear activation to each of the B*T timestamps;
        #  the shape of `v` is (B,T,D)*(D,A)=(B,T,A), where A=attention_size
        #v = tf.tanh(tf.tensordot(inputs, W_omega, axes=1) + b_omega)
        v = tf.sigmoid(tf.tensordot(inputs, W_omega, axes=1) + b_omega)
        # For each of the timestamps its vector of size A from `v` is reduced with `u` vector
        vu = tf.tensordot(v, u_omega, axes=1)   # (B,T) shape
        alphas = tf.nn.softmax(vu)              # (B,T) shape also
        
        # Output of (Bi-)RNN is reduced with attention vector; the result has (B,D) shape
        output = tf.reduce_sum(inputs * tf.expand_dims(alphas, -1), 1)

        if not return_alphas:
            return output
        else:
            return output, alphas

####self-attention
这里我就直接把做好的PPT粘过来

按照公式,一步步处理
#~
在这里插入图片描述

multi-head attrntion

在这里插入图片描述
在这里插入图片描述
在得到多个Z向量后,最后一步就是将多个Z需要映射成我们之前的大小 :we need a way to condense these eight down into a single matrix
在这里插入图片描述

下面就来看看如何用代码来实现吧!


def multihead_attention(query_antecedent,# a Tensor with shape [batch, length_q, channels]
                        total_key_depth,# an integer
                        total_value_depth,# an integer多个V矩阵的最后一个维度,该设置和attention的输入数据维度有关系,不能随意设置,虽然对程序运行没有什么影响,但是对性能有影响
                        output_depth,# an integer 是将多个Z向量映射成单个向量的W矩阵的最后一个维度
                        num_heads,# an integer dividing total_key_depth and total_value_depth
                        memory_antecedent=None,
                        attention_type="dot_product",
                        q_filter_width=7,#该参数应该重点理解,原来是1,在计算q,k,v的时候,若用一维卷积计算,则代表卷积核的大小,可以按照需求设置
                        kv_filter_width=7,#同上
                        q_padding="SAME",
                        kv_padding="SAME",
                        vars_3d=False,
                        training=True):
    q, k, v = compute_qkv(query_antecedent, memory_antecedent,
                        total_key_depth, total_value_depth, q_filter_width,
                        kv_filter_width, q_padding, kv_padding,)
    q = split_heads(q, num_heads)
    k = split_heads(k, num_heads)
    v = split_heads(v, num_heads)

    key_depth_per_head = total_key_depth // num_heads
    if not vars_3d:
        q *= key_depth_per_head ** -0.5
    if attention_type == "dot_product":
        x = dot_product_attention(q, k, v)
    x = combine_heads(x)
    x = tf.layers.dense(x, output_depth, use_bias=False, name="output_transform" )
    return x
    

所需要调用的模块

def compute_qkv(query_antecedent,
                memory_antecedent,
                total_key_depth,
                total_value_depth,
                q_filter_width=None,
                kv_filter_width=None,
                q_padding="VALID",
                kv_padding="VALID"):
    if memory_antecedent is None:
        memory_antecedent = query_antecedent
    q = compute_attention_component(
          query_antecedent,
          total_key_depth,
          q_filter_width,
          q_padding,
          "q")
    k = compute_attention_component(
          memory_antecedent,
          total_key_depth,
          kv_filter_width,
          kv_padding,
          "k",)
    v = compute_attention_component(
          memory_antecedent,
          total_value_depth,
          kv_filter_width,
          kv_padding,
          "v")
    return q, k, v
#
def compute_attention_component(antecedent,
                                total_depth,
                                filter_width=None,
                                padding="SAME",
                                name="c"):
    if filter_width == 1:
        output = tf.layers.dense(antecedent, units=total_depth, use_bias=True, name=name)
    else:
        output = tf.layers.conv1d(antecedent, filters=total_depth, kernel_size=filter_width, strides=2, padding=padding, name=name)
    return output

def dot_product_attention(q,k,v):
    logits = tf.reduce_sum(tf.matmul(q, k, transpose_b= True), axis=3)#原本是没有求和的,这里做了个求和,所以在下面用了tf.expand_dims
    weights = tf.nn.softmax(logits, name="attention_weights")
    output =v * tf.expand_dims(weights, -1)
    return output

小菜鸟踩坑记~~~
第一次博客打卡,哈哈
: 有关attention的使用,之前一直有个疑惑,那就是attention是否只能用在LSTM或者RNN后,对于这个疑问,我之前一直搞不清楚,直到我一步步跟踪数据,才知道attention也是可以脱离RNN和LSTM,所以我将multi-head用在CNN上了,由于最近CNN超级受欢迎,不仅在于它的参数相对于RNN和LSTM少了很多,而且效果也是很好的,代码中有些参数说明不是很清楚,经过大量实验,我暂且用钟式大白话注释~~haha

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

multi-head attention理解加代码 的相关文章

随机推荐

  • mongodb安装

    官网安装 https docs mongodb com manual tutorial install mongodb enterprise on red hat 开源版本 https docs mongodb com manual tut
  • 概率-什么是一阶矩,二阶矩?

    根据S M 罗斯的概率论教程 一阶矩指E X 即数列X的均值称为一阶矩 以此类推 E Xn n 1 称为X的 n阶矩 也就是二阶矩 三阶矩 参考 1 图灵数学 统计学丛书08 概率论基础教程 第7版 美S M 罗斯 郑忠国 译 人民邮电出版
  • KeepChatGPT解决ChatGPT经常中断的问题

    给大家介绍一款ChatGPT畅聊插件 ChatGPT的火热 相信很多人都会学习如何使用 来提升工作效率 在使用ChatGPT的过程中 经常出现下面这些情况 导致聊天中断 需要重新刷新进入 今天介绍一款插件 来自GitHub的KeepChat
  • zynq之petalinux安装和编译

    首先下载petalinux v2015 4 final installer dec run 去xilinx官网或者我的网盘下载http pan baidu com s 1gf11UGr mkdir opt pkg petalinux v20
  • mybatis处理mysql日期格式

    一 常用日期格式 1 DATE 显示格式 yyyy MM dd 时间范围 1000 01 01 到 9999 12 31 2 DATETIME 显示格式 yyyy MM dd HH mm ss 时间范围 1000 01 01 00 00 0
  • 谷歌,前后端Failed to load resource: net::ERR_CERT_AUTHORITY_INVALID

    项目场景 Springboot vue前后端分离 问题描述 谷歌浏览器调试以上条件的前后端分离项目时出现Failed to load resource net ERR CERT AUTHORITY INVALID 记录我出现的问题及解决方法
  • 从浏览器输入网址到显示页面之间发生了什么

    好久没有更博了 最近一直忙于春招实习应聘 似乎有些打乱了我的节奏 我觉得还是应该把重心放在学习和记录上 不管有没有实习或者有没有拿到offer 我都一直stand by 言归正传 当你输入一个网址到页面显示在你眼前到底发生了什么 这其实是个
  • ESP8266 教程3 — 通过TCP组建局域网并通信

    目录 1 ESP8266 的 AP 模式 1 1 查询 ESP8266 的wifi应用模式 1 2 设置 ESP8266 模块的wifi信息 1 3 查询已经接入的设备 2 ESP8266 的Station 模式 2 1 设置ESP8266
  • FusionCompute8.0.0实验(1)CNA及VRM安装

    准备 1 老旧华硕笔记本电脑用于安装CNA 内存8G 硬盘1T 24G固态 i7 4500u 2核4线程 2 USB光驱 电脑上的光驱坏了 CNA不支持U盘安装 5V2A外接适配器 不能用快充 3 ultroISO破解版 4 办公笔记本 1
  • 阿里云服务器包年包月、按量和抢占式实例怎么选?区别是什么?

    阿里云服务器ECS付费类型包年包月 按量付费和抢占式实例有什么区别 包年包月先付费后使用 最低购买一个月时长 平均下来成本较低 按量付费先使用后付费 按小时结算费用 适合短期使用 平均下来费用要比包年包月贵一些 抢占式实例和按量付费相类似
  • 网站前台技术

    一 HTML5 1 历史 2 应用 html5语法 1 标签不区分大小写2 允许属性值不使用引号3 允许部分属性值的属性省略 html标记 带有 lt gt 符号的元素被称为HTML标记 也称为HTML标签或HTML元素 例如 都是HTML
  • Android选择本地视频和照片上传到服务器

    目录 照片photo 将http 本地存放照片数据库电脑ip 端口号 fileaddress png转image 一 后台发送来的数据转换Bitmap的方法 用法 二 将第一针显示出来方法 用法 视频vedio 使用选择器获取的 conte
  • rpm打包流程步骤

    rpm打包流程步骤 一 RPM简介 1 1 优点 1 2 缺点 二 前期准备 三 文件结构 3 1 各文件作用 四 打包步骤及SPEC文件的编辑 4 1 步骤 4 1 1 前期准备 4 1 2 建立相应的文件 4 1 3 将源码包放入SOU
  • 2.微服务架构组件分析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 该系列文章来源于 学习 极客时间 从0开始学习微服务 分享之后笔记载录和读后感 作者胡忠想 微博技术专家 从 2012 年加入微博到现在 从 2012 年加入微博到现在 我
  • blender的下载安装和配置中文环境

    引言 在3D建模和动画设计领域 Blender 作为一款强大且免费的开源软件 一直以优秀的性能和对众多技术的支持赢得了大批用户的喜爱 然而 对于刚接触这款软件的用户而言 其安装和配置过程可能会带来一定困扰 尤其是在设置中文环境方面 因此 本
  • Python 爬虫初学者实战

    1 手写第一个 python 爬虫 爬虫 用程序来获取网站上的资源 常用 encoding utf 8 encoding gbk 1 导入 urllib request urlopen from urllib request import
  • Swiper 显示多行多列

    new Swiper popularity container speed 1600 autoHeight true observer true observeParents true spaceBetween 20 slidesPerVi
  • YOLOv1,v2,v3学习笔记

    YOLO学习笔记 首先我们这篇文章只写yolov1 v2 v3 至于v4我会另起一篇博文的 因为v4中用到了很多的trick和介绍了很多trick 所以我想详细介绍一下 照例 先放大佬的链接 https zhuanlan zhihu com
  • 【数字电路基础】三态门

    目录 前言 三态门 经典问题 前言 文主要讲解三态门 三态门 其模型为 其实际电路为 其真值表为 B A C 0 0 Z 0 1 Z 1 0 0 1 1 1 注意 Z是高阻 不代表没有电压 而是电压不确定 受自身 旁边cell的影响 经典问
  • multi-head attention理解加代码

    multi head attention 用于CNN相关理解 饭前小菜 在早期的Machine Translation 机器翻译 中 Attention机制与RNN的结合 机器翻译解决的是输入是一串在某种语言中的一句话 输出是目标语言相对应