zoukankan      html  css  js  c++  java
  • fastText入门

    简介
    fastText是Facebook AI Research在2016年提出的文本分类和词训练的工具。它最大的特点:模型非常简单,训练速度快,并且能够达到与深度学习旗鼓相当的精度。

    最近在做一个给微博内容分类的项目,主要目的是给微博打上商业标签。这个项目是一个经典的多分类任务,传统的方法包括:SVM、TextCNN、LSTM等。上面这些方法都略有尝试,而大名鼎鼎的fastText一直没有尝尝鲜,正好借此机会尝尝鲜。

    原理
    fastText主要有两个功能:训练词向量和文本分类。除此之外,它的训练中还考虑了N-gram。

    训练词向量
    word2vec的训练粒度是词语,而fastText进一步考虑了subword粒度。subword是一种character-level的n-gram。例如使用tri-gram,那么词语where可以分解成:

    文本分类
    若熟悉Continuous Bag of Words(CBOW)的模型结构,你会发现它完全有潜力扩展成一个分类模型:

    上图左边是word2vec中CBOW的结构,右边是fastText的结构。两类模型的结构区别是:

    CBOW使用context(wt−2,wt−1,...,wt+1,wt+2wt−2,wt−1,...,wt+1,wt+2)作为模型输入,而fastText使用document的词(w1,w2,...,wnw1,w2,...,wn)。
    fastText使用label作为学习目标,而CBOW使用wtwt。
    总结而言,学习目标是造成模型结构不同的决定性因素,即fastText是有监督模型,而word2vec是无监督模型。

    在上述模型结构下,hidden层的计算方式是:

    hidden=1n∑i=1nwi
    hidden=1n∑i=1nwi
    由于分类是模型的最终目标,因此需要一个从hidden层到label的映射,常见的映射方法:

    Softmax
    Hierarchical Softmax
    Noise Contrastive Estimation
    Negative Sampling
    上述方法中,softmax是常见的多分类分类器,其余三种均是对Softmax的近似(通过近似计算,避免过大的归一化代价)。关于Softmax的近似计算,我会在以后的博客中介绍,这里介绍Softmax在fastText的应用。基于Softmax的fastText,其代价函数如下所示:

    loss=−1N∑i=1N∑j=1M1(yi=j)log(y^ij)
    loss=−1N∑i=1N∑j=1M1(yi=j)log(y^ij)
    其中:

    y^i=softmax(hiddeni)
    y^i=softmax(hiddeni)
    N-gram特征
    根据上面的介绍,fastText本质上仍是一类基于词袋(bag-of-words)的分类模型,而丢失词顺序是词袋模型最受人诟病的地方。在词袋模型中,常见增加词顺序信息的方法是N-gram。但是增加N-gram的方法,将带来词典包含大量的词汇,进而导致内存溢出。为了解决此类问题,fastText采用了Hash桶的方式,把所有的N-gram哈希到buckets中,哈希到同一个bucket内的n-gram共享一个vector。具体实现过程如下所示:

    为了更好的表述,如何将n-gram特征转化为hidden层,这里举一个例子。假设一个文本由三个词组成w1w1,w2w2,w3w3,其bigram是w12w12,w23w23,那么此时hidden层的计算公式如下所示:

    hidden=15(w1+w2+w3+w12+w23)
    hidden=15(w1+w2+w3+w12+w23)
    结语
    以上便是fastText的基本原理,接下来将介绍fastText在微博中的应用。

    [1] 玩转fastText
    [2] P. Bojanowski*, E. Grave*, A. Joulin, T. Mikolov, Enriching Word Vectors with Subword Information
    [3] A. Joulin, E. Grave, P. Bojanowski, T. Mikolov, Bag of Tricks for Efficient Text Classification
    [4] facebookresearch/fastText
    ---------------------
    作者:cptu
    来源:CSDN
    原文:https://blog.csdn.net/AckClinkz/article/details/81907555
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    volatile 关键字
    C++ 强制类型转换
    HTTP详解2-请求、响应、缓存
    HTTP详解1-工作原理
    C++ 基本知识
    (转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考
    C++ inline
    P1075 质因数分解
    P1085 不高兴的津津
    P5015 标题统计
  • 原文地址:https://www.cnblogs.com/ExMan/p/10142483.html
Copyright © 2011-2022 走看看