文档分类FastText模型 (pytorch实现)

news2025/1/23 2:05:35

文档分类FastText

        • FastText简介
        • 层次softmax
        • N-gram特征
        • FastText代码(文档分类)

FastText简介

FastText与之前介绍过的CBOW架构相似,我们先来会议一下CBOW架构,如下图:

在这里插入图片描述

CBOW的任务是通过上下文去预测中间的词,具体做法是使用滑动窗口内部的词的embedding的均值作为中间词的embedding。

FastText的任务是通过文章中的词去预测文章的类别(文档分类),具体做法是使用文章中的所有词的embedding的均值作为文章的embedding。最后从隐层再经过一次的非线性变换得到输出层的label。

CBOW和FastText的相似之处:

  1. 每个特征都是词向量的平均值。

总结一下CBOW和FastText的不同之处:

  1. FastText是有监督学习,而CBOW是无监督学习
  2. FastText是预测文章的label,而CBOW是预测中心词
  3. FastText使用的是文章中所有词的embedding,而CBOW使用的是中心词所在滑动窗口内其他所有词的embedding

从模型架构上来说,沿用了CBOW的单层神经网络的模式,不过fastText的处理速度才是这个算法的创新之处。

fastText模型的输入是一个词的序列(一段文本或者一句话),输出是这个词序列属于不同类别的概率。在序列中的词和词组构成特征向量,特征向量通过线性变换映射到中间层,再由中间层映射到标签。fastText在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。

fastText是一个快速文本分类算法,与基于神经网络的分类算法相比有两大优点:

  1. fastText在保持高精度的情况下加快了训练速度和测试速度
  2. fastText不需要预训练好的词向量,fastText会自己训练词向量
  3. fastText两个重要的优化:Hierarchical Softmax、N-gram

fastText方法包含三部分,模型架构,层次SoftmaxN-gram特征。

层次softmax

分层 softmax(Hierarchical Softmax)是一种用于加速词嵌入模型训练的技术,特别是在训练大型词汇表时。它通过将词汇表组织成一棵二叉树(通常是霍夫曼树),从而将原来的线性 softmax 运算转换为对树结构进行的多次二元分类,从而减少了计算量。

在这里插入图片描述

构建哈夫曼树

  • 首先,根据词汇表中每个词的词频构建一棵霍夫曼树。
  • 霍夫曼树是一种最优的二叉树,它通过最小化编码长度来实现对频繁出现的词进行更短的编码,以及对不太频繁出现的词进行较长的编码。

在这里插入图片描述

对数学模型进行改造

  • 对于一个普通的 softmax 模型,它的输出层是一个与词汇表大小相同的全连接层,需要对所有词汇进行一次计算。
  • 而在分层 softmax 中,将词汇表组织成二叉树,每个内部节点代表一个二元分类任务。模型的输出层不再是一个全连接层,而是根据霍夫曼树的结构构建的一系列内部节点。

预测过程

  • 在预测过程中,对于给定的目标词,从树的根节点开始,根据二元分类的规则逐级向下遍历,直到达到叶子节点,从而确定目标词的概率分布。
  • 通过遍历的路径,可以确定目标词在霍夫曼树中的编码,从而得到目标词的概率分布。

我们发现对于每一个节点,都是一个二分类[0,1],也就是我们可以使用sigmod来处理节点信息;
θ ( x ) = 1 1 + e − x \theta \left(x \right)=\frac{1}{1+e{-x}} θ(x)=1+ex1
此时,当我们知道了目标单词x,之后,我们只需要计算root节点,到该词的路径累乘,即可. 不需要去遍历所有的节点信息,时间复杂度变为O(log2(V))。

N-gram特征

n-gram是基于语言模型的算法,基本思想是将文本内容按照字节顺序进行大小为N的窗口滑动操作,最终形成窗口为N的字节片段序列。而且需要额外注意一点是n-gram可以根据粒度不同有不同的含义,有字粒度的n-gram和词粒度的n-gram,下面分别给出了字粒度和词粒度的例子:

#我爱中国
2-gram特征为:我爱 爱中 中国
3-gram特征为:我爱中 爱中国

#我 爱 中国
2-gram特征为:我/爱 爱/中国
3-gram特征为:我//中国

从上面来看,使用n-gram有如下优点

  1. 为罕见的单词生成更好的单词向量:根据上面的字符级别的n-gram来说,即是这个单词出现的次数很少,但是组成单词的字符和其他单词有共享的部分,因此这一点可以优化生成的单词向量。
  2. 在词汇单词中,即使单词没有出现在训练语料库中,仍然可以从字符级n-gram中构造单词的词向量。
  3. n-gram可以让模型学习到局部单词顺序的部分信息, 如果不考虑n-gram则便是取每个单词,这样无法考虑到词序所包含的信息,即也可理解为上下文信息,因此通过n-gram的方式关联相邻的几个词,这样会让模型在训练的时候保持词序信息。

