当前位置: 首页 > 编程日记 > 正文

深度学习中的注意力机制(二)

作者 | 蘑菇先生

来源 | NewBeeNLP

目前深度学习中热点之一就是注意力机制(Attention Mechanisms)。Attention源于人类视觉系统,当人类观察外界事物的时候,一般不会把事物当成一个整体去看,往往倾向于根据需要选择性的去获取被观察事物的某些重要部分,比如我们看到一个人时,往往先Attend到这个人的脸,然后再把不同区域的信息组合起来,形成一个对被观察事物的整体印象。

「同理,Attention Mechanisms可以帮助模型对输入的每个部分赋予不同的权重,抽取出更加关键及重要的信息,使模型做出更加准确的判断,同时不会对模型的计算和存储带来更大的开销,这也是Attention Mechanism应用如此广泛的原因」

前情提要:深度学习中的注意力机制(一)

在上一篇文章中,分享了seq2seq以及普通attention网络,今天来看看Attention机制的各种变体。

Attention Variants

本部分介绍Attention机制的各种变体。包括但不限于:

  • 「基于强化学习的注意力机制」:选择性的Attend输入的某个部分

  • 「全局&局部注意力机制」:其中,局部注意力机制可以选择性的Attend输入的某些部分

  • 「多维度注意力机制」:捕获不同特征空间中的Attention特征。

  • 「多源注意力机制」:Attend到多种源语言语句

  • 「层次化注意力机制」:word->sentence->document

  • 「注意力之上嵌一个注意力」:和层次化Attention有点像。

  • 「多跳注意力机制」:和前面两种有点像,但是做法不太一样。且借助残差连接等机制,可以使用更深的网络构造多跳Attention。使得模型在得到下一个注意力时,能够考虑到之前的已经注意过的词。

  • 「使用拷贝机制的注意力机制」:在生成式Attention基础上,添加具备拷贝输入源语句某部分子序列的能力。

  • 「基于记忆的注意力机制」:把Attention抽象成Query,Key,Value三者之间的交互;引入先验构造记忆库。

  • 「自注意力机制」:自己和自己做attention,使得每个位置的词都有全局的语义信息,有利于建立长依赖关系。

Reinforcement-learning based Attention

NIPS2014: Recurrent Models of Visual Attention[1]

ICLR2015: Multiple Object Recognition with Visual Attention [2]

NIPS2014论文应该是最早的Attention雏形,虽然和我们通常所说的、广泛应用于Seq2Seq的Attention机制不太一样,但是还是值得提一下。这是Google DeepMind2014年提出的一篇计算机视觉领域的文章,适用于处理图像序列或帧序列来进行场景感知或处理(例如Video Caption)。

其动机在于随着分辨率提高,计算量不断增长,神经网络难以在实时应用场景中,快速处理这么大的计算量。借鉴人类视觉系统的特点,即,为了理解某个场景,并不是一下子处理整个场景,而是Focus到某些关键的位置上,然后联合起来构建出整个场景信息。故本篇论文利用RNN处理图像序列,并使用「强化学习」来训练模型,使得模型能够学习attention决策。即,针对实时的场景,基于过去的信息和任务的需要选择下一个要focus的感知区域。这个和人类的感知方式比较相似,也是我们最早理解的Attention机制。

但是,上文所述的广泛应用于Seq2Seq中的Attention不大一样。人类的注意力机制实际上是可以节省计算资源的,注意只需要集中到某些区域,可以忽略大部分区域。Recurrent Models of Visual Attention中的做法和这个是一样的。

然而,下文即将要介绍的应用于Seq2Seq模型模型的Attention就不是这样的了。实际上,下文所述Attention模型,需要把每一个部分都观察的仔仔细细(每部分权重都要算一下),才能进一步决策到底需要focus到哪些部分,这和人类的视觉系统不相符,更像是memory,而不是attention(实际上attention可以理解为一种「短期记忆」,即根据短期记忆在输入特征上分配attention;memory也是另外一种非常重要的机制),然而,这并不妨碍注意力机制的有效性。

Global & Local Attention

EMNLP2015: Effective Approaches to Attention-based Neural Machine Translation[3]

以往的文章,主要将attention应用于不同场景中,而这篇文章提出了新的attention架构,引入了Global Attention和Local Attention的概念。

