作者 | 陆昱博士 追一科技 


今天和大家分享的主题是基于文本和语音的双模态情感分析。大家可能会从自然语言处理的角度认为情感分析已经做得比较成熟了,缺少进一步研究的方向。此外,从多模态角度来讲,大家可能会好奇为何使用文本+语音的方法来解决情感分析的问题。本次分享希望能和大家就上述疑问进行探讨。

今天的介绍会围绕下面四点展开:

  • 文本+语音双模态情感分析概述
  • MSCNN-SPU模型论文介绍
  • 双模态情感分析的域适应方法及应用
  • 展望&总结

01

文本+语音双模态情感分析概述

首先介绍情感分析的背景。

1. 情感分析介绍

java 文本情感分析模型 基于文本的情感分析_大数据

对于情感,其实在2000年前的《礼记·礼运》中就有描述:“喜、怒、哀、惧、爱、恶、欲,七者弗学而能。”情感分为多个类别,是人与生俱来的一种表现或者心理活动。到了近代,心理学家 Paul Ekman 提出从人类表情的角度来说存在七种普适的情感表达:喜悦、愤怒、恐惧、悲伤、惊讶、厌恶、轻蔑。他提出的观点是:情感是一个过程,一种受我们进化和个人过去影响的自动评估。另外一位心理学家 Robert Plutchik 提出了基于八种情感的“轮模型”,其用三维模型的表述方式来展示情感。他认为八种情感类型并不完全独立,存在一些交叉。上述两种模型更多地是以分类的角度来刻画情感。

实际上,我们还可以把情感以量化的方式在二维笛卡尔坐标系上进行展示,这就涉及到了情感的强度和极性模型了。首先,上图右侧坐标系中,X轴代表极性(Valence),表明情感的愉悦程度(负向→正向);Y轴代表强度(Arosual),表明情感的强度(平静→兴奋)。极性分值一般的取值范围是-5~5。这个模型实际上把情感进行了量化。目前有很多开源的数据集也是基于回归的情感打分的方式来制作的,那么对应的模型解决的便是一个回归问题。

但是大部分数据集还是按照分类的角度来给出情感的类别。Sentiment analysis通常分为负向、正向(以及中性)的类别,emotion classification则更倾向于更多具体情感类别的分类。这两类问题的界限并不严格,在很多文献中也会存在如 Sentiment mining, Opinion mining, Opinion extraction, Subjective analysis, Speech emotion recognition 等描述方式, 有时也会混用。

java 文本情感分析模型 基于文本的情感分析_dbcp_02

首先,从方式角度来讲,情感可以按照倾向、类别以及程度进行划分。从粒度上来讲,从粗粒度至细粒度可以分为文档级、句子级和实体级的情感。文档级是对一整篇文档或者多句句子组成的一段话进行整体的情感判别;句子级更多地被使用在对话场景中,即从一个人的对话中抽出一句或者多句语句,并其继续情感判别;实体级的粒度则更加精确,它对给定目标进行情感判断,比如”电脑非常好,但是它的键盘太丑了“,如果给出的实体是”键盘“的话,情感的判别结果应该为负向的。从应用的角度来讲,如果在文本+音频的范畴内,我们更关心服务质检、人机交互、舆情监控,当然也会有一些其他领域的应用期待大家去发掘。

2. 文本+语音:Why?

java 文本情感分析模型 基于文本的情感分析_编程语言_03

下面回答之前抛出的疑问:为什么要做文本+语言的情感分析?首先我们需要知道做情感分析是不是仅使用文本就足够了。例如上图的语句,仅从文本的话它可以被表达成多个不同的情感,是一个一对多的过程(开心、愤怒、悲伤)。从例子中我们其实可以得出这样一个结论:通过文本的内容来判断情感难以做到全面。

java 文本情感分析模型 基于文本的情感分析_编程语言_04

假如我们想要给“文本”这个模态找一个搭档,那么我们提出“语音”和“文本”更加般配。这里我分析一下文本、音频和图像的特点。

首先,文本告诉我们语义方面的内容,它的优点是语义信息丰富且直接,但是它存在的缺点是歧义、偏置,并且受上游ASR效果影响。对于音频来讲,它更多给予我们的是说话的语调、语速、音量等信息,它的优点是可以帮助我们感知说话人的情绪,但是缺点在于难以直接从音频角度获得语义信息。最后,对于图像,它带给我们与情感相关的信息来自于表情、肢体动作、情景等,但是它的缺点在于难以获得这类信息。比如表情属于人脸信息,在很多场景下人脸信息是比较敏感的,所以较难获得。此外,图像信息包含较多冗余,这意味着它包含其他干扰信息。从表情的角度来说,当说话人呈现一个伤心难过的表情时,大部分情况下他说话的情绪与表情时保持一致的,所以音频表达的情感在很多时候与图像有一定的重叠性。

通过以上分析,我们可以看到文本和音频其实可以很好地互补。文本在存在歧义和偏置的情况下,音频就可以基于说话人的情绪相关信息;而音频难以获得的语义信息,文本可以进行补充。

3. 单模态模型-文本模型

java 文本情感分析模型 基于文本的情感分析_java 文本情感分析模型_05

在介绍双模态模型之前,先简要介绍一下使用单模态模型做情感分析的原理。

首先,文本模型中经典的做法是基于情感词典,基本上遵循以下流程。第一步,我们对文本输入进行分词,之后提取每个词的词根,并根据词典进行打分,最终得到一个汇总输出后的结果。词典的构建方法有按照分类的方法构建以及基于计数的方法。这种方式的优点在于模型的参数很少,并且我们很容易地能进行人工干预,但是词典构建的缺点在于构建成本较高,且词典与词典之间的共性较低。有时候我们因为某种原因调整了一个词来达到一个具体目的,但是对于其他场景就会产生干扰。另外,这种方法是基于单个词来做情感打分的,它缺乏语义的上下文理解。

