sentiment-discovery

GitHub
1.1k 205 较难 2 次阅读 1周前NOASSERTION语言模型开发框架
AI 解读 由 AI 自动生成,仅供参考

sentiment-discovery 是一个基于 PyTorch 的开源项目,旨在通过大规模无监督语言建模来实现鲁棒的情感分类。它主要解决了在标注数据稀缺或类别不平衡的现实场景下,传统模型难以准确识别文本情感与复杂情绪的问题。该项目复现并扩展了相关前沿研究,支持将预训练的语言模型迁移到自定义数据集上,仅需少量标注样本即可在情感分析或多模态情绪分类任务中达到业界领先的性能。

sentiment-discovery 特别适合 NLP 研究人员和开发者使用,尤其是那些需要处理大规模文本数据、探索无监督学习技术或构建高精度分类模型的团队。其技术亮点包括支持混合精度训练以及分布式多 GPU、多节点训练,显著提升了训练效率;同时提供了灵活的命令行接口,兼容 Transformer 等多种架构及不同的分词方法。需要注意的是,该仓库目前已标记为弃用,官方建议用户转向功能更完善的 Megatron-LM 项目以获取最新的大规模预训练代码,但若需复现特定历史研究成果,仍可通过该项目的历史版本获取相应资源。

使用场景

某电商数据团队需要快速构建一个能精准识别用户评论中复杂情绪(如愤怒、失望、惊喜等)的分析系统,以应对突发舆情。

没有 sentiment-discovery 时

  • 标注成本高昂:面对海量未标记的用户评论,团队需人工标注数万条数据才能训练基础模型,耗时数周且费用巨大。
  • 细粒度情绪识别难:传统二分类模型(仅正面/负面)无法区分“愤怒”与“悲伤”等细微差别,导致运营策略缺乏针对性。
  • 冷启动效果差:在新业务线缺乏历史标注数据时,模型因训练样本不足而准确率极低,难以投入生产。
  • 领域适配慢:针对特定商品类别的语境变化,重新训练模型需要大量算力资源和漫长的调优周期。

使用 sentiment-discovery 后

  • 无需标注即可启动:利用其大规模无监督预训练能力,直接对海量原始评论进行建模,省去了繁琐的人工标注环节。
  • 支持多维情绪分类:基于普鲁奇克情绪轮(Plutchik Wheel)的微调功能,可精准识别愤怒、恐惧、信任等 8 种具体情绪,洞察更深层用户心理。
  • 小样本高效迁移:凭借强大的特征提取能力,仅需少量标注样本即可完成迁移学习,在新场景下迅速达到业界领先的准确率。
  • 训练效率显著提升:支持混合精度和多 GPU 分布式训练,大幅缩短模型迭代时间,让团队能快速响应市场变化。

sentiment-discovery 通过无监督预训练与小样本微调的结合,将情绪分析从“劳动密集型”的数据标注工作转变为高效的智能化决策工具。

运行环境要求

操作系统
  • 未说明
GPU

需要 NVIDIA GPU 以支持混合精度训练 (FP16) 和分布式多卡训练 (基于 NVIDIA APEX),具体显存大小取决于模型规模 (文中提及 4096-d mLSTM 及大型 Transformer),CUDA 版本需与安装的 PyTorch 及 APEX 兼容

内存

未说明

依赖
notes该仓库已弃用 (DEPRECATED),官方建议转向使用 Megatron-LM。若仍需使用,需安装特定历史版本的依赖。支持混合精度 (FP16) 及分布式多节点训练。预训练模型和分词器需从 Google Drive 手动下载。训练亚马逊数据集时需使用 '--loose-json' 标志。
python3.x (仅支持 Python 3)
numpy
pytorch>=0.4.1
pandas
scikit-learn
matplotlib
unidecode
sentencepiece
seaborn
emoji
nvidia-apex
sentiment-discovery hero image

快速开始

** 已弃用 **

此仓库已被弃用。请访问 Megatron-LM 获取我们最新的大规模无监督预训练和微调代码。

如果您仍希望使用此代码库,请查看我们的标记版本,并安装在该日期公开可用的所需软件/依赖项。

