TensorFlow 指标列,嵌入列

题图:feng-haha-483976-unsplash

一般地,机器学习、深度学习 feed 进来的数据要求为数值型。如果某列取值为字符型,需要做数值转换,今天就来总结下 TensorFlow 中的指标列和嵌入列。

指标列 ( indicator column ) 是指取值仅一个为 1,其他都为 0 的向量,它是稀疏的; 嵌入列 (embedding column) ,取值介于0和1之间,它是稠密的。

指标列,采取 one-hot 编码方法,有多少类输入就会得到一个多少维的向量。如果输入类别为 4 类,那么可以编码为如下,0,1,2,3 类分别编码为4维的向量。

TensorFlow 中通过调用 tf.feature_column.indicator_column 创建指标列

categorical_column = ...

indicator_column = tf.feature_column.indicator_column(categorical_column)

但是,假设我们有一千万个可能的类别,或者可能有十亿个,而不是只有四个。出于多种原因,随着类别数量的增加,使用指标列来训练神经网络变得不可行。

如何解决类别数量激增导致的指标列不可行问题?

使用嵌入列来克服这一限制,嵌入列并非将数据表示为很多维度的独热矢量,而是将数据表示为低维度普通矢量,其中每个单元格可以包含任意数字,而不仅仅是 0 或 1。通过使每个单元格能够包含更丰富的数字,嵌入列包含的单元格数量远远少于指标列。

每个嵌入向量的维度是怎么确定的呢?嵌入矢量中的值如何神奇地得到分配呢?

1、设定词汇表单词个数为 1 万。如果选用指标列,则每个单词的取值为 1 万维,采取嵌入列,每个单词的维度仅为 10,这相比 one-hot 编码绝对是低维度了,维度取值一般经验公式是单词个数的4次方根。

2、初始时,将随机数字放入嵌入向量中,分配值在训练期间进行,嵌入矢量从训练数据中学习了类别之间的新关系。

TensorFlow 中通过调用 tf.feature_column.embedding_column 创建嵌入列,

categorical_column = ...

embedding_column = tf.feature_column.embedding_column(

categorical_column=categorical_column,dimension=dimension)

最后,以一个展示指标列和嵌入列的区别实例作为结尾,

来自:https://tensorflow.google.cn/get_started/feature_columns

嵌入式向量的值是如何分配的,是很有意思的问题,感兴趣的话,可以进一步的思考。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180424G1545400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券