java 文本情感分析模型 基于文本的情感分析_java 文本情感分析模型_06

除了情感词典外还有一个方法叫做TextCNN,它基于CNN的方法,使用不同大小的卷积核的单层卷积层在词嵌入矩阵中进行滑窗卷积操作,得到不同粒度的n-gram特征。最后,将获得的所有特征分别沿着时间维度进行最大池化,并经过全连接层得到最后的情感类别。

java 文本情感分析模型 基于文本的情感分析_大数据_07

当然,CNN能完成的工作RNN同样也可以实现。我们可以基于字粒度,使用常见的双向LSTM对序列进行建模。它的优点是可以得到长时依赖的上下文信息,比如将双向LSTM中正向隐向量和反向隐向量进行拼接得到最终的向量表达。

java 文本情感分析模型 基于文本的情感分析_编程语言_08

类似地,TextRCNN将上述两个模型结合在一起。不同于RNN,它通过CNN经过一定上下文的滑窗卷积操作之后,再使用RNN得到包含上下文信息的特征。简单来说,它先通过CNN得到局部特征向量信息,再将CNN部分的输出输入至LSTM得到最终的特征向量,最后使用这个输出向量做分类任务。TextRCNN这篇文章简单对比了RCNN与CNN的效果,我们可以看到RCNN确实在情感分类任务上有效果的提升。

java 文本情感分析模型 基于文本的情感分析_dbcp_09

但是,模型并不是越复杂越好。反之,FastText实际上从一个非常简单的角度来解决文本情感分类问题。它提出使用字符级的n-gram特征来作为词向量输入,用hidden层将输入向量进行简单叠加,最后用分层softmax进行分类,得到的效果不错,而且运算速度非常快。

java 文本情感分析模型 基于文本的情感分析_dbcp_10

相似地,DAN使用平权的词粒度子向量直接进行简单平均,之后接入两个MLP后根据输出向量执行分类任务。它的最终效果也很不错,之后它还加入了词级别的dropout操作,进行进一步的效果提升。

java 文本情感分析模型 基于文本的情感分析_java 文本情感分析模型_11

随着近年来基于大数据预训练模型的推广,大部分情况下我们都会尝试在大数据集中进行预训练,再在目标数据集中进行finetune。基于Transformer的模型可以提供长距离语义建模,另外由于它是经过在更大数据环境下的预训练,所以它包含的一些知识可以随着模型迁移至目标任务中。尤其是在一些小的数据集中,它实际上也能起到正则的效果。

总结一下,对于文本情感分类问题:

  • 短文本:“词向量+浅层卷积”可以达到不错的效果。
  • 长文本:基于RCNN或者Attention的长距离上下文建模更具优势。
  • 大型预训练模型效果更佳。

4. 单模态模型-音频模型

java 文本情感分析模型 基于文本的情感分析_dbcp_12

人们说话的声音是经过说话人声带振动,通过压缩空气在空气中传播,最后传入人耳。但是对于计算机,它接收的不是模拟信号,需要将其量化成一个数字信号,即需要经过一个AD转换,通过采样、量化、编码的方式得到。我们想要将信号最终以数字的形式存储,所以经过量化以后得到的数据最终会按照一些协议存储在文件中,如wav、mp3格式的文件。那么我们能不能直接通过一些工具把音频数据读进来并送入模型呢?严格来说是可以的,但是会包含信息冗余。首先,我们发音的音素时长通常在20毫秒到50毫秒左右,而且频率-时间信息包含说话音频内容。实际上它更多的是与频率相关,所以我们更关心的是频率随时间变化的信息。

java 文本情感分析模型 基于文本的情感分析_机器学习_13

我们需要把原始的波形信息转换成频率信息,这就涉及到音频特征,如频谱图、梅尔谱、MFCC等。通过A/D转换,我们可以得到电脑可以存储的音频;下一步我们对转换后的音频做分帧,使用小的窗口(大约25ms)按照一定的步长进行滑动。每一个窗口并不是完全分离开的,它实际上是有一些重叠部分,称作overlap length。我们截取滑窗后每一段小的音频输入加上汉明窗做平滑与频谱变换,最终得到频谱图。

java 文本情感分析模型 基于文本的情感分析_dbcp_14

上图分别展示了短时傅里叶变换的频谱图,对纵坐标取对数后得到的频谱图,经过人类声学角度进行改进的梅尔频谱图以及梅尔倒频谱系数(MFCC)。通常我们使用mini batch的形式将数据输入至模型,所以数据的时间维度是T(将所有音频处理成一样的长度),梅尔谱的维度是D(一般取13),batch size的维度是B。梅尔谱的输入数据可以看成是一个单通道的图像,横轴是时间,纵轴是每一个时刻的特征维度。除了上述特征,在早期阶段人们还会使用Low Level Descriptors(LLD)。它们基本上是通过人工对一段音频进行统计学分析,得到一个一维的向量。但是,近期大部分针对音频的工作都会采用类似于梅尔谱的特征作为输入。

java 文本情感分析模型 基于文本的情感分析_java 文本情感分析模型_15

在早期的音频领域的很多概念是尝试从CV或者NLP领域中借鉴得到的。例如NLP中的词袋模型Bag of Words,在音频领域就产生了Bag of Audio Words的想法。它对LLD特征进行加窗,针对每个窗口的LLD使用KMeans进行聚类,得到的类别中心就可以构成一个CodeBook(相当于NLP领域的词典)。在使用CodeBook时,我们会对输入的LLD进行滑窗,匹配CodeBook中最近邻Audio Word的LLD做为音频向量。这个方法完全依照词袋模型,但是它忽略了音频和文本之间的差别。文本是离散化数据,但是音频是一个模拟信号,数字化后也是一个近似于连续的表示,其状态空间会远远大于文本的状态空间。

