Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[飞桨多模态大模型套件PaddleMIX开发大赛] rfc:过滤重复文本 #908

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions paddlemix/datacopilot/example/过滤重复文本.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# 过滤重复文本

| | |
| ---------- | ------------------------------ |
| 提交作者 | Liyulingyue |
| 提交时间 | 2024-12-24 |
| RFC 版本号 | v1.0 |
| 文件名 | 过滤重复文本.md |

## 1. 概述

### 1.1 相关背景

PaddleMIX是基于飞桨的多模态大模型开发套件,聚合图像、文本、视频等多种模态,覆盖视觉语言预训练,微调,文生图,文生视频,多模态理解等丰富的多模态任务。它提供开箱即用的开发体验,同时支持灵活定制,满足不同需求,助力探索通用人工智能。然而在实际项目开发过程中,各个领域的用户除了使用训练好的模型进行推理,也会使用专有数据微调来提升模型效果。

本方案探索通过文本重复度检测方法,对使用的数据进行过滤筛选,旨在通过过滤掉 重复度较高的文本,从而减少训练数据,进而缩短训练或者验证模型的时间。

本方案旨在从多模态大模型数据的领域开展工具组件的建设工作,完善飞桨多模态大模型套件数据分析和处理能力,减少用户开发成本。

### 1.2 功能目标

增加基于词频统计的 PaddleMIX 的数据处理方法。

### 1.3 意义

很多研究表明,数据质量的重要性要高于数据的数量,通过过滤掉 重复度较高的文本数据,可以提升整体数据集的质量,并减轻训练模型的成本。

## 2. 方案背景

针对多模态大模型的数据预处理目前存在较多的方法,如,

- 从数据中的文本分析,只保留文本长度在一定范围内的数据
- 从数据中的图片分析,只保留图片长宽比例在一定范围内的数据
- 从数据中的音频分析,只保留音频长度在一定范围内的数据
- 从数据中的视频分析,只保留视频长度在一定范围内的数据

其中,与本文方案相关的为 `从数据中的文本分析` 部分。

目前使用较多的方法包括但不限于:

- 只保留长度在一定范围内的数据
- 只保留无敏感度的文本
- 只保留重复率较低的文本

本文的方案探索通过使用 N-GRAM/ 和 Word2Vec,对使用的数据进行过滤筛选,旨在通过过滤掉 高重复度 的图片。

## 4. 设计思路与实现方案

本文尝试在 PaddleMIX 中添加
- N-gram 筛选器
- Word2Vec 筛选器

实现之后,用户可以通过使用筛选器过滤数据集,抛弃重复度大于指定阈值的数据,保证使用的每个文本数据的距离都大于指定值。

## 5. 测试和验收的考量

通过设置阈值,收集过滤后的数据集,并进行模型训练。

比对过滤后的数据集所训练的模型,其精度与未过滤数据所训练的模型有何差异。

## 6. 可行性分析和排期规划

此处主要实现两个筛选器

- N-gram,一周
- Word2Vec,一周

模型训练与精度比对,两周

## 7. 影响面

本方案在 `paddlemix/datacopilot/` 中会增加新的筛选器,对训练流程无影响。
61 changes: 61 additions & 0 deletions paddlemix/datacopilot/preprocess/preprocess.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import paddle
import paddle.nn.functional as F
from paddlenlp.transformers import BertTokenizer, BertModel
from paddlenlp.embeddings import TokenEmbedding
from paddlenlp.data import JiebaTokenizer
import numpy as np


def filter_by_text2vec(dataset, threshold=0.1):
tokenizer = BertTokenizer.from_pretrained('shibing624/text2vec-base-chinese')
model = BertModel.from_pretrained('shibing624/text2vec-base-chinese')

def element2vec(item):
s = str(item["conversations"])
with paddle.no_grad():
inputs = tokenizer(s, return_tensors='pd')
inputs["input_ids"]=inputs["input_ids"][:,:512]
inputs["token_type_ids"]=inputs["token_type_ids"][:,:512]
outputs = model(**inputs)
vec = outputs[1]
return vec

vec_list = []
for i in range(len(dataset)-1, -1, -1):
new_vec = element2vec(dataset[i])
for old_vec in vec_list:
dis = 1-F.cosine_similarity(new_vec, old_vec).numpy()[0]
print(dis)
if dis < threshold:
dataset.pop(i)
break
else:
print(f"len of vec list {len(vec_list)}")

return dataset


def filter_by_ngram(dataset, threshold=0.1):
token_embedding = TokenEmbedding(embedding_name='w2v.baidu_encyclopedia.target.word-ngram.1-2.dim300')
tokenizer = JiebaTokenizer(vocab=token_embedding.vocab)

def element2vec(item):
s = str(item["conversations"])
words = tokenizer.cut(s)
vec = token_embedding.search(words).mean(axis=0)
vec = paddle.to_tensor(vec).reshape([1,-1])
return vec

vec_list = []
for i in range(len(dataset)-1, -1, -1):
new_vec = element2vec(dataset[i])
for old_vec in vec_list:
dis = 1-F.cosine_similarity(new_vec, old_vec).numpy()[0]
print(dis)
if dis < threshold:
dataset.pop(i)
break
else:
print(f"len of vec list {len(vec_list)}")

return dataset