【大模型实战篇】高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍

news2024/11/24 22:34:07

1. 高质量数据过滤  

1.1 背景介绍

        数据质量对于大模型的训练至关重要,经常会听到一句话:数据决定模型的上限。模型的性能上限通常受到训练数据的质量限制。如果数据集不够好,模型可能无法学习到泛化的特征,导致其在新数据上的表现不佳。在大模型场景这个道理也通用,训练大模型依然需要喂入高质量的数据。否则造成大量计算资源的浪费,而且学习效果也差强人意。高质量的数据可以提高大型语言模型(LLMs)的最新技术水平,同时显著减少数据集的大小和训练计算量。重要的是需要较少训练的较小模型可以显著降低LLMs的环境成本【1,2】。

        训练大模型之前需要收集大量的文本数据。在收集了大量的文本数据后,为确保数据的质量和有效性,还需进行预处理,以清除低质量、冗余、无关甚至可能有害的数据【3】。目前业内出现了一些系统化的数据处理框架,比如开源库Data-Juicer 【4】来保证预训练数据的质量。       

        【3,4,6,7】中介绍了一系列常用的数据预处理方法和步骤。下图是典型的大语言模型预训练数据的预处理流程,可以参考加深对于预处理过程的了解。

        接下来,详细介绍其中的重要步骤,本文会重点关注质量过滤环节。

        收集到的原始文本数据通常包含大量低质量的内容,例如,从网页抓取的数据中可能包含机器生成的广告网页。为了提升模型学习的性能,有必要从语料库中剔除这些低质量数据。目前,研究人员主要使用两种数据清洗方法:(1)基于启发式规则的方法,和(2)基于分类器的方法。

1.2 基于启发式规则的方法

        通过设计针对性的规则来识别和剔除低质量文本数据是一种常见做法。不同类型的文本数据通常需要不同的清洗规则。例如,在处理问答数据时,可以通过过滤点赞数过少的帖子来剔除低质量内容;在处理代码语料时,可以过滤掉与代码无关的数据格式。以下是对一些常见数据集的清洗规则的总结【3】,仅供参考。

  • 基于语种的过滤:在训练以特定语言为主的大语言模型时,通常需要过滤掉其他语言的文本数据。例如,为了训练非英文主导的大语言模型(如中英双语模型),不仅要保留特定目标语言的数据,还需要保留高质量的英文数据。在训练过程中,使用语言识别器过滤非中英文的网页数据。

  • 基于简单统计指标的过滤:可以通过语料中的标点符号分布、符号与单词比率、句子长度等特征来衡量文本质量,并过滤低质量数据。例如:

    1. 过滤掉任何包含超过100个重复单词或句子的网页数据。
    2. 过滤掉符号与词元比大于0.1的网页数据。
    3. 过滤掉点赞数少于3的评论。
    4. 利用已有的语言模型计算文档的困惑度,作为过滤依据。
    5. 使用FastText分类器检测并删除有害或仇恨言论。
  • 基于关键词的过滤:预训练语料中可能存在大量重复文本模式,如HTML标签、超链接和模板等,还可能包含攻击性或冒犯性的信息。为解决这些问题,可以使用特定的关键词集对文本进行扫描和过滤。例如:

    1. 过滤掉任何少于25个UTF-8单词的页面。
    2. 过滤掉网页数据中的HTML标签。
    3. 过滤掉不含常用词汇(如the, be, to, of, and, that, have, with,的,是,到,的,和,那个,有,与。)的文档。
    4. 过滤掉所有数据中的电话号码、邮箱地址及IP地址等隐私信息。