但正如上面提到过,随着语料库的增加,内存需求也会不断增加,严重影响模型构建速度,针对这个有以下几种解决方案:
1、过滤掉出现次数少的单词
2、使用hash存储
3、由采用字粒度变化为采用词粒度

FastText代码(文档分类)
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np


class Config(object):
    """配置参数"""

    def __init__(self):
        self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')  # 设备
        self.dropout = 0.5  # 随机失活
        self.require_improvement = 1000  # 若超过1000batch效果还没提升,则提前结束训练
        self.num_classes = 10  # 类别数
        self.n_vocab = 10000  # 词表大小,在运行时赋值
        self.num_epochs = 20  # epoch数
        self.batch_size = 128  # mini-batch大小
        self.pad_size = 32  # 每句话处理成的长度(短填长切)
        self.learning_rate = 1e-3  # 学习率
        self.embed = 300  # 字向量维度
        self.hidden_size = 256  # 隐藏层大小
        self.n_gram_vocab = 250499  # ngram 词表大小


'''Bag of Tricks for Efficient Text Classification'''


class Model(nn.Module):
    def __init__(self, config):
        super(Model, self).__init__()
        self.embedding = nn.Embedding(config.n_vocab, config.embed, padding_idx=config.n_vocab - 1)
        self.embedding_ngram2 = nn.Embedding(config.n_gram_vocab, config.embed)
        self.embedding_ngram3 = nn.Embedding(config.n_gram_vocab, config.embed)
        self.dropout = nn.Dropout(config.dropout)
        self.fc1 = nn.Linear(config.embed * 3, config.hidden_size)
        self.fc2 = nn.Linear(config.hidden_size, config.num_classes)

    def forward(self, x):
        out_word = self.embedding(x[0])  # x[0] [batch_size,sentence_len] 经过embedding变为 [batch_size,sentence_len,wmbed_size] torch.Size([128, 32, 300])
        out_bigram = self.embedding_ngram2(x[2])  # torch.Size([128, 32, 300])
        out_trigram = self.embedding_ngram3(x[3])  # torch.Size([128, 32, 300])
        out = torch.cat((out_word, out_bigram, out_trigram), -1)  # torch.Size([128, 32, 900])
        out = out.mean(dim=1)  # torch.Size([128, 900]),沿着第二个维度(即特征维度)对每个样本的特征值进行平均池化
        out = self.dropout(out)  # torch.Size([128, 900])
        out = self.fc1(out)  # torch.Size([128, 900])经过fc1 torch.Size([128, 256])
        out = F.relu(out)  # torch.Size([128, 256])
        out = self.fc2(out)  # torch.Size([128, 256])经过fc1 torch.Size([128, 10])
        return out

config=Config()
model=Model(config)
print(model)

输出:

Model(
  (embedding): Embedding(10000, 300, padding_idx=9999)
  (embedding_ngram2): Embedding(250499, 300)
  (embedding_ngram3): Embedding(250499, 300)
  (dropout): Dropout(p=0.5, inplace=False)
  (fc1): Linear(in_features=900, out_features=256, bias=True)
  (fc2): Linear(in_features=256, out_features=10, bias=True)
)

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

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

相关文章

项目管理重点及笔记【太原理工大学24年】

为了自己复习写的,可能会有不清楚,可以选择性看可以讨论,但别骂我写的什么烂东西,,,(电脑看排版更好看些) 目录 一、IT项目管理概述 二、IT项目组织环境与管理过程 三、整体管理 四、…

使用httpx异步获取高校招生信息:一步到位的代理配置教程

概述 随着2024年中国高考的临近,考生和家长对高校招生信息的需求日益增加。了解各高校的专业、课程设置和录取标准对于高考志愿填报至关重要。通过爬虫技术,可以高效地从各高校官网获取这些关键信息。然而,面对大量的请求和反爬机制的挑战&a…

【汇编】算术指令

一、加法指令 (一)各加法指令的格式及操作 加法指令可做字或字节运算 (1)加法指令 ADD 格式:ADD DST,SRC执行的操作:(DST) ← (SRC)(DST) (2)带进位加法指令 ADC 格式&#xf…

【C语言】自定义类型之---结构体超详解(结构体的定义使用、指针结构体,内存对齐,......代码详解)

目录 前言: 一:结构体 1.1:什么是结构体? 1.2:结构体类型的声明 1.3:结构体变量的定义 1.4:结构体的内存对齐 1.5:结构体传参 二:位段 2.1:位段是什…

反爬-简单滑块思路,秒了~

文章目录 找图片的返回包curl 大法获取图片链接ddddocr分析距离看结果秒了~ 本文仅供参考学习,如有侵权,请联系作者删。 目标地址:aHR0cHM6Ly9pZHMuZ2RpdC5lZHUuY24vYXV0aHNlcnZlci9sb2dpbj9zZXJ2aWNlPWh0dHBzOi8vd2JkdC5nZGl0LmVkdS5jbi9zaG…

