美文网首页
fasttext简单理解及应用

fasttext简单理解及应用

作者: 机器不能学习 | 来源:发表于2019-03-06 13:48 被阅读0次

    fasttext作为NPL领域中机器学习的优秀范例值得研究。

    模型架构

    我对fasttext模型架构理解与CBOW很像。
    在训练时,通过N-gram把词向量喂入模型,输出属于各类的概率,并比对标签修正模型
    在预测时,输入的是词序列,输出的是属于各类概率,取最大概率
    实际上还是一个单层的神经网络系统,一般来说损失函数用得softmax

    但是它快的原因,在于使用了Hierarchical softmax其实就是所谓的霍夫曼树结构:该树每个叶节点都是一个词语,softmax的结果无非就是一个概率,那么我们要找某一个词时,就是计算到该单词的路径中概率积。

    详细架构,我在论文精读中有介绍

    参数调节

    fasttext.supervised 参数如下

    input_file                 训练文件路径(必须)
    output                     输出文件路径(必须)
    label_prefix               标签前缀 default __label__
    lr                         学习率 default 0.1
    lr_update_rate             学习率更新速率 default 100
    dim                        词向量维度 default 100
    ws                         上下文窗口大小 default 5
    epoch                      epochs 数量 default 5
    min_count                  最低词频 default 5
    word_ngrams                n-gram 设置 default 1
    loss                       损失函数 {ns,hs,softmax} default softmax
    minn                       最小字符长度 default 0
    maxn                       最大字符长度 default 0
    thread                     线程数量 default 12
    t                          采样阈值 default 0.0001
    silent                     禁用 c++ 扩展日志输出 default 1
    encoding                   指定 input_file 编码 default utf-8
    pretrained_vectors         指定使用已有的词向量 .vec 文件 default None
    

    在调参之前,对于训练数据的样本有这样的规定。
    每条数据+"\t"+"label_prefix"+标签
    也就是标签在每条数据之后,并用label_prefix作为前缀

    目前我的实验中word_ngrams,minn,maxn是无法调节的。
    主要调节的是min_count ,epoch。前者在数据小的情况下,调1的效果最好,epoch适量,在一定程度上增加该值会提高召回率。

    • 有关minn与maxn需要知道n-char的概念
      n-gram和n-char
      fasttext方法不同与word2vec方法,引入了两类特征并进行embedding。其中n-gram颗粒度是词与词之间,n-char是单个词之间。两类特征的存储均通过计算hash值的方法实现。
      n-gram

    示例: who am I? n-gram设置为2

    n-gram特征有,who, who am, am, am I, I
    n-char

    示例: where, n=3, 设置起止符<, >
    n-char特征有,<wh, whe, her, ere, er>
    

    所以对于中文而言,输出的词可能没必要再细分,故n-char可为0,但是在词与词语义中会有一定联系,根据情况来设定n-gram

    预测问题
    model.predict(list,k)
    model.predict_proba(list,k)
    

    第一个函数输出最有可能的k个类
    第二个函数输出最有可能的k个类及其概率
    第一个参数一定是list!!!!这个值得注意

    词向量

    fasttext可通过cbow/skipgram两种模型训练词向量
    且训练出的词向量距离也能表示相近程度

    def train_unsupervised(input, model="skipgram", lr=0.05, dim=100, 
                       ws=5, epoch=5, minCount=5, 
                       minCountLabel=0, minn=3, 
                       maxn=6, neg=5, wordNgrams=1, 
                       loss="ns", bucket=2000000, 
                       thread=12, lrUpdateRate=100,
                       t=1e-4, label="__label__", 
                       verbose=2, pretrainedVectors=""):
    
    

    或用

    • 参数
      input_file 训练文件路径(必须)
      output 输出文件路径(必须)
      lr 学习率 default 0.05
      lr_update_rate 学习率更新速率 default 100
      dim 训练的词向量维度 default 100
      ws 上下文窗口大小 default 5
      epoch epochs 数量 default 5
      min_count 最低出现的词频 default 5
      word_ngrams n-grams 设置
      loss 损失函数 {ns,hs,softmax} default ns
      minn 最小字符长度 default 3
      maxn 最大字符长度 default 6
      thread 线程数量 default 12
      t 采样阈值 default 0.0001
      silent 禁用 c++ 扩展日志输出 default 1
      encoding 指定 input_file 的编码 default utf-8
        # skipgram model
        model = fasttext.skipgram('train.txt','model',lr = 0.1,dim = 300)
         
        # cbow model
        model = fasttext.cbow('train.txt','model',lr = 0.1,dim = 300)
    

    例如我用评论作为训练集,

    model = fasttext.skipgram('mydata2.txt','model',lr = 0.1,dim = 10)
    print model['好评']
    print model['不错']
    
    输出:
    [-1.0843074321746826, 0.21589583158493042, 0.1687242090702057, 0.11248864978551865, -0.8439181447029114, -1.3056985139846802, 0.5022682547569275, 0.08825510740280151, 0.8310032486915588, 0.04486303776502609]
    [-0.7305361032485962, 1.175795078277588, 0.45464813709259033, -0.3532727360725403, -0.021342813968658447, -0.5648921728134155, 0.4911344051361084, 0.6292283535003662, 0.004915270954370499, 0.2739366292953491]
    

    参考
    https://blog.csdn.net/ymaini/article/details/81489599
    https://blog.csdn.net/qq_32023541/article/details/80845913
    https://www.jianshu.com/p/e828f02e41c8
    论文:Bag of Tricks for Efficient Text Classification

    相关文章

      网友评论

          本文标题:fasttext简单理解及应用

          本文链接:https://www.haomeiwen.com/subject/orytpqtx.html