1.3 基于分类器的方法

        除了启发式规则,还可以训练文本分类器来判断数据质量并进行清洗。具体来说,可以对部分代表性数据进行质量标注,以此训练一个精准的文本质量分类器。例如,可将高质量数据作为正样本,从网页中筛选出含有不良或低质量数据的样本作为负样本。使用这种分类器可以精确识别并过滤低质量数据,从而显著提升语料库的整体质量。当然这里面涉及到一系列工作,比如需要明确什么样的数据被认为是高质量的。这可能包括数据的完整性、准确性、一致性、相关性和时效性。根据你的数据类型和质量标准,选择合适的分类器模型。提取有助于分类器区分高质量和低质量数据的特征,这可能包括统计特征、文本特征、图像特征等。

        基于分类器的方法可能会无意中删除一些低资源但高质量的文本(如文言文数据)。为减少误筛,可以使用多个分类器进行联合过滤或召回。此外,还可根据不同的评估维度训练不同的分类器,采用类似集成的方式进行全面过滤。目前常用的分类器方法包括轻量级模型(如FastText等)、可微调的预训练语言模型(如BERT、LLaMA3等)以及闭源大语言模型API(如GPT-4o、Claude 3.5)。

1.4 效率与准确性的平衡

        在数据清洗过程中,过滤效率也是需要考虑的重要因素。例如,基于启发式规则的方法由于其规则设计相对简单,可以迅速过滤大量文档集;而基于分类器的方法尽管能提供更高的精确度,但需要消耗更多的计算资源。因此,可以结合使用这两种方法以达到平衡——先通过启发式规则进行初筛,快速排除不符合要求的文档,再使用分类器进一步精细过滤,以确保最终语料的高质量。

2. BoostedBaggingFilter处理方法

2.1 项目目标

        关于基于分类器的数据过滤方法,想起很多年前自己做的一个项目中也涉及到类似的任务,需要从用户标注的数据中筛选出可靠性强的样本数据,过滤掉噪声数据,虽然时间久远,但思路也许还是可以参考,这里做下简单的介绍。该方法其实是基于多层次集成分类器的思想,称为BoostedBaggingFilter。

        当时项目的目标是增加对用户标注数据的自学习,提高算法自适应能力,使算法能够应对新数据的分类任务,并且能够有效提升现有算法的分类准确性。基本思路如下:

 (1)增加与原有数据相似的样本数据,即使用样本数据训练产生的算法模型,去识别更多的能够支持样本数据分类准确度的用户标注数据。也就是同类型但可能表达形式差异的数据。


 (2)增加原有样本数据不存在的新的分类数据。比如原有数据中不存在"Uber#交通出行",现有分类算法会使得Uber被判别为其他。用户对该流水Uber人为改为Uber#交通出行,那么通过识别算法可以将该正确的数据识别出来,将Uber#交通出行这条新的信息补充到训练样本中,使得现有分类算法具备对新数据的识别能力。

2.2 算法思路描述

总体算法框架示意图如下:
        

说明:

解决的问题:
用户标注数据(反馈信息)的有效利用。

方法:
采用两层标注数据过滤算法,识别和利用正确的用户标注数据。

  1. 第一层过滤算法:旨在识别与现有样本数据存在交叉信息的标注数据,有助于提高分类的准确性。
  2. 第二层过滤算法:旨在识别全新的、未在样本数据中出现过的标注数据,帮助分类算法更好地应对全新的数据来源情况。
  • 第一层过滤算法(橙色椭圆):使用 Biterm 特征结合多分类逻辑回归(OvsR),以样本数据作为训练集,识别出与样本数据存在交叉信息的数据来源。
  • 第二层过滤算法(红色椭圆):采用 Boosted Bagging Filter 算法,针对第一层算法未能识别的标注数据。这些数据可能包括明显存在分类误差的样本以及在现有样本数据中没有对应信息的全新数据,从而有效识别出用户标注的新数据。

算法测试结果:

  1. 对于备注特征与样本特征存在一定交集的用户标注数据,通过交叉验证测试,过滤后的用户标注数据准确率平均达到了 99%。
  2. 对于备注特征与样本特征没有交集的全新用户标注数据,过滤后的类别准确率为 99.3%,错误数据的召回率为 97.8%。

2.3 标注数据过滤算法详述

目的:通过算法对用户标注数据进行清洗,去除噪声数据。

2.3.1 第一层过滤算法流程

目标: 使用样本集训练一个基本的分类器 f,这里选择逻辑回归(Logistic Regression)作为分类器,策略为“一对多”(One-vs-Rest)。

