【论文复现】以思维链为线索推理隐含情感
📕作者简介:热爱跑步的恒川,致力于C/C++、Java、Python等多编程语言,热爱跑步,喜爱音乐、摄影的一位博主。
📗本文收录于论文复现系列,大家有兴趣的可以看一看
📘相关专栏C语言初阶、C语言进阶系列、恒川的日常汇报系列等,大家有兴趣的可以看一看
📙Python零基础入门系列,Java入门篇系列、docker技术篇系列、Apollo的学习录系列正在发展中,喜欢Python、Java、docker的朋友们可以关注一下哦!
以思维链为线索推理隐含情感
- 简介
- 摘要
- 引言
- THOR
- THOR核心代码
- 实验结果
- 代码运行
- 总结
本文所涉及所有资源均在这里可获取。
简介
本文主要对2023ACL论文《Reasoning Implicit Sentiment with Chain-of-Thought Prompting》主要内容进行介绍。
摘要
虽然情绪分析任务中通常根据输入文本中的关键意见表达来确定给定目标的情绪极性,但在隐式情绪分析(ISA)中,意见线索通常是隐含或者模糊的。因此,检测隐含情绪需要常识和多跳推理能力来推断意见的潜在意图。在思想链(CoT)思想的启发,本文引入了一个三跳推理(THOR)CoT框架来模拟ISA的模拟人类推理的过程。THOR设计了一个三步提示原则,逐步诱导隐含的方面、观点,最后是情绪的极性。THOR+Flan-T5(11B)在监督微调下将数据集最优性能(SoTA)提高了6%以上。更引人注目的是,THOR+GPT3(175B)在零样本设置下将SoTA提高了50%以上。
引言
情感分析(SA)旨在基于输入文本检测对给定目标的情绪极性。SA可分为显性SA(ESA)和隐性SA(ISA),前者是当前的主流任务,他的情感表达会明确出现在文本中。因此ISA更具挑战性,因为在ISA中,输入仅包含事实描述,没有直接给出明确的意见表达。例如,给定一个文本“Try the tandoori salmon!”,由于没有显著的提示词,几乎所有现有的情绪分类都预测“tandoori salmon”为中性极性。人类很容易准确地确定情绪状态,因为我们总是掌握在文本后面隐含的真实意图或观点。因此,在没有真正理解情绪是如何被激发的情况下,传统的SA方法对ISA是无效的。
THOR
近期大模型的崛起,让我们看到了机器对文本的理解有了新的高度。受到大模型中CoT的启发,文章提出了THOR( Three-hop Reasoning CoT framework),一个三段式的提问框架,能够通过循循善诱地方法,很好的让机器对隐形情感进行挖掘并预测,提升了ISA任务的性能。
如上图所示:
Traditional Prompting,表明传统的提示学习方法就是直接问模型,这句话中这个词的情感极性是什么。
Three-hop Reasoning with CoT Prompting,则是本文提出基于大模型思维链(CoT)的方法,提出的三段式提问框架。首先询问句子在讲述方面词的什么方面;其次,将回答整合后,将整合后的答案继续问方面词背后有什么隐含观点;最后,再次整合前面的回答,最后问方面词的情感极性是什么。
通过THOR我们可以看到,使用CoT的方法循循善诱模型得到的答案为positive是正确的,而传统的提问时neutral是不正确的。
THOR框架具体设置如下:
假设我们要预测的句子为:“The new mobile phone can be just put in my pocket.”
其中要预测的方面词为“The new mobile phone”
不妨设句子为X,设方面词为t如上图所示:
Traditional Prompting,表明传统的提示学习方法就是直接问模型,这句话中这个词的情感极性是什么。
Three-hop Reasoning with CoT Prompting,则是本文提出基于大模型思维链(CoT)的方法,提出的三段式提问框架。首先询问句子在讲述方面词的什么方面;其次,将回答整合后,将整合后的答案继续问方面词背后有什么隐含观点;最后,再次整合前面的回答,最后问方面词的情感极性是什么。
通过THOR我们可以看到,使用CoT的方法循循善诱模型得到的答案为positive是正确的,而传统的提问时neutral是不正确的。
THOR框架具体设置如下:
假设我们要预测的句子为:“The new mobile phone can be just put in my pocket.”
其中要预测的方面词为“The new mobile phone”
不妨设句子为X,设方面词为t
以上述设置为例:
第一步,模型的输入为 Given the sentence “X”, which specific aspect of t is possibly mentioned?
假设模型得到的结果为"The specific aspect of the new mobile phone mentioned in the sentence is the size or portability",记为A
第二步,模型的输入为Given the sentence “X”, A(第一问结果). Based on the common sense, what is the implicit opinion towards the mentioned aspect of the new mobile phone, and why?
假设模型输出为"Based on the mentioned aspect of size and portability, the sentence implies that the phone is small enough to fit in the speaker’s pocket. According
to common sense, the implicit opinion of speaker towards the portability is good, because the speaker is able to easily carry the phone with them by
placing it in their pocket, and find the phone to be convenient and easy to use."这个答案不妨记作O。
第三步,模型的输入为Given the sentence “X”, A(第一问结果), O(第二问的结果). Based on such opinion, what is the sentiment polarity towards the new mobile phone?
此时假设模型的输出为"The sentiment polarity towards the new mobile phone based on the given sentence is positive. The speaker finds the phone to be convenient and easy
to use, implying having a favorable view of the phone."
此时我们可以看到,模型得到了我们需要的预测结果为positive。
此时再来看这幅图,应该是一目了然了吧。
THOR核心代码
def prompt_for_aspect_inferring(context, target):
new_context = f'Given the sentence "{context}", '
prompt = new_context + f'which specific aspect of {target} is possibly mentioned?'
return new_context, prompt
def prompt_for_opinion_inferring(context, target, aspect_expr):
new_context = context + ' The mentioned aspect is about ' + aspect_expr + '.'
prompt = new_context + f' Based on the common sense, what is the implicit opinion towards the mentioned aspect of {target}, and why?'
return new_context, prompt
def prompt_for_polarity_inferring(context, target, opinion_expr):
new_context = context + f' The opinion towards the mentioned aspect of {target} is ' + opinion_expr + '.'
prompt = new_context + f' Based on such opinion, what is the sentiment polarity towards {target}?'
return new_context, prompt
实验结果
文章实验主要是基于Flan-T5大模型做的(因为这是为数不多开源且效果不错的大模型)
这个结果是使用数据集进行监督微调训练后的结果,监督微调大模型确实能够使得模型有更好的表现,但是随着现在预训练大模型越来越大,我们微调的成本也越来越大了。
这个结果是使用zero-shot零样本得到的结果(不对大模型进行微调,直接通过THOR框架或者直接prompt询问结果,省去了微调大模型的时间和需要花费的资源,但是整体效果不如监督微调的结果)。可以看得出使用THOR的方法比直接prompt效果好,并且当用GPT3作为大模型询问时,效果明显好很多,因为GPT3的参数量远大于Flan-T5而且也并不开源,使用起来可能需要花点钱。这说明目前大模型对自然语言的理解缺失已经有了质的飞跃了。
代码运行
首先创建虚拟环境
conda create -n thor python=3.8
按照自己电脑的cuda版本安装pytorch
首先可以查看自己gpu的版本(如果你的电脑有且可以用的话)
打开命令行
输入:
nvidia-smi
可以查看自己gpu的版本
然后去pytorch官网查看对应gpu版本的安装命令
下面是一些版本的实例,可供参考
# CUDA 10.2
conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=10.2 -c pytorch
# CUDA 11.3
conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c pytorch -c conda-forge
# CUDA 11.7
conda install pytorch==1.13.0 torchvision==0.14.0 torchaudio==0.13.0 pytorch-cuda=11.7 -c pytorch -c nvidia
最后安装一些必备的库
下载代码打开后在终端运行安装即可。
pip install -r requirements.txt
打开main.py后可以看到参数的设置,直接运行是进行laptop数据集+THOR框架+零样本进行评估
目前支持prompt和zero-shot两种,使用GPT3因为需要密钥,需要自己去获取。
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--cuda_index', default=0)
parser.add_argument('--reasoning', default='thor', choices=['prompt', 'thor'],
help='with one-step prompt or multi-step thor reasoning')
parser.add_argument('-z', '--zero_shot', action='store_true', default=True,
help='running under zero-shot mode or fine-tune mode')
parser.add_argument('-d', '--data_name', default='laptops', choices=['restaurants', 'laptops'],
help='semeval data name')
parser.add_argument('-f', '--config', default='./config/config.yaml', help='config file')
args = parser.parse_args()
template = Template(args)
template.forward()
完整可运行的代码(包含Flan-T5 250M)附件可下载。
由于大模型文件太大上传不了,需要通过网盘下载大模型,链接也在附件中哦。
总结
这篇文章使用大模型思维链的思路优化了隐式情感分析中,隐含观点等难以挖掘的难题,使得ISA任务能够有较大性能的提升。随着近些年prompt learning的兴起,提示学习也逐渐成为NLP中的新范式,也让我们逐渐发现,训练出的大模型有很强的能力等待我们去挖掘,就好像一个聪明的小孩,你教他一遍怎么做,他就能帮你把任务做的不错了。
详细复现过程的项目源码、数据和预训练好的模型可从该文章下方链接获取:https://www.aspiringcode.com/content。
如果这份博客对大家有帮助,希望各位给恒川一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给恒川的意见,欢迎评论区留言。