Word2Vec向量大小与扫描的总词数之间的关系是什么?

6

如果唯一单词总数超过10亿,那么在word2vec算法中设置的向量大小的最佳值是多少?

我正在使用Apache Spark Mllib 1.6.0进行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个回答

7

并没有一个标准答案:这将取决于您的数据集和目标。

基于一些原始论文中的偏好值,单词向量的维度大小通常为300-400。

但是,最好的方法是创建某种项目特定的定量质量评分 - 单词向量在您预期的应用程序中表现良好吗? - 然后像任何其他元参数一样优化 size

另外,如果您真正拥有10亿个唯一的单词令牌 - 10亿个单词词汇 - 在典型的系统环境中训练这些向量将很困难。(10亿个单词令牌比Google发布的300万向量数据集大333倍。)

10亿个300维单词向量需要(10亿 * 300浮点维度 * 4字节/浮点 =)1.2TB的可寻址内存(基本上是RAM)来存储原始向量进行训练。(神经网络在训练期间还需要另外1.2TB的输出权重,以及其他支持结构。)

相关地,出现次数很少的单词无法从这些少数上下文中获得高质量的单词向量,但仍倾向于干扰附近单词的训练-因此,0 的最小计数永远不是一个好主意,并且丢弃更多低频词语倾向于加速训练,降低内存需求并提高剩余词汇的质量。


4
根据研究,随着向量维度的增加,向量表示的质量会提高,直到达到300维。在300维之后,向量的质量开始下降。您可以在这里找到不同向量和词汇表大小的分析(请参见表2,其中SG指的是Word2Vec模型背后的Skip Gram模型)。
向量大小的选择也取决于您的计算能力,即使300维可能会给您最可靠的向量,如果您的机器在计算向量时速度太慢,您可能需要降低向量的大小。

最佳的“size”可能会受到训练数据和最终应用程序的影响,因此不能一般认为“300”是最佳大小。(如果有人使用与“GloVe”论文中链接的算法和训练数据相同,并且具有类似的最终应用程序,则300将是一个可能的好尺寸。但是,他们可以直接重复使用该项目的可下载向量。) - gojomo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接