流程:

  1. 对于每一个新的用户标注数据实例 x_i​,使用分类器f(x_i)进行预测,获得预测概率的最大值 \text{max}(f(x_i)),对应的类别为 y'_i
  2. 获取用户实际标注的类别 y_i。
  3. 如果\text{max}(f(x_i)) > ty'_i = y_i,则将该用户标注数据添加到训练集中,继续用于分类器训练;否则,将该数据放入候选标注数据集,交由第二层过滤算法处理。

测试结果:过滤算法对测试集中数据的预测类别与实际类别的平均匹配度达到了 99%。匹配准确率是指类别正确标注的比例。

2.3.2 第二层过滤算法

目标:基于带噪声的标注数据集 D = \{(x_i, y_i) \mid 1 \leq i \leq n\},通过迭代和加权抽样的方法识别并过滤掉噪声数据。实验参数设置为 Bootstrap 样本数 m = 10,迭代次数 T = 10,并使用逻辑回归(Logistic Regression)作为基本分类器。

流程:

  1. 初始化错误分类计数 TNC

    \text{TNC}(i) 表示第 i 个实例的错误分类次数,初始状态为 0:\text{TNC}(i) = 0, \, i = 1, \ldots, n
  2. 初始化实例选择权重 W

    W(i) 表示第 i 个实例的选择权重,初始状态为均匀分布:W(i) = \frac{1}{n}, \, i = 1, \ldots, n
  3. 迭代过程(从 t = 1 到 T):

    • 对每次迭代:
      • 对每次 Bootstrap 采样(从 j = 1 到 m):
        • 从数据集中根据权重 W 抽样生成样本集 S_j = \text{ResampleWithWeight}(D, W)
        • 用样本集 S_j 训练分类器 h_j = \text{buildClassifier}(S_j)
      • 重置局部错误计数 NC\text{NC}(i) = 0
      • 对每个实例 x_i​:
        • 检查所有分类器 hjh_jhj​ 的预测结果:
          • 如果 h_j(x_i) \neq y_i,则增加相应的错误计数:\text{NC}(i)++
        • 更新全局错误计数:\text{TNC}(i) = \text{TNC}(i) + \text{NC}(i)
      • 更新实例权重:
        • W(i) \leftarrow W(i) \times e^{-\text{NC}(i)}
        • 归一化权重:W(i) \leftarrow \frac{W(i)}{\sum W(i)}​。
  4. 返回按 TNC 升序排列的实例。

  5. 根据 TNC 结果:

    • TNC 为 0 的实例标记为正确分类。
    • TNC 大于等于 10 的实例标记为错误分类。

算法测试方式:

  • 从样本集中随机抽取 5000 个实例,设置噪声比例(Noise Rate)来模拟带噪数据。例如,噪声比例为 0.2 表示 5000 个样本中有 20% 的数据被标记为错误类别。

  • 计算准确率(Precision)和召回率(Recall):这里的准确率表示TNC为0的实例中被正确标注的实例个数与TNC为0的实例总个数的比例。而召回率是指TNC 非 0 的实例中包含的噪声实例个数与所有噪声实例总个数的比例。

算法测试结果:

噪音率准确率(Precision)召回率(Recall)
0.10.9980.986
0.20.9970.989
0.30.9920.985
0.60.9600.982
0.80.8750.985

代码示例(java),仅供参考:

package com.yuanquan.userlabelcleaning;

import com.yuanquan.liblinear.FeatureNode;
import com.yuanquan.liblinear.Model;
import com.yuanquan.utils.Utils;
import com.yuanquan.utils.SysCfgUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.*;

/**
 * <p>
 * Title:BoostedBaggingFilter
 * </p>
 * <p>
 * Description:
 * 第二层过滤算法BBF, 提取出新的用户标注信息
 * 通过bootstrap抽样,训练多个子分类器, 并通过调整每一个实例的权重使得最正确的数据可以被选择.
 * 由于用户标注数据经过第一层算法过滤后, 会更新到第二层算法数据池, 因此每次使用都需要重新训练,针对不同的现有数据池.
 * </p>
 *
 */
public class BoostedBaggingFilter {