2024 Google I/O Android 相关内容汇总

2024 Google I/O Android 相关内容汇总 本次 Google I/O 的核心虽然是 AI ,但是 Android 也是作为主要议题出现, Android 部分可以简单分为产品和开发相关内容,接下来主要介绍这两部分的相关更新。 重点开始开发相关,内容不少 产…

2010-2024年各地级市社会信用体系建设匹配DID数据

2010-2024年各地级市社会信用体系建设匹配DID数据 1、时间:2010-2024年 2、指标:行政区划代码、年份、所属省份、地区、社会信用体系建设示范区 3、范围:310个地级市 4、来源:国家发改委 5、指标解释: 社会信用体…

webpack优化构建速度示例-babel-loader开启缓存cacheDirectory:

babel-loader 默认并没有开启缓存。尽管babel-loader有自己的缓存机制,但它并不与webpack的缓存机制相冲突。相反,它们可以协同工作,以提供最佳的构建性能。 src/index.js import {otherSomeFuction} from ./module; console.log(otherSomeF…

LeetCode322:零钱兑换

题目描述 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无…

Kotlin核心编程知识点-02-面向对象

文章目录 1.类和构造方法1.1.Kotlin 中的类及接口1.1.1.Kotlin 中的类1.1.2.可带有属性和默认方法的接口 1.2.更简洁地构造类的对象1.2.1.构造方法默认参数1.2.2.init 语句块1.2.3.延迟初始化:by lazy 和 lateinit 1.3.主从构造方法 2.不同的访问控制原则2.1.限制修…

24长三角A题思路+分析选题

需要资料的宝子们可以进企鹅获取 A题 问题1:西湖游船上掉落华为 mate 60 pro 手机 1. 手机掉落范围分析 物品特征:华为 mate 60 pro 手机的尺寸、重量、形状等特性。静水假设:西湖水面平静,不考虑水流影响。掉落位置&#xff…

多态:解锁面向对象编程的无限可能

1. 概述 多态(Polymorphism)是面向对象编程的三大核心特性之一(另两个是封装和继承)。多态意味着不同的对象对同一消息做出不同的响应。简单来说,多态允许你使用父类引用指向子类对象,并且当调用方法时&am…

Jmeter使用While控制器

1.前言 对于性能测试场景中,需要用”执行某个事物,直到一个条件停止“的概念时,While控制器控制器无疑是首选,但是在编写脚本时,经常会出现推出循环异常,获取参数异常等问题,下面总结两种常用的…

如何看待Agent的爆火

在2023年3月,一个名为AutoGPT的框架项目引发了一场AI Agent热潮。这个项目利用大型语言模型,将大任务拆分成小任务,并使用工具完成它们。这种技术将大语言模型处理语言、创造内容和逻辑推理的能力扩展到了应用场景中,还加入了感知…

代码随想录——填充每个节点的下一个右侧节点指针 II(Leetcode117)

题目链接 层序遍历 /* // Definition for a Node. class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val _val;}public Node(int _val, Node _left, Node _right, Node _next) {val _val;left _l…

Android setMaxLifecycle和BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT浅析

前言 最近公司动荡,我在的项目受大环境影响收益每年下滑,可能要领盒饭了,所以最近都在复习相关基础内容,毕竟小脑袋瓜会忘记以前学过的东西。 在ViewPager和Fragment的懒加载中,具体的原理是怎么样的呢?为…

多联机常见各部件功能及常见机组制冷原理图

一、各部件名称和主要功能 1、压缩机 压缩机根据实际系统需要,调整其转速达到节能目的。 2、压缩机油温加热带 在待机状态下,保证压缩的油温确再启动可靠性。 3、压缩机 排气 感温包 检测压缩机的排气温度,达到控制和保护目的。 4、高压开…

告别手动截图!手把手教您在教程制作中,如何自动生成Windows操作步骤

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 操作演示 📒📝 记录器📝 操作步骤⚓️ 相关链接 ⚓️📖 介绍 📖 🚀 探索Windows的隐藏宝藏 —— 步骤记录器:你的操作,它来记录! 你是否曾经希望有一个助手,能够自动记录下你在电脑上的每一个操作步骤?无论是为…

电机控制系列模块解析(20)—— MTPA

一、MTPA MTPA 是 "Maximum Torque Per Ampere" 的缩写,意为“最大转矩电流比”。在电机控制系统中,特别是永磁同步电机(PMSM)或其它永磁电机的控制策略中,MTPA 控制旨在实现电机在给定负载条件下&#xff…

24年湖南三支一扶报名流程图及报名照片要求

24湖南三支一扶报名流程图,照片要求☑️ ✔️报名时间:5月15日9:00至5月23日17:00 ✔️报名方式 报考人员登录市州人力资源社会保障局官网、市州人事考试网等查看各地公告,按要求报名。 ✔️报名流程(湖南各地市单独报名&…