文本分类fastText算法

文本分类fastText算法

1. 概述

在深度学习遍地开花的今天,浅层的网络结构甚至是传统的机器学习算法被关注得越来越少,但是在实际的工作中,这一类算法依然得到广泛的应用,或者直接作为解决方案,或者作为该问题的baseline,fastText就是这样的一个文本分类工具。fastText是2016年由facebook开源的用于文本分类的工具,fastText背后使用的是一个浅层的神经网络,在保证准确率的前提下,fastText算法的最大特点是快。

2. 算法原理

2.1. fastText的模型结构

fastText是如何保证速度的呢?首先fastText的模型结构如下所示:

www.zeeklog.com  - 文本分类fastText算法

假设文本有 N N N个词,如上图所示,首先将这 N N N个词映射成词向量,可以通过矩阵 A A A实现,得到 N N N个词的向量后,将这些向量相加并取均值,得到该段文本的向量表示,最后输入到线形分类器中,得到最终的分类。从模型结构上来看,模型结构也是相当简单,只是是逻辑回归LR模型的基础上增加了句子向量的计算。对于分类问题,其损失函数为:

L = − ∑ i = 1 c y i l o g ( σ ( w x ) ) L=-\sum_{i=1}^{c}y_ilog\left ( \sigma \left ( wx \right ) \right ) L=−i=1∑c​yi​log(σ(wx))

其中, c c c表示的是类别, σ \sigma σ为激活函数,通常采用sigmoid函数。

2.2. 层次softmax

为了简化问题,假设隐含层的为 x x x,那么对于 x x x,其属于第 i i i个类别的概率为:

P ( c i ∣ w 1 , w 2 , ⋯ , w i , ⋯ , w c , x ) = e x p ( w i x ) ∑ j = 1 c e x p ( w j x ) P\left ( c_i\mid w_1,w_2,\cdots ,w_i,\cdots ,w_c,x \right )=\frac{exp\left ( w_ix \right )}{\sum_{j=1}^{c}exp\left ( w_jx \right )} P(ci​∣w1​,w2​,⋯,wi​,⋯,wc​,x)=∑j=1c​exp(wj​x)exp(wi​x)​

如果类别较多时,上述公式的分母的计算会严重降低算法的速度,借鉴word2vec中的经验,使用层次softmax可以加速计算,带有层次softmax加速的fastText结构可以表示为:

www.zeeklog.com  - 文本分类fastText算法


如上图,最下面是一个Huffman树,每个叶子节点代表一个类别,这样可以对每一个叶子节点编号。同时,假设一个Huffman树有 V V V个叶子节点,那么该树有 V − 1 V-1 V−1个非叶子节点,将上述的Huffman树抽象出来,如下图所示:

www.zeeklog.com  - 文本分类fastText算法

对于特征 x x x该如何计算类别,如上图中,对于每一个叶子节点,都有对应的编码,如叶子节点 c 1 c_1 c1​的编码为:0000,叶子节点 c 7 c_7 c7​的编码为:11。对于Huffman树的构建过程非本文的重点,不在本文中重复。在模型参数初始化过程中,需要同时初始化非叶子节点的向量表示,如图中的 a 1 , a 2 , ⋯ , a 6 a_1,a_2,\cdots ,a_6 a1​,a2​,⋯,a6​,假设对于特征 x x x,其所属的类别为 c 3 c_3 c3​,因此找到 c 3 c_3 c3​的编码和路径,我们发现需要经过的非叶子节点为: a 1 , a 2 , a 4 a_1,a_2,a_4 a1​,a2​,a4​,其对应的编码为:001,因此计算过程为:

P ( c 3 ∣ a 1 , a 2 , ⋯ , a 6 , x ) = ( 1 − σ ( a 1 x ) ) ⋅ ( 1 − σ ( a 2 x ) ) ⋅ σ ( a 4 x ) P\left ( c_3\mid a_1,a_2,\cdots ,a_6,x \right )=\left ( 1-\sigma \left ( a_1x \right ) \right )\cdot \left ( 1-\sigma \left ( a_2x \right ) \right )\cdot \sigma \left ( a_4x \right ) P(c3​∣a1​,a2​,⋯,a6​,x)=(1−σ(a1​x))⋅(1−σ(a2​x))⋅σ(a4​x)

同样,每一个非叶子节点的向量也参与模型的训练。在预测过程中,直接可以计算出属于每一个叶子节点的概率。

