我正在使用deeplearning4j Java库来构建尺寸为100的段落矢量模型(doc2vec)。我正在使用文本文件。它大约有1700万行,文件大小为330 MB。 我可以训练模型并计算段落向量,从而得出相当不错的结果。
问题是,当我尝试使用WordVectorSerializer.writeParagraphVectors(dl4j方法)保存模型(通过写入磁盘)时,大约需要20 GB的空间。当我使用本地Java序列化程序时,大约有30GB。
我想这可能是模型太大而无法容纳那么多数据。型号大小20GB是否适合300 MB的文本数据?
也欢迎在其他库/语言中使用过doc2vec / paragraph向量的人发表评论。
谢谢!
答案 0 :(得分:4)
我不熟悉dl4j的实现,但是模型大小由唯一字向量/文档向量的数量以及所选向量大小决定。
(330MB / 1700万)表示每个文档平均只有20个字节-对于Doc2Vec
来说很小!
但是,例如,如果您要为每个文档训练一个300维的文档向量,并且每个维(通常)为4字节浮点数,则(1700万* 300暗* 4字节/暗) = 20.4GB。这样一来,字向量和模型内部权重/词汇表等的空间将更大,因此,您所报告的存储大小也不是不可能。
使用您描述的大小,还有很大的过拟合风险-如果使用300维度,则您会将<20字节源材料的文档建模为(300 * 4 =)1200字节文档向量。
在某种程度上,这使模型趋向于一个庞大的,记忆输入的查找表,因此不太可能捕获有助于理解培训文档或新文档的可概括模式。相反,有效的学习通常看起来像压缩:将源材料建模为更小但更突出的东西。