一、简介:
情感识别在自然语言处理、心理学、认知科学等各个领域引起了人们的关注,但是之前的情感判断都是仅仅依靠文本信息,对文本中的词性打标签,进而实现通过词性的整体整合,对一句话中的情感偏向给予打分,从而实现情绪的分类,只有很少的一部分研究的是在实景对话中的研究当前对话中的情感变化,比如(Picard 2010)发现了情绪于面部线索之间的相关性。Datcu和Rothrantz(2008)将声学信息于视觉信息融合在一起,用去情感识别,近年来,对话中的情绪检测越来越收到外界的感觉,他在许多重要任务中有很重要的应用,比如针对于youtobe,facebook,twitter上面的聊天历史跟和社交媒体流中的意见挖掘,从而可以更好的优化自己的产品,另一方面,随着现在计算机视觉的飞速发展,视频数据的高速膨胀,越来越多的视频资料出现在人的视线里面,针对这形形色色的视频,不管是在日常生活体验中,还是在对于监控视频的信息提取,来进一步辅助侦探等功能上都有很大的潜在功效,所以,在这里,因为RNN可以记录当前时刻于之前时刻以及下一个时刻的状态,并可以提取这个过程中的特征信息,而对面中情感的识别于判断是一个连续的过程,一方的话语于对话的背景可能会影响到另外一个人的情感状态(Figure1),所以在这里,我用了基于已经发表过了的模型-优化RNN来实现对视频对话双方情感的判断。主要是针对传统的RNN的网络LSTM,应用了其变体GRU在网络中作为一个cell来实现对说话者状态的存储,有三个循环控制门进行控制,传入的的语言被放入两个GRU中,分别是全局的GRU跟party(社交状态)的GRU,从而实现对当前对话的背景,以及当前对话的状态的情感识别,进而结合这两个方面,给与对应的情感判断。下面我将从两方面来介绍这个实现情感分析中所用到的模型,以及这个模型的结果。
二、方法
前期准备:
场景描述:我们实现仅仅是两个人对话的场景,基于两个人对话的内容于语气的波动,来实现对6种情感的识别与分类,6种情感是生活种比较有代表性的情感,包快乐、悲伤、中立、兴奋、愤怒以及沮丧,其原理其实是主要实现对语句中带语气标签的成分进行准确的预测并进行分类。
特征提取
基于我们的video数据,其实主要是分成三个部分的特征提取,主要包括对文本特征的提取,音频特征的提取,以及对视频特征的提取,三种特征的提取分别参考了别人的提取方法针对于文本特征,用了cnn的方法进行了特征的提取,使用3个不同的卷积滤波器从每个话语中获得n-gram特征,每个卷积滤波器的大小分别是3,4和5,每个卷积滤波器具有50个feature-map,然后对输出进行pooling,再经过Relu激活,经过全连接层,最终成为100维的dense layer,我们把这个叫做文本话语表征,这个特征再对话的时候与感情标签同时使用,作为输入进行训练,对于音频与视频的特征的提取,我用了比较常规的方法,分别是3D-cnn以及openSMILE,来进行视觉特征以及声音特征的提取。
模型介绍:
本工作中用到的模型是再2018年发表的DialogueRNN的网络模型,针对于对话中情感变化的主要是由三个部分引起,第一个是说话的人,当你是个倾听者的时候,第二个是之前话语的上下文,第三个是你听到的前面的话语背后的情感蕴含之后,你的情绪会发生变化。所以针对这个三个会导致情感变化的因素,该网络模型对这个三个因素进行建模如下图中的a部分所示,首先是对说话人的话语追踪,分析一方在说话时候的情绪变化以及整个对话中的情感氛围。从而使模型能够通过对话跟踪各方的情绪动态。此外,话语的上下文使用全局状态(称为全局,因为在各方之间共享)来建模,其中前面的话语和对话状态被联合编码以用于表征上下文,。最后,当前情绪的表征把来自发言者的社交状态的情绪表征以及前面说话者的状态作为上下文,由此来进行情绪的分类。
图二:DialogueRNN 网络模型逻辑图
从图中可以清楚的看到,针对这三种状态的记录,分时是由三个GRU来实现对当前状态的更新,分别是Speaker GRU,Party GRU,Global GRU。分别实现对上面叙述的三个部分的功能,下面是对各个模块的介绍.
1. GRU内部结构组成:
图三:GRU 内部结构
GRU的输入跟输出是跟RNN的是相同的,其内部结构与LSTM相似,但是结构更加精简,他只有两个门进行更新,分别是控制重置以及控制更新的门,整体的参数更少。两个门控的控制原理如下:
为sigmoid函数,将结果转化位0-1的范围)
之后在得到门控信号之后,首先使用重置门控来得到“重置”之后的数据,再将 [图片上传失败...(image-3be231-1562942317857)] 与输入 [图片上传失败...(image-969a72-1562942317857)] 进行拼接,再通过一个tanh激活函数来将数据放缩到-1~1的范围内。即得到[图片上传失败...(image-4a1c2c-1562942317857)] 。
[图片上传失败...(image-9b561a-1562942317857)] =[图片上传失败...(image-fc8b4a-1562942317857)]
最后到了更新记忆阶段,这个步骤一次进行两次遗忘操作,我们使用了先前得到的更新门控 z,[图片上传失败...(image-54d500-1562942317857)] z越接近1,则表示被记忆下来的数据越多,更新公式如下所示。
[图片上传失败...(image-953857-1562942317857)] =z[图片上传失败...(image-8026b7-1562942317857)]
2.Global GRU::主要目的是是通过对话语和说话人状态的联合编码来捕获给定话语的上下文
[图片上传失败...(image-a93885-1562942317857)]
其中,[图片上传失败...(image-fe7c17-1562942317857)] 表示前面的一个状态,[图片上传失败...(image-93dab2-1562942317857)] 表示当前状态,其中[图片上传失败...(image-1eec37-1562942317857)]
表示串联,即在类似两个cell之间的串联的意思,这是g_(t-1) 是上一个cell的隐状态,然后每个GPU都输入的是上一个的隐状态以及当前的社交party state。
3.Party GRU****:DialogueRNN使用固定大小向量[图片上传失败...(image-d6fcd4-1562942317857)] ,[图片上传失败...(image-3ca922-1562942317857)] 跟踪各个说话者在谈话时候的状态。这些状态代表了对话中发言人的状态,与情绪分类有关。该部分主要是确保模型知道每个话语的发言者并相应地处理它,从而进行下一步的情绪的分辨。这个一部与上一步Global GRU的输入相关。
4.Speaker GRU(updata):这一步实现对说话者情绪状态的更新,因为对话的过程是一个相互的过程,所以speaker的状态的更新是根据Global state以及party state进行更新的,具体的更新如下所示,
[图片上传失败...(image-a713e3-1562942317857)]
主要是利用了Global stata 与party state 来实现更新,这里他根据Global state 生成一个attention score,即实现了对当前状态前的所有的全局状态softmax规范化,由此来表征前面的对话中隐藏的情绪状态,从而实现对当前情绪背景的监控,从而实现对发言者发生对话的时候话语中包含的情绪情况,由此来预测当前说话的状态,其状态的更新公式跟全局GRU的更新公式是相同的,不过不是根据[图片上传失败...(image-a1e388-1562942317857)] ,而是根据[图片上传失败...(image-8f7367-1562942317857)] 来实现更新,还有其中的第二个公式softmax函数实现情绪状态的判断分类的,内部的参数[图片上传失败...(image-4fb482-1562942317857)] 是表征情绪的向量,是根据[图片上传失败...(image-6993ad-1562942317857)] 以及[图片上传失败...(image-634db6-1562942317857)] 来实现更新,流程在图一中的b部分,其获取公式如下:
[图片上传失败...(image-aa9f9a-1562942317857)]
5.****倾听者状态的更新:
这个的更新可以分成两种情况,首先是第一种是一方沉默的情况,这时候保持当前的状态不变即可,第二种是前面说话者的上下文以及当前倾听者的面部表情来实现状态的更新,两种状态的更新的表达式分别如下:
[图片上传失败...(image-8e461c-1562942317857)] ** ---------- [1]**
[图片上传失败...(image-3a03d-1562942317857)] ------[2]
其中在式子[2]种的部分参数[图片上传失败...(image-e26f48-1562942317857)] 是表示在t时候的时候提取的面部特征,提取特征的方式在前面做特征提取的时候有对应的介绍。在实现的过程种发现,这两种方式更新方式区别不大,但是第二种的计算量更大。在后面的实现过程种是采用了第一种方式进行更新。
5.****情绪的分类:情绪分类我们使用具有最终softmax层的双层感知器来从话语的情感表征中计算情绪类的概率,然后我们选择最可能的情绪类,具体公式如下所示,
[图片上传失败...(image-380090-1562942317857)]
从三个公式中可以分别利用了情绪表征的向量[图片上传失败...(image-9fc7aa-1562942317857)] ,以及party state 和global state,其中[图片上传失败...(image-8d2bc7-1562942317857)] 最后模型的训练的loss用交叉熵跟L2范式来恒定,对应的式子如下:
[图片上传失败...(image-158d0b-1562942317857)]
其中n是样本(对话)数量,c(i)是在一对对话里面话语的数目(一段对话里面有几句话)。[图片上传失败...(image-3b9b6-1562942317857)] 是表示在第i段对话里面话语的情感标签的概率分布。
前面的模型的组成介绍完成了最后我是BioDialogueRNN(双向对话循环神经网络)+ attention(当前对话上下文中的情感分数) (DialogueRNN+Att)来实现对对话中情感的预测,在6中分类的结果中有比较稳定的结果,其实可以理解,如果仅仅是单项的DialogueRNN的话,不能完成上下文的深度的tracking,所以在效果上还是存在一定的差异的。