FastText 使用预训练的词向量进行文本分类
Posted
技术标签:
【中文标题】FastText 使用预训练的词向量进行文本分类【英文标题】:FastText using pre-trained word vector for text classification 【发布时间】:2018-05-21 10:23:48 【问题描述】:我正在研究一个文本分类问题,也就是说,给定一些文本,我需要为其分配某些给定的标签。
我曾尝试使用 Facebook 的快速文本库,它有两个我感兴趣的实用程序:
A) 带有预训练模型的词向量
B) 文本分类实用程序
但是,似乎这些是完全独立的工具,因为我找不到任何合并这两个实用程序的教程。
我想要的是能够利用 Word-Vectors 的预训练模型对某些文本进行分类。有没有办法做到这一点?
【问题讨论】:
措辞改变,试图让意思更清楚 【参考方案1】:FastText 监督训练有 -pretrainedVectors
参数,可以这样使用:
$ ./fasttext supervised -input train.txt -output model -epoch 25 \
-wordNgrams 2 -dim 300 -loss hs -thread 7 -minCount 1 \
-lr 1.0 -verbose 2 -pretrainedVectors wiki.ru.vec
需要考虑的几件事:
嵌入的选择维度必须适合预训练向量中使用的维度。例如。 Wiki word vectors 必须为 300。它由-dim 300
参数设置。
截至 2018 年 2 月中旬,Python API (v0.8.22) 不支持使用预训练向量进行训练(忽略相应参数)。所以你必须使用 CLI(命令行界面)版本进行训练。但是,通过 CLI 使用预训练向量训练的模型可以通过 Python API 加载并用于预测。
对于大量的类(在我的例子中有 340 个),即使 CLI 也可能会出现异常,因此您需要使用分层 softmax 损失函数 (-loss hs
)
分层 softmax 的性能比普通 softmax 差,因此它可以放弃您从预训练嵌入中获得的所有收益。
使用预训练向量训练的模型可能比没有训练的模型大几倍。
在我的观察中,使用预训练向量训练的模型比没有训练的模型更快地过度拟合
【讨论】:
Re: Python 版本不支持pretrainedVectors
,你是怎么发现的?知道为什么这个选项被删除了吗?
更新:截至fasttext==0.9.1
(Python API),pretrainedVectors
可通过 Python 访问。您可以在训练期间将其作为附加超参数包含在预训练向量 (.vec) 文件中,然后执行训练。但无论出于何种原因,我都无法使用预训练向量显着提高模型的 F1 分数。不知何故,FastText 似乎没有像现代深度学习方法那样从预训练向量中转移知识。如果有人对预训练向量进行分类有更好的运气,我很想知道!
@prrao 我的分数似乎也没有改变。你有运气吗?谢谢...
@OzgurOzturk 我不认为 FastText 旨在用作迁移学习分类器。请参阅上面接受的答案。使用 Facebook 提供的automatic hyperparameter optimization tool,我能够显着提高我的 F1 分数。请注意,它还允许您通过快速扫描整个参数空间来同时优化分类器和分类器,因此它可以大幅减小模型大小,同时还可以提高 F1 分数。所以使用这种方法是双赢的。【参考方案2】:
FastText 的原生分类模式取决于您自己训练词向量,使用具有已知类别的文本。因此,词向量被优化为对训练期间观察到的特定分类有用。因此,该模式通常不会与预先训练的向量一起使用。
如果使用预训练的词向量,您可以自己以某种方式将它们组合成一个文本向量(例如,通过将文本中的所有词平均在一起),然后训练一个单独的分类器(例如scikit-learn 的许多选项)使用这些功能。
【讨论】:
以上是关于FastText 使用预训练的词向量进行文本分类的主要内容,如果未能解决你的问题,请参考以下文章
BERT实战:使用DistilBERT作为词嵌入进行文本情感分类,与其它词向量(FastText,Word2vec,Glove)进行对比