PyTorch 无监督情感发现

本代码库包含预训练的二元情感分类模型和多模态情绪分类模型,以及用于复现我们一系列大规模预训练+迁移NLP论文结果的代码:《大规模语言建模:四小时内收敛至40GB文本》(https://nv-adlr.github.io/publication/2018-large-batch-lm) 和 《基于大型预训练语言模型的实际文本分类》(https://arxiv.org/abs/1812.01207)。这项工作源于对复现、分析并扩展OpenAI的[生成评论与发现情感](https://github.com/openai/generating-reviews-discovering-sentiment)论文的渴望。

本仓库中采用的技术具有通用性,我们易于使用的命令行界面可用于在您自己的复杂分类数据集上训练最先进的分类模型。 本代码库支持混合精度训练,以及针对语言模型的分布式、多GPU、多节点训练(支持基于NVIDIA的APEx项目)。除了训练语言模型外,该代码库还可用于轻松地将已训练好的模型迁移到自定义文本分类数据集上进行微调。

例如,我们用PyTorch实现了一个Transformer语言模型,用于对大型文本数据集(如亚马逊评论数据集)进行无监督建模。我们还支持其他分词方法,如字符级或sentencepiece分词,以及使用各种循环架构的语言模型。 学习到的语言模型可以迁移到其他自然语言处理(NLP)任务中,用于对文本样本进行特征提取。这些特征提供了一个强大的判别式语言任务初始化点,在仅有少量标注样本的情况下即可实现具有竞争力的任务性能。例如,我们考虑在普鲁奇克情绪轮的一部分基础上,对多模态情绪分类这一困难任务进行微调。

plutchik fig

罗伯特·普鲁奇克创建的情绪轮以引人入胜且细腻的方式展示了不同的情绪。他提出存在8种主要的双极情绪(喜悦与悲伤、愤怒与恐惧、信任与厌恶、惊讶与期待),每种情绪都有不同的强度级别。对于我们的分类任务,我们使用来自SemEval2018 Task 1E-c情绪分类数据集的推文,执行愤怒、期待、厌恶、恐惧、喜悦、悲伤、惊讶和信任的多标签分类。这是一项困难的任务,受到现实世界分类问题的影响,如类别不平衡和标注者意见不一致。

semeval results

在完整的SemEval情绪分类数据集中,我们发现仅通过对数据进行微调,我们的模型就能在无需额外领域特定特征工程的情况下达到具有竞争力的最新水平性能。

semeval leaderboard

ReadMe 目录

设置

安装

运行python3 setup.py install来安装sentiment_discovery包,以便在此仓库内运行模块/脚本。

Python要求

目前我们仅支持Python 3。

  • numpy
  • pytorch (>= 0.4.1)
  • pandas
  • scikit-learn
  • matplotlib
  • unidecode
  • sentencepiece
  • seaborn
  • emoji

预训练模型

我们已将 SentencePiece 分词器模型及其词汇表打包成一个 ZIP 文件:

我们还提供了 Transformer 语言模型基础版本以及一个 4096 维的 mLSTM 语言模型基础版本。有关如何使用这些模型的示例,请参阅我们的 微调迁移 部分。尽管这些模型是用 FP16 训练的,但它们同样可以在 FP32 的训练或推理中使用。

此外,我们还提供了在 SemEval 情感数据子集上训练的分类器,对应普鲁奇克的八种情感(愤怒、期待、厌恶、恐惧、喜悦、悲伤、惊讶和信任):

最后,我们还提供了针对 SST 和 IMDB 二元情感分类的预训练分类模型:

若要使用能够复现我们原始大批次语言建模论文结果的分类模型,请使用以下 commit hash 和模型集合

我们未包含利用 ELMo 的预训练模型。如需使用 ELMo 复现论文结果,请参阅我们的 可用资源

每个文件都包含一个字典,其中含有 PyTorch 的 state_dict,包括基于亚马逊评论训练的语言模型(lm_encoder 键)和分类器(classifier 键),以及运行该 state_dict 所需的配套 args

数据下载

./data 文件夹中,我们提供了 二元斯坦福情感树库(Binary SST)IMDB 电影评论SemEval2018 推文情感竞赛 数据集的处理后副本,作为本仓库的一部分。若要使用亚马逊数据集进行训练,请从朱利安·麦考利的原始 网站 下载“激进去重版”数据。对该数据集的访问请求通常会立即获批。使用该数据集时,请务必加上 --loose-json 标志加载。

使用方法

除了提供本工作的核心功能(模型、分布式、FP16 等)的可重复使用代码外,我们还提供了用于执行原始论文中高层次功能的脚本:

  • 对输入文本进行情感分类
  • 对语料库中的文本进行无监督重建/语言建模(并附有启动分布式工作节点的脚本)
  • 将学习到的语言模型迁移到指定语料库以进行情感分析
  • 从语言模型中采样生成文本(可能具有固定的情感倾向),并可视化文本中的情感热图

文本分类

使用我们的预训练模型或您自己的模型对输入的 CSV/JSON 文件进行分类。 默认情况下会对 Binary SST 进行分类。 分类概率输出将保存为 .npy 文件。

python3 run_classifier.py --load_model ama_sst.pt                               # 对 Binary SST 进行分类
python3 run_classifier.py --load_model ama_sst_16.pt --fp16                     # 以 FP16 运行分类
python3 run_classifier.py --load_model ama_sst.pt --text-key <text-column> --data <path.csv>     # 对您自己的数据集进行分类

更多文档请参见 这里

训练语言模型(含分布式/FP16 训练)

对 CSV/JSON 语料库训练语言模型。默认情况下,我们将训练一个权重归一化的 4096 维 mLSTM,其字符嵌入维度为 64。 这是训练您自己的情感分类器的两步过程的第一步。 默认情况下,模型将保存为 lang_model.pt

python3 pretrain.py                                                               # 在 IMDB 数据上训练大型模型
python3 pretrain.py --model LSTM --nhid 512                                       # 改为训练小型 LSTM
python3 pretrain.py --fp16 --dynamic-loss-scale                                   # 以 FP16 训练模型
python3 -m multiproc pretrain.py                                                  # 分布式模型训练
python3 pretrain.py --data ./data/amazon/reviews.json --lazy --loose-json \       # 在亚马逊数据上训练模型
  --text-key reviewText --label-key overall --optim Adam --split 1000,1,1 
python3 pretrain.py --tokenizer-type SentencePieceTokenizer --vocab-size 32000 \  # 使用我们的 SentencePiece 分词训练模型
  --tokenizer-type bpe --tokenizer-path ama_32k_tokenizer.model 
python3 pretrain.py --tokenizer-type SentencePieceTokenizer --vocab-size 32000 \  # 使用 SentencePiece 分词训练 Transformer 模型
  --tokenizer-type bpe --tokenizer-path ama_32k_tokenizer.model --model transformer \
  --decoder-layers 12 --decoder-embed-dim 768 --decoder-ffn-embed-dim 3072 \
  --decoder-learned-pos --decoder-attention-heads 8
bash ./experiments/train_mlstm_singlenode.sh                                      # 在一台 DGX-1V 上运行我们的 mLSTM 训练脚本
bash ./experiments/train_transformer_singlenode.sh                                # 在一台 DGX-1V 上运行我们的 Transformer 训练脚本 

有关语言建模功能的更多文档,请参阅 这里

如需了解我们的语言建模实验并复现结果,请参阅分析部分的 训练复现 章节。

有关我们如何通过 FP16 训练实现数值稳定性的信息,请参阅我们的 FP16 训练 分析。

情感迁移

给定一个训练好的语言模型,此脚本将对训练集、验证集和测试集的 CSV/JSON 文件中的文本进行特征提取。然后使用 scikit-learn 的逻辑回归来拟合一个分类器,以根据这些特征预测情感。最后,它会进行特征选择,尝试用最相关的前 n 个神经元(特征)来拟合回归模型。默认情况下,第二次回归只使用一个神经元。

python3 transfer.py --load mlstm.pt                                 # 将模型迁移到 SST 数据集,并将结果保存到 `<model>_transfer/` 目录
python3 transfer.py --load mlstm.pt --neurons 5                     # 使用 5 个神经元进行第二次回归
python3 transfer.py --load mlstm.pt --fp16                          # 在特征提取步骤中以 fp16 精度运行模型
bash ./experiments/run_sk_sst.sh                                    # 在 IMDb 数据集上使用 mlstm 进行情感迁移
bash ./experiments/run_sk_imdb.sh                                   # 在 SST 数据集上使用 mlstm 进行情感迁移

有关迁移命令行参数的更多文档,请参阅 这里

分类器微调

给定一个训练好的语言模型和分类数据集,此脚本将构建一个分类器,利用训练好的语言模型作为文本特征编码器。与 transfer.py 的区别在于,该脚本的模型训练是端到端进行的:分类器的损失也会反向传播到语言模型编码器中。与 transfer.py 相比,此脚本允许构建更复杂的分类模型、指标和损失函数。该脚本支持构建任意多标签、多层和多头感知机分类器。此外,它还允许在训练过程中使用语言建模作为辅助任务损失,以及使用多头方差作为辅助损失。最后,该脚本支持根据验证集的表现自动选择分类阈值。为了衡量验证集的表现,该脚本包含了更复杂的指标,包括 F1 分数、马修斯相关系数、雅卡尔指数、召回率、精确率和准确率。

python3 finetune_classifier.py --load mlstm.pt --lr 2e-5 --aux-lm-loss --aux-lm-loss-weight .02   # 在 SST 数据集上对 mLSTM 模型进行微调,并加入辅助损失
python3 finetune_classifier.py --load mlstm.pt --automatic-thresholding --threshold-metric f1     # 在 SST 数据集上微调 mLSTM 模型,并根据验证集的 F1 分数自动选择分类阈值
python3 finetune_classifier.py --tokenizer-type SentencePieceTokenizer --vocab-size 32000 \       # 在 SST 数据集上使用 SentencePiece 对 Transformer 模型进行微调
  --tokenizer-type bpe tokenizer-path ama_32k_tokenizer.model --model transformer --lr 2e-5 \
  --decoder-layers 12 --decoder-embed-dim 768 --decoder-ffn-embed-dim 3072 \
  --decoder-learned-pos --decoder-attention-heads 8 --load transformer.pt --use-final-embed
python3 finetune_classifier.py --automatic-thresholding --non-binary-cols l1 l2 l3 --lr 2e-5\     # 在某个自定义数据集上微调一个具有 3 个类别、每类 4 个头的多层分类器,并自动选择分类阈值
  --classifier-hidden-layers 2048 1024 3 --heads-per-class 4 --aux-head-variance-loss-weight 1.   # `aux-head-variance-loss-weight` 是一种辅助损失,用于增加每个头权重之间的差异
  --data <custom_train>.csv --val <custom_val>.csv --test <custom_test>.csv --load mlstm.pt
bash ./experiments/se_transformer_multihead.sh                                                    # 在 8 个 SemEval 类别上微调一个多头 Transformer 模型

请参阅分析部分的 微调复现 部分,了解如何重现我们的微调实验。

有关 finetune_classifier.py 可用命令行参数的更多文档,请参阅 这里

分析

致谢

特别感谢我们出色的暑期实习生 Neel Kant,他在 Transformer、分词以及预训练和微调分类模型方面所做的大量工作。

还要特别感谢 @csarofeen@Michael Carilli,他们在开发和记录我们的 RNN 接口、分布式数据并行模型和 fp16 优化器方面提供的帮助。这些工具的最新版本可以在 APEx GitHub 页面 上找到。

感谢 @guillitte,他提供了 OpenAI 情感神经元仓库的一个轻量级 PyTorch 移植版

该项目使用了由 J. McAuley 收集的 亚马逊评论数据集

感谢

想帮忙吗?可以开一个议题提出问题或建议,也可以提交从轻微修复到新功能的各种拉取请求。

愿你的学习深入而无监督。

版本历史

v0.3.large_batch_stable2018/12/14
v0.32018/04/06
v0.22018/03/13
v0.12017/12/12

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|2天前
Agent图像开发框架