Global Attention和上文的Soft Attention几乎一样,即计算上下文向量时,和所有的encoder隐状态向量求alignment;而Local Attention是Soft Attention和Hard Attention的权衡,既拥有Soft Attention可微分,容易使用反向传播来优化的优点,又拥有Hard Attention复杂度低的优点,除此之外,还不需要强化学习方法进行训练。

首先定义,

  • Encoder得到的源语句单词的隐状态为:

  • Decoder中目标语句单词的隐状态为:

  • 对每一个目标单词,使用Attention机制计算的上下文向量为 

  • Attention机制中的对齐模型为

(前面文章中都是使用 , 即「前一个时间步」的Decoder隐状态和Encoder隐状态来计算对齐权重)。

首先是Global Attention,如下图所示:

Global Attention中上下文向量  的计算路径为:

  • 对齐模型计算:

 是源语句单词的位置。

 具体可以采用:

  • 上下文向量计算:

注意图中,框起来的部分作者称为Attention Layer。

接着是Local Attention,如下图所示:

Local Attention的引入是为了解决Global Attention中Attend到源语句中所有的词,一方面复杂度高,另一方面很难翻译长序列语句。Local Attention首先根据目标词的隐状态  计算源语句中的「对齐位置」(中心),然后使用以该位置为中心的窗口  内的源语句单词 ,来计算Attention的权重,计算时使用以 为中心的高斯核函数进行衰减。具体如下:

  • 「对齐位置模型」:,  是源语句长度。只与t时刻Decoder状态 有关。

  • 对齐权重模型:, 也就是在global Attention对齐模型基础上加了高斯函数指数衰减。

计算上下文向量时,同上文,即对窗口内的encoder隐向量进行加权,即 

计算得到上下文向量后,本文直接将  和  concat在一起,并计算经过attention后的隐状态 

再将上述attention后的隐状态输入到一个softmax全连接层,得到预测目标值:

按照上述方式来看,每个目标输出单词的预测值,没有利用已经预测的输出单词(embedding)作为输入,也没有利用目标词位置前一时刻的decoder隐状态 ;只利用了当前时刻Decoder隐状态 (上下文向量计算中的权重也主要依据这个计算的)。也就是说,每个目标词位置的attention决策是独立的(只和  本身相关)。

然而在机器翻译当中,通常要维护一个覆盖集,即源语句中哪些单词被翻译过了;同理,在神经机器翻译中,我们在翻译一个目标词时,同样需要关注哪些源语句单词已经被翻译了。因此,作者提出了一个Input-feeding approach,把Decoder端前一时刻attention「后」的隐状态和前一时刻预测的输出单词的embedding连接起来,作为下一时刻的输入。(这个和传统Attention的几乎没差别)

本文的贡献主要是Local Attention以及提出的各种各样的Alignment函数,其余都和前面的工作大同小异。现总结下Alignment函数如下图所示:

Multi-dimensional Attention

AAAI2018:DiSAN: Directional Self-Attention Network for RNN/CNN-Free Language Understanding[4]

在Baisc Attention中,对于每个查询,每个key对应的value都有一个权重值,即每个查询会对应一个1-D的Attention weight向量。而Multi-dimensional Attention会产生更高维度的Attention矩阵,旨在捕获不同特征空间中的Attention特征。


实际上主要区别在于,之前每个value向量对应一个权重Alignment Score,加权的时候实际上是利用了广播机制,value每个元素feature都乘上该权重;现在修改为在feature-level,每个元素特征都乘上不同的权重系数,因此Alignment Score是和Value同维度数的向量,即右图中的 。做法很简单,使用MLP对齐的时候,MLP输出层神经元数量等于Value维度数即可,例如这篇文章中使用其他方式如下:()

Multi-Source Attention

NAACL-HLT2016:Multi-Source Neural Translation[5]

这是2016发表在NAACL-HLT的一篇文章。文章使用英语,德语,法语三种语言建立了一种多源(三语言)机器翻译模型。Intuition在于,如果一篇文章被翻译成了另一种语言,那么就更加倾向于被翻译成其他语言。这样的观点对机器翻译任务有一定的启发,将原本的单一源语言替换为多种源语言,应该可以取得更好的效果。

