FastText模型原理

FastText简介

预备知识

N-gram模型

对句子或单词的所有长度为N的子句或子字符串进行操作,如2-gram中,对“girl”的字符串为“gi”,“ir”,"rl"进行操作,通常有操作如下:

  • 比较两个单词的相似度,即按照公式根据子字符串的匹配情况计算出相似度,常用于模糊匹配、单词纠错等
  • 评估句子是否合理,将句子定义为N阶马尔科夫链,即 P ( w i w 1 , w 2 , . . . , w i 1 ) = P ( w i w i N + 1 , . . . , w i 1 ) P(w_i|w_1,w_2,...,w_{i-1})=P(w_i|w_{i-N+1},...,w_{i-1})​ ,根据语料库得到的条件概率可求得句子出现在该语料库中的概率,常用于搜索引擎中输入提示、文本自动生成等

CBOW模型

是把单词的高维稀疏的one-hot向量映射为低维稠密的表示的方法。

模型架构如下:

(此处有图)

  • 输入:给定词的上下文共 C C 个单词,每个单词由 V V 维的一个1-of-V的向量表示,即

{ x 1 , x 2 , . . . , x c 1 , x c } \{x_1,x_2,...,x_{c-1},x_c\}

  • 映射:每个单词乘以一个 ( V , N ) (V,N) 的输入矩阵 W W ,求和得到一个 N N 维的中间向量 h h ,即

h = 1 C i = 1 C x i W h = \frac{1}{C}\sum_{i=1}^C x_iW

  • 输出: h h 乘以一个 ( N , V ) (N,V) 的输出矩阵 W W' ,得到一个 V V 维向量,每一维做 s o f t m a x softmax 得到这个单词出现的概率,选择其中最大的 C C 个作为输出

V o u t = h W = [ u 1 , u 2 , . . . , u V ] V_{out}=hW'=[u_1,u_2,...,u_V]

y i = e x p ( u i ) j = 1 V e x p ( u j ) y_i=\frac{exp(u_i)}{\sum_{j=1}^V exp(u_j)}\\

FastText模型

[1]中提出了FastText模型,类似CBOW模型,使用n-gram特征代替单个词的特征,提取序列信息,效果与深度学习分类器持平,但速度快得多。其模型架构如下:

  • 对整篇文档的n-gram特征,计算词向量,取平均得到文档的向量表示
  • 将上述文档向量作为线性分类器的输入,并使用层次softmax计算文档属于每个类别的概率
    • 将所有类别按照频率构建哈夫曼二叉树,每次对两个类别进行二分类(如使用LR),决定走左子树或右子树,将复杂度由线性降低为对数
  • 损失函数为对数似然函数取负,即

m i n 1 N i = 1 N y i l o g ( f ( B A x i ) ) x i i / b a g    o f    f e a t u r e s A B min-\frac{1}{N}\sum_{i=1}^N y_ilog(f(BAx_i))\\ 其中,x_i为第i个文档正则化/规范化后的特征向量(bag\ \ of\ \ features)\\ A和B是两个权重矩阵

NCE loss(noise-contrastive estimation),噪声对比估计。

在词向量的生成过程中,用的loss函数是NCE或negative sampling,而不是常规的softmax。在《learning tensorflow》这本书中,作者这样说道:but it is sufficient to think of it (NCE) as a sort of efficient approximation to the ordinary softmax function used in classification tasks。由此看来,NCE是softmax的一种近似,但是为什么要做这种近似,而不直接用softmax呢?

当类别数很大时(CBOW中是单词数),softmax复杂度很高,为了更高效地进行,将softmax计算过程转化为二分类(LR)。具体地,将单词与真实类别的true pair、单词与随机类别的randomly corrupted pair送入分类器,待优化的分类器只需判断输入的pair是真或假即可。(主要思想与负采样和层次softmax相同)

Word2Vec slightly customizes the process and calls it negative sampling.

def nce_loss(weights, #[num_classes, embed_size]
             biases,  #[num_classes]
             inputs,  #[vocab_size, embed_size]
             labels,  #[vocab_size, num_true]
             num_sampled, num_classes, num_true=1,
             sampled_values=None,
             remove_accidental_hits=False,
             partition_strategy="mod",
             name="nce_loss")

个人理解:对input中的每个词,选择对应的标签构成正样本对,再随机选择num_sampled个标签与该词构成负样本对。对每个单词对,在weights和biases中找到对应标签的w和b,用逻辑回归进行二分类,每个分类问题计算交叉熵

Reference

[1] Bag of Tricks for Efficient Text Classification

[2] 自然语言处理中的N-Gram模型详解

[3] https://github.com/brightmart/text_classification

猜你喜欢

转载自blog.csdn.net/qq_36153312/article/details/87897054
今日推荐