参考文献

  • Armand Joulin, Edouard Grave, Piotr Bojanowski, and Tomas Mikolov. Bag of tricks for efficient text classification. arXiv preprint arXiv:1607.01759, 2016
更多内容请访问:

Read more

Html学习总结(2)——Html页面head标签元素的意义和应用场景

Html学习总结(2)——Html页面head标签元素的意义和应用场景

相信在html5之前,很少人会关注html页面上head里标签元素的定义和应用场景,可能记得住的只有"title"、"keyword"和"description"这些meta在逐渐了解使用html新标准后,特别是移动页面的开发普及,可以看到html中这一块内容越来越重要为大家所认识,初次见到这些标签基本是摸不着头脑,今天就来梳理这些标签的定义(以html5标准展开); 先来一个页面概括,head标签不分排序先后: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Title</title> <meta content="keyword&

By Ne0inhk
【腾讯云 Cloud Studio 实战训练营】Redisgo_task 分布式锁实现

【腾讯云 Cloud Studio 实战训练营】Redisgo_task 分布式锁实现

文章目录 * * * * 前言 问题场景 随着云技术的成熟,各大厂商为提升服务质量、降低生产成本、加快产品迭代效率,都提倡服务上云,分享云技术带来的便利。 而作为开发人员,总会被这样的问题时不时烦恼:接手或搭建项目时,由于自身机器的环境变量、sdk 包版本、等因素,导致服务无法正常启动、或者是在本地搭建环境需要依赖多种基础存储、组件,小小的 Mac 几G的存储完全 Hold 不住,尤其涉及算法同学感受极深、或者压根都不想把公司的代码库放到自己的电脑上,弄的公私不分… 其实,不光是研发人员,领导们也很纠结,怕存在代码泄漏、等安全问题。 针对这种特有场景,云提供了一种简单、便捷的解决方案。在解决研发问题的同时,也规避了某中安全问题,甚至提升了功能交付效率。 下面给大家介绍 腾讯云 Cloud Studio ,一种 “在线编程 · AI-辅助开发” 云上工具。 腾讯云 Cloud Studio * 官网地址:

By Ne0inhk
谈谈普通码农如何不靠工资也能月入过万

谈谈普通码农如何不靠工资也能月入过万

人活着是是为了吃饭,吃饭是为了活着,呵呵。 要吃饭就得有钱,要钱就得工作,工作是为了挣钱。实际上对于普通的码农来说虽有比普通行业略高的报酬,但是钱到用时方恨少啊一年到头视乎没剩下多少了。所以今天谈谈怎么在业余的时间增加自己的收入。 NO1、私活(俗称外包) 这是最直接的方式,马上就能见到现钱!当然这要花费你很大一部分时间,承接时你要考虑时间成本,至少这些时间要和你的工资相当。个人不怎么推荐这种方法,有时周期长,价格低,还会遇到一些老是赖账的人,不过也算是一种方法。 网站开发、微信开发、app开发什么的,刷机、越狱、装系统什么的我们应该都会点,装系统的小摊装一个机器还要几十块呢! 私活来源:朋友介绍、国内外外包平台等,这里就不给他们做免费广告啦,哈哈。 NO2、做网站、博客 这招最适合做web开发的码农们,自己本来就有技术何不给自己整几个网站玩玩呢?没事写个博客,整个有用的网站挂着,平时搞点内容简单维护着不知不觉网站流量就上来了,你就可以挣些广告钱了。挂上Google Adsense广告美金正在向你招手啦! NO3、做自己的APP 这个适合移动应用开发的码农,目前国内应用

By Ne0inhk
白盒 SDK 加密 —— Go 语言中直调 C 动态库实现

白盒 SDK 加密 —— Go 语言中直调 C 动态库实现

文章目录 * * 1.背景 在重构的历史项目中,有一点是语言转换:从 PHP 转至 Goland ,在压缩资源的同时,享受语言实现级别进步带来的性能红利。 在功能点覆盖上存在白盒 SDK 加密场景,如 流量校验、对端数据传输…等。 * 原 PHP 实现中是通过扩展方式进行调用:将白盒 SDK 以 .so 文件的形式补充至 php-config --extension-dir,并添加 extension=XXX.so 到 php.ini 配置文件。 * 现 Goland 实现中,使用直调 C 动态库的方式实现【无成熟的 go-sdk, 存在额外的实现成本】。 2.实现方式 在 Goland 中,

By Ne0inhk