全部文章

· Casimiro Ferreira· 1 分钟阅读

你的情绪模型分不清投诉和告别

  • Affective Computing
  • Emotion
  • Machine Learning
  • LILACS
  • Open Source
  • Science

你的客服队列里收到两条消息。

“这是你们第三次弄丢我的工作了。修好它。”

“我不知道我这样操作对不对,我怕我把什么东西搞坏了。”

随便跑什么情绪模型都行。两条结果一模一样:负面,高唤醒度。看起来都在生气。都很沮丧。

于是你用同样的方式处理——你这就犯了一个错,因为这两个人需要的是完全相反的东西。

第一个是暴怒,暴怒的人是在积极互动。他们相信自己可以逼出一个修复方案,而且会一直施压直到问题解决。你要是给他们发一段温暖的道歉外加一句”我们会跟进的”,只会让他们更火大。

第二个是害怕。他们觉得自己什么都修不了。只要再收到一个糟糕的回复,他们就会关掉页面再也不回来——安安静静地,连为什么走都不会告诉你。你要是给他们发一个工单号加五天处理窗口,你就失去他们了。

一个是投诉。另一个是告别。而情绪 AI 的工具箱里几乎没有东西能告诉你谁是谁。

我们花了不少时间研究原因。答案比我们预想的要有趣得多——结局是,一个在十亿条推文上训练出来的神经网络,竟然同意了一篇它从未读过的 1985 年心理学论文。

缺失的维度

愤怒和恐惧这件事是这样的:用常规方式去测量,它们几乎一模一样。

两者感觉都很糟糕。两者都高度激活——你的心率都会飙升。这两个特质,“感觉有多好”和”有多激动”,就是几乎所有情绪模型赖以建立的两个维度。它们通常叫效价唤醒度

愤怒和恐惧在那个空间里几乎重叠在一起。无论模型多复杂,只靠这两个数字的模型都没法把它们分开,因为信息根本不在那里。

真正把它们区分开来的是第三样东西:你觉得自己能不能做点什么?

愤怒是你在某件事出了错并且你能采取行动时的感受。恐惧是你在某件事出了错但你无能为力时的感受。那种掌控感——心理学家叫它应对潜能效能感——就是全部的区别。它也决定了一个人会对抗还是逃跑、会升级还是会消失。

这不是一个边缘观点。四个独立的研究项目在二十年间各自得出了同样的结论,其中一项(Lerner & Keltner, 2001)还做了因果性的验证:愤怒的人会做出乐观、风险容忍度高的判断,而恐惧的人会做出悲观、风险规避的判断——驱动这种效应的是控制感和确定感,而不是他们觉得有多糟糕。

他们最引人注目的发现值得好好想想。**愤怒的人的判断看起来和快乐的人的判断一样。**不像恐惧的人。愤怒和快乐的效价完全相反,但这不重要,因为真正起作用的不是效价。

那为什么这个维度没有出现在现有的工具里?

为什么这个维度消失了

大多数情绪工具的根源都可以追溯到少数几个理论模型。最有影响力的两个是 Plutchik 的情绪轮(1980),以及建立在它之上的 Cambria 的情绪沙漏(2012),后者是 SenticNet 背后的模型。

Plutchik 的情绪轮是一个漂亮的图形。它长得像一个色轮,并且把色轮的核心理念也带了过来:情绪成对立对出现。快乐和悲伤对立。信任和厌恶对立。愤怒和恐惧对立。

最后那个就是问题所在——你一旦看出来就再也无法假装没看见。

如果愤怒和恐惧是一条轴的两端,那它们应该相互抵消。取一个人能感受到的最强烈的暴怒,混上最强烈的恐惧,问问模型你会得到什么:

(rage + terror) / 2  ==  neutrality

**平静。**把人类能产生的两种最剧烈的负面状态混在一起,模型告诉你:你什么感觉都没有。

这不是某个实现的 bug。这是几何结构的直接后果——它意味着模型恰恰丢掉了我们最需要的量。通过让愤怒和恐惧成为对立面,模型保证了它们永远无法被区分开来