如英语中的“bank”一词原本可以翻译为河岸或是银行,如果源语言中有德语词汇“Flussufer”(河岸)作为帮助,则自然可以精确得到法语中“Berge”(河岸)这样的翻译结果。基于这样的思想,作者在原有的seq2seq+attention模型的基础上做了修改,引入更多源语句,建立一种多源的翻译模型。模型结构如下:

左侧是两种不同语言的源语句,每种语言的源语句都有一个自己的encoder,且结构一样。问题的关键在于如何将两种语言encoder的东西combine在一起,并和decoder的表示进行对齐求attention。

由于作者采用了LSTM,因此同时考虑了hidden state和cell state的combination。核心工作就是图中黑色部分的combiners。combiners的输入是两个源语句最后时刻encoder得到的hidden state  和cell state ,输出是单个hidden state  和单个cell state 。(以往的工作似乎没有把encoder的cell state给decoder,从图中还可以看出,两个encoder中,每一层得到的两个源语句的hidden state和cell state都需要经过combiners)

  • 最基本的combiner:对于hideen state,就是把两个encoder的隐状态concat起来,再做一个线性变换+tanh激活:。对于cell state,直接相加: 

  • LSTM variant combiner:唯一要提的就是, 作为输入,每个encoder得到的cell state各自对应一个自己的遗忘门。

到目前为止,都不涉及到attention。上文得到的  和  只是作为decoder的初始输入(前一时刻的输入,以前的Seq2Seq模型,似乎cell state没有传给decoder)。

至于attention,作者做了很小的改动。采用的是EMNLP2015: Effective Approaches to Attention-based Neural Machine Translation[6]中的Local Attention。

在这个基础上,让decoder的隐状态同时和两个encoder得到的隐状态进行对齐,并各自计算得到一个上下文向量,,注意这个c是上下文向量,跟上文所述cell state无关。最后计算Decoder的Attentional Hidden State时,使用 。也就是之前只使用1个上下文向量,这里面使用两个上下文向量。

下面是实验的一个case:

Hierarchical Attention

NAACL-HLT2016:Hierarchical Attention Networks for Document Classification[7]

文本分类是一项基础的NLP任务,在主题分类,情感分析,垃圾邮件检测等应用上有广泛地应用。其目标是给「每篇」文本分配一个类别标签。本文中模型的直觉是,不同的词和句子对文本信息的表达有不同的影响,词和句子的重要性是严重依赖于上下文的,即使是相同的词和句子,在不同的上下文中重要性也不一样。就像人在阅读一篇文本时,对文本不同的内容是有着不同的注意度的。而本文在attention机制的基础上,联想到文本是一个层次化的结构,提出用词向量来表示句子向量,再由句子向量表示文档向量,并且在词层次和句子层次分别引入attention操作的模型。


模型结构如上图所示,

  • 词先经过Bidirectional RNN(GRU)提取到word annotation,然后经过1个MLP得到word annotation对应的隐表示(这一步在Basic Attention中没有),

  • 然后使用该隐表示和全局的「word-level上下文隐向量」  进行对齐,计算相似性,得到softmax后的attention权重,

  • 最后对句子内的词的word annotation根据attention权重加权,得到每个句子的向量表示。

  • 接着,将得到的句子表示同样经过Bidirectional RNN(GRU)提取sentence annotation,再经过MLP得到对应的隐表示,接着将其和全局的「sentence-level上下文隐向量」 进行对齐计算,得到句子的attention权重,最后加权sentence annotation得到文档级别的向量表示。得到文档表示后再接一个softmax全连接层用于分类。

这里最有趣的一点是,全局的「word-level上下文隐向量」 和全局的的「sentence-level上下文隐向量」,是随机初始化的,且也是通过模型进行学习的。这二者就像专家一样,是高级咨询顾问。为了得到句子的向量表示,我们询问 哪些词含有比较重要的信息?为了得到文档的向量表示,我们询问  哪些句子含有比较重要的信息?

Attention over Attention

ACL2017:Attention-over-Attention Neural Networks for Reading Comprehension[8]

比较巧妙,但很容易理解,直接上图:


两个输入,一个Document和一个Query,分别用一个双向的RNN进行特征抽取,得到各自的隐状态  和 。(Embedding Layer+Bi-GRU Layer)。接着要计算document和query之间「每个词」的相似性得分,