java 文本情感分析模型 基于文本的情感分析_java 文本情感分析模型_16

于此同时,有人提出借鉴CV领域的方法来处理频谱图。上图展示的工作使用了预训练的AlexNet,将音频的频谱图作为输入得到4096维的隐向量,将其作为音频的向量表示。这相当于从图像角度进行处理,其下游的分类器使用的是SVM。最终得到的效果不弱于传统音频特征BoAW。这篇文章是使用神经网络来提取音频特征的早期尝试,目的是为了替代人工提取的特征。

java 文本情感分析模型 基于文本的情感分析_dbcp_17

早期也有人尝试借鉴TextCNN模型来对音频进行情感分类。如果沿着时间方向提取窗口特征,实际上我们也可以将音频看作一段文本。那么我们可以使用相同的方法,使用不同大小的卷积核进行滑窗卷积操作,然后使用max pooling得到每个卷积层的特征,最后使用MLP进行分类任务。实际上,它是完全按照TextCNN的结构并迁移至音频分类任务。从效果上来看,作者通过对比实验发现其特征效果接近传统LLD。

java 文本情感分析模型 基于文本的情感分析_大数据_18

当然,我们也可以同时使用卷积层和LSTM来提取音频特征。上图展示了两种模型融合的方法,其基本思路是先通过卷积层与LSTM分别提取特征,之后将两种特征拼接起来,进行分类任务。从效果上来看,这个方法在IEMOCAP数据集上超越了手工提取特征的方法。

java 文本情感分析模型 基于文本的情感分析_大数据_19

还有一些其他的工作,例如类似于文本RCNN的ACRNN模型,它先使用卷积层进行特征提取,再接上LSTM提取上下文特征,最后进行分类任务。值得注意的是,ACRNN加入了全新的特征处理方式,即加入了频谱的一阶以及二阶delta特征。Delta特征是对相邻帧进行简单的差分得到的特征。三种特征频谱图仿照图像的channel进行拼接。这种方法在后来的工作中被频繁使用,上图右侧的表格展示了加入delta特征后对情感分类具有正向作用。

java 文本情感分析模型 基于文本的情感分析_java 文本情感分析模型_20

近期的一些工作使用了attention机制以及时间维度+频率维度的特征。上图的文章使用卷积层先沿着时间与频率维度分别提取特征,然后将提取的特征进行拼接后,再使用多层卷积神经网络做进一步特征提取,最后使用attention pooling得到一维的音频特征向量。这篇文章是第一个在IEMOCAP四分类任务中将准确率刷至70%以上的工作。

做一个简单的小结。音频模型具有以下三个特点:

  • 音频情感建模:从早期使用手工特征加全局统计量的方法,演变为使用深度学习模型来进行representation learning,试图去得到一个好的特征表示;
  • 音频情感分类对特征以及模型鲁棒性要求较高,因为音频的连续性导致其状态空间较大,与此同时一个人在不同场景下说的同一句话的特征也有所不同(例如在会议室说话与在空旷的操场上说话);
  • 音频的局部特征和全局特征均对分类任务有贡献。

5. 双模态模型

java 文本情感分析模型 基于文本的情感分析_编程语言_21

下面就进入到我们的关注点:双模态模型。首先因为是双模态,每一个模态都有其自身独有的信息,那么我们最感兴趣的是这两个模块能不能很好的融合,达到1+1>2的效果。问题的核心在于怎么做模态融合。实际上,模态融合有两个方面,即模型在什么阶段做融合以及如何去做融合(Where? How?)。

第一个问题可以按照融合在模型的不同阶段来分成三个类型。在早期阶段就对特征进行融合,对应于上图下方的第一张图,被称为early fusion;late fusion是两侧使用不同的网络架构对文本和音频做特征提取,然后在最后的分类之前做融合;multi-level fusion在模型中间阶段对两种特征进行融合,之后使用独立的模型继续提取特征,最后在分类前对两种特征汇总到一起做分类任务。

第二个问题可以按方式进行划分。融合的最简单方式就是拼接,例如直接concat到一起或者直接进行堆叠操作。更进一步,我们可以使用非平权的方式,即使用attention机制。如果一层attention不能满足需求的话可以进行多次attention,例如文本对音频做attention,音频对文本做attention,并将以上过程堆叠多次。这种使用多次attention机制的特征融合方式也被称作multi-hop attention。

java 文本情感分析模型 基于文本的情感分析_编程语言_22

双模态情感分析常用的数据集如上图所示。这几个数据集有的是请专业演员表演并进行录制的,有的是从如老友记电视剧中抽出带有感情色彩的一些段落,或者从YouTube视频中截取片段构成数据集。

java 文本情感分析模型 基于文本的情感分析_java 文本情感分析模型_23

最常用的数据集时IEMOCAP,它包含9中不同情感,但是很多学术文章中只会使用四种,因为九种情感在数据集中分布很不均匀,所以大部分情况大家会选择其中四种:中性、愤怒、悲伤和兴奋,因为他们的分布最接近。最终使用的数据集是四分类的子数据集,包含5531条对话。后面介绍的双模态模型基本上都是使用这个数据集进行测试的。

下面介绍在双模态情感分类中接近SOTA的几个模型。

java 文本情感分析模型 基于文本的情感分析_大数据_24

