嗨,各位大佬好,不知過年有沒有想起我,沉寂了一個多月該出來溜溜了,在推薦場景中,無論是召回,排序或者粗排階段都需要訓練資料,用戶的點擊行為歷史是一直在更新的,這就必然要求模型一直訓練,因而增量訓練成為必然,如果沒有增量訓練,那么推薦就會限于區域,比如很多item不夠充分曝光、很多user短期內行為只有很少難以推薦相應的item、user和item不能夠相互匹配(match),當引入增量訓練,很多問題就會不解而解,等于是繞過了很多問題,這時候的推薦則是全量的資料,全部的user和item,只要有行為,不管user在任何時候點擊了,不管item有幾個人點擊,都可以得到相應的匹配,這是對內容的充分利用,讓用戶最大EE(給用戶很多可能感興趣的其他偏好),這是非常nice的,
下面則是簡單的函式呼叫,
1-初始化方法,這個說起來有很多方法,常見的正態分布(或者截斷正態分布、固定均值和方差的)以及Xavier,he等方法都可嘗試,
初始化的時候要注意,一定要有初始化,,,這不是廢話,
sess.run(tf.global_variables_initializer())
常用的函式如下,其他不多贅述,這兩個意思一樣,親測結果一樣,但前者只能加載一維的變數,如果采用初始化器則可以,
tf.get_variable()
tf.Variable()
2-累計編碼,對見過的user/item進行編碼,未見過的從上次的最大編碼值處開始編碼,
直接采用dict及zip即可解決,去重的話采用set的difference,但是奇怪的是在gbdt的編碼中有誤,百度的大佬說gbdt不能增量訓練,也不知道是不是真的,待驗證,
問題思考:
3-在一段時間內,如果user沒有行為,那么訓練中該user的emb是否會更新,講道理應該沒有更新,如果沒有更新,如何給它推新的item呢?這時user的emb與item的新的emb并不算服從同一個模型啊,這樣給它推item是否合理??
同樣,如果真的在全部的user和item空間進行推薦,那么有些item的emb某一次沒有經過訓練,而有的item則經過訓練了,這樣這兩個item的空間距離是怎樣變化的?一個普適性的理論是:如果兩個item距離很近,那么它們在任何空間的距離都很近,如果經訓練的item與未經訓練的item的距離變化了(本來應該近的,訓練后距離遠了,或者本來距離遠的,訓練后距離近了,注,這里的訓練是指一個訓練,一個未訓練)這種情況怎么應對呢?可能最后推出的item并不理想,當然,如果更新的頻率較快,比如1h,是不是可以忽略這種變化的影響?
4-上述3的假設是:如果近1h的資料中沒有某個user或item,那么訓練后他們的emb肯定沒有變化,這個是不是真理??
請教了同事大佬,他覺得如果是資料可以在短時間進行更新,不必增量訓練,另外,如果相似的item或者user經訓練后變化大也可能是他們本來就不是那么相似,這是變化的思想,似乎也有道理,大佬還覺得,如果需要增量訓練,如果要避免OOM問題,那么可以將沒有用到的user和item向量去掉(也就是說未經訓練的user/item的向量不變),這就是說要另外建立一個索引,每次都要重建,這個很心累的,如果我不想建立索引,只能減少batch_size,我怕最后的batch_size等于1還好OOM,這樣即使采用多GPU也難以解決問題,而重建索引真的很麻煩,進退兩難啊,所以今天的周報咋寫呢???
后記,最近請教了很多公司的同事,有些公司的演算法和工程是分開的,做演算法的就是一直優化迭代更新模型,提升效果,這才是真的做演算法,而有專門做工程的,如果是這樣,那么精力只能花在幾個模型上進行更新,而不是今天復現個paper,明天copy個代碼,跑一下,能用,然后就over了,這仍舊沒有絲毫的競爭力,
愿我們終有重逢之時,而你還記得我們曾經討論的話題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/267026.html
標籤:AI
上一篇:Matlab函式打包為.jar后在java中呼叫出現錯誤:Exception:com.mathworks.toolbox.javabuilder.MWException: An error occur
