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

文档分类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 npclass 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 outconfig=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.xdnf.cn/news/1424842.html

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

相关文章

Python——IO编程

IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。 比如你打开浏览器,访问新浪…

算法练习第22天|39. 组合总和、40.组合总和II

39. 组合总和 39. 组合总和 - 力扣(LeetCode)https://leetcode.cn/problems/combination-sum/description/ 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数…

宝塔助手是以宝塔Linux面板提供的API开发的一款可以随时随地管理服务器的APP

【软件介绍】手机操控云服务器的神器软件,本人亲测在用,好用极了! 【软件名称】宝塔助手 【软件包名】com.lensyn.zsbt 【软件版本】1.4.1 【软件大小】29.00M 【适用系统】安卓 【软件特色】宝塔助手是以宝塔Linux面板提供的API开发的一款可…

Unity 2021 升级至团结引擎

UnityWebRequest 报错 InvalidOperationException: Insecure connection not allowed 解决方法 不兼容jdk 8 需要安装 JDK11 64bit 必须JDK 11,高版本也不行 安卓环境hub 未给我安装完全。 Data\PlaybackEngines\AndroidPlayer 并没有NDK,SDK。但是 HUB 显示已经…

其实解决问题的方法很简单

大家好!我是编码小哥,欢迎关注,持续分享更多实用的编程经验和开发技巧,共同进步! 本例是一个动态数组的例子,实现数据的增加、删除、根据索引修改数值、获取数值。 dynamic_array.c #include "dy…

月薪3万,沉迷“薅羊毛”

在网购江湖中,蟹老板是一位拥有十年经验的资深“羊毛党”。 他不仅是位精明的数学家,更是一位高效的“生产线”工人,专注于各大网购平台的优惠机制。每逢618大促,他总能凭借超凡的洞察力和手速,轻松斩获丰厚的“羊毛”…

每日一题——力扣26. 删除有序数组中的重复项(举一反三)

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客​专栏:每日一题——举一反三 目录 我的写法: 代码点评: 时间复杂度分析: 空间复杂度分析: 总结: 我要更好&am…

ue引擎游戏开发笔记(41)——行为树的建立(2)--丰富ai行为:巡逻后返回原处

1.需求分析: 就敌人ai而言,追踪到敌人有可能丢失目标,丢失目标后应该能返回原来位置,实现这一功能。 2.操作实现: 1.思路:利用clear value函数,禁用掉当前的追踪功能,执行之后的返…

Java | Leetcode Java题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; class Solution {public int numDecodings(String s) {int n s.length();// a f[i-2], b f[i-1], cf[i]int a 0, b 1, c 0;for (int i 1; i < n; i) {c 0;if (s.charAt(i - 1) ! 0) {c b;}if (i > 1 && s.charAt(i …

C++ 计时器

文章目录 一、简介二、实现代码2.1 windows平台2.2 C标准库 三、实现效果 一、简介 有时候总是会用到一些计时的操作&#xff0c;这里也整理了一些代码&#xff0c;包括C标准库以及window自带的时间计算函数。 二、实现代码 2.1 windows平台 StopWatch.h #ifndef STOP_WATCH_H…

C++ static_cast学习

static_cast可实现&#xff0c; 1 基本类型之间的转换 2 void指针转换为任意基本类型的指针 3 用于有继承关系的子类与父类之间的指针或引用的转换 用于基本类型转化时&#xff0c;会损失精度类似于C语言的强制转化&#xff1b; 下面先看一下void指针的转换&#xff1b; …

CSS学习笔记之中级教程(二)

-.CSS学习笔记之中级教程&#xff08;一&#xff09; 6、CSS 布局 - display: inline-block 与 display: inline 相比&#xff0c;主要区别在于 display: inline-block 允许在元素上设置宽度和高度。 同样&#xff0c;如果设置了 display: inline-block&#xff0c;将保留上下…

【数据库】知识总结(期末复习)

题型&#xff1a; 一、选择题(共10题&#xff0c;每题2分&#xff0c;共20分) 二、填空题(共10空&#xff0c;每空1分&#xff0c;共10分) 三、关系代数计算题&#xff08;共5题&#xff0c;每题2分&#xff0c;共10分&#xff09; 四、SQL计算题(共10题&#xff0c;每题3分…

C++ | Leetcode C++题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode *reverseBetween(ListNode *head, int left, int right) {// 设置 dummyNode 是这一类问题的一般做法ListNode *dummyNode new ListNode(-1);dummyNode->next head;ListNode *pre dummyNode;for (i…

东莞酷得电子方案 遥控水弹坦克车

首先遥控小车是一种能够通过无线遥控器进行远程操控的小型机器人。遥控小车应用了哪些软硬件技术呢&#xff1f;本文将从以下几个方面进行详细介绍。 遥控小车应用了多种软硬件技术&#xff0c;涉及底盘结构、动力系统、传感器、控制器等多个方面。 底盘结构&#xff1a;遥控…

PostgreSQL扩展之PGroonga:多语言全文搜索

简介 PGroonga 是一个 PostgreSQL 扩展&#xff0c;它增加了基于 Groonga 的全文搜索索引方法。虽然原生的 PostgreSQL 支持全文索引&#xff0c;但它仅限于基于字母和数字的语言。PGroonga 提供了更广泛的字符支持&#xff0c;使其成为 PostgreSQL 支持的语言的超集&#xff…

【考研数学】张宇《1000题》强化阶段正确率多少算合格?

张宇1000题真的很练人心态.... 基础不好&#xff0c;建议别碰1000题 基础好&#xff0c;1000题建议在两个月以内刷完 如果自己本身在基础阶段学的比较水&#xff0c;自己的薄弱点刷了一小部分题没有针对性完全解决&#xff0c;转身去刷1000题就会发现&#xff0c;会的题目刷…

一线互联网大数据面试题核心知识库(100万字)

本面试宝典涵盖大数据面试高频的所有技术栈&#xff0c;包括Liunx&Shell基础&#xff0c;Hadoop&#xff0c;Zookpeer&#xff0c;Flume&#xff0c;Kafka&#xff0c;Hive&#xff0c;Datax&#xff0c;Maxwell&#xff0c;DolphinScheduler&#xff0c;Spark Core&SQ…

王炸!OpenAI全新模型GPT-4o推出!免费使用,实时语音视频交互来了!

北京时间5月14日凌晨&#xff0c;OpenAI 春季新品发布会举行&#xff0c;新一代旗舰生成模型 GPT-4o来了。GPT-4o 的推出代表着技术进步的一大步&#xff0c;集成了文本、语音和图像三种模态&#xff0c;使人机交互更加自然和高效。 这样的话&#xff0c;目前可以使用的版本包括…

[Linux][网络][高级IO][三][IO多路转接][epoll]详细讲解

目录 1.IO多路转接之epoll1.epoll初识2.epoll_create()3.epoll_ctl()4.epoll_wait()5.epoll工作原理6.epoll使用过程三部曲7.epoll的优点(和select缺点对应)8.思考 && 问题 2.epoll工作方式0.感性理解 && 铺垫1.水平触发(Level Triggered)工作模式2.边缘触发(E…