然后基于query和doc的隐状态进行dot product,得到doc和query的attention关联矩阵 (Document所有词和Query所有词和之间的关联矩阵,行是Document,列是Query)。然后按列(column)方向进行softmax操作,得到query-to-document的attention值 ,表示t时刻的query 「word」的document-level attention。按照行(row)方向进行softmax操作,得到document-to-query的attention值 ,表示t时刻的document 「word」的query-level attention,再对  按照列方向进行累加求平均得到averaged query-level attention值 ,(可以证明,按列对  平均后仍然是概率分布),这个求平均的操作可以理解为求query-level每个词和document所有词的平均关联性。

最后再基于上一步attention操作得到  和 ,再进行attention操作,即attention over attention得到最终的attended attention ,即Document每个词都有一个attended attention score。

预测的时候,预测词典中每个词的概率,将词w在document中出现的位置上对应的attention值进行求和。例如图中Mary出现在Document首尾,故把这两个attention score相加,作为预测的概率。

文章的亮点在于,引入document和query所有词pair-wise的关联矩阵,分别计算query每个词document-level attention(传统的方法都只利用了这个attention),和document每个词的query-level attention,对后者按列取平均得到的averaged query-level attention。进一步,二者点乘得到attended document-level attention,也即attention-over-attention。

这个和上文层次化Attention有点像。

参考资料

[1]NIPS2014: Recurrent Models of Visual Attention:

https://papers.nips.cc/paper/5542-recurrent-models-of-visual-attention.pdf

[2]ICLR2015: Multiple Object Recognition with Visual Attention :

https://arxiv.org/abs/1412.7755

[3]EMNLP2015: Effective Approaches to Attention-based Neural Machine Translation:

http://aclweb.org/anthology/D15-1166

[4]AAAI2018:DiSAN: Directional Self-Attention Network for RNN/CNN-Free Language Understanding:

https://arxiv.org/pdf/1709.04696.pdf

[5]NAACL-HLT2016:Multi-Source Neural Translation:

http://www.aclweb.org/anthology/N16-1004

[6]EMNLP2015: Effective Approaches to Attention-based Neural Machine Translation:

http://aclweb.org/anthology/D15-1166

[7]NAACL-HLT2016:Hierarchical Attention Networks for Document Classification:

http://www.aclweb.org/anthology/N16-1174

[8]ACL2017:Attention-over-Attention Neural Networks for Reading Comprehension:

https://arxiv.org/pdf/1607.04423.pdf

更多精彩推荐
  • 用Python分析5000+抖音大V,粉丝最喜欢的视频类型是它

  • Google和网易有道合作开课了

  • 看清头秃元凶,腾讯AI首度揭示真相

  • 开发者的 Big Day!亚马逊 re:Invent 2020 参会学习攻略来啦~

  • 不发项目奖金,程序员怒删代码,被判 5 个月!

相关文章:

DataGrid列操作

