设置“ hash_bucket_size”参数的原理?

fen*_*122 5 tensorflow

问题1

在中wide_n_deep_tutorial.py,有一个hash_bucket_sizetf.feature_column.categorical_column_with_hash_buckettf.feature_column.crossed_column方法命名的超参数,值是hash_bucket_size=1000

但是为什么要1000?如何设置该参数?

问题2:关于第二个问题crossed_columns,那就是,

crossed_columns = [ tf.feature_column.crossed_column( ["education", "occupation"], hash_bucket_size=1000), tf.feature_column.crossed_column( [age_buckets, "education", "occupation"], hash_bucket_size=1000), tf.feature_column.crossed_column( ["native_country", "occupation"], hash_bucket_size=1000) ]

wide_n_deep_tutorial.py

为什么选择["education", "occupation"][age_buckets, "education", "occupation"]以及["native_country", "occupation"]作为crossed_columns,是有经验的任何规则?

Min*_*ark 5

关于hash_bucket_size:如果将其设置得太低,则会发生许多哈希冲突,其中不同类别将映射到同一存储桶,从而迫使神经网络使用其他功能来区分它们。如果将其设置得太高,则将无用的RAM大量使用:我假设您将包裹categorical_column_with_hash_bucket()embedding_column()(通常应该如此)中,在这种情况下,hash_bucket_size它将确定嵌入矩阵的行数。

如果有k个类别,则发生碰撞的概率大约等于:1 - exp(-k*(k-1)/2/hash_bucket_size)source),因此,如果有40个类别并且您使用hash_bucket_size=1000,则发生碰撞的概率非常高:大约54%!为了说服自己,请尝试运行len(np.unique(np.random.randint(1000, size=40)))几次(它会选择0至999之间的40个随机数,并计算有多少个唯一数),您会发现结果通常少于40。您可以使用此公式选择一个的值hash_bucket_size不会导致太多的冲突。

就是说,如果只有几次碰撞,在实践中可能不会太糟,因为神经网络仍将能够使用其他功能来区分碰撞类别。最好的选择是尝试不同的值,hash_bucket_size以找到低于该值的性能开始下降,然后将其提高10-20%以确保安全。


amo*_*ej1 4

对于 hash_bucket

一般思想是,理想情况下,哈希函数的结果不应导致任何冲突(否则您/算法将无法区分两种情况)。因此,在这种情况下,1000“只是”一个值。如果您查看职业和国家/地区的唯一条目(16 和 43),您会发现这个数字足够高:

edb@lapelidb:/tmp$ cat  adult.data | cut -d , -f 7 | sort  | uniq -c  | wc -l
16
edb@lapelidb:/tmp$ cat  adult.data | cut -d , -f 14 | sort  | uniq -c  | wc -l
43
Run Code Online (Sandbox Code Playgroud)

特征交叉

我认为经验法则是,如果特征的组合确实有意义,那么交叉就有意义。在这个例子中,教育和职业是相关的。至于第二个,将人们定义为“拥有博士学位的初级工程师”与“没有学位的高级清洁人员”可能是有意义的。您经常看到的另一个典型例子是经度和纬度的交叉,因为它们在一起比单独存在更有意义。