要是关注深度学习在自然语言处理方面的研究进展,我相信你一定听说过
Attention Model
(后文有时会简称
AM
模型)这个词。
AM
模型应该说是过去一年来
NLP
领域中的重要进展之一,在很多场景被证明有效。听起来
AM
很高大上,其实它的基本思想是相当直观简洁的。本文作者可以对灯发誓:在你读完这篇啰里啰嗦的文章及其后续文章后,一定可以透彻了解
AM
到底是什么,以及轻易看懂任何有关论文看上去复杂的数学公式部分。怎么样,这广告打的挺有吸引力吧,尤其是对那些患有数学公式帕金森病的患者。
在正戏开演前,我们先来点题外话。
|
引言及废话
你应该常常听到被捉奸在床的男性经常感叹地说一句话:女性的第六感通常都很准,当然这里的女性一般是特指这位男性的老婆或者女友,当然也可能是他的某位具有女性气质的男友。要我说,男人的第六感其实也不差(这里的“男人”特指本文作者本人,当然非上文所引用的“男性”,为避免混淆特做声明)。当我第一次看到机器学习领域中的
Attention Model
这个名字的时候,我的第一直觉就是:这是从认知心理学里面的人脑注意力模型引入的概念。若干年前,也就是在我年轻不懂事的花样年华里,曾有一阵子沉迷于人脑的工作机制,大量阅读了认知心理学方面的书籍和论文,而一般注意力模型会作为书籍的单独一章来讲。下面请允许我显摆一下鄙人渊博的知识。
注意力这东西其实挺有意思,但是很容易被人忽略。让我们来直观地体会一下什么是人脑中的注意力模型。首先,请您睁开眼并确认自己处于意识清醒状态;第二步,请找到本文最近出现的一个“
Attention Model
”字眼(就是“字眼”前面的两个英文单词,…
^@@^
)并盯住看三秒钟。好,假设此刻时间停止,在这三秒钟你眼中和脑中看到的是什么?对了,就是“
Attention Model
”这两个词,但是你应该意识到,其实你眼中是有除了这两个单词外的整个一副画面的,但是在你盯着看的这三秒钟,时间静止,万物无息,仿佛这个世界只有我和你
…..
对不起,串景了,仿佛这个世界只有“
Attention Model
”这两个单词。这是什么?这就是人脑的注意力模型,就是说你看到了整幅画面,但在特定的时刻
t
,你的意识和注意力的焦点是集中在画面中的某一个部分上,其它部分虽然还在你的眼中,但是你分配给它们的注意力资源是很少的。其实,只要你睁着眼,注意力模型就无时不刻在你身上发挥作用,比如你过马路,其实你的注意力会被更多地分配给红绿灯和来往的车辆上,虽然此时你看到了整个世界;比如你很精心地偶遇到了你心仪的异性,此刻你的注意力会更多的分配在此时神光四射的异性身上,虽然此刻你看到了整个世界,但是它们对你来说跟不存在是一样的
…..
这就是人脑的注意力模型,说到底是一种资源分配模型,在某个特定时刻,你的注意力总是集中在画面中的某个焦点部分,而对其它部分视而不见。
其实吧,深度学习里面的注意力模型工作机制啊,它跟你看见心动异性时荷尔蒙驱动的注意力分配机制是一样一样的。
好,前戏结束,正戏开场。
|
Encoder-Decoder
框架
本文只谈谈文本处理领域的
AM
模型,在图片处理或者(图片
-
图片标题)生成等任务中也有很多场景会应用
AM
模型,但是我们此处只谈文本领域的
AM
模型,其实图片领域
AM
的机制也是相同的。
要提文本处理领域的
AM
模型,就不得不先谈
Encoder-Decoder
框架,因为目前绝大多数文献中出现的
AM
模型是附着在
Encoder-Decoder
框架下的,当然,其实
AM
模型可以看作一种通用的思想,本身并不依赖于
Encoder-Decoder
模型,这点需要注意。
Encoder-Decoder
框架可以看作是一种文本处理领域的研究模式,应用场景异常广泛,本身就值得非常细致地谈一下,但是因为本文的注意力焦点在
AM
模型,所以此处我们就只谈一些不得不谈的内容,详细的
Encoder-Decoder
模型以后考虑专文介绍。下图是文本处理领域里常用的
Encoder-Decoder
框架最抽象的一种表示:
图
1.
抽象的
Encoder-Decoder
框架
Encoder-Decoder
框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对
,我们的目标是给定输入句子
X
,期待通过
Encoder-Decoder
框架来生成目标句子
Y
。
X
和
Y
可以是同一种语言,也可以是两种不同的语言。而
X
和
Y
分别由各自的单词序列构成:
Encoder
顾名思义就是对输入句子
X
进行编码,将输入句子通过非线性变换转化为中间语义表示
C
:
对于解码器
Decoder
来说,其任务是根据句子
X
的中间语义表示
C
和之前已经生成的历史信息
y1,y2….yi-1
来生成
i
时刻要生成的单词
yi
每个
yi
都依次这么产生,那么看起来就是整个系统根据输入句子
X
生成了目标句子
Y
。
Encoder-Decoder
是个非常通用的计算框架,至于
Encoder
和
Decoder
具体使用什么模型都是由研究者自己定的,常见的比如
CNN/RNN/BiRNN/GRU/LSTM/Deep LSTM
等,这里的变化组合非常多,而很可能一种新的组合就能攒篇论文,所以有时候科研里的创新就是这么简单。比如我用
CNN
作为
Encoder
,用
RNN
作为
Decoder
,你用
BiRNN
做为
Encoder
,用深层
LSTM
作为
Decoder
,那么就是一个创新。所以正准备跳楼的憋着劲想攒论文毕业的同学可以从天台下来了,当然是走下来,不是让你跳下来,你可以好好琢磨一下这个模型,把各种排列组合都试试,只要你能提出一种新的组合并被证明有效,那恭喜你:施主,你可以毕业了。
扯远了,再拉回来。
Encoder-Decoder
是个创新游戏大杀器,一方面如上所述,可以搞各种不同的模型组合,另外一方面它的应用场景多得不得了,比如对于机器翻译来说,
就是对应不同语言的句子,比如
X
是英语句子,
Y
是对应的中文句子翻译。再比如对于文本摘要来说,
X
就是一篇文章,
Y
就是对应的摘要;再比如对于对话机器人来说,
X
就是某人的一句话,
Y
就是对话机器人的应答;再比如
……
总之,太多了。哎,那位施主,听老衲的话,赶紧从天台下来吧,无数创新在等着你发掘呢。
|
Attention Model
图
1
中展示的
Encoder-Decoder
模型是没有体现出“注意力模型”的,所以可以把它看作是注意力不集中的分心模型。为什么说它注意力不集中呢?请观察下目标句子
Y
中每个单词的生成过程如下:
其中
f
是
decoder
的非线性变换函数。从这里可以看出,在生成目标句子的单词时,不论生成哪个单词,是
y1,y2
也好,还是
y3
也好,他们使用的句子
X
的语义编码
C
都是一样的,没有任何区别。而语义编码
C
是由句子
X
的每个单词经过
Encoder
编码产生的,这意味着不论是生成哪个单词,
y1,y2
还是
y3
,其实句子
X
中任意单词对生成某个目标单词
yi
来说影响力都是相同的,没有任何区别(其实如果
Encoder
是
RNN
的话,理论上越是后输入的单词影响越大,并非等权的,估计这也是为何
Google
提出
Sequence to Sequence
模型时发现把输入句子逆序输入做翻译效果会更好的小
Trick
的原因)。这就是为何说这个模型没有体现出注意力的缘由。这类似于你看到眼前的画面,但是没有注意焦点一样。如果拿机器翻译来解释这个分心模型的
Encoder-Decoder
框架更好理解,比如输入的是英文句子:
Tom chase Jerry
,
Encoder-Decoder
框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。在翻译“杰瑞”这个中文单词的时候,分心模型里面的每个英文单词对于翻译目标单词“杰瑞”贡献是相同的,很明显这里不太合理,显然“
Jerry
”对于翻译成“杰瑞”更重要,但是分心模型是无法体现这一点的,这就是为何说它没有引入注意力的原因。没有引入注意力的模型在输入句子比较短的时候估计问题不大,但是如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息,这也是为何要引入注意力模型的重要原因。
上面的例子中,如果引入
AM
模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:
(
Tom,0.3
)
(Chase,0.2)(Jerry,0.5)
每个英文单词的概率代表了翻译当前单词“杰瑞”时,注意力分配模型分配给不同英文单词的注意力大小。这对于正确翻译目标语单词肯定是有帮助的,因为引入了新的信息。同理,目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。这意味着在生成每个单词