首先第一个模型是Learning Alignment,它是由滴滴研发团队提出的。它是基于early fusion的 方法,通过attention的方式进行特征融合。具体地,模型使用双向LSTM在输入端分别对音频和文本做了一个简单建模后,对每个token位置的向量拿出来做attention,计算公式如上图左侧所示。s代表speech,即向量是通过音频侧输入特征经过LSTM得到的,h则为通过文本侧输入特征经过LSTM后得到的特征。Attention相当于在文本的每个token位置对所有音频特征做query,这样做的目的是因为音频的长度和文本的长度不一样,经过LSTM特征提取后长度也不一样,那么如果我们可以用文本对音频做query的话,那attention后的输出特征可以与文本对齐。此外,这么做的意义在于使用文本token来寻找音频中与之最相关的音频,这也是这个方法被称为learning alignment的原因。经过early fusion后的特征再经过后面的LSTM以及MLP的网络结构进行分类任务。

java 文本情感分析模型 基于文本的情感分析_机器学习_25

另外一个模型是由韩国首尔大学提出的Multimodal Dual Recurrent Encoder。它的想法也是使用attention机制,使用late fusion进行特征融合。模型首先通过两个不同的LSTM网络结构分别对音频和文本提取特征,然后以音频作为query对文本做attention,最后接上全连接层并进行拼接,做最终的情感分类任务。

java 文本情感分析模型 基于文本的情感分析_机器学习_26

同一个团队在上一个模型的基础上又提出了multi-hop attention。前一篇文章中他使用了音频对文本的attention,那么也可以用文本对音频做attention。此外,attention后得到的结果还可以对文本和音频做attention。这就相当于只要有足够多的时间,可以堆叠很多层attention。这个方法实际上是想要有效地利用文本和音频之间的相互耦合的信息。上图右上角给出了最终的效果对比,大家可以看到基本上attention堆叠两层就可以达到最好的效果。这个模型在提出的时候在IEMOCAP数据集上达到了SOTA的效果,后续我们自己的工作也会与它进行比较。

做一个简单的小结。现有的双模态模型大多基于LSTM做特征提取,并使用attention机制进行特征融合。大多数情况下late fusion的效果相对来说较好,且模型相对简洁。Multi-hop attention可以有效地融合特征,但是这会导致模型复杂,参数量较大。

02

MSCNN-SPU模型论文介绍

下面我将会从三个方面介绍在21年提出的MSCNN-SPU的模型。

1. 启发

java 文本情感分析模型 基于文本的情感分析_大数据_27

首先介绍是什么启发我们提出针对双模态情感分析的MSCNN-SPU模型。我们对大量的数据进行了分析,包括中文数据以及IEMOCAP数据。最终发现由于这些数据是基于口语对话场景的,从文本角度来讲它们的句子相对较短,那么对于情感分析任务来说它的局部信息的贡献较高。从语音模态来看,模型对音频依赖更倾向全局统计特征,即人的情感表现在这些短对话中,在音频的表现形式上基本保持一致。但是不同的人说话可能有不同的音调高低,不同的说话尖锐程度,所以我们认为需要引入一些与说话人相关的个性化信息。

基于上述启发,我们去查看了不同的文献,从文本特征角度来看,我们发现一篇SWEM,他的想法是既不适用CNN又不使用LSTM,只使用最简单的词向量。文章中提出了三种方法,第一种是直接将词向量取平均(SWEM-avg),第二种方法是沿着词的方向做max pooling,第三种方法是先对词向量取平均再做max-pooling。文章经过对比实验后发现SWEM这种很简单的模型在参数量上占有很大的优势,从上图右下角表格也可以发现其效果甚至超过了fastText。这也启发了我们使用浅层的特征来做文本+语音的情感分析。

java 文本情感分析模型 基于文本的情感分析_机器学习_28

从音频方面,我们借鉴了音频做tts的相关工作。做音频的同学可能对Tacotron比较熟悉,它使用了大量类似一维卷积bank的结构。它在文本转化成音频以及音频转化为最终音频输出的时候,都使用了一维卷积bank的结构,最终得到的效果也很不错。这就启发我们去学习它的网络结构。一维卷积bank是使用一系列一维卷积网络,每个卷积层的卷积核大小不同。Tacotron在一维卷积bank特征提取完成后会进行堆叠作为最终的浅层特征输出。后续会使用max pooling将特征从二维压缩至一维。我们的工作也借鉴了Tacotron的方法。

java 文本情感分析模型 基于文本的情感分析_大数据_29

此外,我们认为在输入端需要加入说话人的信息,或者与说话人音频相关的信息。这里我们使用了音频领域常用的说话人识别的网络,它是基于TDNN,经过pooling层和softmax层来进行分类任务。训练完成后,分类层前的一维向量就可以作为说话人相关的特征向量。所以,我们的模型中引用了X-vector来作为模型可以提供说话人信息的输入。

2. 模型结构

java 文本情感分析模型 基于文本的情感分析_机器学习_30

综合以上启发,我们提出了MSCNN-SPU模型,它分为如上图所示的五个层级:输入层、MSCNN层(多尺度卷积神经网络)、SPU层(统计池化层)、Attention以及输出层。当然,我们也使用了SWEM的浅层特征,所以整体上我们的模型借鉴了多尺度特征(低层->高层)的概念。

接下来我将逐步介绍模型的实现细节。

java 文本情感分析模型 基于文本的情感分析_dbcp_31

首先我们来看一下输入层。对于每个样例,我们需要获取对应的文本以及音频,其中文本可以使用音频ASR技术得到。针对文本输入,我们采用经典的NLP领域的做法,即先对其进行分词,然后使用Glove Embedding得到词嵌入向量。我们这里也使用了SWEM-max和SWEM-avg两个一维的特征向量作为模型的输入。针对音频输入,我们提取其MFCC特征以及预训练的TDNN模型中可以提取的说话人相关特征X-vector。值得注意的是,TDNN的训练是使用目标数据集之外的预训练数据,所以这里不会存在信息泄露的问题。

