1.背景:
我在原来特征基础上,增加了一列特征,这列特征是一个list,长度不固定[0,5]之间的一个长度,比如 样本 1: ['找工作', '发工资', '领导力']
代码中给该列特征先做了一个分桶,根据该列特征中词的个数,来确定桶的大小;我这里大约2k个不同的词,hash_bucket_size=2e3;然后做tf.feature_column.embedding_column(feat, 8);这个8怎么确定?2000开两次根号,等于6.7,向上取整得到 7,因为这样不会造成词重叠,但是会造成一些参数浪费;至于效果如何,数据记录在下面;为什么是 8? 因为我没有见过embedding的长度是单数,因此我取了8. 下面将embedding设置为[6, 7, 8]都跑了一遍,整体对比一下auc情况。
feat = tf.feature_column.categorical_column_with_hash_bucket(key='feature', hash_bucket_size=2e3)
feat_em = tf.feature_column.embedding_column(feat, 8)
2.解决:
方法一:将batchsize调小一些
方法二:过滤掉error或者warning信息「看着有点这是自欺欺人,看不到就当不存在」
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import tensorflow as tf
0 = all messages are logged (default behavior)
1 = INFO messages are not printed
2 = INFO and WARNING messages are not printed
3 = INFO, WARNING, and ERROR messages are not printed
3.不同embedding长度的eval auc:
embedding长度=6: eval auc = 0.81333274
embedding长度=7: eval auc0.81431544
embedding长度=8: eval auc 0.8145471
embedding长度=16: eval auc 0.81362206
看着差别不是特别大,从auc的 细微差别上能 看出 ,embedding维度太大或者小了 ,auc都不行;那就尽量让embedding维度的值为:
并且维度是单数还是双数,这个目测对auc没有什么影响,所以不用纠结单双数了(今天的最大收获)
但是训练时间上维度越小 ,时间越短。
4.产生的原因以及带来的影响
产生的原因:
模型参数较多,能自由分配的RAM不能够满足所需内存。情况 一:在运行tf.global_variables_initializer()的时候就会出现。情况二:如果选择的优化器需要历史grad的话,也会报这个错误,因为存储历史grad,需要double的RAM。情况三:数据类型float32 和 float 64占用内存是不同的,因此慎重选择数据类型。
带来的影响:
选择了一台RAM足够的机器运行了一下demo,auc变为了0.852,提升了3个点。