关于fasttext的一点体会

最近用到fasttext,这里简单总结一下

1: fasttext能干什么?
① 文本分类
② 词向量训练

2: fasttext原理

fasttext和word2vec的作者是一个人,fasttext和word2vec中的CBOW的原理基本相同,不同的地方后面说
这个链接里面总结的很详细,可以参考这里 word2vec中的数学原理详解

fasttext模型架构
在这里插入图片描述
这里的输入x1,x2,…xN是多个单词的embeding向量和n-gram特征(这个图里输入是embeding的,图里没有展示这个过程),输出是文档对应的类标。

3: fasttext做了什么???
****fasttext从输入到隐层做了一件事: 生成用来表征文档的向量
how to do it? 叠加构成这篇文档的所有词以及n-gram的词向量,然后取平均
****fasttext从隐层到输出做了一件事: 多类别分类

所以,fasttext的核心思想:将整篇文档的词以及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。(这句话不是我说的)

4: word2vec和fasttext不同
之前一直不明白fasttext用层次softmax时叶子节点是啥,CBOW很清楚,它的叶子节点是词和词频,后来看了源码才知道,其实fasttext叶子节点里是类标和类标的频数。

输入:word2vec是one-hot形式的单词的向量,fasttext是embedding过的单词的词向量和n-gram向量
输出:word2vec的输出层对应的是每一个term,计算某term概率最大
fasttext的输出层对应的是分类的标签。

本质不同,体现在softmax的使用:
**word2vec的目的是得到词向量,该词向量最终是在输入层得到的,输出层对应的h-softmax也会生成一系列的向量,但是最终都被抛弃,不会使用.
**fasttext则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label.(这也不是我说的)

5:fastext源码中的一些细节(这是我说的(__) 嘻嘻……)
首先fasttext训练是多线程的,读数据是单线程的,读取输入数据时完成文本解析和分词。
它通过-input参数获取一个文件句柄用于输入数据,初始化2个向量,word2int_和words_来跟踪输入信息

word2int是一个映射集,它将字符串映射为数值(0~30000000之间的唯一一个,一个单词一个id)
单词字符串→数值(哈希)→words_数组的索引(根据单词出现的顺序递增创建索引) 索引值是结构体,封装了单词的所有信息,比如字符串,频次,label,subwords.

源码中MAX_VOCAB_SIZE=30000000,当词汇表的大小逼近这个值时,算法性能会下降,内存可能不足,所以会有一个删减词汇表的操作。源码中哈希值>75%*30000000时,会删减词汇表。
删减过程:当词典里单词个数大于75%*30000000时,通过增加单词最小计数阈值α完成,每一次触发阈值,第一次触发阈值过滤掉频率为2的单词,第2次触发阈值过滤掉频率为3的单词…

由于有n-gram,因此n-gram的量会远远大于word的量,所以完全存下所有的n-gram也不现实,源码中通过hash桶来实现,把所有的n-gram都哈希到buckets个桶中,哈希到同一个桶中的所有n-gram共享一个embedding向量

先总结到这里吧,后面有的再补上来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值