这个情绪轮其实自己也知道这一点。情绪沙漏有一套情感评分公式,在那个公式里愤怒-恐惧轴被包在绝对值里:两端都算作不愉快。这没错!愤怒和恐惧确实都不愉快。但它悄悄地和最初的几何结构矛盾了——当初把它们放在两极的正是这个结构。模型自己的算术和自己的图示互相打架。

证据实际上说了什么

到了这一步,我们停下了写代码的手,去读文献。那几天过得不太舒服。

Plutchik 的对立对结构已经被检验过了。2009 年,Smith 和 Schneider 对它跑了超过两千个统计检验,得出结论:情绪轮理论”没有获得实证支持”。那些对立对是从色彩理论借来的优雅隐喻。它们不是关于人的发现。

与此同时,真正经得起重复验证的东西——Russell 的效价-唤醒度环形模型,以及区分愤怒和恐惧的控制维度——恰恰是很少进入实际软件的那些。

这里有一个二阶问题,而且才是真正困扰我们的。这些模型每一个都能用。它们形象、好教、一张幻灯片就能讲清。所以它们被不断引用——一旦一个模型被引用得够多,去核查它的出处就开始显得像是吹毛求疵而不是严谨治学。一个隐喻就是这么悄悄变成基础的。

从经得起检验的东西出发来构建

所以我们构建了 emotion-algebra,并且把缺失的维度放在了它的中心。

核心由五个数字组成:感觉有多好,感觉有多坏(是的,分开——待会儿会说),你觉得有多掌控,你有多激活,以及这一切有多出乎意料。这些来自 Fontaine 和同事(2007),他们从跨文化的 144 个测量特征中推导出了这些维度,而不是来自一张好看的图表。

现在混合行为正确了:

from emotion_algebra import prototype, dominant

dominant(prototype("anger").blend(prototype("fear"), 0.5))
# 'distress'

不再是”平静”。而是痛苦——极度不愉快,高度激活,掌控感被相互抵消。这正是暴怒加恐惧应该有的感觉。

客服队列的例子也跑通了:

from emotion_algebra import affect_from_texts

angry, afraid = affect_from_texts([
    "This is the third time your app has lost my work. Fix it.",
    "I don't know if I'm doing this right and I'm scared I've broken something.",
])

angry.valence,  angry.potency    # -0.43, +0.16   -> 'disgust'
afraid.valence, afraid.potency   # -0.47, -0.43   -> 'apprehension'

看看那些数字。效价几乎一模一样——两条消息的不愉快程度差不多,这就是为什么传统情绪模型会把它们看成一回事。效能感是相反的。一个人觉得自己能行动;另一个觉得不能。

这就是你的投诉,那就是你的告别。

差点杀死这个项目的测试

接下来是我们真正担心的部分。上面所有内容都建立在心理学文献的基础上,而那些文献几乎完全建立在问卷上——让人们在 1 到 9 的量表上给词语打分。问卷有一个令人不安的特性:它们可以悄悄地编码一个理论而不是检验它。如果所有写情绪问卷的人都学的是同一本教科书,问卷就会和教科书一致,然后每个人都会觉得受到了很大的验证。

我们想要一个完全没有受过理论训练的见证者。

DeepMoji 是一个神经网络,它在 12 亿条推文上训练过,用来预测一条消息以哪个表情符号结尾。这就是它做的全部。它从来没听说过 Plutchik,没听说过评价理论,也没听说过应对潜能。它对情绪没有任何看法——它只是对人们在有感受时实际上怎么写东西有极其准确的认知。

于是我们问了它唯一重要的问题:

你能分清愤怒和恐惧吗?如果能——你用的是什么来分?

它能。 给它真实的人类评论(由真实的人标注),它区分愤怒和恐惧的能力远高于随机水平。(打乱标签后这个能力就完全消失了,所以这不是我们方法的产物。)

然后我们看了怎么分的。我们取了 DeepMoji 用来区分两者的方向,然后测量它和我们五个维度中的每一个有多吻合。

它和效能感最吻合——比其他任何维度强三倍。不是效价。不是唤醒度。

一个在十亿条推文上训练出来的模型,从来没有被告知愤怒涉及掌控感而恐惧涉及掌控感的缺失——当你让它做选择时,它恰恰抓住了这个区分。它自己找到了那个维度。