java 文本情感分析模型 基于文本的情感分析_编程语言_32

接下来介绍MSCNN-SPU模块。首先MSCNN是一个多尺度的卷积神经网络。实际上它是一个浅层网络,每个尺度下只包含一层CNN,但是MSCNN通过使用并行的不同尺度的CNN来进行滑窗操作。CNN的核函数大小是{d,{k1,k2…}}。我们将每一个CNN得到的二维特征送入SPU模块。不同于传统的average pooling和max pooling层输出一个的一维向量,SPU输出的是特征向量的标准差、最大值以及均值。这是因为我们考虑到在音频领域,传统的特征处理方法更偏向于音频的统计学特征。对于一个特征,假如它遵循高斯分布,那么我们感兴趣的统计学标准有分布的中心位置(avg),最高点(max)以及宽度(std)。所以我们用三种pooling输出的结合来刻画音频的统计学特征分布。文本输入侧与音频输入侧的MSCNN-SPU均具有相似的结构。

java 文本情感分析模型 基于文本的情感分析_java 文本情感分析模型_33

得到MSCNN-SPU模块的输出结果后,模型通过attention做模态融合。具体地,模型使用经过SPU层的音频全局特征作为query,对文本侧经过MSCNN提取的局部特征进行attention操作。这是因为我们认为音频在短对话中它的整体情绪变化并不大,但是对于文本来说,它的局部信息更重要。最终,三个pooling(max,avg,std)特征对文本进行attention后的结果会进行拼接,得到attention层输出的一维特征向量。

java 文本情感分析模型 基于文本的情感分析_java 文本情感分析模型_34

在分类层之前,我们不仅仅使用了attention特征,还使用了MSCNN-SPU对文本和音频进行局部特征提取的输出向量、音频X-vector特征以及文本SWEM特征。最终的特征综合了低层SWEM、X-vector以及高层的attention特征,是一个维度比较大的向量,在我们的实验中达到了1024维。

3. 效果分析

java 文本情感分析模型 基于文本的情感分析_java 文本情感分析模型_35

上图展示了我们的模型的实验效果。这里给出了两个评价指标:加权准确率以及非加权准确率。由于不同数据集类别具有差异,加权准确率会计算所有True Positive的数量,并除以数据样本总量;而非加权准确率则针对每一个类别计算准确率,最后计算平均的指标。实验中使用的Ground-truth transcript是人工标注的文本,而ASRtranscript是通过ASR转写的文本。通过实验结果可以发现我们的模型超过了SOTA大约3~4个点。从混淆矩阵可以看出大部分判断错误的类集中在中性类别上。实际上这个现象比较合理,因为中性情感本身就位于不同情感的交界点上,所以对模型、甚至对人来说情感判断的难度比较大。

java 文本情感分析模型 基于文本的情感分析_编程语言_36

此外,我们也进行了消融测试。比如我们把attention模块去除以后,模型的效果从80.3%下降到79.5%。又比如我们丢弃X-vector、SPU或者SWEM后,模型的性能都有不同程度的退化。我们还将模型MSCNN-SPU部分与传统的LSTM方法进行了对比,比如将文本部分替换成BiLSTM会使模型效果从79.5%下降至72.4%,而将音频部分替换成BiLSTM则会使效果下降至74.3%。所以,相较于传统的LSTM模型,我们提出的MSCNN-SPU具有一定优势。这个项目的代码会被上传到上图左下角的链接。

03

双模态情感分析的域适应方法及应用

1. 域适应简介

很多同学可能在工作中会遇到这样一个问题:在学术数据集上模型表现比较好,但是在工业界上线之后模型效果不及预期。下面我会介绍我们如何在工作中应用双模态情感分析模型以及如何使用域适应方法来降低模型跨域的成本。

java 文本情感分析模型 基于文本的情感分析_dbcp_37

首先简单了解一些模型应用中存在的挑战。我们在一个数据集上训练一个模型并将其迁移至线上进行使用,但是预训练的数据集与线上场景不同,但又属于同一个任务,那么这时候由于数据分布存在差异,模型线上应用的效果就会比较差。此外,另一个问题是数据标注的人工成本较高,尤其是涉及到音频标注时,其标注时长很长,这无形之中提高了模型的应用成本和门槛。那么我们就想找到一种在少量甚至没有标注的情况下能达到模型跨场景应用的方法。

java 文本情感分析模型 基于文本的情感分析_dbcp_38

首先我们想到的是迁移学习,它本质上是想将一个模型的知识迁移到另外一个新场景的模型中进行应用。迁移学习有基于样本的方法(如样本加权),基于模型的方法(如预训练+fine-tuning),基于特征的方法(如域适应)和基于关系的方法(如lifelong learning)。

java 文本情感分析模型 基于文本的情感分析_大数据_39

因为标注成本较高,我们的目标是仅使用目标域的无标签数据对业务模型进行微调,使得模型在目标域上得到较好的效果。那么我们就需要使用域适应的方法。首先我们需要明确什么是域。粗略来讲,它反映了了同一数据格式的不同形式的表达。例如从图像上来讲,一个白色背景与自然场景下的自行车就可以被认为是在不同的域内。对于大数据来说,它的来源可能来自于保险行业,也有可能来自于银行产品,因为场景不同,数据的分布也不同,可以被认为是在不同的域内。从音频角度来讲,一个无噪环境与夹杂着背景噪声的音频也是在不同的域。

