Attention机制是最近深度学习的一个趋势。在一次采访中,OpenAI的研究总监Ilya Sutskever说attention机制是最令人兴奋的进步之一,而且已经广为使用。听起来激动人心吧。但attention机制究竟是什么呢?

神经网络里的attention机制是(非常)松散地基于人类的视觉注意机制。人类的视觉注意机制已经被充分地研究过了,而且提出了多个不同的模型,所有的模型归根结底都是按照“高分辨率”聚焦在图片的某个特定区域并以“低分辨率”感知图像的周边区域的模式,然后不断地调整聚焦点。

Attention在神经网络领域有着很长的历史,尤其是在图像识别领域。相关的论文有Learning to combine foveal glimpses with a third-order Boltzmann machineLearning where to Attend with Deep Architectures for Image Tracking。但直到最近,attention机制才被引入NLP界常用的(视觉领域也逐步使用的)递归神经网络结构中。这正是我们这篇文章的主要关注点。

attention解决了什么问题?

我们以神经机器翻译(Neural Machine Translation,NMT)为例,来理解attention能为我们做什么。传统的机器翻译系统通常依赖于基于文本统计特性的复杂特征工程。简而言之,这些系统非常复杂,需要投入大量工程来搭建它们。神经机器翻译系统则有所区别。在NMT系统里,我们把一句话的意思映射为一个固定长度的表征向量,然后基于此向量生成翻译文本。由于不依赖于类似n-gram计数,而是捕捉文本更高层次的含义,NMT系统生成的翻译语句比大多数其它方法都要好。更重要的是,NMT系统的搭建和训练过程更方便,它们不需要任何手工的特征工程。事实上,TensorFlow只需要几百行代码就能实现一个简单版本

Continue reading

 

本文主要是利用图片的形式,详细地介绍了经典的RNN、RNN几个重要变体,以及Seq2Seq模型、Attention机制。

希望这篇文章能够提供一个全新的视角,帮助初学者更好地入门。

1

从单层网络谈起

在学习RNN之前,首先要了解一下最基本的单层网络,它的结构如图:

输入是x,经过变换Wx+b和激活函数f得到输出y。相信大家对这个已经非常熟悉了。
Continue reading

1 最int 型数组,子数组的最大和

#get max array
#得到 最大 子数组
def getmaxarray(arraylist):
    
    currentsum = arraylist[1]
    currentsumlist = [arraylist[1]]
    maxsum = arraylist[1]
    maxsumlist = [arraylist[1]]

    for i in range(len(arraylist)):
        # 如果加入后面的数据大于当前的sum
        if( (currentsum +  arraylist[i]) >  currentsum):
            # 更新当前的currentsum 数据
            currentsum += arraylist[i]
            # 更新当前的currentsumlist 列表
            currentsumlist.append(arraylist[i])

            # 如果当前的sum 大于最大sum  更新最大sum
            if(currentsum >= maxsum):
                maxsum = currentsum
                maxsumlist = currentsumlist
        else:
            currentsum = arraylist[i]
            currentsumlist= []
            currentsumlist.append(arraylist[i])
            # 如果当前的sum 大于最大sum  更新最大sum
            if(currentsum >= maxsum):
                maxsum = currentsum
                maxsumlist = currentsumlist
    return maxsumlist


print(getmaxarray([-1,-3,-10,-5]))
print(getmaxarray([-1,-3,-0,-10,-5]))
print(getmaxarray([1,-3,0,10,-5]))
print(getmaxarray([1,3,0,10,5]))

Continue reading

摘要:本文针对自然语言对话任务和相关技术进行分类,列举主要技术挑战,解析如何构建基于数据的对话系统,并详细介绍最新的基于深度学习的对话技术。同时还介绍了深度学习在自然语言表示学习中的最新成果。

前言

我们在日常生活中经常使用自然语言对话系统,比如苹果Siri。现在的对话系统多数只能做单轮对话,可以帮助用户完成一些简单的任务,如问天气,查股票(如果做多轮对话,也是在单轮对话的基础上加一些简单处理)。实现这些自然语言对话系统的基本技术可以分为两大类,基于规则的和基于数据的。你也许想知道对话系统的基本原理是怎样的?特别是如何用数据驱动的方式构建一个对话系统?
Continue reading

从Encoder到Decoder实现Seq2Seq模型

前言

好久没有更新专栏,今天我们来看一个简单的Seq2Seq实现,我们将使用TensorFlow来实现一个基础版本的Seq2Seq,主要帮助理解Seq2Seq中的基础架构。

最基础的Seq2Seq模型包含了三个部分,即Encoder、Decoder以及连接两者的中间状态向量,Encoder通过学习输入,将其编码成一个固定大小的状态向量S,继而将S传给Decoder,Decoder再通过对状态向量S的学习来进行输出。
Continue reading

这里写图片描述


1. sequence-to-sequence模型

官方教程使用seq2seq模型实现了英语-法语的翻译系统。经典的sequence-to-sequence模型由两个RNN网络构成,一个被称为“encoder”,另一个则称为“decoder”,前者负责把序列编码成一个固定长度的向量,这个向量作为输入传给后者,输出可变长度的向量,它的基本网络结构如下,
这里写图片描述

其中每一个小圆圈代表一个cell,比如GRUcell、LSTMcell、multi-layer-GRUcell、multi-layer-GRUcell等。尽管“encoder”或者“decoder”内部存在权值共享,但encoder和decoder之间一般具有不同的一套参数。
Continue reading

什么是用户意图识别?就是让搜索引擎能够识别出与用户输入的查询最相关的信息,例如用户输入查询“仙剑奇侠传”时,我们知道“仙剑奇侠传”既有游戏又有电视剧还有新闻、图片等等,如果我们通过用户意图识别发现该用户是想看“仙剑奇侠传”电视剧的,那我们直接把电视剧作为结果返回给用户,就会节省用户的搜索点击次数,缩短搜索时间,大大提升使用体验。
Continue reading

 

对于搜索引擎来讲,很多情况下只需要用户在搜索输入框内输入所需要查询的内容就可以了,其余的事情就全部交给搜索引擎去处理。理想的情况下,搜索引擎会优先返回用户想要的结果。理想很丰满,但总会存在一些骨感的现实,用户通过搜索无法找到最想要的结果。如果应用中压根不存在用户搜索的内容,倒还可以理解。反之的话,就是一个大写的尴尬。本文主要谈论和解决的是令人尴尬的问题。
Continue reading