Word2Vec矢量大小与扫描的总字数之间的关系?

时间:2017-10-04 08:58:47

标签: machine-learning apache-spark-mllib word2vec

如果唯一字的总数大于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$
      }
}

2 个答案:

答案 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的最小数量永远不会一个好主意,扔掉更低频率的词往往会加速训练,降低记忆要求,并提高剩余词的质量。