我们想要使用无监督的方式来做域适应来达到我们的目的,在这里我们给出无监督域适应的定义。对于一个目标任务,如情感分类,我们收集了一批目标域的无标签数据和一些源域的有标签数据,利用这些数据我们希望得到一个面向目标任务的可接受的模型。通常情况下,我们的做法是用一个有标签的数据训练一个模型,然后把这个模型放在目标域上去应用。但是由于之前提到的几个问题,模型可能在目标域上的表现并不令人满意,那么我们就希望通过无监督域适应的方法让模型调整参数,使得其可以在目标域上得到较好的效果。

java 文本情感分析模型 基于文本的情感分析_编程语言_40

接下来对这个问题进行简单的分析。首先,因为目标域与源域数据分布存在差异,它们经过模型的特征提取后在特征空间上的分布不一致,进而使得同一分类器的分类效果存在差异,导致跨域模型表现不佳。解决这一问题的思路是希望在特征空间上(如分类层前的隐向量空间)找到一个度量准则,使得源域与目标域的特征分布尽可能接近。如果能做到这一点,我们就可以用源域的分类器直接作用在目标域上,同时保证模型在目标域有一个不错的表现。这样相当于实现了模型跨域迁移的目标。

java 文本情感分析模型 基于文本的情感分析_dbcp_41

无监督域适应有很多不同类型的解决方案。首先介绍一下基于BatchNorm的方法。前面我们提到,域适应的目标是将不同域的数据分布进行对齐,而BatchNorm本身就具有对齐数据分布的属性。它会在训练过程中保存训练数据的running mean以及running std。如上图右侧所示,一个简单的方法就是在源域中训练一个带有BatchNorm的模型。尽管目标域没有标注数据,但是我们有原始输入数据。我们可以将这些数据输入至模型,同时将BatchNorm层的均值和方差调整至目标域中,使得它能够符合目标域的数据分布。这相当于只去改动训练好模型的BatchNorm参数,就能完成目标域与源域数据分布对齐的目标。但是这里有一个比较强的假设:BatchNorm仅有的参数是均值和方差,这样也就忽略了数据中的很多信息,即数据的均值和方差并不能完整地体现数据的分布。

java 文本情感分析模型 基于文本的情感分析_java 文本情感分析模型_42

另一种方法是基于对抗训练的域适应,我们的MSCNN-SPU模型也是采用了这个类型的方法。首先我们想到的问题是如何衡量两个分布的距离。这里给出的答案是使用神经网络模型,也是基于对抗训练的域适应方法的核心思想。它的想法是通过一个判别器来判断一个数据是否来自源域或者目标域,从而让模型学习度量两个分布之间的距离的方法。

具体地,如上图所示,我们有源域和目标域的特征提取器。首先,模型从源域提取特征输入至下游的任务,如分类任务。由于源域是有标签的,所以我们可以训练下游任务中的分类器。另一方面,目标域是没有标签的,我们可以使用判别器判断输入是来自于源域还是目标域,同时在训练目标域的特征提取器时尽可能迷惑判别器,从而达到目标域的特征分布与源域的特征分布的距离尽可能接近的目的。在对抗学习的范式中,我们通常使用JS距离作为距离度量标准。当然,我们也可以使用Wasserstein距离(推土机距离)。

2. 基于对抗的无监督域适应

java 文本情感分析模型 基于文本的情感分析_编程语言_43

模型的整个训练流程如上图所示。X是源数据,Gs 是源数据侧的特征提取模型。我们首先进行有监督训练,将X输入至Gs,训练分类器Fs。进行对抗训练时,我们会将Gs复制一份给目标域的特征提取器Gt,相当于使用源域的特征提取器参数初始化目标域的特征提取器。在接下来的训练过程中,在每一个循环,在第一步先固定特征提取器的参数,训练判别器D,使得D可以判断出接收的数据是来源于源域还是目标域;随后在第二步训练特征提取器,使其尽可能迷惑判别器D。训练稳定之后,我们就可以得到目标模型,它是由目标域的特征提取器以及源域的分类器构成的。整个对抗训练相当于将原来在目标域训练好的模型拷贝了一份,并通过进一步训练调整特征提取模块的参数,使其在目标域上的分布与源域的分布尽可能接近,从而我们就可以使用源域上训练好的分类器进行分类任务。

3. 业务应用

java 文本情感分析模型 基于文本的情感分析_机器学习_44

我们在业务数据中对方法进行了检验。比如我们做了一个简单的双模态二分类模型,源域选择服务商的数据。如上图所示,在有监督训练的情况下,单模态的准确率可以达到89%,而双模态模型的准确率可以达到94%,这也体现了双模态模型的优势。我们的目标域有三个:保险、教育、银行。我们的目标是将在原域上进行有监督训练的模型,直接使用在目标域上,并且取得还不错的效果。这里我们对比了迁移前和迁移后的测试结果,可以看到迁移前模型的分类准确率在60%左右。使用对抗学习域适应的方法对模型进行参数的微调后,准确率的提升大致有二至四个点。所以,对抗学习域适应方法在应用中,相比于直接把训练好的模型放到一个未知领域,其效果很更加理想。但是它存在的问题是效果提升的可控性,这也有待后续研究去继续探索。

java 文本情感分析模型 基于文本的情感分析_大数据_45

另外,在很多实际应用场景中,目标域数据类别分布并不均匀。我们虽然不需要目标域的标签,但是它的数据经过随机抽取后,可能得到的正向标签较多。在这种数据类别不均衡的情况下,我们也希望观察对抗学习域适应方法的迁移效果。从上图表格中可以看到,针对仅包含单个类别的数据,模型在迁移后的分类效果相较于迁移前有一定的提高,但是在一些情况下无法达到均衡类别的指标。这是因为单个类别的数据缺少了类别分布的信息,使得模型在做迁移的时候稳定性较差(例如目标2)。

04

展望&总结

最后,我们做一下展望和总结。

java 文本情感分析模型 基于文本的情感分析_编程语言_46

