Loading [MathJax]/jax/output/HTML-CSS/jax.js
27 Jul

为节约而生:从标准Attention到稀疏Attention

attention, please!

attention, please!

如今NLP领域,Attention大行其道,当然也不止NLP,在CV领域Attention也占有一席之地(Non Local、SAGAN等)。在18年初《〈Attention is All You Need〉浅读(简介+代码)》一文中,我们就已经讨论过Attention机制,Attention的核心在于Q,K,V三个向量序列的交互和融合,其中Q,K的交互给出了两两向量之间的某种相关度(权重),而最后的输出序列则是把V按照权重求和得到的。

显然,众多NLP&CV的成果已经充分肯定了Attention的有效性。本文我们将会介绍Attention的一些变体,这些变体的共同特点是——“为节约而生”——既节约时间,也节约显存

背景简述

《Attention is All You Need》一文讨论的我们称之为“乘性Attention”,目前用得比较广泛的也就是这种Attention:
Attention(Q,K,V)=softmax(QKdk)V

点击阅读全文...

8 Jul

用时间换取效果:Keras梯度累积优化器

现在Keras中你也可以用小的batch size实现大batch size的效果了——只要你愿意花n倍的时间,可以达到n倍batch size的效果,而不需要增加显存。

Github地址:https://github.com/bojone/accum_optimizer_for_keras

扯淡

在一两年之前,做NLP任务都不用怎么担心OOM问题,因为相比CV领域的模型,其实大多数NLP模型都是很浅的,极少会显存不足。幸运或者不幸的是,Bert出世了,然后火了。Bert及其后来者们(GPT-2、XLNET等)都是以足够庞大的Transformer模型为基础,通过足够多的语料预训练模型,然后通过fine tune的方式来完成特定的NLP任务。

点击阅读全文...

30 Jul

Keras实现两个优化器:Lookahead和LazyOptimizer

最近用Keras实现了两个优化器,也算是有点实现技巧,遂放在一起写篇文章简介一下(如果只有一个的话我就不写了)。这两个优化器的名字都挺有意思的,一个是look ahead(往前看?),一个是lazy(偷懒?),难道是两个完全不同的优化思路么?非也非也~只能说发明者们起名字太有创意了。

Lookahead

首先登场的是Lookahead优化器,它源于论文《Lookahead Optimizer: k steps forward, 1 step back》,是最近才提出来的优化器,有意思的是大牛Hinton和Adam的作者之一Jimmy Ba也出现在了论文作者列表当中,有这两个大神加持,这个优化器的出现便吸引了不少目光。

点击阅读全文...

9 Aug

seq2seq之双向解码

在文章《玩转Keras之seq2seq自动生成标题》中我们已经基本探讨过seq2seq,并且给出了参考的Keras实现。

本文则将这个seq2seq再往前推一步,引入双向的解码机制,它在一定程度上能提高生成文本的质量(尤其是生成较长文本时)。本文所介绍的双向解码机制参考自《Synchronous Bidirectional Neural Machine Translation》,最后笔者也是用Keras实现的。

Seq2Seq的双向解码机制图示

背景介绍

研究过seq2seq的读者都知道,常见的seq2seq的解码过程是从左往右逐字(词)生成的,即根据encoder的结果先生成第一个字;然后根据encoder的结果以及已经生成的第一个字,来去生成第二个字;再根据encoder的结果和前两个字,来生成第三个词;依此类推。总的来说,就是在建模如下概率分解
p(Y|X)=p(y1|X)p(y2|X,y1)p(y3|X,y1,y2)

点击阅读全文...

20 Aug

开源一版DGCNN阅读理解问答模型(Keras版)

去年写过《基于CNN的阅读理解式问答模型:DGCNN》,介绍了一个纯卷积的简单的问答模型。当时是用Tensorflow实现的,而且没有开源,这几天抽空用Keras复现了一下,决定开源。

模型综述

关于DGCNN的基本介绍,这里不再赘述。本文的模型并不是之前模型的重复实现,而是有所改动,这里只介绍一下被改动的地方。

1、这里放出的模型,线下验证集的分数大概是0.72(之前大约是0.75);

2、本次模型以字为单位,使用笔者之前探索出来的“字词混合Embedding”(之前是以词为单位);

3、本次模型完全去掉了人工特征(之前用了8个人工特征);

4、本次模型去掉了位置Embedding(之前将位置Embedding拼接到输入上);

5、模型架构和训练细节有所微调。

点击阅读全文...

29 Jan

抛开约束,增强模型:一行代码提升albert表现

本文标题看起来有点“标题党”了,不过所作改动放到bert4keras框架下,确实是一行代码的变动,至于是否有提升,这个笔者不敢打包票,不过测了几个算是比较有代表性的任务,均显示持平甚至有提升,所以标题说的也基本是事实。

那究竟是什么改动呢?其实一句话也能讲清楚:

在下游任务中,放弃albert的权重共享的约束,也就是把albert当bert用。

具体思路细节,请接着看下去~

点击阅读全文...

2 Apr

bert4keras在手,baseline我有:百度LIC2020

百度的“2020语言与智能技术竞赛”开赛了,今年有五个赛道,分别是机器阅读理解、推荐任务对话、语义解析、关系抽取、事件抽取。每个赛道中,主办方都给出了基于PaddlePaddle的baseline模型,这里笔者也基于bert4keras给出其中三个赛道的个人baseline,从中我们可以看到用bert4keras搭建baseline模型的方便快捷与简练。

思路简析

这里简单分析一下这三个赛道的任务特点以及对应的baseline设计。

点击阅读全文...

11 May

AdaX优化器浅析(附开源实现)

这篇文章简单介绍一个叫做AdaX的优化器,来自《AdaX: Adaptive Gradient Descent with Exponential Long Term Memory》。介绍这个优化器的原因是它再次印证了之前在《AdaFactor优化器浅析(附开源实现)》一文中提到的一个结论,两篇文章可以对比着阅读。

Adam & AdaX

AdaX的更新格式是
{gt=θL(θt)mt=β1mt1+(1β1)gtvt=(1+β2)vt1+β2g2tˆvt=vt/((1+β2)t1)θt=θt1αtmt/ˆvt+ϵ
其中β2的默认值是0.0001。对了,顺便附上自己的Keras实现:https://github.com/bojone/adax

点击阅读全文...