推理性能提升一倍,TensorFlow Feature Column性能優化實踐

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"寫在前面"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在CTR(Click Through Rate)點擊率預估的推薦算法場景,TensorFlow Feature Column被廣泛應用到實踐中。這一方面帶來了模型特徵處理的便利,另一方面也帶來了一些線上推理服務的性能問題。爲了優化推薦業務性能,提升線上服務效率,愛奇藝深度學習平臺團隊在實踐中總結了一些性能優化方法。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"經過這些優化,推薦業務的線上推理服務性能效率可以提升一倍以上,p99延遲降低達到50%以上。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"背景介紹"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Feature Column是TensorFlow提供的用於處理結構化數據的工具,是將樣本特徵映射到用於訓練模型特徵的橋樑。它提供了多種特徵處理方法,讓算法人員可以很容易將各種原始特徵轉換爲模型的輸入,來進行模型實驗。"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/1d\/1ddccd183fe4a4ee2ae9d83b0ba9d45d.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如上圖所示,所有Feature Column都源自FeatureColumn類,並繼承了三個子類CategoricalColumn、DenseColumn和SequenceDenseColumn,分別對應"},{"type":"text","marks":[{"type":"strong"}],"text":"稀疏特徵"},{"type":"text","text":"、"},{"type":"text","marks":[{"type":"strong"}],"text":"稠密特徵"},{"type":"text","text":"、"},{"type":"text","marks":[{"type":"strong"}],"text":"序列稠密特徵"},{"type":"text","text":"。算法人員可以按照樣本特徵的類型找到對應的接口直接適配。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而且 Feature Column 和 TF Estimator 接口有很好的集成,通過定義好對應的特徵輸入就可以直接在預定義的 Estimator 模型中使用。TF Estimator 在推薦算法的使用非常普遍,特別是它封裝了分佈式訓練的功能。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下圖是一個使用Feature Column處理特徵,進入到 Estimator DNN Classifier的示例:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/ce\/cef236beccb60b10188d4fac68b8615f.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雖然Feature Column使用起來很方便,模型代碼編寫比較快,但是在愛奇藝推薦類業務的線上服務落地過程中,一些性能問題逐漸凸顯,下面將逐個介紹我們在實際中碰到的一些問題,以及如何優化。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"整型特徵哈希優化"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"推薦類模型通常都會將ID類特徵哈希到一定數量的bucket 分桶,然後轉換成 Embedding再作爲神經網絡的輸入,比如視頻類ID特徵,用戶ID特徵,商品ID特徵等。示例如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/d4\/d4df0bbc6059d58f9584c77d8ecf6d6d.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在` categorical_column_with_hash_bucket `的文檔[2]裏面說到:對於String類型的輸入,會執行`output_id = Hash(input_feature_string) % bucket_size`做哈希操作,而對於整數類型的輸入會先轉成String類型然後再進行同樣的哈希操作。通過查看源代碼[3]可以看到這樣的邏輯:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/8b\/8b71d83a6eb268f121ba99dd6f7d8182.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在推薦業務中,通常這類ID都是已經過某種方式的哈希,形成64bit的整型特徵放到樣本里面,因此必然要執行整型轉化成String的操作。但是在TensorFlow 的 Timeline中可以看到函數`as_string`所對應的TF內部的`AsString` OP其實是一個比較耗時的操作,經過分析對比發現`AsString` OP的耗時通常是後面的哈希操作的3倍以上,如下圖所示:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/c9\/c9352da2198db292bf3be01647ceee97.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"進一步分析`AsString` OP內部的代碼,可以發現這個OP內部還涉及到了內存分配和拷貝操作,因此比純哈希計算慢就可以理解了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"很自然,團隊考慮去掉相關操作來做優化,因此專門編寫了一個給整型做哈希的函數來做優化,示例代碼如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/66\/66b14e2e747d53f924833f4ad05b461e.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"經過這樣做區分類型的哈希方式,完全優化了原先耗時長的類型轉換操作。這裏需要注意的是新加的哈希函數對應的新OP同樣需要加到 TF Serving 中。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"定長特徵轉換優化"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"定長特徵是指使用接口`tf.io.FixedLenFeature`來解析的特徵,比如用戶的性別,年齡等,這類特徵的長度通常都是定長的,並且固定爲 1 維或多維。這類特徵經過接口`tf.io.parse_example` 解析成 Dense Tensor,然後經過Feature Column處理,再進入到模型的輸入層。常見的代碼示例如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/45\/4552c745e90cfc7362037f742e4bd19a.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以上面的代碼爲例子,舉例解析一下 TensorFlow 內部的Tensor 轉換邏輯。如下圖所示,兩個樣本user_name分別爲bob和wanda,經過樣本解析成shape爲2的Dense Tensor,然後經過`categorical_column_with_vocabulary_list`轉換,查找詞表分別轉成0和2,再經過`indicator_column`轉換成One hot編碼的Dense輸入。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/30\/300e41f6fc6e1faa9ce83cdcb6650e63.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從上面的樣本處理來看沒有什麼問題,然後再來看一下Feature Column代碼內部的轉換處理邏輯:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/91\/911fa3c1a490ea969f41ab1aa5c56d5e.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如上圖所示,在代碼中Vocabulary Categorical Column 會先去除掉一些非法值,然後把輸入的Dense Tensor 轉換成 Sparse Tensor,在Indicator Column中會再次把Tensor從Sparse轉成Dense,最後轉成需要的One Hot Tensor。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"先來思考一下上面兩個轉換操作的目的,一方面是爲了去除樣本數據中一些異常的值,另外一方面是這樣的處理其實是同時兼顧了輸入是 Sparse Tensor 的情況,如果輸入是Spare Tensor就直接做Vocabulary詞表查找,然後再轉成Dense Tensor。這樣轉換雖然達到代碼複用的作用,但是在性能上卻有損失。如果能直接將原始的Input Tensor轉換成One Hot Tensor,就可以省去兩個轉換過程,而且Sparse Tensor 和Dense Tensor之間的轉換其實是非常耗時的操作。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"再回到定長特徵的原始性質,對於這類定長特徵來講,在樣本處理的時候如果沒有值,會被填充成默認值,而且在生成樣本的時候都會被保證不會出現有空值或者 -1的情況,因此異常值的處理其實是可以被省略的。最後優化後的內部轉換邏輯如下圖,省去了兩次Sparse Tensor 和Dense Tensor之間的轉換。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/eb\/eb5a910a6b0af5f966a6afdaca0aadcd.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"除了上面的Vocabulary Categorical Column,還有別的類似Feature Column也有同樣的問題,因此針對這類特徵,平臺專門開發了一套優化的Feature Column接口提供給業務使用,優化性能效果還不錯。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"用戶特徵去重優化"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"推薦類算法模型都有個很典型的特點,那就是模型中會包含用戶側特徵和要推薦的Item側特徵,比如視頻的特徵、商品的特徵等。模型在線上服務部署的時候,會給一個用戶推薦多個視頻或商品,模型會返回這多個視頻或商品的打分,然後按照打分的大小推薦給用戶。由於是給單個用戶做推薦,這個時候該用戶的特徵會根據推薦Item的數量重複多次,再發送給模型。如下是一個典型的推薦算法排序模型線上推理的示意圖:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/bb\/bb13d2e6da7de0ad049a8500173dd8c8.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"圖示的模型輸入有3個User特徵,3個Item特徵,假定在對某個用戶做推薦,該用戶的3個特徵分別對應爲u1,u2和u3。這時要對兩個不同的Item做推薦評分請求,也就是一個請求裏面有兩個Item,這兩個Item分別爲I1和I2,這兩個Item分別有三個特徵,I1對應I11,I12,I13,以此類推,這樣構成一個batch size爲2的推理請求。從圖中可以看到,因爲是給同一個用戶推薦兩個不同的Item,Item側的特徵是不同的,但是用戶的特徵被重複了兩次。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上面的例子只以2個Item爲例,但是實際線上的服務一個推理請求會帶100個Item甚至更多,因此用戶的特徵也會被重複100次甚至更多,重複的用戶特徵不僅增加了傳輸的帶寬,而且增加了特徵處理時的計算量,因此業務非常希望能解決這個問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這個問題的本源要從TensorFlow 的模型訓練代碼說起。TensorFlow 訓練時的每一條樣本是某個用戶對某個Item的行爲,然後經過shuffle和batch後進入到訓練模型,這時候一個batch裏面的數據肯定包含了多個用戶行爲的樣本,這個和線上推理服務的輸入數據格式是完全不同的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如何解決這個問題?最簡單的想法,如果在線上服務就只發送一條用戶特徵會怎麼樣?快速的嘗試就可以知道特徵數據進入到模型輸入層的時候會 concat失敗。這是因爲Item特徵的batch size是多個,而用戶特徵的batch size只有1,示例如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/ad\/ada8d11ef6abf5b307a8c02790084793.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了解決concat失敗的問題,單純先從模型的角度來看,可以考慮在進入到輸入層之前把用戶特徵還原到和Item特徵同樣的batch size,如下圖所示。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/45\/45f5ac25b7969795cda23091d51ee92a.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"顯然這個從數學模型上是可行的,接下來就是怎麼在TensorFlow 的代碼裏面實現這個想法。這裏需要注意的是複製的操作只能在線上服務的模型裏面,不能在訓練的模型裏面。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"目前TF Estimator 接口在推薦類算法的應用比較常見,而Estimator 接口提供了很好的模型區分方法,通過判斷ModeKeys爲`tf.estimator.ModeKeys.PREDICT`時是線上的服務模型,ModeKeys爲`tf.estimator.ModeKeys.TRAIN`時是訓練模型,下面是示例代碼:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/7a\/7a4b7a6a4b330d71d619739ef12809d1.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在實際的模型上,需要將User和Item的feature column區分開來分別傳入,這個對原來的模型代碼改動比較大,batch size的獲取可以通過判斷Item特徵的長度來獲取,這裏不再贅述。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在實際的上線過程中,團隊經歷了兩個階段,第一個階段是隻對算法模型代碼做修改,在處理用戶特徵時只取第一維,但是實際發送的推理請求還是會把用戶特徵重複多次;第二個階段才把發送的推薦請求優化成只發送一份用戶特徵,這個時候模型代碼不需要再做修改,已經自動適配。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/86\/86593cf987a81ce7ea29676c4bb2e96c.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如上圖所示,第一階段的時候用戶特徵的輸入還是重複多次,在模型中,對用戶特徵只取第一維再進行特徵處理,示例代碼如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/eb\/ebb733a2c8231ea212fca67e6eb9f28a.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上面的模型代碼可以同時適配推理請求發送重複的用戶特徵,或者只發送一條用戶特徵。因此在第二階段的時候,不需要再修改模型代碼,只需要優化發送推理請求的引擎側代碼。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"經過這樣的優化,線上推理服務不需要重複發送用戶特徵,不僅節約了帶寬,而且減少了序列化的消耗。對一個 batch 中的用戶特徵只做一份數據的Feature Column轉換,然後做複製操作,複製消耗的時間遠遠小於轉換的時間。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏其實還可以做進一步的優化,將複製操作延後到第一層神經網絡的矩陣乘後面,這樣可以減少第一個矩陣乘的部分計算消耗。如果用戶特徵的維度佔比比較高,優化的效果會比較明顯。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"總結"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文介紹了愛奇藝深度學習平臺在實踐過程中總結的一些TensorFlow Feature Column優化。經過這些優化,線上的推理服務性能效率提升一倍以上,p99延遲降低達到50%以上。而且相比較於做op fuse,模型圖修改等優化,這些優化在業務實際中也比較容易去落地。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後,我們還是要肯定TensorFlow Feature Column給推薦類算法帶來的特徵處理便利性,它將整個特徵的處理抽象出來,算法只要稍微適配一下樣本特徵就可以很快的做迭代和實驗。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"參考文獻"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1. https:\/\/www.tensorflow.org\/tutorials\/structured_data\/feature_columns"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2. https:\/\/www.tensorflow.org\/api_docs\/python\/tf\/feature_column"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3. https:\/\/github.com\/tensorflow\/tensorflow"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文轉載自:愛奇藝技術產品團隊(ID:iQIYI-TP)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"原文鏈接:"},{"type":"link","attrs":{"href":"https:\/\/mp.weixin.qq.com\/s\/2pV38VbvwCJkNA44HfcPuA","title":"xxx","type":null},"content":[{"type":"text","text":"推理性能提升一倍,TensorFlow Feature Column性能優化實踐"}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章