Rah*_*hul 4 machine-learning word2vec apache-spark-mllib
如果唯一字的总数大于10亿,则在word2vec算法中设置的矢量大小的最佳数目是多少?
我正在为word2vec使用Apache Spark Mllib 1.6.0。
示例代码:-
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$
}
}
Run Code Online (Sandbox Code Playgroud)
没有答案:这取决于您的数据集和目标。
基于某些原始论文中偏爱的值,字向量的维数大小的常用值为300-400。
但是,最好的方法是创建某种特定于项目的定量质量得分-单词向量在您想要的应用程序中表现良好吗?–然后size像其他任何元参数一样进行优化。
另外,如果您确实拥有10亿个唯一的单词标记(即10亿个单词的词汇量),则在典型的系统环境中很难训练这些向量。(10亿个单词标记是Google发布的300万个向量数据集的333倍。)
10亿个300维字向量将需要(10亿* 300浮点数* 4字节/浮点=)1.2TB的可寻址内存(本质上是RAM)仅用于在训练期间存储原始向量。(神经网络在训练期间将需要另外1.2TB的输出权重,以及其他支持结构。)
与此相关的是,出现次数很少的单词不能从那少数的上下文中获得高质量的单词向量,但是仍然倾向于干扰附近单词的训练-因此,最小数量的单词0永远不是一个好主意,而丢掉更多的单词,频度词往往会加快训练速度,降低内存需求,并提高剩余词的质量。
| 归档时间: |
|
| 查看次数: |
3776 次 |
| 最近记录: |