fastText 是一种新的嵌入方法,它在 Word2Vec 方法中添加了基于拼写的嵌入方法。这种方法是 Word2Vec 的一个限制,即无法对现有语料库中不存在的单词进行向量化。word2vec请参考 NLP | word2vec图文详解及代码_夏天|여름이다的博客-CSDN博客
CBOW的思路是用上下文词语来预测当前词,从而拿到模型最终的W矩阵得到词向量,而Fasttext的思路是使用模型进行文本分类操作。
Fasttext的模型架构如下:
其中x1,x2,...,xN−1,xNx1,x2,...,xN−1,xN表示一个文本中的n-gram向量,每个特征是词向量的平均值。
1.词汇表外 (Out Of Vecabulary:OOV) 问题
在 Word2Vec中的问题,可以说这是一个 OOV 问题。换句话说,输出一个没有出现在现有语料库中的单词时,就发生了错误。没有出现在语料库中或出现数量很少的词不能生成嵌入向量,但是当它们不在语料库中时,称为OOV。
2.拼写单元嵌入n-gram
2.1.子词生成
对于一个单词,我们生成其中存在的长度为 3 到 6 的字符 n-gram。
- 我们取一个单词并添加尖括号来表示单词的开头和结尾
然后,我们生成长度为 n 的字符 n-gram。例如,对于单词“eating”,长度为 3 的字符 n-gram 可以通过从尖括号的开头滑动 3 个字符的窗口直到到达结束的尖括号来生成。在这里,我们每次移动窗口一步。
因此,我们得到一个单词的字符 n-gram 列表。
下面给出了不同长度字符 n-gram 的示例:
2.2. 带负采样的skip-gram
为了理解预训练,让我们举一个简单的玩具示例。我们有一个中心词“eating”的句子,需要预测上下文词“am”和“food”。
首先,中心词的嵌入是通过对字符 n-gram 和整个词本身的向量求和来计算的。
对于实际的上下文词,我们直接从嵌入表中获取它们的词向量,而不添加字符 n-gram。
随机收集负样本,其概率与一元频率的平方根成比例。对于一个实际的上下文词,随机抽取 5 个否定词。然后
我们在中心词和实际上下文词之间进行点积,并应用 sigmoid 函数来获得 0 到 1 之间的匹配分数。
基于损失,我们使用 SGD 优化器更新嵌入向量,以使实际上下文词更接近中心词,但增加与负样本的距离。
拼写单元嵌入意味着即使模型没有学习过的单词也可以通过很好地分解它们来从语料库中出现的单词中推断出来。
-
fastText 将单词切割成 3-6 个单元并嵌入它。例如,如果有单词“eat”,
则使用 <ea , eat, at>。在这个过程之后,除了吃这个词之外,还添加了三个字母。 -
通过这种方式,一个嵌入向量被创建并与原始的eat嵌入向量一起使用。
-
这样得到的n-gram的所有嵌入向量都得到了。
-
简单来说,和Word2Vec不同的是,通过类比可以得到一个未学习词的向量,但是可以假设因为计算量很大,所以会花费很多时间。但是,由于算法本身如此高效,因此在时间上并没有太大的差异。
示例:
常见类型
"""
input: 训练数据文件路径
lr: 学习率
dim: 向量维度
ws: cbow模型时使用
epoch: 次数
minCount: 词频阈值, 小于该值在初始化时会过滤掉
minCountLabel: 类别阈值,类别小于该值初始化时会过滤掉
minn: 构造subword时最小char个数
maxn: 构造subword时最大char个数
neg: 负采样
wordNgrams: n-gram个数
loss: 损失函数类型, softmax, ns: 负采样, hs: 分层softmax
bucket: 词扩充大小, [A, B]: A语料中包含的词向量, B不在语料中的词向量
thread: 线程个数, 每个线程处理输入数据的一段, 0号线程负责loss输出
lrUpdateRate: 学习率更新
t: 负采样阈值
label: 类别前缀
verbose: ??
pretrainedVectors: 预训练的词向量文件路径, 如果word出现在文件夹中初始化不再随机
model object
"""