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
嵌入式向量的值是如何分配的,是很有意思的問題,感興趣的話,可以進一步的思考。
※一文了解Word2vec之Skip-Gram訓練網路的3種技術
※Facebook開源 時間序列預測框架 Prophet
TAG:演算法channel |