首先,我们之前介绍的模型实际上并没有利用到施加坐标信息,也就是说我们并没有将一句话的音频的起止时间和文本起止时间进行对齐。在后续的模型优化中,我们希望找到能够把时间信息加入的方法,使得音频和文本中每一个token进行对齐。

java 文本情感分析模型 基于文本的情感分析_大数据_47

另外,由于音频模态的状态空间非常大,容易受到信道状态影响。比如通过电话听到的声音和面对面听到的声音是有所区别的,这是因为它受到了信道状态甚至远场效应的影响。目前,音频特征的鲁棒性有待提高。近期有很多尝试使用预训练的模型来进行音频特征的提取,如上图表格中Wav2Vec、CPC、APC、Transformer-3L。它们先在大量数据上对音频特征进行预训练,再使用预训练完成后的特征完成下游任务。我们也做了一些简单的对比实验,可以看到这些预训练模型很有潜力,如CPC模型可以超越传统MFCC得到的特征。这个方向也是将来双模态模型可以重点关注的。

java 文本情感分析模型 基于文本的情感分析_机器学习_48

近期,随着基于Transformer的各种应用遍地开花,双模态的预训练模型也成为了值得关注的焦点。双模态模型在利用Transformer时首先将不同模态的数据拉到同一空间下,再将其“tokenize”。比如对于图像我们可以取多个patch,对于音频我们可以取不同帧来将其离散化。然后我们可以将上述输入按照文本的方式输入到Transformer模型中。这对应于early fusion的方法,即在很早的阶段就将不同模态的信息融合在一起,放入Transformer模型在大规模数据集上做预训练。这也是多模态领域值得关注的工作。

综上所述,今天的分享主要探讨了以下五个问题:

  • 了解情感分析,以及为什么要做文本+音频的模态模型;
  • 句子级情感分析的音频、文本单模态模型;
  • 双模态的特征融合方法、架构以及MSCNN-SPU模型;
  • 面向算法落地的无监督域适应方法;
  • 文本+音频双模态情感分析的潜在方向。

05

精彩问答

Q:语音模态中的输入噪声会不会比其携带的情感信息更多?

A:很大程度上这取决于数据量以及数据的多样性。从用户角度来讲,音频的噪声从频谱上来看是有一定规律的,如果这种噪声来源于同一种噪声源,它会服从一些固定分布。对于模型,这就相当于在数据上加了偏置。但是如果噪声来源于多个源,即噪声的频谱分布差别较大的话,从数据角度来讲确实有可能会掩盖情感表达信息。比如一个人在会议室说话比较暴躁,但在操场上玩的时候就比较开心,那么模型很有可能会学习到说话时的背景噪声信息。具体地,在会议室中可能回音比较大,噪声强度较高,那么模型就很容易通过噪声来判断音频是不是包含暴躁的情感。实际上在这种情况下,我们可以通过增加数据多样性;或者可以通过预训练来让模型学习与说话人相关的特征(如X-vector),从而达到过滤环境噪声的目的。

Q:MFCC的特征维度一般取多少比较合适?GPT的主干网络可以用来做语音识别吗?

A:音频的MFCC特征中时间维度是1280。因为我们的输入是mini batch的形式,所以batch中所有的音频会截断或者补零至相同的长度。具体地,1280维对应的是8秒左右的音频长度。输入的梅尔谱的维度是96,它是由原始频谱、频谱的一阶delta特征以及频谱的二阶delta特征组成的,即原始梅尔谱的维度为32。当然维度的大小完全取决于应用。一般情况下,针对简单的分类任务,维度大小设定为13就比较合适了。另外一方面,时间维度取决于数据的真实长度。X-vector是使用预训练模型来提取说话人身份信息,所以它的特征维度和音频长度没有关系,而是固定在200维。

Q:多模态的处理是不是仅仅包含信息的融合,没有不同模态的信息在隐藏层中的交互?

A:实际上这取决于我们怎么去融合多模态信息。NLP、音频和CV相对比较独立,所以基本上信息融合可以被放在early fusion、late fusion和multi-level fusion这三种框架内。当然,多模态信息融合不止这三种形式。比如无人驾驶场景中会有一些传感器的信息和摄像头的信息,它们之间有时候是强相关的,那么这时候这两个模态的信息融合就不适用于以上三种框架。如果模态信息是强相关的话,通常的做法是针对性地使用一些规则与先验来进行融合。如果仅限于文本、语音、CV,那么我们经常会直接使用上述三种框架。当然,我们在中间层是可以添加不同模态之间的信息交互的。

Q:音频模块有没有考虑过使用Transformer结构?说话人的身份识别特征是如何使用的?

A:首先回答第一个问题。我们当时主要考虑在业务上实验双模态情感识别模型,但是模块是完全可以使用Transformer进行代替的。就如展望部分提到的,我们可以使用三层Transformer,或者使用其他预训练模型(如Wav2vec)来做音频的特征提取。包括文本模块,我们也可以将特征提取部分换成Transformer,它的效果可能会有进一步的提升。当然,我们整个工作的目的是与非Transformer的模型进行对比。

针对第二个问题,X-vector本身是被嵌入至KALDI这一工具中的,它的使用场景主要在音频领域,例如做说话人识别等。它有开源的数据与框架,并且有在开源的音频数据集上预训练好的模型。我们就使用了预训练好的模型来提取特征。TDNN本身是一个分类网络,内部结构类似于卷积神经网络。整个模型就是通过多层TDNN提取音频特征,之后使用pooling与全连接层进行分类任务。它的训练方式类似于Transformer,是在大量的数据集上(包含很多场景、背景)使用了大规模预训练,所以最终我们可以使用分类层之前的隐向量作为与说话人相关的特征。此外,这个特征向量还可以过滤大量的噪声信息,如环境因素、信道影响等。