DataTable检测是否存在某个DataColumn 1.if (dt.Columns.Contains("aa") true){ //存在aa} 2.foreach(DataColumn mDCol in dt.Columns) { if(mDCol.ColumnName"aa") { //存在aa } } 怎么样移除DataGrid列private void OnDataBound(object send…

【★更新★】高性能 Windows Socket 服务端与客户端组件(HP-Socket v2.0.1 源代码及测试用例下载)...

HP-Socket 以前为某大型通信项目开发了一套通用 Windows Socket TCP 底层通信组件,组件代号为 HP-Socket。现在把 HP-Socket 的所有代码向大众公开,希望能对大家有所帮助;另外,为了让大家能更方便的学习 HP-Socket,因此…

【数据库优化专题】MySQL视图优化(一)

本期数据库优化专题分享,为大家带来的是DBA社群MySQL领域原创专家——李海翔所著的MySQL视图优化系列文章。以下是第一部分的内容,未完部分敬请关注后续更新。 专家简介 李海翔 网名:那海蓝蓝 DBA社群MySQL领域原创专家 从事数据库研发、数…

使用Repeater的Template

.NET FX提供了一个方法,就是使用Template来在程序运行时对Repeater的显示进行控制. 这里我就不多说了,可以去看MSDN中的相关资料.(嘿嘿,其实我也没搞多少 )..其实主要是private void lc_DataBinding(object sender, EventArgs e)函数,在DataSource中的数据进行Bind的时候,每Bin…

获取文件最后修改时间的VC代码

作者:朱金灿来源:http://blog.csdn.net/clever101很多时候我们需要知道系统是什么时候编译生成的。我想到的一个直接的思路的是获取exe文件的最后修改时间。下面的一段代码可以做到这一点:CWinApp* pApp AfxGetApp();std::string strAppName…

BAT新风向标:程序员有福利了!

人工智能已成为新时代的风向标,如果你是对人工智能感兴趣的互联网工作者、大学生、研究生并期望在 AI 方向发展,建议你一定要深入学习一下人工智能。因为,未来将是人工智能的时代!为什么会有这个判断呢?第一&#xff0…

《C++代码设计与重用》——1.2 重用的神话

本节书摘来自异步社区出版社《Imperfect C中文版》一书中的第1章,第1.2节,作者: 【美】Martin D.Carroll , Margaret A.Ellis,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.2 重用的神话 C代码设计与重用1.2 重用的神…

控件的呈现方法(Rendering)的内核

Asp.net中所有的控件都是从System.Web.UI.Control类,在control类中定义了三个与呈现有关的方法,分别是Render方法,RenderChildren方法和RenderControl方法.其中RenderControl方法是public的方法,先看看这三个方法的实现: Public void RenderControl(HtmlTextWriter writer) {//…

清华、北大教授同台激辩:脑科学是否真的能启发AI?

作者 | 高卫华出品 | AI科技大本营头图 | CSDN下载自视觉中国广义的智能科学是研究智能背后的科学,需要不断扩展科学研究范围,没有最后的疆域。但脑在几千年内的进化中都相对静止,因此脑科学是“自然科学最后的疆域”。脑科学是一个重要的研究…

CentOS 5 升级mysql5.1启动服务时报错

CentOS 5 升级mysql5.1启动服务时报错: [ERROR] Error message file /usr/share/mysql/english/errmsg.sys had only 481 error messages, but it should contain at least 641 error messages.解决方法是:1.mv /usr/share/mysql/english/errmsg.sys /us…

《JavaScript设计模式》——11.2 一切只因跨域

本节书摘来自异步社区《JavaScript设计模式》一书中的第11章,第11.2节,作者:张容铭著,更多章节内容可以访问云栖社区“异步社区”公众号查看 11.2 一切只因跨域 “哦,为什么会出现,什么是跨域?…

程序员:我不学Python了!!

总学不会Python的原因,归根结底只有一个——学习方法不对。 作为一个唯一将易用性与功能取得平衡的编程语言,无论是编程新手还是多年经验的BATJZ技术大牛,都无可否认如今Python对于一个程序员职业发展的重要性。 所以,你现在能在网…

Javascript Tip(1) 操作剪贴板

javascript可以轻松操作客户端剪贴板内容,不过只适用IE5以上浏览器 javascript可以使用window.clipboardData对象处理剪贴板内容 保存到剪贴板的方法 setData(param1, param2) param1 :数据类型 text 或 URL等. param2 :数据内容 从剪贴板读出数据的方法 getdata(p…

MySQL 自增ID

http://hi.baidu.com/517898291/item/9cac18066030cac6905718e0 http://jiangshuiy.iteye.com/blog/751060 Sina 转载: MySQL: Get next AUTO_INCREMENT value from/for table Note to self: To get the next auto_increment value from a table run this query: SE…

《算法基础:打开算法之门》一1.5 拓展阅读

本节书摘来自华章出版社《算法基础:打开算法之门》一书中的第1章,第1.5节,作者 [美]托马斯 H 科尔曼(Thomas H Cormen),更多章节内容可以访问云栖社区“华章计算机”公众号查看 1.…

Python画出心目中的自己

作者 | 李秋键责编 | 晋兆雨头图 | CSDN下载自视觉中国引言:人脸图像的生成在各个行业有着重要应用,例如刑事调查、人物设计、教育培训等。然而一幅逼真的人脸肖像,对于职业画家也要至少数小时才能绘制出来;对于从未接触过绘画的新…

认识 PHP 的hash函数

Hashing function (散列函式) 在网页应用中被广泛采用,从数码签署、错误检测、登入验证、到压缩储存空间,由于它的原理比较复杂,很多人把它跟加密函式混淆,对于如何运用hash function,如何选择合适的hash function&…

const在函数前与函数后的区别 [转]

[转] http://blog.csdn.net/clozxy/article/details/5679887 一 const基础 如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况: int b 500; const int* a &b; [1] int const …

《HTML5游戏编程核心技术与实战》——2.8 小结

本节书摘来自异步社区《HTML5游戏编程核心技术与实战》一书中的第2章,第2.8节,作者: 向峰 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.8 小结 本章介绍了canvas的一些常用的操作,作为HTML5的最重要的特性,canvas使得…

IANA保留地址

IANA 就是指(Internet Assigned Numbers Authority) ,Internet号分配机构。负责对IP地址分配规划以及对TCP/UDP公共服务的端口定义。国际互联网代理成员管理局(IANA)是在国际互联网中使用的IP 地址、域名和许多其它参数的管理机构。IP地址、自…

张亚勤世界互联网大会谈AI:将变革传统行业,催生新业态

11月23日至24日,一年一度的世界互联网大会互联网发展论坛如期召开。全球疫情冲击下,科技创新成为了海内外共同关注的焦点。其中,人工智能作为新一轮科技革命和产业变革的重要驱动力量,同样饱受关注。 在24日上午的"人工智能…

如何通过参数来切换图表和数据

在报表设计的过程中有时候我们想在一张报表中既可以看到数据又可以看到图表,但是如果把数据和图表放在同一页面中似乎不太美观,所以我们可以用参数来控制是要显示数据还是显示图表。下面来看看如何实现通过参数来切换图表和数据 设计一张既有数据又有图表…

安装 Fedora 22 后要做的事情

Red Hat操作系统的社区开发版的最新成员Fedora 22,已经于2015年5月26日发布了。对这个经典的Fedora发行版的发布充斥着各种猜测和预期,而最终Fedora 22推出了许多重大变化。 就初始化进程而言,Systemd还是个新生儿,但它已经准备好…

针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言第二部552-556条

552. 无人驾驶与自动驾驶 无人驾驶与自动驾驶技术属于人工智能技术范畴,近年来有长足进步。无人驾驶与自动驾驶的实现的与路况密切有关。 根据国际自动机工程师学会2004年制度的“无人驾驶与自动驾驶技术界定标准”,将路况分成5级: 根据美国…

Web的桌面提醒(Popup)

大多数Windows程序都有桌面提醒(Popup)功能,如Msn Messenger,Outlook2003,FoxMail,SharpReader等,对用户来说可以非常的方便最新的信息。 在Web中借用IE5.5的Popup,也可以实现类似的…

linux的裁剪过程,让你的小linux更加完善,赶快试试吧!

一、系统启动流程: 1、POST-->BIOS(Boot Sequence)--> BootLoader(MBR)--> Kernel(initrd,initramfs)--> init (/etc/inittab) 第一步首先加电自检,计算机本身不会执行程序,由此它会…

《Adobe Premiere Pro CC经典教程(彩色版)》——2.2 建立项目

本节书摘来自异步社区《Adobe Premiere Pro CC经典教程(彩色版)》一书中的第2课,第2.2节,作者 【英国】Maxim Jago(马克西姆 亚戈),译者 陈昕昕,郭光伟 ,更多章节内容可以…

针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言第二部557-561条如下

557,解决最后一公里短板,提升语义网络内涵,使之具有实现可解释人工智能(或实现认知智能)的能力,尚待努力! 在跟贴263、521中,谈到提升语义网络内涵的解决之道,要坚持数据…

struts2+hibernate+Spring分层开发

web.xml中要加Spring的listener,struts2的filter的配置。UI struts2: jsp struts.xml ActionSpring ActionSpring:applicationContent-actions.xml Service Spring:applicationContent-services.xml DAO Entity DAL hibernate: …

DataGrid鼠标事件处理

http://blog.csdn.net/bgu/完成功能是DataGrid的页面选中事件、鼠标事件、双击事件改变TR的色彩。代码很简单,只是一点JS操作。JS文件:GridControl.js/*------------ DataGrid鼠标事件处理 ------------功能:用于数据梆定后鼠标事件参数说明:obj:对像thisfontColor:…