如何将有监督FastText词向量转换为无监督格式用于自定义数据集重训练
可以实现该需求,无需做格式转换,手动初始化无监督FastText的词向量层即可完成重训练。你碰到的NotImplementedError报错是因为gensim的FastText.load_fasttext_format仅支持Facebook官方无监督预训练的bin格式模型,你手头的有监督训练导出的词向量文件仅包含词级向量,没有FastText原生模型的结构信息,因此无法用该接口加载。
具体操作步骤
from gensim.models import FastText from gensim.models import KeyedVectors # 加载预训练词向量 pretrained_kv = KeyedVectors.load_word2vec_format('model.txt') # 初始化无监督FastText,注意vector_size必须和预训练向量维度一致 # 其余训练参数(window、min_count、epochs等)按你自有数据集的需求调整即可 ft_model = FastText( vector_size=pretrained_kv.vector_size, window=5, min_count=5, workers=4 ) # 基于你的自有数据集构建词表 ft_model.build_vocab(corpus_iterable=your_custom_corpus) # 给词表中存在的词替换预训练向量,不在预训练词表的词保留默认随机初始化 for word in ft_model.wv.index_to_key: if word in pretrained_kv: ft_model.wv[word] = pretrained_kv[word] # 开启重训练即可 ft_model.train( corpus_iterable=your_custom_corpus, total_examples=ft_model.corpus_count, epochs=10 )
该方案的弊端
- 你加载的预训练词向量仅包含完整词的向量,没有FastText原生无监督模型自带的n-gram子词向量。训练初期碰到未出现在预训练词表的OOV词时,无法通过子词拼接得到合理的初始向量,OOV词初始表现偏差,需要更多轮次训练才能拟合。
- 有监督预训练的词向量本身是面向原训练时的下游分类任务优化的,语义空间分布和无监督预训练得到的通用语义空间存在差异,直接初始化后重训练可能需要更长的收敛时间,甚至出现前期效果波动的情况,建议调低初始学习率避免破坏预训练的有效语义信息。
- 如果你的自有数据集规模很小,有监督预训练带来的任务偏置很难被修正,最终得到的向量可能更偏向原预训练任务的特征,而非你期望的适配自有数据的通用语义特征。
内容的提问来源于stack exchange,提问作者L.Stefan
相关产品推荐
相关产品推荐

