长短期记忆(LSTM)网络是一种循环神经网络(RNN),能够捕获顺序数据中的长期依赖关系。它们对于语言翻译、语言建模等任务以及需要模型长时间记住过去信息的其他任务特别有用。
LSTM能够通过引入额外的“存储单元”来实现这一点,这些“存储单元”可以长时间存储信息,并使用“门”来控制进出单元的信息流。这些门允许 LSTM 有选择地存储和检索信息,并忘记不再需要的信息。
与传统 RNN 相比,LSTM 的主要优势之一是它们能够处理长期依赖关系。在传统的RNN中,给定时间步的隐藏状态通常是前一个时间步的隐藏状态和当前时间步的输入的函数。这意味着模型捕获长期依赖项的能力受到隐藏状态大小的限制,这使得捕获跨越多个时间步的依赖项变得困难。
相比之下,LSTM 能够通过使用其存储单元来存储与较长时间相关的信息来捕获长期依赖关系。这使他们能够更好地捕获数据中对手头任务很重要的模式和关系。
总体而言,LSTM 是一个强大的工具,适用于需要模型长时间记住过去信息的任务,并且已经在广泛的任务上取得了成功,包括语言翻译、语言建模和语音识别。
根据通用近似定理,前馈网络和循环网络都有很强的能力。但由于优化算法和计算能力的限制,在实践中很难达到通用近似的能力。
神经网络中可以存储的信息量称为 网络容量(Network Capacity) 。一般来讲,利用一组神经元来存储信息时,其 存储容量和神经元的数量以及网络的复杂度成正比 。如果要存储越多的信息,神经元数量就要越多或者网络要越复杂,进而导致神经网络的参数成倍地增加。
大脑神经系统有两个重要机制可以解决信息过载问题: 注意力和记忆机制 。我们可以借鉴人脑解决信息过载的机制,从两方面来提高神经网络处理信息的能力。 一方面是注意力,通过自上而下的信息选择机制来过滤掉大量的无关信息;另一方面是引入额外的外部记忆,优化神经网络的记忆结构来提高神经网络存储信息的容量 。
在计算能力有限情况下,注意力机制(Attention Mechanism)作为一种资源分配方案,将计算资源分配给更重要的任务,是解决信息超载问题的主要手段。
注意力是一种人类不可或缺的复杂认知功能,指人可以在关注一些信息的同时忽略另一些信息的选择能力 。
注意力一般分为两种:一种是自上而下的有意识的注意力,称为 聚焦式(Focus)注意力 。聚焦式注意力是指有预定目的、依赖任务的、主动地有意识地聚焦于某一对象的注意力;另一种是自下而上的无意识的注意力,称为 基于显著性(Saliency-Based)的注意力 。基于显著性的注意力是由外界刺激驱动的注意,不需要主动干预,也和任务无关。
一个和注意力有关的例子是 鸡尾酒会效应 。当一个人在吵闹的鸡尾酒会上和朋友聊天时,尽管周围噪音干扰很多,他还是可以听到朋友的谈话内容,而忽略其他人的声音(聚焦式注意力)。同时,如果未注意到的背景声中有重要的词(比如他的名字),他会马上注意到(显著性注意力)。
在目前的神经网络中,我们 可以将最大汇聚(Max Pooling)、门控(Gating)机制来近似地看作是自下而上的基于显著性的注意力机制 。除此之外,自上而下的会聚式注意力也是一种有效的信息选择方式。
用 表示 组输入信息,其中每个向量 都表示一组输入信息。为了节省计算资源,不需要将所有信息都输入到神经网络,只需要从 中选择一些和任务相关的信息。 注意力机制的计算可以分为两步:一是在所有输入信息上计算注意力分布,二是根据注意力分布来计算输入信息的加权平均 。
给定一个和任务相关的查询向量 ,我们用注意力变量 来表示被选择信息的索引位置,即 表示选择了第 个输入向量。为了方便计算,我们采用一种“软性”的信息选择机制,首先计算在给定 和 下,选择第 个输入向量的概率 :
其中 称为注意力分布(Attention Distribution), 为 注意力打分函数 ,可以使用以下几种方式来计算:
其中 为可学习的网络参数, 为输入向量的维度。理论上,加性模型和点积模型的复杂度差不多,但是点积模型在实现上可以更好地利用矩阵乘积,从而计算效率更高。但当输入向量的维度 比较高,点积模型的值通常有比较大方差,从而导致 函数的梯度会比较小。因此,缩放点积模型可以较好地解决这个问题。
上式称为 软性注意力机制(Soft Attention Mechanism) 。下图给出了软性注意力机制的示例。
上面提到的注意力是 软性注意力,其选择的信息是所有输入向量在注意力分布下的期望。此外,还有一种注意力是只关注到某一个输入向量,叫做硬性注意力 。
硬性注意力有两种实现方式:
其中 为概率最大的输入向量的下标,即
硬性注意力的一个缺点是基于最大采样或随机采样的方式来选择信息。因此最终的损失函数与注意力分布间的函数关系不可导,因此无法用反向传播算法进行训练(硬性注意力需要通过强化学习来进行训练) 。为了使用反向传播算法,一般使用软性注意力来代替硬性注意力。
更一般地,我们可以用 键值对(key-value pair) 格式来表示输入信息,其中“键”用来计算注意力分布 ,“值”用来计算聚合信息。
用 表示 组输入信息,给定任务相关的查询向量 时,注意力函数为:
下图给出键值对注意力机制的示例。当 时,键值对模式就等价于普通的注意力机制。
多头注意力(Multi-Head Attention)是利用多个查询 ,来平行地计算从输入信息中选取多组信息。每个注意力关注输入信息的不同部分 。
其中 表示向量拼接。
在之前介绍中,我们假设所有的输入信息是同等重要的,是一种扁平(Flat)结构,注意力分布实际上是在所有输入信息上的多项分布。但 如果输入信息本身具有层次结构,比如文本可以分为词、句子、段落、篇章等不同粒度的层次,我们可以使用层次化的注意力来进行更好的信息选择 。
注意力机制一般可以用作一个神经网络中的组件。
注意力机制可以分为两步:一是计算注意力分布 ,二是根据 来计算输入信息的加权平均。我们可以只利用注意力机制中的第一步,并 将注意力分布作为一个软性的指针(pointer)来指出相关信息的位置 。
指针网络(Pointer Network) 是一种序列到序列模型, 输入是长度为 的向量序列 , 输出是下标序列 。
和一般的序列到序列任务不同,这里的输出序列是输入序列的下标(索引) 。比如输入一组乱序的数字,输出为按大小排序的输入数字序列的下标。比如输入为20, 5, 10,输出为1, 3, 2。
条件概率 可以写为:
其中条件概率 可以通过注意力分布来计算。假设用一个循环神经网络对 进行编码得到向量 ,则:
其中 为在解码过程的第 步时,每个输入向量的未归一化的注意力分布:
其中 为可学习的参数。下图给出指针网络的示例。
当使用神经网络来处理一个变长的向量序列时,我们通常可以使用卷积网络或循环网络进行编码来得到一个相同长度的输出向量序列。
基于卷积或循环网络的序列编码都是可以看做是一种局部的编码方式,只建模了输入信息的局部依赖关系。虽然循环网络理论上可以建立长距离依赖关系,但是由于信息传递的容量以及梯度消失问题,实际上也只能建立短距离依赖关系 。如果要建立输入序列之间的长距离依赖关系,可以使用以下两种方法:一种方法是 增加网络的层数 ,通过一个深层网络来获取远距离的信息交互;另一种方法是 使用全连接网络 。全连接网络是一种非常直接的建模远距离依赖的模型,但是无法处理变长的输入序列。不同的输入长度,其连接权重的大小也是不同的。这时我们就可以 利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(Self-Attention Model) 。
假设输入序列为 ,输出序列为 ,首先我们可以通过线性变换得到三组向量序列:
其中 分别为查询向量序列,键向量序列和值向量序列, 分别为可学习的参数矩阵。
利用键值对的注意力函数,可以得到输出向量 :
其中 为输出和输入向量序列的位置, 连接权重 由注意力机制动态生成 。
下图给出全连接模型和自注意力模型的对比,其中实线表示为可学习的权重,虚线表示动态生成的权重。 由于自注意力模型的权重是动态生成的,因此可以处理变长的信息序列 。
自注意力模型可以作为神经网络中的一层来使用,既可以用来替换卷积层和循环层,也可以和它们一起交替使用。
为了增强网络容量,我们可以 引入辅助记忆单元,将一些信息保存辅助记忆中,在需要时再进行读取,这样可以有效地增加网络容量 。这个引入辅助记忆单元一般称为 外部记忆(External Memory) ,以区别与循环神经网络的内部记忆(即隐状态)。
生理学家发现信息是作为一种 整体效应(collective effect) 存储在大脑组织中。当大脑皮层的不同部位损伤时,其导致的不同行为表现似乎取决于损伤的程度而不是损伤的确切位置。 大脑组织的每个部分似乎都携带一些导致相似行为的信息。也就是说,记忆在大脑皮层是分布式存储的,而不是存储于某个局部区域 。
人脑中的记忆具有 周期性 和 联想性 。
长期记忆可以类比于人工神经网络中的权重参数,而短期记忆可以类比于人工神经网络中的隐状态 。
除了长期记忆和短期记忆,人脑中还会存在一个“缓存”,称为 工作记忆(Working Memory) 。在执行某个认知行为(比如记下电话号码,算术运算)时,工作记忆是一个记忆的临时存储和处理系统,维持时间通常为几秒钟。
和之前介绍的LSTM中的记忆单元相比,外部记忆可以存储更多的信息,并且不直接参与计算,通过读写接口来进行操作。而 LSTM模型中的记忆单元包含了信息存储和计算两种功能,不能存储太多的信息。因此,LSTM中的记忆单元可以类比于计算机中寄存器,而外部记忆可以类比于计算机中的存储器:内存、磁带或硬盘等 。
借鉴人脑中工作记忆,可以在神经网络中引入一个外部记忆单元来提高网络容量。 外部记忆的实现途径有两种:一种是结构化的记忆,这种记忆和计算机中的信息存储方法比较类似,可以分为多个记忆片段,并按照一定的结构来存储;另一种是基于神经动力学的联想记忆,这种记忆方式具有更好的生物学解释性 。
一个不太严格的类比表格如下:
为了增强网络容量,一种比较简单的方式是引入结构化的记忆模块, 将和任务相关的短期记忆保存在记忆中,需要时再进行读取 。这种装备外部记忆的神经网络也称为 记忆网络(Memory Network,MN) 或 记忆增强神经网络(Memory Augmented Neural Network,MANN) 。
记忆网络结构如图:
一般有以下几个模块构成:
这种结构化的外部记忆是带有地址的,即每个记忆片段都可以按地址读取和写入。要实现类似于人脑神经网络的联想记忆能力,就需要按内容寻址的方式进行定位,然后进行读取或写入操作。 按内容寻址通常使用注意力机制来进行。通过注意力机制可以实现一种“软性”的寻址方式,即计算一个在所有记忆片段上的分布,而不是一个单一的绝对地址 。比如读取模型 的实现方式可以为:
其中 是主网络生成的查询向量, 为打分函数。类比于计算机的存储器读取, 计算注意力分布的过程相当于是计算机的“寻址”过程,信息加权平均的过程相当于计算机的“内容读取”过程 。因此,结构化的外部记忆也是一种联想记忆,只是其结构以及读写的操作方式更像是受计算机架构的启发。
通过引入外部记忆,可以将神经网络的参数和记忆容量的“分离”,即在少量增加网络参数的条件下可以大幅增加网络容量。 注意力机制可以看做是一个接口,将信息的存储与计算分离 。
端到端记忆网络(End-To-End Memory Network,MemN2N) 采用一种可微的网络结构,可以多次从外部记忆中读取信息。 在端到端记忆网络中,外部记忆单元是只读的 。
给定一组需要存储的信息 ,首先将其转换成两组记忆片段 和 ,分别存放在两个外部记忆单元中,其中 用来进行寻址, 用来进行输出。
主网络根据输入 生成 ,并使用注意力机制来从外部记忆中读取相关信息 :
并产生输出:
其中 为预测函数。当应用到分类任务时, 可以设为softmax 函数。
为了实现更新复杂的计算,我们可以让主网络和外部记忆进行多轮交互。在第 轮交互中,主网络根据上次从外部记忆中读取的信息 ,产生新的查询向量:
其中 为初始的查询向量, 。
假设第 轮交互的外部记忆为 和 ,主网络从外部记忆读取信息为:
端到端记忆网络结构如图:
RNN模型的基础结构是单元,其中比较常见的有LSTM单元,GRU单元等,它们充当了RNN模型中的基础结构部分。使用单元搭建出来的RNN模型会有更好的拟合效果。
LSTM单元与GRU单元是RNN模型中最常见的单元,其内容由输入门、忘记门、和输出门三种结构组合而成。
LSTM单元与GRU单元的作用几乎相同,唯一不同的是:
相比之下,使用GRU单元会更加简单。
QRNN(Quasi-Recurrent Neural Networks) 单元是一种RNN模型的基础单元,它比LSTM单元速度更快。
QRNN单元发表于2016年。它使用卷积操作替代传统的循环结构,其网络结构介于RNN与CNN之间。
QRNN内部的卷积结构可以将序列数据以矩阵方式同时运算,不再像循环结构那样必须按照序列顺序依次计算。其以并行的运算方式取代了串行,提升了运算速度。在训练时,卷积结构也要比循环结构的效果更加稳定。
在实际应用中,QRNN 单元可以与RNN模型中的现有单元随意替换。
了解更多,可以参考论文:
Quasi-Recurrent Neural Networks
SRU单元是RNN模型的基础单元,它的作用与QRNN单元类似,也是对LSTM单元在速度方面进行了提升。
LSTM单元必须要将样本按照序列顺序一个个地进行运算,才能够输出结果。这种运算方式使得单元无法在多台机器并行计算的环境中发挥最大的作用。
SRU单元被发表于2017年。它保留LSTM单元的循环结构,通过调整运算先后顺序的方式(把矩阵乘法放在串行循环外,把相乘的再相加的运算放在串行循环内)提升了运算速度。
若需要研究SRU单元更深层次理论,可以参考如下论文:
Simple Recurrent Units for Highly Parallelizable Recurrence
关于函数tfcontribrnnSRUCell 的更多使用方法,可以参照官方帮助文档。
https://wwwtensorfloworg/api_docs/python/tf/contrib/rnn/SRUCell
注:需要科学上网
github可以参考:
https://githubcom/tensorflow/tensorflow/blob/r115/tensorflow/contrib/rnn/python/ops/rnn_cellpy#L2738-L2816
输入输出都是向量,或者说是矩阵。LSTM用于分类的话,后面一般会接softmax层。个人浅薄理解,拿动作识别分类举例,每个动作帧放入LSTM中训练,还是根据task来训练每个LSTM单元的Weights。所以LSTM的单元数量跟输入和输出都没有关系,甚至还可以几层LSTM叠加起来用。分类的话,一般用最后一个单元接上softmax层。LSTM结构是传统的RNN结构扩展,解决了传统RNN梯度消失/爆炸的问题,从而使得深层次的网络更容易训练。从这个角度理解,可能会容易很多。今年的ResNet也是使传统的CNN更容易训练weights。看来deeplearning越来越深是趋势啊。如果说训练,就一个关键,所谓LSTMUnroll,将RNN展开成一个静态的“并行”网络,内部有“侧向连接”,实现长的短时记忆功能(状态“记忆”在LSTMCell里)。如果说预测,也就一个关键,要将Cell的h和C弄出来,作为当前状态(也就是所谓“记忆”)作为init参数输入,这样,携带了当前记忆状态的网络,预测得到的就是下一个输入了,所谓的recurrent了。那份代码里还包含了一个使用cudnn的实现(built-inRNNoperator),这是一个高性能的版本,可以真正干活的。原来我也尝试搞懂一些天书般的公式,很快发现从那里入手是个错误。强烈推荐:理解LSTM网络(翻译自UnderstandingLSTMNetworks)只要有一点点CNN基础+半个小时,就可以通过这篇文章理解LSTM的基础原理。回答你的问题:和神经元个数无关,不知道你是如何理解“神经元”这个概念的,输入输出层保证tensor的维数和输入输出一致就可以了。
与其他的人工智能技术相比,情感分析(Sentiment Analysis)显得有些特殊,因为其他的领域都是根据客观的数据来进行分析和预测,但情感分析则带有强烈的个人主观因素。情感分析的目标是从文本中分析出人们对于实体及其属性所表达的情感倾向以及观点,这项技术最早的研究始于2003年Nasukawa和Yi两位学者的关于商品评论的论文。
随着推特等社交媒体以及电商平台的发展而产生大量带有观点的内容,给情感分析提供了所需的数据基础。时至今日,情感识别已经在多个领域被广泛的应用。例如在商品零售领域,用户的评价对于零售商和生产商都是非常重要的反馈信息,通过对海量用户的评价进行情感分析,可以量化用户对产品及其竞品的褒贬程度,从而了解用户对于产品的诉求以及自己产品与竞品的对比优劣。在社会舆情领域,通过分析大众对于社会热点事件的点评可以有效的掌握舆论的走向。在企业舆情方面,利用情感分析可以快速了解社会对企业的评价,为企业的战略规划提供决策依据,提升企业在市场中的竞争力。在金融交易领域,分析交易者对于股票及其他金融衍生品的态度,为行情交易提供辅助依据。
目前,绝大多数的人工智能开放平台都具备情感分析的能力,如图所示是玻森中文语义开放平台的情感分析功能演示,可以看出除了通用领域的情感分析外,还有汽车、厨具、餐饮、新闻和微博几个特定领域的分析。
那么到底什么是情感分析呢?从自然语言处理技术的角度来看,情感分析的任务是从评论的文本中提取出评论的实体,以及评论者对该实体所表达的情感倾向,自然语言所有的核心技术问题,例如:词汇语义,指代消解,此役小气,信息抽取,语义分析等都会在情感分析中用到。因此,情感分析被认为是一个自然语言处理的子任务,我们可以将人们对于某个实体目标的情感统一用一个五元组的格式来表示:(e,a,s,h,t)
以图为例,e是指某餐厅,a为该餐厅的性价比属性,s是对该餐厅的性价比表示了褒义的评价,h为发表评论者本人,t是19年7月27日。所以这条评论的情感分析可以表示为五元组(某餐厅,性价比,正向褒义,评论者,19年7月27日)。
情感分析根据处理文本颗粒度的不同,大致可以分为三个级别的任务,分别是篇章级、句子级和属性级。我们分别来看一下。
1 篇章级情感分析
篇章级情感分析的目标是判断整篇文档表达的是褒义还是贬义的情感,例如一篇书评,或者对某一个热点时事新闻发表的评论,只要待分析的文本超过了一句话的范畴,即可视为是篇章级的情感分析。
对于篇章级的情感分析而言有一个前提假设,那就是全篇章所表达的观点仅针对一个单独的实体e,且只包含一个观点持有者h的观点。这种做法将整个文档视为一个整体,不对篇章中包含的具体实体和实体属性进行研究,使得篇章级的情感分析在实际应用中比较局限,无法对一段文本中的多个实体进行单独分析,对于文本中多个观点持有者的观点也无法辨别。
例如评价的文本是:“我觉得这款手机很棒。”评价者表达的是对手机整体的褒义评价,但如果是:“我觉得这款手机拍照功能很不错,但信号不是很好”这样的句子,在同一个评论中出现了褒义词又出现了贬义词,篇章级的分析是无法分辨出来的,只能将其作为一个整体进行分析。
不过好在有很多的场景是不需要区分观点评价的实体和观点持有者,例如在商品评论的情感分析中,可以默认评论的对象是被评论的商品,评论的观点持有者也是评论者本人。当然,这个也需要看被评论的商品具体是什么东西,如果是亲子旅游这样的旅游服务,那么评论中就很有可能包含一个以上的观点持有者。
在实际工作中,篇章级的情感分析无法满足我们对于评价更细致,如果需要对评论进行更精确,更细致的分析,我们需要拆分篇章中的每一句话,这就是句子级的情感分析研究的问题。
2 句子级情感分析
与篇章级的情感分析类似,句子级的情感分析任务是判断一个句子表达的是褒义还是贬义的情感,虽然颗粒度到了句子层级,但是句子级分析与篇章级存在同样的前提假设是,那就是一个句子只表达了一个观点和一种情感,并且只有一个观点持有人。如果一个句子中包含了两种以上的评价或多个观点持有人的观点,句子级的分析是无法分辨的。好在现实生活中,绝大多数的句子都只表达了一种情感。
既然句子级的情感分析在局限性上与篇章级是一样的,那么进行句子级的情感分析意义何在呢?关于这个问题,需要先解释一下语言学上主观句与客观句的分别。在我们日常用语当中,根据语句中是否带有说话人的主观情感可以将句子分为主观句和客观句,例如:“我喜欢这款新手机。”就是一个主观句,表达了说话人内心的情感或观点,而:“这个APP昨天更新了新功能。”则是一个客观句,陈述的是一个客观事实性信息,并不包含说话人内心的主观情感。通过分辨一个句子是否是主观句,可以帮助我们过滤掉一部分不含情感的句子,让数据处理更有效率。
但是在实操过程中,我们会发现这样的分类方法似乎并不是特别准确,因为一个主观句也可能没有表达任何的情感信息,知识表达了期望或者猜测,例如:“我觉得他现在已经在回家的路上了。”这句话是一个主观句,表达了说话人的猜测,但是并没有表达出任何的情感。而客观句也有可能包含情感信息,表明说话者并不希望这个事实发生,例如:“昨天刚买的新车就被人刮花了。”这句话是一个客观句,但结合常识我们会发现,这句话中其实是包含了说话人的负面情感。
所以,仅仅对句子进行主客观的分类还不足以达到对数据进行过滤的要求,我们需要的是对句子是否含有情感信息进行分类,如果一个句子直接表达或隐含了情感信息,则认为这个句子是含有情感观点的,对于不含情感观点的句子则可以进行过滤。目前对于句子是否含有情感信息的分类技术大多都是采用有监督的学习算法,这种方法需要大量的人工标注数据,基于句子特征来对句子进行分类。
总之,我们可以将句子级的情感分析分成两步,第一步是判断待分析的句子是否含有观点信息,第二步则是针对这些含有观点信息的句子进行情感分析,发现其中情感的倾向性,判断是褒义还是贬义。关于分析情感倾向性的方法与篇章级类似,依然是可以采用监督学习或根据情感词词典的方法来处理,我们会在后续的小节详细讲解。
句子级的情感分析相较于篇章级而言,颗粒度更加细分,但同样只能判断整体的情感,忽略了对于被评价实体的属性。同时它也无法判断比较型的情感观点,例如:“A产品的用户体验比B产品好多了。”对于这样一句话中表达了多个情感的句子,我们不能将其简单的归类为褒义或贬义的情感,而是需要更进一步的细化颗粒度,对评价实体的属性进行抽取,并将属性与相关实体之间进行关联,这就是属性级情感分析。
3 属性级情感分析
上文介绍的篇章级和句子级的情感分析,都无法确切的知道评价者喜欢和不喜欢的具体是什么东西,同时也无法区分对某一个被评价实体的A属性持褒义倾向,对B属性却持贬义倾向的情况。但在实际的语言表达中,一个句子中可能包含了多个不同情感倾向的观点,例如:“我喜欢这家餐厅的装修风格,但菜的味道却很一般。”类似于这样的句子,很难通过篇章级和句子级的情感分析了解到对象的属性层面。
为了在句子级分析的基础上更加细化,我们需要从文本中发现或抽取评价的对象主体信息,并根据文本的上下文判断评价者针对每一个属性所表达的是褒义还是贬义的情感,这种就称之为属性级的情感分析。属性级的情感分析关注的是被评价实体及其属性,包括评价者以及评价时间,目标是挖掘与发现评论在实体及其属性上的观点信息,使之能够生成有关目标实体及其属性完整的五元组观点摘要。具体到技术层面来看,属性级的情感分析可以分为以下6个步骤:
关于文本中的实体抽取和指代消解问题,我们已经在知识图谱的相关章节中做了介绍,这里就不再赘述。针对篇章级、句子级、属性级这三种类型的情感分析任务,人们做了大量的研究并提出了很多分类的方法,这些方法大致可以分为基于词典和基于机器学习两种,下面我们进行详细的讲解。
做情感分析离不开情感词,情感词是承载情感信息最基本的单元,除了基本的词之外,一些包含了情感含义的短语和成语我们也将其统称为情感词。基于情感词典的情感分析方法,主要是基于一个包含了已标注的情感词和短语的词典,在这个词典中包括了情感词的情感倾向以及情感强度,一般将褒义的情感标注为正数,贬义的情感标注为负数。
具体的步骤如图所示,首先将待分析的文本先进行分词,并对分词后的结果做去除停用词和无用词等文本数据的预处理。然后将分词的结果与情感词典中的词进行匹配,并根据词典标注的情感分对文本进行加法计算,最终的计算结果如果为正则是褒义情感,如果为负则是贬义情感,如果为0或情感倾向不明显的得分则为中性情感或无情感。
情感词典是整个分析流程的核心,情感词标注数据的好坏直接决定了情感分类的结果,在这方面可以直接采用已有的开源情感词典,例如BosonNLP基于微博、新闻、论坛等数据来源构建的情感词典,知网(Hownet)情感词典,台湾大学简体中文情感极性词典(NTSUSD),snownlp框架的词典等,同时还可以使用哈工大整理的同义词词林拓展词典作为辅助,通过这个词典可以找到情感词的同义词,拓展情感词典的范围。
当然,我们也可以根据业务的需要来自己训练情感词典,目前主流的情感词词典有三种构建方法:人工方法、基于字典的方法和基于语料库的方法。对于情感词的情感赋值,最简单的方法是将所有的褒义情感词赋值为+1,贬义的情感词赋值为-1,最后进行相加得出情感分析的结果。
但是这种赋值方式显然不符合实际的需求,在实际的语言表达中,存在着非常多的表达方式可以改变情感的强度,最典型的就是程度副词。程度副词分为两种,一种是可以加强情感词原本的情感,这种称之为情感加强词,例如“很好”相较于“好”的情感程度会更强烈,“非常好”又比“很好”更强。另外一种是情感减弱词,例如“没那么好”虽然也是褒义倾向,但情感强度相较于“好”会弱很多。如果出现了增强词,则需要在原来的赋值基础上增加情感得分,如果出现了减弱词则需要减少相应的情感得分。
另一种需要注意的情况是否定词,否定词的出现一般会改变情感词原本的情感倾向,变为相反的情感,例如“不好”就是在“好”前面加上了否定词“不”,使之变成了贬义词。早期的研究会将否定词搭配的情感词直接取相反数,即如果“好”的情感倾向是+1,那么“不好”的情感倾向就是-1。但是这种简单粗暴的规则无法对应上真实的表达情感,例如“太好”是一个比“好”褒义倾向更强的词,如果“好”的值为+1,那么“太好”可以赋值为+3,加上否定词的“不太好”变成-3则显然有点过于贬义了,将其赋值为-1或者-05可能更合适。
基于这种情况,我们可以对否定词也添加上程度的赋值而不是简单的取相反数,对于表达强烈否定的词例如“不那么”赋值为±4,当遇到与褒义词的组合时褒义词则取负数,与贬义词的组合则取正数,例如贬义词“难听”的赋值是-3,加上否定词变成“不那么难听”的情感得分就会是(-3+4=1)。
第三种需要注意的情况是条件词,如果一个条件词出现在句子中,则这个句子很可能不适合用来做情感分析,例如“如果我明天可以去旅行,那么我一定会非常开心。”,在这句话中有明显的褒义情感词,但是因为存在条件词“如果”,使得这个句子的并没有表达观点持有者的真实情感,而是一种假设。
除了条件句之外,还有一种语言表达也是需要在数据预处理阶段进行排除的,那就是疑问句。例如“这个餐厅真的有你说的那么好吗?”,虽然句子中出现了很强烈的褒义情感词“那么好”,但依然不能将它分类为褒义句。疑问句通常会有固定的结尾词,例如“……吗?”或者“……么?”,但是也有的疑问句会省略掉结尾词,直接使用标点符号“?”,例如“你今天是不是不开心?”,这个句子中含有否定词和褒义词组成的“不开心”,但不能将其分类为贬义情感。
最后一种需要注意的情况是转折词,典型词是“但是”,出现在转折词之前的情感倾向通常与转折词之后的情感倾向相反,例如:“我上次在这家酒店的住宿体验非常好,但是这次却让我很失望。”在这个转折句中,转折词之前的“非常好”是一个很强的褒义词,但真实的情感表达却是转折词之后的“很失望”,最终应该将其分类为贬义情感。当然,也存在出现了转折词,但语句本身的情感并没有发生改变的情况,例如“你这次考试比上次有了很大的进步,但是我觉得你可以做得更好”,这里的转折词没有转折含义,而是一种递进含义。在实际操作中,我们所以需要先判断转折句真实的情感表达到底是哪个,才能进行正确的分析计算。
构建情感词典是一件比较耗费人工的事情,除了上述需要注意的问题外,还存在精准度不高,新词和网络用语难以快速收录进词典等问题。同时基于词典的分析方法也存在很多的局限性,例如一个句子可能出现了情感词,但并没有表达情感。或者一个句子不含任何情感词,但却蕴含了说话人的情感。以及部分情感词的含义会随着上下文语境的变化而变化的问题,例如“精明”这个词可以作为褒义词夸奖他人,也可以作为贬义词批评他人。
尽管目前存在诸多问题,但基于字典的情感分析方法也有着不可取代的优势,那就是这种分析方法通用性较强,大多数情况下无需特别的领域数据标注就可以分析文本所表达的情感,对于通用领域的情感分析可以将其作为首选的方案。
我们在机器学习算法的章节介绍过很多分类算法,例如逻辑回归、朴素贝叶斯、KNN等,这些算法都可以用于情感识别。具体的做法与机器学习一样需要分为两个步骤,第一步是根据训练数据构建算法模型,第二步是将测试数据输入到算法模型中输出对应的结果,接下来做具体的讲解。
首先,我们需要准备一些训练用的文本数据,并人工给这些数据做好情感分类的标注,通常的做法下,如果是褒义和贬义的两分类,则褒义标注为1,贬义标注为0,如果是褒义、贬义和中性三分类,则褒义标注为1,中性标注为0,贬义标注为-1
在这一环节中如果用纯人工方法来进行标注,可能会因为个人主观因素对标注的结果造成一定影响,为了避免人的因素带来的影响,也为了提高标注的效率,有一些其他取巧的方法来对数据进行自动标注。比如在电商领域中,商品的评论除了文本数据之外通常还会带有一个5星的等级评分,我们可以根据用户的5星评分作为标注依据,如果是1-2星则标注为贬义,如果是3星标注为中性,4-5星标注为褒义。又比如在社区领域中,很多社区会对帖子有赞和踩的功能,这一数据也可以作为情感标注的参考依据。
第二步是将标注好情感倾向的文本进行分词,并进行数据的预处理,前文已经对分词有了很多的介绍,这里就不再过多的赘述。第三步是从分词的结果中标注出具备情感特征的词,这里特别说一下,如果是对情感进行分类,可以参考情感词典进行标注,也可以采用TF-IDF算法自动抽取出文档的特征词进行标注。如果分析的是某个特定领域的,还需要标注出特定领域的词,例如做商品评价的情感分析,需要标注出商品名称,品类名称,属性名称等。第四步根据分词统计词频构建词袋模型,形成特征词矩阵,如表所示。在这一步可以根据业务需要给每个特征词赋予权重,并通过词频乘以权重得到特征词分数。最后一步就是根据分类算法,将特征词矩阵作为输入数据,得到最终的分类模型。
当训练好分类模型之后,就可以对测试集进行分类了,具体的流程与建模流程类似,先对测试的文本数据进行分词并做数据预处理,然后根据特征词矩阵抽取测试文本的特征词构建词袋矩阵,并将词袋矩阵的词频数据作为输入数据代入之前训练好的模型进行分类,得到分类的结果。
采用基于机器学习的方法进行情感分析有以下几个不足之处,第一是每一个应用领域之间的语言描述差异导致了训练得到的分类模型不能应用与其他的领域,需要单独构建。第二是最终的分类效果取决于训练文本的选择以及正确的情感标注,而人对于情感的理解带有主观性,如果标注出现偏差就会对最终的结果产生影响。
除了基于词典和基于机器学习的方法,也有一些学者将两者结合起来使用,弥补两种方法的缺点,比单独采用一种方法的分类效果要更好,另外,也有学者尝试使用基于LSTM等深度学习的方法对情感进行分析,相信在未来,情感分析会应用在更多的产品中,帮助我们更好的理解用户需求,提升用户使用智能产品的体验。
随着深度神经网络等算法的应用,情感分析的研究方向已经有了非常大的进展,但依然存在着一些难题是目前尚未解决的,在实操过程中需特别注意以下几种类型数据:
情绪轮在用户体验设计上被广泛的应用,很多情感化设计都是基于情绪轮进行的。但是在人工智能领域,将情绪进行多分类比情感分析的三分类任务要难得多,目前大多数分类方法的结果准确性都不到50%。这是因为情绪本身包含了太多的类别,而且不同的类别之间又可能具有相似性,一个情绪词在不同的语境下有可能表达的是不同的情绪类别,算法很难对其进行分类。即使是人工对文本进行情绪类别标注也往往效果不佳,因为情绪是非常主观性的,不同的人对不同的文本可能产生不同的理解,这使得人工标注情绪类比的过程异常困难。如何让机器可以理解真实的情绪目前还是一个未能攻克的难题。
在长短期记忆 (LSTM) 网络中,输入通常是一系列数据点,例如语言翻译任务中的单词序列或时间序列预测任务中的传感器读数序列。输入数据通过输入层传递,输入层将输入数据转换为一组可由 LSTM 网络处理的内部表示。
然后,输入数据的内部表示通过一系列LSTM层传递,这些层使用一组“存储单元”来存储和检索长时间的信息。每个LSTM层还包括一组“门”,用于控制进出存储单元的信息流,允许LSTM有选择地存储和检索信息,并忘记不再需要的信息。
LSTM网络的输出通常是基于输入数据和存储在存储单元中的信息的预测或分类。例如,在语言翻译任务中,输出可能是翻译的句子,而在时序预测任务中,输出可能是序列中的预测未来值。
总体而言,LSTM网络的输入是一系列数据点,输出是基于输入数据和存储在LSTM层的存储单元中的信息的预测或分类。
罗素悖论:由所有不包含自身的集合构成的集合
例子:理发师称只给那些不给自己理发的人理发。
基于集合论,理发师无论给自己理发还是不给自己理发都是矛盾的。
因此集合论不是完备的。 即使后面冯罗伊德等科学家提出了各种假定条件。
由于上述的原因,集合率无法很好的描述自然语言,科学家发现通过概率模型可以更好的描述自然语言。
深度学习来处理自然语言属于概率模型
证明最小点位于坐标轴上
h = f+c|x|
由于在x = 0处不可导
h-left'(0)h-right'(0) = (f'+c)(f'-c)
那么如果c>|f'(0)|可得,h在0处左右导数异号
0是最值。
那么在损失函数加入L1正则化后,可以得到某些维度容易为0,从而得到稀疏解
几乎所有的最优化手段,都将适用凸优化算法来解决
P(A|B) = P(A and B) / P(B)
if A and B 独立
=》P(A and B| C) = P(A|C)P(B|C)
也可以推出
=>A(A|B and C) = P(A|C) (B交C不为空)
抛9次硬币,硬币出现正面的概率是05,出现k次的概率分布如下如
服从正态分布
x的平均值
E = xp(x) +
x相对于期望的偏离
var = (x-E(x))^2
conv = (x - E(x))(m - E(m))
描述x,m是否有同分布
按理协方差为0,并不代表x和m没有关系
例如下图
如果点的分布对称的分布,会得到协方差为0,但是其实他们是有关系的。
把每个相关的概率累加,得到联合概率
P(x1=m1,x2=m2) = n!P1 m1/m1!P2 m2/m2!
T(n) = (n-1)!
T(x)用一条曲线逼近n!,进而可以求得非整数的阶乘
由二项式分布推出
P = T(a+b)x (a-1)(1-x) (b-1)/(T(a)T(b))
则正态分布
y为0时,不考虑y‘。y为1时,y'越接近1,越小,越靠近0,越大
把D最小化,迫使y'逼近y
对于一个句子,有若干单词组成。例如
C1: The dog laughs
C2: He laughs
那么计算P(C1) = P(The, Dog, laughs)的概率和P(C2) = P(He, laughs)的概率。
根据历史文本的统计学习。
可以得到P(C1)<<P(C2)
P('I love the game') = P('I')P('love')P('the')P('game')
其中P(<work>) = 频率/总单词数
计算一篇文章是积极的还是消极的。
P(y|x) = sigmod(wx)
x是文章内每个单词的频率
y表示积极和消极情感
其中P(xk|x1, x2,xk-1) = frequence(x1, x2 ,, xk)/frequence(x1, x2xk-1)
2-gram模型例子
把多个gram的模型进行线性整合
P(y|x1, x2, xn) = P(y)P(x1, x2, xn|y) / P(x1, x2, xn)
y代表是否是垃圾邮件
x代表单词
广州市长寿路 -》 广州市长|寿路
广州市长寿路 -》 广州市|长寿路
匹配词袋:广州市,广州市长,长寿路
使用最大匹配发,第二个分词更优
通过统计P(A|B),得出各个option的概率,取最大的概率,则为最后的分词
word => [0, 0 , 1, 0]
word => [0, 1, 0, 1, 0, ]
可以解决词相似性问题
计算附近词的频率
word => [0, 3, 0, 1, 0, ]
w是附近词的one-hot encoding
score是词的one-hot encoding
最后一层通过softmax,取拟合文本
最终中间层则为词向量
输入为词one-hot encoding
输出为附近此的one-hot encoding
最后通过softmax预测附近词
最后中间层则为结果词向量
混合模型是一种统计模型,问题中包含若干个子问题,每个子问题是一个概率分布,那么总问题就是若干个子问题的组合,也就是若干个子分部的组合,这样就形成了混合模型。
有红黑两种硬币,把它们放在盒子里,从盒子里随机抽取一个硬币并投币,抽到红色的概率是p,红色硬币正面的概率是q,黑色硬币正面的概率是m,假设我们没办法看到抽取出的硬币的颜色,只能看到最终是正面或者反面的结果,例如HTTHTTTTHHH (H:正面 T: 反面)。需要估计p,q,m三个参数。
此时可以计算出
通过EM算法迭代如下:
随机p q m
迭代以下过程:
计算上面table
p = (aC(正)+cC(反))/total
q = aC(正)/(aC正+cC正)
m = bC(正)/(bC正 + dC正)
假设有上述数据,需要用混合模型来逼近,通过分析,红色和蓝色数据分别为高斯正态分布,N(u, v)
此时可以得到如下表
p = pN红x/(pN红x+(1-p)N蓝x)
u = pN红x/n
v = pN红(x-u)^2/n
词性转换概率
词性到单词的转换概率
通过EM递归算法,训练以上参数,得到隐马尔可夫模型
PLSA主题模型
只统计词的频率,不计算词的相对位置
计算文档和单词频率的矩阵
进行奇异矩阵分解
得到A矩阵的压缩U,U中的k则为k个主题
通过分析,LSA得到的主题是跟现实无法关联,它只是一个量,而没有明显的意义。
PLSA为了解决此问题,引入概率模型,先确定主题个数
然后通过构建Doc->topic的概率table,和topic->word的概率table。
然后通过EM模型,得到这两个table的所有概率值。
进而得到文档的主题表示
PLSA的缺陷是,对于预测未知的doc,无法计算此文档的相关概率。随着doc数量的增加,PLSA模型的参数会线性增加,从而会造成过拟合。
LDA通过引入先验概率来克服PLSA的问题。
类似于编译原理的上下文无法句法分析,一颗语法树
通过对CFG引入概率参数
有了概率,可以计算每颗语法树的极大似然概率,并取最大概率的树为最终输出
上一个状态中间层的输出作为下一隐层的输入
类似于HMM的2-gram模型。t状态受到t-1时刻输出的影响,受t-k的输出的k越大,影响越小
由于RNN几乎只受到上一时刻的影响,而忽略了久远信息的影响。从而造成了一定的局限性。
LSTM通过引入长短记忆方法,来维持长记忆的信息。
通过训练核内的sigmod函数,使得LSTM可以根据不同的句子,有条件的保留和过滤历史信息,从而达到长记忆的功能。
GRU是LSTM的简化版,它只需要处理两个sigmod函数的训练,而LSTM需要三个sigmod函数的训练,减少了训练的参数,加快了训练的速度,但也损失了一部分模型的复杂,在处理较复杂问题时,没有LSTM那么好。
auto-encoder-decoder的特点是输出的单元数是固定的。对于一般自然语言处理,例如机器翻译,输入的单元个数跟输出单元的个数并不是一一对应的,此时就需要动态的生成输出单元。Seq2Seq通过动态的输出结束符,代表是否输出完成,达到可以动态的根据输入输出不同的单元个数。
seq2seq的缺点是,所有的输入序列都转化为单一的单元c,导致很多信息都将消失,对于不同的输出yi,它可能依赖的输入xj有可能不一样,此时通过加入注意力模型,通过对xi进行softmax处理,并加入到y权重的训练中,可以让不同的y,有不同的x对它进行影响
softmax的输入为输入单元x,和上一个输出单元y,联合产生softmax的权重,进而对不同的序列,对于同一个x,会有不同的注意力到输出
q = Wq(x)
k = Wk(x)
v = Wv(x)
x为词向量
通过训练,得到权重w,从而学习到这一层的softmax注意力参数
R是前一次encoder的输出
通过增加w的数量,产生多个z,并进行堆叠,通过前馈网络,最后产生z
在使用self attention处理句子时,是没有考虑单词在句子中的位置信息的。为了让模型可以加入考虑单词的位置信息,加入了位置编码的向量
计算如下:
pos为单词在句子中的位置
i为词向量的位置
d为句子的长度
位置编码加上词向量形成tranformer的输入
加入了归一化和残差网络
最终通过softmax,输出每个单词的概率,并最终输出单词
1、全连接层作用:
全连接的一个作用是维度变换,尤其是可以把高维变到低维,同时把有用的信息保留下来。
全连接另一个作用是隐含语义的表达(embedding),把原始特征映射到各个隐语义节点(hidden node)。对于最后一层全连接而言,就是分类的显示表达
2、简述LSTM如何解决梯度消失
LSTM有能力向单元状态中移除或添加信息,通过门结构来管理,包括“遗忘门”,“输出门”,“输入门”。通过门让信息选择性通过,来去除或增加信息到细胞状态 模块中sigmoid层输出0到1之间的数字,描述了每个成分应该通过门限的程度。0表示“不让任何成分通过”,而1表示“让所有成分通过!
一个对RNN和LSTM分析比较好的连接 (注意理解体会一下他说的公式)
3、激励函数:
作者这篇激励函数写的也很好 (我们实际中一般遇见都是非线性问题,所以对特征做了加权线性操作需要通过非线性的激励函数做非线性的变换)
激励函数选择
4、BP的反向推导( 详细参考 )( 参考2 )
欢迎分享,转载请注明来源:浪漫分享网
评论列表(0条)