Q:模型在中文数据集上表现如何?

A:我们只在业务数据上做了测试,还没有在开源数据集上进行实验。我们的MSCNN-SPU模型在二分类的任务下,若只使用文本或者音频输入特征,它的准确率可以达到89%,而使用双模态特征作为输入的话准确率有了四至五个点的明显提升。这从侧面反映出双模态带来的信息交互与信息协同可以给模型带来增益。

Q:在银行等行业中应用的是什么数据?为什么既有文本特征又有音频特征?

A:其实像保险、教育、银行这几个场景,我们的应用都是集中在客服质检上。它可以分为两个方面。一方面是对客服人员进行质检,另一方面是对客户进行情感判断。通常来说,客户遇到问题时会打电话给客服,之后客服和客户会通过电话进行沟通。沟通的过程中是有录音的,但它只包含音频,所以文本数据是后续通过ASR进行音频至文本的转换得到的。这里的文本数据可能会存在一定程度的ASR错误累积。从产品角度来看,我们想要做的是检验客服的态度是不是符合要求,同时观察客户有没有暴露极端情绪。

Q:能不能把文本、视频、音频数据都进行融合?如果可以的话,应该如何设计?

A:实际上这是完全可行的。之前提到的多模态融合方法完全可以迁移至三个模态的特征融合,本质上没有很大区别。只是在多模态融合之前,文本是偏离散的形式,音频是偏连续的数据,而图像是以像素为粒度的信息呈现形式。所以如果使用early fusion,我们需要将不同模态的数据提取特征并将它们统一到同一空间中来避免表示空间的差异。三模态数据当然也可以使用late fusion进行融合,即使用不同的特征提取网络,得到的模态特征进行简单拼接即可。最近基于大规模数据预训练的方法是基于Transformer来做模态特征融合的。它本质上就是将音频和图像token化,再将其输入至Transformer中对模型进行训练。

Q:如果使用Bert进行文本特征提取,应该如何平衡使用LSTM做音频特征提取的向量融合问题?

A:我认为在有监督学习的框架下影响不大,因为加入我们固定Bert模型参数不变的情况下,这相当于将文本输入词向量替换为Bert预训练的词向量。如果想要将Bert的权重加入整个网络进行整体训练,这可能会出现一些问题。因为这会导致双模态模型的参数量极不平衡,即文本部分参数量很大、音频部分参数量较小。现在也有研究正在探索如何针对这一现象对训练做一个权衡。简而言之,如果我们使用late fusion做模态特征融合,对文本侧使用bert会让模型整体效果打些折扣。当然,我们也可以尝试将音频侧的特征提取网络的参数量进行扩充。在无监督域适应方法中,它对模型参数量更为敏感。如果文本侧和音频侧的参数差距很大,那么在做模型迁移的时候,双模态就可能无法进行协同,因为文本部分的参数没有得到充分地域适应。

Q:语音模型识别准确率达到多少才能体现出多模态模型的优势?识别率与最终情感分析结果的相关程度有没有做过实验?有没有这方面的经验可以分享?

A:确实是有一些影响的。Google的ASR工具在一年前的字错率在5%左右。我们在实验中发现使用ASR的双模态模型的分类效果确实是没有使用Ground truth的分类效果好。在业务场景下ASR也会带来一些潜在问题,比如我们在训练模型的时候使用的是自己的ASR技术,而在线上部署的时候可能使用的是另一套ASR技术。不同的ASR可能会存在不同的偏置,这就导致最后模型分类的效果存在较高的不确定性。在通常情况下,我们假设ASR的效果是在一个合理范围内,使用效果也表明多模态模型对最终分类性能有一定的提升效果。但是按照目前的研究,我们还缺乏对提升幅度的可控性。

Q:将文本作为Transformer encoder端的输入并将音频作为Transformer decoder端的输入,这样的效果会不会比多模态更好?

A:直接把音频特征输入Transformer中存在一个问题,即Transformer最初是面向文本token这类离散化的输入的,但是由于音频包含大量的冗余信息,有可能相邻两帧或者几十毫秒之间音频变化并不是很大。如何对这类冗余信息进行建模是将音频直接运用在Transformer中需要解决的问题。目前有一些预训练模型如CPC,它使用对比学习的方法,使用前几帧的信息来对未来几帧的信息做相似度衡量。所以目前来说,使用预训练模型直接处理音频输入有很大的研究空间。只不过一般来说我们会将音频直接作为Transformer的输入,而作为decoder作为输入的工作暂时还没有看到。

Q:请问音频中有多个人说话的情况下会有鸡尾酒会效应吗?是不是可以依赖说话人识别特征来改善这个现象?

A:大部分情况下我们可以从音频的角度直接识别出说话人。但是也有一种情况,即客服正在说话的时候,客户会进行抢话甚至打断。目前我们的模型还无法在这种情形下对两个说话人进行区分,因为基于频谱的音频特征提取还是假设输入的音频是源自于一个人。

Q:模型上线运行速度问题怎么解决?是做蒸馏吗?

A:因为考虑到模型线上推理速度,所以我们倾向于使用卷积作为特征提取的基本结构。基本上如果音频和文本的输入特征已经处理完毕,模型的运行速度在10毫秒的量级(单个10s左右的样例)。但是这也存在一个问题,即线上模型中音频的X-vector以及MFCC特征并没有预先提取好。所以目前模型遇到的瓶颈是特征提取模块。另外一个瓶颈在于有时候原始数据是没有文本的,所以我们需要通过ASR将音频转化为文本信息,这也是一个十分耗时的操作。整体来说,我们双模态模型本身的推理速度比较快,但是主要的瓶颈在于特征提取。