NLP投满分项目学习

day01

打印对象的所有属性

对象.__dict__.items()

Counter的使用

nsmallest和tolist

print(f'长度最小值内容:{df["text"].tolist()[idx]}')

# 最小的十条
print(df.nsmallest(10, 'text-length'))

TF-IDF的使用

TF范围小:两个字符

IDF范围大:三个字符

TF-IDF = 词频(TF) × 逆文档频率(IDF)衡量词对“某篇文档”有多重要

  • TF(词频):词在当前文档有多频繁
    公式:词在当前文档中出现的次数 / 文档总词数
  • IDF(逆文档频率):词在所有文档中有多罕见
    → 公式:log(总文档数 / 包含该词的文档数)

TfidfVectorizer :去掉无用的停用词,文本转向量,数字大小表示词在当前文档有多频繁,在所有文档中有多罕见

day02

join支持字符串

' '.join('asdfasdf')

多分类评价指标注意点

注意:多分类(非二分类)使用accuracy_score、precision_score、recall_score、f1_score的时候需要加上average=’macro’,否则会报错

# average='macro':计算每个类别的精确率,然后求算术平均
# average='binary':按照二分类的逻辑去计算
print('准确率', accuracy_score(y_test, y_pre))
print('精确率', precision_score(y_test, y_pre, average='macro'))
print('召回率', recall_score(y_test, y_pre, average='macro'))
print('f1', f1_score(y_test, y_pre, average='macro'))

随机森林

基于baggin思想由多颗决策树组成的集成学习算法。

n_jobs=-1, # 并行处理

RandomForestClassifier(
    n_estimators=100,          # 决策树数量
    min_samples_split=5,       # 最小分割样本数
    min_samples_leaf=2,        # 叶节点最小样本数  
    n_jobs=-1,                 # 并行处理
    max_features='sqrt'       # 特征选择策略
)

预测

# 1. 加载验证数据
dev_data = pd.read_csv(config.process_dev_path)

# 2. 特征转换
dev_features = tfidf.transform(dev_data['words'])

# 3. 批量预测
dev_pre = model.predict(dev_features)

# 4. 保存结果
df = pd.DataFrame({'words': dev_data['words'], 'label': dev_pre})
df.to_csv(config.model_predict_result, index=False)

day03

Bert模型原理,文本分类流程

原理: 三层 Embedding 相加作为输入多层双向 Transformer 编码器提取特征输出上下文向量

文本分类:采用bert模型输出的第一个位置的向量,[CLS] 用于分类,因为它包含了句子的所有语义信息。

image-20260718162054420

fasttext模型结构和原理

模型结构:输入层、隐藏层、输出层

原理:

输入层: 提取所有的词和 N-gram 子词,并查找对应的向量
隐藏层:向量求和并取平均(词向量和字词向量)
输出层: 线性计算并通过Softmax输出概率

底层还用到了层次softmax来提升训练和推理速度,训练的时候还应用了负采样来提升训练速度。

image-20260718162225610

day04

为什么要使用模型压缩

让模型的体积更小,速度更快,有利于适配不同的硬件平台

transformer可以并行计算,效率碾压RNN的底层本质原因

transformer不需要逐个词依次输入,而是将句子作为一个矩阵一次性输入模型,因为内部实际上就是主要就是矩阵乘法等运算,输入行维度和矩阵列维度相等,就可以进行矩阵运算。

低秩因式分解的目的和大致原理

目的:对大模型进行压缩

大致原理:通过某些算法将大模型的参数矩阵分解参数小的矩阵相乘,从而减少总参数量

动态量化、静态量化、量化感知训练

  • 动态量化只量化权重,推理时动态计算激活值范围并实时量化。优点是易用(无需校准数据),缺点是速度提升有限。
  • 静态量化权重和激活值都量化,推理前用校准集提前算出激活值的固定缩放参数。优点是推理更快,缺点是需要少量数据做校准。
  • 量化感知训练在训练中模拟量化误差(伪量化),让模型参数适应低精度。优点是精度损失最小,缺点是需要训练数据和额外计算成本。

一句话串联核心区别
动态只量化权重(事后处理),静态量化权重+激活(预先校准),QAT在训练时就模拟量化(精度最高)。

结构化和非结构化剪枝

1.结构化剪枝(Structured Pruning)
是什么:以网络中的完整结构单元为单位进行剪枝(如一行,或者一列,卷积滤波器、通道、整个网络层等)。
核心特点:
粗粒度:移除整个结构单元。
保持密集结构:剪枝后的模型仍是规则密集矩阵,无需特殊硬件支持。

2.非结构化剪枝(Unstructured Pruning)
是什么:以单个权重参数为单位进行剪枝(一个参数,细粒度)。
核心特点:
细粒度:可精确移除权重矩阵中的任意独立参数(如将某个权重置零)。
生成稀疏矩阵:剪枝后矩阵中存在大量零值,形成不规则稀疏模式。

image-20260718162645242

模型蒸馏

image-20260718164507047

模型蒸馏是一种通过将一个复杂模型(教师模型)的知识转移给一个简单模型(学生模型)的方法,以提高学生模型的性能。在减小模型体积的同时,保持或提升模型性能。

硬标签是指传统监督学习中使用的确定性分类标签,通常是一个 one-hot 向量,表示样本属于哪个类别。

软标签是指教师模型输出的概率分布,表示其对每个类别的预测信心。是知识蒸馏中的关键。

中间层指的是神经网络中非最终输出的隐藏层表示,通常是特征图或向量。

三种蒸馏方式

① 硬标签蒸馏

学生模型直接学习教师模型硬标签,即教师模型预测的具体类别作为学生的label。

损失函数:交叉熵损失

②软标签蒸馏

学生模型学习真实的标签和教师模型软标签,将两种losss进行相加来更新学生模型的参数。

③中间层蒸馏

教师模型中间层的特征表达方式,让学生具备更相似的“思考过程”

KL散度

image-20260718164023643

软硬标签温度

image-20260718164153726

本文为 程序员青阳 原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文链接及本声明。

原文链接:https://heliufang.github.io/posts/f1391a2c/index.html