    private static final Logger LOGGER = LoggerFactory.getLogger(BoostedBaggingFilter.class);

    private static int T;  //BBF模型迭代次数
    private static int NUM_BOOTSTRAP_SAMPLE; //bootstrap抽样次数
    private static int THRESHOLD_TRUE; //BBF算法中错误数小于该值,则被认为用户分类正确的可能性极大
    private static int THRESHOLD_FALSE; //BBF算法中错误数大于该值,则被认为用户分类错误的可能性极大

    private static String PRE_PATH;
    private static String BASIC_INFO;
    private HashMap<String, String> BasicInfo;

    public BoostedBaggingFilter(){
        try {
            PRE_PATH = SysCfgUtils.getInstance().getValue("PRE_PATH");
            BASIC_INFO = PRE_PATH + "basicInfo.txt";
            BasicInfo = loadBasicInfo();
            T = Integer.parseInt(SysCfgUtils.getInstance().getValue("T"));
            NUM_BOOTSTRAP_SAMPLE = Integer.parseInt(SysCfgUtils.getInstance().getValue("NUM_BOOTSTRAP_SAMPLE"));
            THRESHOLD_TRUE = Integer.parseInt(SysCfgUtils.getInstance().getValue("THRESHOLD_TRUE"));
            THRESHOLD_FALSE = Integer.parseInt(SysCfgUtils.getInstance().getValue("THRESHOLD_FALSE"));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public HashMap<String, String> loadBasicInfo() throws IOException {
        BufferedReader inputReader = new BufferedReader(new InputStreamReader(new FileInputStream(BASIC_INFO)));
        try {
            return loadBasicInfo(inputReader);
        } finally {
            inputReader.close();
        }
    }

    //基于集成bagging过滤算法, 筛选出能够可信度大的正确及错误数据
    public  ArrayList<ArrayList<Integer>> ClassifyByBoostedBaggingFilter(List<CategoryAndFeatures> noiseInstances) throws IOException {
        int lenOfNoiseInstances = noiseInstances.size();
        int[] TNC = new int[lenOfNoiseInstances];
        double[] Weights = new double[lenOfNoiseInstances];
        int[] instances = new int[lenOfNoiseInstances];
        for(int i=0;i<lenOfNoiseInstances;i++){
            TNC[i] = 0;
            instances[i] = i;
            Weights[i] = 1.0/lenOfNoiseInstances;
        }

        for(int t=0;t<T;t++){
            Model[] LRmodels = new Model[NUM_BOOTSTRAP_SAMPLE];
            LOGGER.info("T:"+t);
            for(int j=0;j<NUM_BOOTSTRAP_SAMPLE;j++){
                LOGGER.info("NUM_BOOTSTRAP_SAMPLE:"+t+"-"+j);
                int[] newInstances = resampleWithWeights(Weights, instances);
                String modelFilePath = "BBF_"+j+".txt";
                TrainingDataFormat TDF = constructTrainingFeature(noiseInstances, newInstances);
                Model model = BaseOvsRLogisticRegression.trainingByLR(TDF.getFeatures(),
                        Integer.parseInt(BasicInfo.get("NumberOfFeature")), TDF.getGROUPS_ARRAY(), modelFilePath, false);
                LRmodels[j] = model;
            }
            int[] NC = new int[lenOfNoiseInstances];
            //noise data classification
            for(int i=0;i<lenOfNoiseInstances;i++){
                CategoryAndFeatures currTestInstance = noiseInstances.get(i);
                for(int j=0;j<NUM_BOOTSTRAP_SAMPLE;j++){
                    Model model = LRmodels[j];
                    double[] prediction = BaseOvsRLogisticRegression.predict(model, currTestInstance.getFeatures());
                    double preClass = prediction[0];
                    if(preClass != currTestInstance.getCategory()){
                        NC[i] = NC[i] + 1;
                    }
                }
                TNC[i] = TNC[i] + NC[i];
            }

            for(int i=0;i<lenOfNoiseInstances;i++){
                Weights[i] = Weights[i] * Math.exp(-NC[i]);
            }
            Weights = normalize(Weights, sum(Weights));
        }

        // 按照TNC值升序返回noise Instances
        Map<Integer, Integer> TNC_instance = new HashMap<Integer, Integer>();
        for(int i=0;i<lenOfNoiseInstances;i++){
            TNC_instance.put(i, TNC[i]);
        }

        TNC_instance = Utils.sortByValue(TNC_instance);

        ArrayList<Integer> TrueInstance = new ArrayList<Integer>();
        ArrayList<Integer> FalseInstance = new ArrayList<Integer>();

        for(Map.Entry<Integer, Integer> entry : TNC_instance.entrySet()) {
            LOGGER.info(entry.getKey()+"\t"+TNC_instance.get(entry.getKey()));

            if(entry.getValue() < THRESHOLD_TRUE){
                TrueInstance.add(entry.getKey());
            }

            if(entry.getValue() > THRESHOLD_FALSE){
                FalseInstance.add(entry.getKey());
            }

        }

        //返回最正确的,和最错误的instance index
        ArrayList<ArrayList<Integer>> TrueFalseInstanceIndex = new ArrayList<ArrayList<Integer>>();
        TrueFalseInstanceIndex.add(TrueInstance);
        TrueFalseInstanceIndex.add(FalseInstance);

        return TrueFalseInstanceIndex;


    }

    public HashMap<String, String> loadBasicInfo(Reader inputReader) throws IOException {
        BufferedReader reader;
        if (inputReader instanceof BufferedReader) {
            reader = (BufferedReader)inputReader;
        } else {
            reader = new BufferedReader(inputReader);
        }

        HashMap<String, String> infos = new HashMap<String, String>();

        String line;
        while ((line = reader.readLine()) != null) {
            String[] split = line.split(SysCfgUtils.getInstance().getValue("SEPARATOR_sys"));
            infos.put(split[0],split[1]);
        }
        reader.close();

        return infos;

    }


    public TrainingDataFormat constructTrainingFeature(List<CategoryAndFeatures> noiseInstances, int[] newInstances) {
        int lenOfInstances = newInstances.length;
        FeatureNode[][] trainingFeature = new FeatureNode[lenOfInstances][];
        double[] targetArray = new double[lenOfInstances];
        for (int i = 0; i < lenOfInstances; i++) {
            int index = newInstances[i];
            trainingFeature[i] = noiseInstances.get(index).getFeatures();
            targetArray[i] = noiseInstances.get(index).getCategory();
        }
        TrainingDataFormat TDF = new TrainingDataFormat();
        TDF.setFeatures(trainingFeature);
        TDF.setGROUPS_ARRAY(targetArray);
        return TDF;
    }

    public int[] resampleWithWeights(double[] weights, int[] instances) {

        if (weights.length != instances.length) {
            throw new IllegalArgumentException("weights.length != numOfInstances.");
        }

        int numInstances = instances.length;

        int[] newData = new int[numInstances];
        if (numInstances == 0) {
            return newData;
        }
        Random random = new Random();
        double[] probabilities = new double[numInstances];
        double sumProbs = 0, sumOfWeights = sum(weights);
        for (int i = 0; i < numInstances; i++) {
            sumProbs += random.nextDouble();
            probabilities[i] = sumProbs;
        }
        normalize(probabilities, sumProbs / sumOfWeights);
        probabilities[numInstances - 1] = sumOfWeights;
        int k = 0; int l = 0;
        sumProbs = 0;
        int count = -1;
        while ((k < numInstances && (l < numInstances))) {
            if (weights[l] < 0) {
                throw new IllegalArgumentException("Weights have to be positive.");
            }
            sumProbs += weights[l];
            while ((k < numInstances) && (probabilities[k] <= sumProbs)) {
                count++;
                newData[count] = instances[l];
                k++;
            }
            l++;
        }
        return newData;
    }

    public double sum(double[] weights) {
        double summation = 0;
        for (double weight : weights) {
            summation = summation + weight;
        }
        return summation;
    }

    public double[] normalize(double[] doubles, double summation) {
        for (int i = 0, len = doubles.length; i < len; i++) {
            doubles[i] = doubles[i] * 1.0 / summation;
        }
        return doubles;
    }
}

3. 参考材料

【1】Textbooks Are All You Need

【2】LLM and Dataset Quality

【3】Data Collection and Preprocessing for Large Language Models

【4】RUC AI box-《大语言模型》

【5】Data-Juicer: A One-Stop Data Processing System for Large Language Models

【6】Towards Trustable Language Models: Investigating Information Quality of Large Language Models

【7】A Survey of Large Language Models

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2135264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习——数据预处理,张量降维

目录 一、数据预处理1.1 读取数据集1.2 处理缺失值1.3 转换为张量类型 二、张量2.1 张量算法的基本性质2.1.1 两个形状相同的张量相加2.1.2 哈达玛积2.1.3 与标量相加或相乘 2.2 降维2.2.1 对所有行的元素求和来降维&#xff08;轴0&#xff09;2.2.2 对所有列的元素求和来降维…

ISO15693讲解

ISO15693 工作频率为13&#xff0e;56 MHz的非接触式智能标签卡芯片&#xff0c;该芯片主要针对包裹运送、航空行李、租赁服务以及零售供应链管理等物流系统应用所新研发设计的一系列RFID射频识别芯片。 需求图鉴&#xff1a; 使用TTL模组 串口打印&#xff1a;

Webstorm Idea 系列3分钟安装激活使用教程

1. 下载好自己需要的版本。 自行需要,其他相关idea也一样 2. 点击安装【傻瓜式的安装】 下一步> 选择自己的安装路径 > 下一步直到安装完成 3. go go 3.1 首次使用需要打开后立即关闭 3.2 选择指定的方式 3.3 提示成功 3.4 打开软件查看信息2099 3.5 异常提示 若提示以…

Facebook主页,广告账户,BM被封分别怎么解决?

我们在投放facebook广告的过程中&#xff0c;经常会遇到FB主页&#xff0c;广告账户和BM被封的情况&#xff0c;这三者有啥区别呢&#xff1f;遇到被封的情况又该如何解决&#xff0c;本篇文章会一次性说清楚Facebook主页&#xff0c;广告账户&#xff0c;BM分别是什么&#xf…

LabVIEW中AVI帧转图像数据

在LabVIEW中&#xff0c;有时需要将AVI视频文件的帧转换为图像数据进行进一步处理。下面详细讲解了如何从AVI视频提取单帧并将其转换为图像数据集群&#xff0c;以便与其他图像处理VI兼容。 问题背景&#xff1a; 用户已经拥有能够处理JPEG图像数据集群的VI&#xff0c;现在希…

【C#】自动升级工具

系列文章 【C#】最全业务单据号生成&#xff08;支持定义规则、流水号、传参数&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;https…

资深盘点:国内外知名的ERP管理系统厂商有哪些?

已经考虑引入ERP系统却担心面临以下问题&#xff1f;ERP系统流程僵化难以调整&#xff1f;流程与实际业务脱节&#xff1f;培训不到位、技术支持不及时导致难以实现全员使用、共创&#xff1f;市面上的ERP系统众多不知道如何选择&#xff1f; 今天就根据2024最新市场动态&…

Shader Graph Create Node

一、Artistic 1、Adjustment 1)、Channel Mixer(通道混合) 根据权重对每个通道进行混合。 Contrast(对比度) 可调整对比度 调整对比度可以改变图像的鲜明度和层次感。增加对比度会使图像中的明暗差异更加显著&#xff0c;使图像看起来更加清晰、明亮&#xff1b;减少对比…

从单体到微服务:FastAPI ‘挂载’子应用程序的转变

在现代 Web 应用开发中&#xff0c;模块化架构是一种常见的设计模式&#xff0c;它有助于将大型应用程序分解为更小、更易于管理的部分。FastAPI&#xff0c;作为一个高性能的 Python Web 框架&#xff0c;提供了强大的支持来实现这种模块化设计。通过“挂载”子应用程序&#…

如何用 Helm Chart 安装指定版本的 GitLab Runner?

本分分享如何使用 Helm 来在 Kubernetes 集群上安装极狐GitLab Runner。整体步骤分为&#xff1a;Helm 的安装、vaules.yaml 文件的配置、Runner 的安装、Runner 的测试。 极狐GitLab 为 GitLab 在中国的发行版&#xff0c;中文版本对中国用户更友好。极狐GitLab 支持一键私有…

【新时代概论】新时代概论书目的结构(LP)

文章目录 前言一、结构导论第一章、新时代坚持和发展中国特色社会主义第二章、以中国式现代化全面推进中华民族伟大复兴第三章、坚持党的全面领导第四章、坚持以人民为中心第五章、全面深化改革开放第六章、推动高质量发展第七章、社会主义现代化建设的教育、科技、人才战略第八…

鸿蒙读书笔记1:《鸿蒙操作系统设计原理与架构》

笔记来自新书&#xff1a;《鸿蒙操作系统设计原理与架构》 HarmonyOS采用分层架构&#xff0c;从下到 上依次分为内核层、系统服务层、框架层和应用层。 1. 内核层 内核层主要提供硬件资源抽象和常用软件资源&#xff0c;包括进程/线程管 理、内存管理、文件系统和IPC&#xff…

若依plus-cloud nacos yml 动态获取 配置内容

这是剑走偏锋的写法。 直接上代码 在nacos中配置一个ruoyi-cms.yml 内容中有cms:filepath:******* springcloud配置 package org.dromara.cms.entity;import lombok.RequiredArgsConstructor; import org.springframework.core.env.Environment; import org.springframewo…

电脑怎么录屏?四款录屏工具分享

作为一个刚刚踏入视频创作领域的新手&#xff0c;我一直在寻找一款适合自己的录屏软件。最近&#xff0c;我尝试了四款市面上比较热门的录屏工具。今天&#xff0c;就让我来分享一下我的使用体验&#xff0c;希望能给同样在寻找录屏软件的朋友们一些参考。 一、福昕录屏大师 …

OpenCV运动分析和目标跟踪(1)累积操作函数accumulate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将一个图像添加到累积图像中。 该函数将 src 或其部分元素添加到 dst 中&#xff1a; dst ( x , y ) ← dst ( x , y ) src ( x , y ) if mask…

为什么矩阵特征值之和等于主对角线元素之和,特征值乘积等于行列式值

首先给出特征值和特征向量的定义。 设A是n阶矩阵&#xff0c;如果数λ和n维非零向量x使关系式 Axλx &#xff08;1&#xff09; 成…

DPO: Direct Preference Optimization 介绍

DPO 是 RLHF 的屌丝版本&#xff0c;RLHF 需要加载 4 个模型&#xff08;2个推理&#xff0c;2个训练&#xff09;&#xff0c;DPO 只需要加载 2 个模型&#xff08;1个推理&#xff0c;一个训练&#xff09;。 RLHF&#xff1a; DPO&#xff1a; DPO 原理 DPO 的本质是监督对…

canfd 卡 canfd-422ac在汽车电子测试中的大作用

随着汽车电子的高速发展&#xff0c;车内信息的急剧增多&#xff0c;传统的CAN总线的数据传输能力已经很难满足车辆ECU的数据传输需求了&#xff0c;此时CANFD就应运而生了。![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c3822ac2b2ed4694a58132e0b4743e99.png)CAN…

无需部署,云电脑带你秒变AI绘画大师

在人工智能的浪潮中&#xff0c;AI 绘画逐渐火爆&#xff0c;通过关键字描述就能让AI把你想要的画面完美展示出来。 当前最火的绘画软件当属 Midjonary&#xff0c; Midjourney 界面比较直观&#xff0c;适合新手以及非专业的用户&#xff0c;风格比较多样&#xff0c;可以轻松…

Python “集合” 100道实战题目练习,巩固知识、检查技术

本文主要是作为Python中列表的一些题目&#xff0c;方便学习完Python的集合之后进行一些知识检验&#xff0c;感兴趣的小伙伴可以试一试&#xff0c;含选择题、判断题、实战题、填空题&#xff0c;答案在第五章。 在做题之前可以先学习或者温习一下Python的列表&#xff0c;推荐…