如果唯一字的总数大于10亿,那么在word2vec算法中设置的矢量大小的最佳数量是多少?
我正在使用Apache Spark Mllib 1.6.0 for word2vec。
示例代码: -
public class Main {
public static void main(String[] args) throws IOException {
SparkConf conf = new SparkConf().setAppName("JavaWord2VecExample");
conf.setMaster("local[*]");
JavaSparkContext jsc = new JavaSparkContext(conf);
SQLContext sqlContext = new SQLContext(jsc);
// $example on$
// Input data: Each row is a bag of words from a sentence or document.
JavaRDD<Row> jrdd = jsc.parallelize(Arrays.asList(
RowFactory.create(Arrays.asList("Hi I heard about Spark".split(" "))),
RowFactory.create(Arrays.asList("Hi I heard about Java".split(" "))),
RowFactory.create(Arrays.asList("I wish Java could use case classes".split(" "))),
RowFactory.create(Arrays.asList("Logistic regression models are neat".split(" ")))
));
StructType schema = new StructType(new StructField[]{
new StructField("text", new ArrayType(DataTypes.StringType, true), false, Metadata.empty())
});
DataFrame documentDF = sqlContext.createDataFrame(jrdd, schema);
// Learn a mapping from words to Vectors.
Word2Vec word2Vec = new Word2Vec()
.setInputCol("text")
.setOutputCol("result")
.setVectorSize(3) // What is the optimum value to set here
.setMinCount(0);
Word2VecModel model = word2Vec.fit(documentDF);
DataFrame result = model.transform(documentDF);
result.show(false);
for (Row r : result.select("result").take(3)) {
System.out.println(r);
}
// $example off$
}
}
答案 0 :(得分:3)
根据研究,矢量表示的质量会随着矢量大小的增加而提高,直到达到300维。在300维之后,向量的质量开始下降。您可以找到不同向量和词汇量here的分析(参见表2,其中SG指的是Skip Gram模型,它是Word2Vec背后的模型)。
您对矢量大小的选择也取决于您的计算能力,即使300可能为您提供最可靠的矢量,如果您的机器在计算矢量时太慢,您可能需要降低尺寸。
答案 1 :(得分:3)
没有人回答:这将取决于您的数据集和目标。
单词向量的维数大小的常用值是300-400,基于某些原始论文中的首选值。
但是,最好的方法是创建某种项目特定的定量质量得分 - 单词向量在您的预期应用中表现良好吗? - 然后像任何其他元参数一样优化size
。
另外,如果你真的拥有10亿个独特的单词标记 - 一个10亿字的单词 - 那么在典型的系统环境中训练这些向量将很困难。 (10亿个单词令牌比谷歌发布的300万个向量数据集大333倍。)
10亿个300维字向量需要(10亿* 300浮点数* 4字节/浮点数)1.2TB的可寻址存储器(本质上是RAM)只是为了在训练期间存储原始矢量。 (在训练期间,神经网络需要另外1.2TB的输出权重,以及其他支持结构。)
相关地,出现次数很少的单词不能从这几个上下文中获得高质量的单词向量,但仍然会干扰附近单词的训练 - 所以0
的最小数量永远不会一个好主意,扔掉更低频率的词往往会加速训练,降低记忆要求,并提高剩余词的质量。