这是我们最有说服力的一个发现,我们想明确说明它完全可能走向另一个方向。如果 DeepMoji 用效价来区分愤怒和恐惧,或者根本区分不出来,我们的第三维度就只是心理学文献的产物,我们就得如实说。

苦乐参半,以及一个数字装不下的其他东西

再说一个推论,因为它很有意思。

我们把”感觉有多好”和”感觉有多坏”存为两个独立的数字,而不是一个从负到正的分数。听起来像技术细节。其实不是。

人真的会同时感到好和坏。经典研究用的是毕业典礼:学生们同时报告真正的快乐和真正的悲伤,而不是两者之间一个温吞的平均值。单个效价分数在数学上无法表示这种情况。它只能报告”有点开心”,但那不是在场任何人的真实感受。

两个通道可以容纳它。这意味着模型可以表示不情愿的胜利、深情的告别、既松了口气还在生气的客户。这些才是真正有趣的情绪,也正是一个数字会压扁的那些。

给另一边的情绪

到目前为止说的全是读懂人类。同一套机制也可以反过来用,赋予角色自己的情感生活。

这里的情绪是一个位移——你被从平时的位置推开了,然后随着时间慢慢漂回去。你漂回去的位置不是零。不存在所谓”没有情绪”这种状态;即使在休息时你也在某个位置,而那个位置是微微愉悦、平静、微微有掌控感的。(正是那个微微的正向倾向,让一个休息中的生物会去探索些什么,而不是一动不动地待着。这是一个被测量过的真实效应。)

所以一个刚看到可怕东西的守卫,不会在计时器到期时瞬间恢复中性。他会逐步降下来:

terror → fear → apprehension → pensiveness → acceptance

先是恐惧,然后是警惕,然后是一种安静的沉思,最后他没事了。我们没有编排这个序列——它是几何结构自然得出的。

而两个守卫可以不同,因为他们趋向不同的静息位置。给其中一个稍微低一点的基线掌控感,再加上一个把坏消息的影响加倍的习惯,他就变得明显焦虑——更容易受惊,恢复更慢,沉思更久。这就是一个角色,它只用四个数字而不是一棵行为树。

然后是实用的部分:他会做什么?那也来自控制维度。愤怒的守卫冲向你。恐惧的守卫逃跑。“负面情绪”无法在两者之间做出选择,它从来也不能。

我们告诉你哪里不对的部分

这个库里的每个模型都带有一个评级和引用——从 ESTABLISHED(经复制验证、跨文化、有元分析)到 METAPHOR(一张漂亮但经不起检验的图)。

Plutchik 的情绪轮就在里面,评级为 METAPHOR,它的行为完全按照 Plutchik 的描述——-anger 仍然给你 fear,因为那是他的模型说的。他的算术被忠实地实现了,同时他的模型关于人的部分是不对的。两件事都是真的,我们宁愿两个都告诉你,而不是只挑一个。

我们对自己的短板也一样直白:

从文本中读取唤醒度是未解决的。 我们可以得到效价,可以得到效能感——但我们没法可靠地从文字中判断一个人有多激动。我们最好的数字也很糟糕。我们把它标注为糟糕发布出来,而不是悄悄祈祷你不检查。

我们自己的一个发现是临时性的。 导致愤怒的那个”掌控感”和人们在愤怒时报告的掌控感原来是两码事——你在暴怒中的掌控感比理论预测的要低。发脾气毕竟是失去控制。我们认为这很重要。但我们认为支撑它的证据还不够充分,所以相应地做了标注。

我们为什么费这个劲

一个悄悄断言与证据相悖之事的情绪模型,比没用还糟糕。它是自信地没用——建在它上面的一切都会无声地继承这个错误,永远。

我们宁愿发布一样东西,告诉你可以多大程度上信任它的每个部分。

pip install emotion-algebra

文档里有五分钟快速入门、一个给智能体赋予情感生活的指南,以及完整的证据表——里面包含了每一条引用。如果你觉得我们的某个评级是错的,源代码就在那里可以争论——我们真的想听到。

与此同时:你的客服队列里有某个人正在默默编写一句告别。要是能知道他们是哪一种就好了。