instructERC论文阅读笔记
2024-12-14
论文题目:InstructERC: Reforming Emotion Recognition in Conversation with Multi-task Retrieval-Augmented Large Language Models
说明:以下内容纯属本人看论文及复现代码的记录,如想了解论文细节,请移步论文原文看。
碎碎念:
作者为华中科技大学硕士生,该论文为他在美团实习期间成果
代码:
作者提供了代码,链接如下:
https://github.com/LIN-SHANG/InstructERC
环境配置记录:
作者推荐用docker,但是我没有用过docker跑深度学习代码。所以,我直接用的conda,在autodl上面租的RTX4090,debug的时候租的1张显卡,微调llama2的时候租的4张显卡。
没有创建虚拟环境,直接用的base环境,镜像是pytorch2.0.0,cuda11.8, python3.8(ubuntu20.04),然后也没有安装作者的requirements.txt文件(主要是在安装这个文件的时候报了很多错一直装不上,所以就没有安装了),然后安装如下几个包就能跑通了(版本最好也对应上,不然不一定能跑通):
于是重新创建环境
pip install numpy1.24.3
pip install transformers4.30.2
pip install deepspeed0.12.3
pip install SentencePiece0.1.99
conda install mpi4py
pip install Ninja1.11.1
pip install pandas2.0.1
然后还需要设置一下环境变量(不设置可能会报错误,跟ninja相关的错,环境变量里面加上ninja的到bin的安装路径即可,通过在命令行输入which ninja即可得到路径)
代码复现注意事项
实现细节:作者的训练分为两个阶段
第一阶段,使用speaker_task=True,相当于进行模型预热??
第二阶段,使用emotion_prediction=True和ERC main task联合训练。
不需要同时设置emotion_prediction和speaker_task为true。
因此,作者提供的train_and_inference_Uni.sh文件里面的第一阶段的时候只进行了speaker识别任务,第二阶段没有进行说话者识别任务。在第一阶段if [ ${emotion_prediction} = ‘False’ ],走的是这个分支,在第二阶段,elif [ ${emotion_prediction} = ‘True’ ]走的是这个分支。
train_and_inference_Plain.sh这个文件里面是使用大模型进行ERC任务的实验,也就是没有其他的辅助任务和说话者识别预训练任务,直接测试用大模型来进行ERC任务的实验结果。
注:
还有一点需要注意的是,有可能在跑的时候会报cuda outofmemory错误,这种情况下需要把代码中的deepspeed_config的fp16关闭掉,把bfloat16打开,我除了改动这里以外,还改了几处跟半精度微调大模型相关的代码(是我自己根据看的大模型微调教程改的),但是作者代码仓库里的issue给的答复是只要改”deepspeed_config的fp16关闭掉,把bfloat16打开“就行应该。反正我顺利跑通了。
最后要注意的是,作者的代码里面没有给出论文里面的demonstration模块,作者说的意思大概是由于美团的什么代码保密原则不能公开。
代码复现用时
15个batch,在4张RTX4090上面微调llama2,花费了快4小时,30块钱(心疼中,嘤嘤嘤~)
其他的任务,比如说话者识别预热模型参数和测试纯大模型进行ERC任务,花费的时间要少很多,大约半个多小时就可以了应该是。
代码复现结果分析
出于成本考虑(俺们实验室只有3090,4090得自己花钱租555~),我这里只进行了在meld数据集上的复现,并且只进行了lora这种微调方式。
纯llama2-7b-hf微调进行ERC任务的结果大概是f1=6263,acc=6365
作者的方法(这里没有示例检索模块)实验结果大概是f1=64.69,acc=65.62
作者在论文里面记录的实验结果是69.15
可见,我这里复现出的结果跟做作者还是有很大差距的(这里应该主要是因为示例检索模块的原因,作者也说了这个模块比较重要,或许还有部分我自己对于微调大模型没有什么经验的原因)
其他的消融实验我就不做了,费钱555我还是老老实实的做自己的3090实验吧(无奈)
摘要:
对话情绪识别的发展一直受到pipeline设计复杂性的阻碍,导致ERC模型经常过度拟合特定的数据集和对话模式。在这项研究中,我们提出了一种新的方法,即InstructERC,将ERC任务从判别式框架重新调整为基于大型语言模型( LLMs )的生成式框架。instructERC有4个重大贡献:
-
引入一个简单但是有效的模板检索模块,通过将语义相似度较高的历史对话内容、标签陈述、情绪域演示连接起来进行串联,从而显式地整合多粒度对话监督信息
-
进一步地,我们引入了两个额外的情绪对齐任务,即说话人识别和情绪预测任务,对对话中的对话角色关系和未来情绪倾向进行隐式建模。
-
我们的基于LLM的即插即用插件框架显著优于之前的所有模型,并在3个常用的ERC数据集上实现了全面的SOTA。
-
此外,我们首次承担了在三个ERC数据集上统一标签映射和建模的任务,展示了LLM强大的泛化能力。
对参数有效性、数据缩放和数据混合实验的广泛分析为InstructERC在实际场景中的应用提供了经验指导。我们的代码已经在Github上发布。
结论:
总之,我们的研究引入了instructERC,一种变革性的方法利用大型语言模型在生成框架中重新定义ERC任务。instructERC将独特的检索模板与情绪域检索模块相结合,能够适应不同的会话长度和提供高度相关的情绪识别示例。历史窗口探索实验说明了语境建模的最佳会话轮数是多少,这对于以前的工作由于令牌限制是无法达到的。此外,它集成了两个新颖的任务:说话人识别和情感预测,有效地建模了复杂的会话动态和说话人关系。这种方法允许更细致入微的ERC信息集成。值得注意的是,我们基于LLM的插件框架超越了所有先前的模型,在三个ERC数据集上设置了新的基准。我们还率先在这些数据集上统一了标签映射和建模,展示了LLM强大的泛化能力。此外,在数据缩放探索实验中发现了低资源互增益现象。我们的广泛分析为在真实世界场景中实现InstructERC提供了实际的见解,突出了其在对话中情感识别的效率和有效性。
方法:
主任务的输入是:指令、历史内容、标签声明、给定话语的演示检索的连接。
代码里面的演示检索模块由于美团的什么什么规定,没有开放出来。
模型使用了两个辅助任务与主任务一起微调LLM进行联合训练。
两个辅助任务分别是说话者识别、情绪反应预测。
说话者识别任务:为了让LLM捕捉不同个体的说话风格。在不考虑上下文的情况下,让大模型识别说话者。
情绪反应预测任务:这个任务是为了??
训练分为两个阶段:
第1阶段使用说话者识别来预热参数。第2阶段使用ERC主任务和情绪反应预测任务一起来微调LLM。
其他
笔记都是本人看论文时的个人意见和想法,仅供参考,如果您有任何建议也非常欢迎留言指出~
2024-12-14
的的
neu 计算机科学与工程学院(本硕东b)研三在读