notes

召回&排序

特征

從分布類型看,分為連續類型、離散類型、序列類型。從特征主體劃分,可以分為User特征、Item特征、Scene特征、交叉特征。

特征預處理通常有歸一化、標準化、截斷等方法,歸一化標準化需要對數據計算/保存最大最小值/方差均值,而且容易隨著數據集變化產生較大波動。截斷容易損失信息。可取對數等方法。

特征交叉:自動交叉如deepFM,autoint,dcn等,可以剔除不需要交叉的特征,同時做一部分人工交叉,如該用戶對某個作者的點擊率等。

共線冗余特征:可根據相關性和auc變化剔除部分;也有對其增加gate層學習權重的。

序列特征:可用w2v,bert?得embedding作為特征。

點擊率預測模型的校準

不僅需要排序,還需要精確得到點擊率。偏差來源有:訓練樣本采樣(盡量不采樣)、冷啟動(均值為零的隨機初始化參數使預測結果接近0.5)、數據分布遷移(及時更新模型or在線學習)、模型收斂到局部最優(減少參數,避免過擬合)。常用的校準方案有Isotonic Regression和Platt Calibration,還有《Practical Lessons from Predicting Clicks on Ads at Facebook》中的校準。

在線學習

在線batch有較大隨機性,而且隨時間漂移,也不能整體shuffle,不能簡單load舊模型去train。可以進行參數凍結(凍結交叉層和fc層,embedding層可訓練)、樣本回放(當前是1點,取昨天1點以后的樣本與當前樣本混合訓練,因為1點之前的當天樣本已經訓練過了)、蒸餾學習(以離線模型為teacher,實時模型為student,在 loss 上除了student的Logloss損失,添加了teacher與student之間的交叉熵損失,兩個損失的權重比為 1:0.2,目的就是讓student模型不要離 teacher太遠)

召回評價指標

HR@K, MRR

排序評價指標

auc

AB測試

分為按設備分流和按流量分流。按設備分流需做AA測試,避免個別特例的存在影響AB分組的均衡。按流量分流可能導致一個設備不能保證分在某組,難以長期觀測。

auc提升但線上ctr不漲?

base auc:去掉item特征和交叉特征,只保留user和context,auc也可能比較高,但是這時的預測結果是沒有意義的,這個auc可以作為base auc,突破了這個值后的auc提升對于線上效果提升是有明顯幫助的。

GAUC:每個用戶算一個AUC,然后加權平均,需要每個用戶行為足夠豐富(至少2個曝光,1個點擊)。權重一般可以設為每個用戶view的次數,或click的次數,而且一般計算時,會過濾掉單個用戶全是正樣本或負樣本的情況。

線上線下特征不一致:上線前一致性校驗:生成一批樣本離線在線打分查看是否一致;線上線下使用同一套特征抽取框架;監控空值率,取值分布,時效性等;強偏置特征建模是否正確:比如pos bias,一般放到wide側,線上置為0,這對于只求相對排序的模型來講沒問題,但在一些需要預測點擊率的場景,比如廣告等,結果就會有很大的偏差。一個可行解:先用0計算所有內容的分數,排序得到預估pos,再按預估pos跑一遍模型打分。

訓練過程:訓練集測試集重疊、特征穿越、過擬合

線上結果可信度:統計時間長度、ab分組是否正確、serving是否正常

數據分布變化:訓練時未有足夠曝光的數據、新數據等導致;比如baseline是熱門模型,則訓練模型的數據集中很少其他樣本的數據,訓練效果就不好,但是迭代一段時間會逐漸改變,模型本身會影響樣本數據,對照組數據也會慢慢發生變化。可行經驗:新老模型加權融合逐漸替換、過采樣探索型流量得到的樣本。

上下游變化、產品變化、特殊時間節點的變化等。

LR&SVM&FM

lr:線性+sigmoid,人工特征組合引入非線性,解釋性強,但人工特征成本很高。

svm:用核函數增加高階特征組合,訓練數據中不存在的特征組合沒法被訓練,泛化能力弱,大規模稀疏特征下尤其嚴重;求解將涉及m階矩陣的計算(m為樣本個數), 因此SVM不適用于大數據集。

FM:同樣是二階特征組合,但用的是embedding的方式,泛化能力更強,即使訓練數據中沒有某個特征組合,依然可以用embedding內積來計算其權重。y=w_0+\displaystyle \sum^{n}_{i=1}{w_ix_i}+\displaystyle \sum^{n}_{i=1}{\displaystyle \sum^{n}_{j=i+1}{<v_i,v_j>x_ix_j}}。n為特征數量,k為embedding維度。交叉項可改寫為\frac{1}{2}\displaystyle \sum^{k}_{f=1}{((\displaystyle \sum^{n}_{i=1}{v_{i,f}x_i})^2-\displaystyle \sum^{n}_{i=1}{v_{i,f}^2x_i^2})},復雜度由O(kn^2)變為為O(kn)。

MF:矩陣分解,等價于FM的特例,只有user和item的id特征,通過矩陣分解進行embedding化,FM相當于引入side info embedding。

協同過濾:user/item-based(按相似度求加權和),矩陣分解也可以做。

Word2vec

w2v

模型包括一層輸入embedding,一層隱層,一層輸出softmax。CBOW使用上下文預測當前詞,Skip-gram使用當前詞預測上下文。softmax計算花銷大,有基于哈夫曼樹的層次softmax和負采樣方法。cbow訓練快但低頻詞效果不好,skip-gram訓練慢效果更好。

負采樣方法:有N個詞,按出現頻率作為每個詞的線段長度,拼成一個單位長度的線段,取M>>N,把該線段作M等分,可得每個詞所在的小線段對應的哪些m_i段。從[0,M]中生成隨機整數r,即可得對應哪個詞。其中,每個詞的頻率可取\alpha次冪,len(w_i)=\frac{count(w_i)^{\alpha}}{sum(count(w)^{\alpha})},若\alpha取0即所有詞等權重,取1則按詞頻賦權重。Word2vec中\alpha=0.75,M=1e8,如果采樣到w_i自己則跳過。

DeepWalk

cf方法只能用item的共現來學習,很難學到序列和圖結構中item間更高階的相似性;同時隨機游走可以增加訓練樣本。RandomWalk是一種可重復訪問已訪問節點的深度優先遍歷算法。DeepWalk對每個節點多次使用RandomWalk得到一系列節點序列,隨后進行Word2vec。

Line

基于廣度優先的領域構造,只能使用于無向圖。根據權重定義一階相似度,根據共同鄰接節點的一階相似度定義二階相似度。模型中使用embedding內積進行sigmoid和softmax來推理一二階相似度。節點負采樣:按節點出度決定選擇概率;邊負采樣:alias。

alias采樣:時間復雜度O(1)的離散事件抽樣算法。有n個候選,把概率分布畫成柱狀圖,底邊為1n,高為概率,高乘以n,再把高的矩形切分到低的,每個列最多兩個候選,得到面積1n的大矩形,每個小矩形面積為1*1,維護兩個數組分別保存每列原始概率和被挪過來的候選,生成2次隨機數得到最終候選。

node2vec

比起deepwalk,node2vec改變了randomwalk時的節點采樣路徑。前一個節點為t,當前節點為v,后續節點為x;x==t則采樣概率為1/p;d_{tx}=1則采樣概率為1;d_{tx}=2則采樣概率為1/q;p控制返回原來節點的概率,q控制偏向于dfs還是bfs,q越大則更傾向于在當前節點的附近進行采樣,也即BFS和結構性。在采樣節點路徑的時候使用了alias采樣。

同質性指item之間性質相近,結構性指item在圖結構中所處地位相近。dfs更能學到同質性,bfs更能學到結構性。dfs中更傾向于在一個大類中深度挖掘,bfs雖然在當前節點附近來回走但仍有概率走出當前大類。同質性的相似,是簇內的item在內容屬性上的相似;結構性相似的item則是各簇中的熱門item。實際推薦中同質性即dfs更有意義,pq的設置可以兼顧結構性。

airbnb embedding

  1. 訓練民宿embedding用于短期實時個性化推薦;2.訓練民宿類型、用戶類型embedding用于長期個性化推薦。分別使用點擊/預訂序列進行Skip-gram負采樣訓練,監督訓練也嘗試過似乎不如無監督的好。

民宿embedding使用點擊序列訓練,兩次點擊超過半小時即為新序列。除了全局負采樣外,還增加了同城隨機樣本做負樣本,增加了預訂民宿做正樣本,相當于在無監督的基礎上引入了業務上的監督信息。冷啟動方面,根據side info選擇距離最近的三個民宿embedding取平均,得到新民宿的embedding。

檢驗結果:k-means聚類,在地圖上觀察同地區的民宿被聚類到一起;對不同side info的民宿求余弦相似,觀察同類型是否相似度更高。

長期推薦使用的embedding根據用戶預訂行為做推薦,由于樣本量少序列短,根據side info對民宿和用戶歸類,訓練類別的embedding。構造序列為(u1,i1,u2,i2...),使得兩種embedding在同一向量空間。增加房東拒絕訂單的樣本做負樣本。類型embedding在訓練好后和其他特征一起作為gbdt的輸入進行訓練。

EGES

eges

為了緩解冷啟動問題,使用side info參與建模。在GES中,item embedding和side info(種類,店鋪,品牌,價格,性別年齡等)embeddings取平均作為item的最終embedding;在EGES中為每個side info賦予可訓練的權重,每個item都有自己的權重,權重取softmax歸一化,一般item自己的權重最大。離線評價指標:預測被人為去掉的邊,取auc、embedding可視化;線上A/B評價ctr。在線上冷啟動時,取side info embeddings平均作為item的最終embedding。

構造數據集:有向帶權圖,邊的流向為用戶點擊順序,權重為共現次數。用戶歷史序列按時間窗口截取。點擊后停留時間小于1s的、過度活躍用戶的數據進行過濾。邊權重較小的可能是噪聲可以考慮過濾。

doc2vec

word2vec提供了詞向量,對于句子向量可以用lda,tfidf帶權平均wordvec等方法。doc2vec在word2vec基礎上增加句子的embedding矩陣,包含兩種方法:PV-DM(使用cbow)和PV-DBOW(使用skip-gram)。PV-DM對句子向量與詞向量拼接輸入,PV-DBOW使用句子向量來預測其中的幾個詞。推理時新句子會重新初始化向量并訓練模型,其他參數不變直到收斂。

YoutubeDNN召回/排序

召回
排序

召回部分:特征經過embedding送入三層relu,最后一層輸出user vector,訓練時與item vectors(全連接層的參數,不同于輸入層的embedding矩陣,維度大小也不一定一樣)內積并softmax得到每類概率,serving時用user vector從item矩陣中取最近鄰topN。

排序部分:歷史video做embedding平均,上次看此頻道/先前看過此視頻次數特征做開方和平方,三層relu,訓練時按播放時長做weighted logistic,serving時用exp(wx+b)得到期望播放時長。

召回softmax分類數目很大,如何實現?負采樣并根據重要性加權、層次softmax(達不到精度,因為遍歷樹的每個節點時經常要判別不相關的類)。

召回的example age?日志發生距離訓練/推理的時間,推理時置為零。比如某個視頻點擊集中在7天前(比如7天前點擊率10%),訓練前這個時間點點擊率比較低(訓練前10分鐘點擊率3%),模型學出來之后預測的時候把Example Age置為0去預測,預測出這個視頻點擊率就會更接近3%。同理如果某視頻以前不火,訓練前突然火了,預測的時候Example Age置為0就可以預測到更高的點擊率。如果不帶Example Age,模型學出來的該視頻點擊率更接近于這個訓練區間下這個視頻平均點擊率。

對每個用戶采用同樣數量的樣本的原因?減少高度活躍用戶的過度影響。

模型中沒有采用rnn結構去建模用戶歷史瀏覽?文中說到避免過擬合,案例:用戶看過泰勒的視頻結果后面全推她的視頻導致效果不好。實際上后面谷歌也出了其他rnn的方案。

做video embedding時為何把大量長尾video直接用0向量代替?節省資源,這些video也不好訓練,算是一種trade-off。

weighted logistic和期望播放時長?p=sigmoid(\theta x) => exp(\theta x)=\frac{p}{1-p},對于weighted logistic,有exp(\theta x)=\frac{wp}{1-wp}\approx wp=t_{play}p

對部分特征開方和平方共同作為特征輸入的原因?引入非線性,從實驗看離線效果有提升。

Youtube雙塔召回

Youtube雙塔召回

雙塔結構,Queries特征\{x_i\}_{i=1}^N,item特征\{y_j\}_{j=1}^M
二者內積為s(x,y)=<u(x,\theta),v(y,\theta)>,其中\theta為模型參數,
訓練集為T=\{(x_i,y_i,r_i)\}_{i=1}^T,其中r_i為用戶反饋,如用戶觀看時長。

通過query x,從M個item檢索得到y的概率為P(y|x;\theta)=\frac{e^{s(x,y)}}{\displaystyle \sum_{j \in [M]}{e^{s(x,y_j)}}}

對數似然函數作為損失函數L_T(\theta)=-\frac{1}{T}\displaystyle \sum_{i \in [T]}{r_i log(P(y_i|x_i;\theta))}

當M很大,考慮計算效率,通常從中選取一個子集作為負樣本,在訓練MLP模型中負樣本通常從固定的語料中做采樣得到,對于流數據這里只用batch內的其他正樣本item做負樣本。在一個mini batch \{(x_i,y_i,r_i)\}_{i=1}^B中,對于每個i,softmax為P_B(y_i|x_i;\theta)=\frac{e^{s(x_i,y_i)}}{\displaystyle \sum_{j \in [B]}{e^{s(x_i,y_j)}}}

batch內item通常服從冪律分布,導致熱門item經常出現在負樣本中,被過度懲罰了,對s做修正:s^c(x_i,y_j)=s(x_i,y_j)-log(p_j)

估算y_j的出現概率p_j的算法:大小為H的數組A,B,輸出空間為[H]的哈希函數h,A表示上次y被采樣的時刻,B表示每隔多少步y可以被采樣一次,迭代第t步:B[h(y)]=(1-\alpha)B[h(y)]+\alpha(t-A[h(y)]),A[h(y)]=tp_j=1/B[h(y)]

為了減少哈希沖突的影響,設置多套哈希函數h和對應的AB數組,取B的最大值(如果沖突了,B會頻繁出現,取值會較小)。

線上推理時會事先計算好item的向量,再根據線上的user向量去找最近鄰。

對u,v做歸一化、同時用溫度系數效果更好。神經網絡常用向量內積,但向量內積不滿足非負、三角不等式,通過歸一化將其轉化為距離度量,映射到歐式空間。而歸一化之后交叉熵變得難以學習,即\hat{y}接近y時交叉熵仍較大,loss也就仍較大,\hat{y}y相反時loss仍較小,訓練變得很難進行;對內積結果放大之后,交叉熵的結果分布更尖銳更接近1和0,對應正確分類的樣本loss就很小,錯分的就很大,更容易訓練。換個角度來說,溫度系數對類心附近的簡單樣本學習力度小,對邊界樣本和難樣本力度大。溫度系數也可以按epoch迭代變化,當其接近于0時,得到的分桶概率分布接近于one-hot,當其接近于無窮時,得到的分桶概率分布近似于均勻分布。

在in-batch負采樣中有兩個問題:selection bias(長尾內容不能被選為樣本)和采樣分布與實際分布不符,解決的方法是增大batch大小以及減小采樣分布與真實分布的偏差。后續谷歌在google play中使用了mixed negative sampling,即在in-batch采樣基礎上增加一些全局采樣的負例。

對于全局采樣,如果按曝光概率p作為負采樣概率,則熱門內容會被過度打壓,如果每個內容均等概率,則又沒有打壓,實際采樣概率可以取p^k,k \in [0,1]

騰訊并聯雙塔召回

對item側和user側的輸入,分別給到數個分類模型(mlp,dcn,fm,cin),再對每個模型的結果分別做哈達瑪積(對應元素相乘),通過lr得到最終分數,lr的參數作為推理時每個子模型結果的權重。

召回的降維查看

對于embedding的效果衡量,可以降維可視化,pca和t-SNE在sklearn和tensorborad都有。pca通過正交變換得到一組方差最大的線性不相關的變量,t-SNE通過仿射變換把數據映射到概率分布上,使低維數據的局部結構接近原始數據。

senet

v2-eb33a772a6029e5c8011a5ab77ea2f74_720w.png

圖中的Ftr是傳統的卷積結構,X和U是Ftr的輸入(C'xH'xW')和輸出(CxHxW),這些都是以往結構中已存在的。SENet增加的部分是U后的結構:對U先做一個Global Average Pooling(圖中的Fsq(.),作者稱為Squeeze過程),輸出的1x1xC數據再經過兩級全連接(圖中的Fex(.),作者稱為Excitation過程),最后用sigmoid(論文中的self-gating mechanism)限制到[0,1]的范圍,把這個值作為scale乘到U的C個通道上, 作為下一級的輸入數據。這種結構的原理是想通過控制scale的大小,把重要的特征增強,不重要的特征減弱,從而讓提取的特征指向性更強。

wide&deep

wide&deep

GBDT

DSSM

DSSM

SDM

召回模型。融合用戶長期短期偏好。

定義兩次瀏覽間隔少于10分鐘則為同一個session,且一個session最大長度為50。短期行為指最近的session,長期行為指最近session前7天以內的session。

文章核心貢獻:1.同一個session中可能存在多個興趣傾向,利用多頭自注意力機制對短期興趣行為建模;2.當前session的興趣可能會受長期偏好的影響,分別建模長短期行為,利用gated fusion模塊進行融合。

SDM

item embedding:id,類別,商店,品牌等concat;user embedding:年齡性別等concat;短期興趣:用戶行為序列->lstm->multihead_self_att->和user做attention;長期興趣:不同維度行為序列分別與user做att,拼接過fc;gated fusion:G=sigmoid(W_1User+W_2Long+W_3Short+b), out=(1-G)Long+GShort

DIN, DIEN

din用target對用戶歷史做attention,dien用gru處理用戶歷史,并和target做attention。

warm up

參考

模型蒸餾

參考

point/pair/list wise

重排序

聚類

數據增強

dropout: 隨機丟棄部分神經元,以此來避免在訓練過程中的過擬合,每次丟棄后產生的子模型都不一樣,所以 Dropout 一定程度上使得訓練后的模型是多個子模型的組合約束。

對比學習/r-drop: 對每個樣本兩次前向傳播,得到的兩次輸出預測P_1,P_2是兩個不同子網絡的兩個預測值,對P_1,P_2的KL散度加權作為一項損失。直觀地說,在訓練時,Dropout 希望每一個子模型的輸出都接近真實的分布,然而在測試時,Dropout 關閉使得模型僅在參數空間上進行了平均,因此訓練和測試存在不一致性。而 R-Drop 則在訓練過程中通過刻意對于子模型之間的輸出進行約束,來約束參數空間,讓不同的輸出都能一致,從而降低了訓練和測試的不一致性。

對抗訓練: 在輸入或embedding處加小擾動。

mix-up: 對兩個樣本的x和y按權重\lambda線性相加,組合出新的樣本,\lambda服從beta分布。

transformer, bert

transformer詳解

multihead transformer:中對多個head的結果concat后過線性變換。舉個例子 如果輸入是 token64 ,分為8 head, 每個head 輸出 為 token8 , 8個 head concate 成 token* 64, 因為不同head 之間信息缺乏交流,需要再用一個矩陣把不同head信息進行融合。其實關于這個8,蘇神也有理論的解釋,最小熵原理。

position emb提供語義順序關系,論文里是利用寫死的周期函數,不過后面有很多改進方案。

bert開源模型為什么序列上限512? BERT中的Positional Embedding和Transformer中的Positional Embedding實現方式并不一樣,后者是通過三角函數公式計算得到,而前者本質上則是一個可學習的embedding層。在開源模型訓練時為了加速訓練,90%的step用長度128訓練,10%用512訓練。如果要突破該限制,可以擴大Positional Embedding層,前512個向量沿用開源參數,后面的參數自己訓練;也可以對文本做滑動窗口多次計算。

bert做語義相似度計算,可以用[SEP]分開兩句,標簽用0/1,也可以做成雙塔/孿生網絡在頂層交互兩個句子的特征;前者兩句更早交互,更容易學習到深層的語義信息,但由于樣本對數多導致訓練時間更長。

其他

RNN系列

rnn梯度消失/爆炸。lstm加門控遺忘過久信息,cell state保存長期信息。gru和lstm性能類似但參數少可視為簡化版,選擇可由實驗決定。參考。rnn模型需要序列訓練,相當耗時,可用attention/transformer代替。

神經網絡為什么歸一化

參考。數值問題,一個w過大,x稍微變化導致結果變化很大;訓練會走z字形,w大小范圍不同的參數訓練速度不一樣,影響收斂速度;評價標準歸一化更好比較;用了sigmoid等函數的不容易飽和;數值小的參數和特征不容易被埋沒掉。

auc和gauc

參考

知識蒸餾

參考

EE算法

基礎冷啟動算法,看作躲避老虎機問題,每個臂是一個item,該臂的收益是點擊率,對臂的排序即算法輸出。

湯普森采樣

假設每個臂收益分布符合beta(win,lose)分布,win,lose分別是試驗中點擊和不點它的次數。每次選擇臂的方法是:每個臂按beta分布生成隨機數b,選擇結果最大的去搖。

beta分布:f=c*x^{\alpha-1}{(1-x)}^{\beta-1},均值為\alpha / (\alpha + \beta)\alpha + \beta越大曲線越窄,生成的隨機數越接近均值。

初始化:新item要進行探索,可以設置公式為beta(1+win,1+lose),即點擊率初始化為1。也可以根據先驗知識,比如item平均點擊率3%,可設置為beta(3+win,97+lose),可能更貼合實際情況。

UCB

score_{i}=\frac{Click_{i}}{Show_{i}}+\sqrt{\frac{2ln(Show_{u})}{Show_{i}}}

前一項是點擊率,當item試驗次數很大時,后一項接近0,反之點擊率置信度不高,后一項分數用來優先探索。

初始化:對于新item,初始Show_{i}設置越小探索概率越大。

Embedding 擾動

主要考慮模型在小擾動下的穩健性,一種正則化方法。max-min game。cv和nlp用的多。
1.往x里加上\Delta x,使loss越大越好;滿足||\Delta x|| \leq \epsilon
2.用(x+\Delta x,y)作為樣本訓練模型最小化損失;
3.循環直到收斂。
Fast Gradient Method(FGM):\Delta x取上升梯度,標準化避免它過大。

GAN

接受隨機信號的生成器G,分類模型判別器D,先固定G訓練k次D分辨輸入來自G還是真實樣本,再固定D訓練1次G使得G的結果更接近真實樣本。當D無法分辨時,即輸出0.5左右則收斂。

類別不平衡問題

過采樣欠采樣,損失加權,數據增強,度量學習

新item或長尾item的曝光

它們早期點擊率不穩定,后期只有點擊率高的曝光量才會大,可取曝光量前20%內容的平均點擊率做默認點擊率,與實際點擊率加權,權重取曝光量。算法層面有冷啟動、多樣性、EE(UCB、湯普森采樣)等方法。

loss上升原因?

學習率過大、優化帶慣性(一段時間后應該下降)、召回數據集采樣范圍內(潛在的)正樣本多。

能否用一個統一的模型代替多路召回?

不能,面對海量物料庫,模型召回結果很可能集中在頭部內容(可頭部數據降采樣,針對重要特征做dropout等),多路召回時每一路靠硬性截斷,可以保證某類內容總能召回。

是否可以用一個模型統一召回和排序?

不能,海量數據,線上跑模型有耗時要求;數據分布也不一樣,召回是面向全部數據,排序面向曝光數據。

Batch Norm & Layer Norm

BN的提出?

在深度學習中,第L+1層的輸入,也可能隨著第L層參數的變動,而引起分布的變動。這樣每一層在訓練時,都要去適應這樣的分布變化,使得訓練變得困難。這種層間輸入分布變動的情況,就是ICS(Internal Covariate Shift)。而BN提出的初衷就是為了解決這一問題。另外ICS可能導致在過激活層的時候,容易陷入激活層的梯度飽和區,降低模型收斂速度。同時BN還有一定的正則作用,避免極端數據造成的過擬合。

模型推理時的處理?

推理時的方差和均值,可以用訓練數據做無偏估計,或者用移動平均的方法求running mean/var。

為什么BN里要引入Scale和Shift?

當時論文作者在設計BN 的時候,默認將BN加在了激活函數之前,所以才有此話,不管激活函數時sigmoid、tanh、還是relu, 如果做完Normalize之后不加個線性變換,那么將導致大部分輸入處于激活函數的線性部分,或者一半的輸入處于relu 的dead部分。為了避免這種情況,作者在BN里加入了Scale和shift。可是之后很多人做BN并不一定是這樣做了,也有直接放在激活函數之后的,效果也不差。所以這個design個人感覺是個歷史原因。

BN一般不適用什么場景?

batch size較小,rnn和nlp(不同長度)。推薦系統里面長尾分布與bn的假設也不符。

nlp中為什么用Layer Norm?

句子長短不一,有些位置沒有足夠的數據,測試集中甚至可能出現比訓練集長的句子。訓練到的均值和方差可能有偏差。另外,batch的分布對圖像可能是有意義的,但對不同的句子沒什么意義,我們只需要每句話內的分布一致。

優化器

SGD

batch GD, mini-batch GD, SGD。可能收斂在最小值、極小值、鞍點。

w = w - alpha * g

動量

v = momentum * v - alpha * g

w = w + v

AdaGrad

參數的更新越頻繁,學習率越低。更新頻繁說明接近最優解了。適合稀疏數據。與動量類似,也是減弱梯度下降時在陡峭方向來回擺動的現象。

r = r + g*g

w = w - alpha * g / (sqrt(r) + eps)

RMSProp

AdaGrad的改進,增加一個衰減系數控制歷史信息的保留,丟棄遙遠的歷史。

r = rho * r + (1-rho) * g*g

Adam

m和v分別是梯度的一階動量項和二階動量項
m = beta1 * m + (1-beta1) * g

v = beta2 * v + (1-beta2) * g^2

偏置修正,t為迭代輪數:

m = m / (1 - beta1^t), v = v / (1 - beta2^t)

更新參數:

w = w - alpha * m / (sqrt(v) + epsilon)

Adam和RMSProp很像,除了m使用平滑版,以及偏置修正。

偏置修正是為了去除初始的m_0和v_0的影響,比如m_0 = 0(keras默認初始化值),修正前{m_1}=(1-beta1) * g \approx 0,修正后{m_1}=(1-beta1) * g / (1-beta1) =g。這兩個bias修正本質上是對學習率的修正,在keras和tf中,都是在lr上直接修正(lr=lr*sqrt(1-{beta2}^t)/(1-{beta1}^t))以代替對m和v的計算。

在bert中使用了adamW且不做de-bias。如果模型中計算了l2正則,正常情況下權重越大的懲罰會越大。但對于adam來說,權重大對應的梯度也會比較大,梯度平方在分母中會使得懲罰更小。所以adamW不把l2正則算在損失函數(原始的梯度)里面(g_t=g_{t-1}+\lambda{\theta}_{t-1}),而是在更新權重的時候做weight decay({\theta}_t={\theta}_{t-1}-\alpha * ...+\lambda\theta_{t-1})。因此使用了adamW就不必再另外加l2正則了。

bert中還對學習率做了warm-up,即從0線性增加到 init_learning_rate,然后lr又從 init_learning_rate 線性衰減到0(完成所有steps)。這是為了避免較早的對mini-batch過擬合,即較早的進入不好的局部最優而無法跳出。同時Adam中的bias correct也同理去掉了。由于bert預訓練時有足量的樣本并迭代足夠的epoch,使得這種有偏估計與無偏區別不大,并且bert推薦在fine-tune中使用同樣的優化器。但有文章認為在小樣本fine-tune中,不de-bias會導致學習率不穩定并影響訓練效果。

Loss

無損編碼事件信息的最小平均編碼長度,混亂程度,不確定性,驚奇程度不可預測性,信息量等等。

對于有n種可能性的場景,編碼一個信息的最小編碼長度=log2(n)=-log2(1/n)=-log2(p)。

Entropy=平均最小編碼長度=-sum(p*log2(p))

相對熵(KL散度)

有一個真實但未知的分布p,使用分布q去預測它。

KL(p,q)=-sum(plog2(q-p))=sum(plog2(p-q))=sum(p*log2(p/q))

交叉熵和softmax

由于E(p)是固定的,略去這一項,得到交叉熵CrossEntropy=-sum(p*log(q)),也可以理解為用q表示p的編碼長度,則kl散度為兩種編碼長度的位數差。

CE(p,q)>=E(p),只有在完美估計的情況下才能相等。

二分類交叉熵因為兩種情況概率相加為1,所以有BCE=-plog(q)-(1-p)log(1-q)

為什么比mse好?從計算上看,假如模型只有一層線性一層sigmoid,對參數w求導,ce的結果為x(y'-y),mse結果為-|y-y'|sigmoid'(z)x,mse在sigmoid的飽和區求導結果接近0,而ce可以做到求導與y'和y的差成比例。

sigmoid' = sigmoid * (1 - sigmoid)

mse的含義是輸出概率分布服從高斯分布。二分類/多分類交叉熵則是服從兩點分布/二項分布。

極大似然函數的形式也是-sum(plogq),但它衡量的是模型輸出的結果作為一個數據分布(多項式分布),對樣本集里的y分布的解釋程度,而交叉熵直接衡量的是兩個模型(訓練的模型和真實世界模型)的分布之間的差異。參考

softmax可以理解為arg max的一種平滑近似;也可以理解為將輸入向量歸一化映射到n個類別上的概率分布。softmax是sigmoid的一般性情況,對于二分類問題,搭建模型時選取softmax或sigmoid則在logit和輸出上略有不同,前者是二維輸出,后者是一維輸出,即sigmoid只對一個類別建模,softmax對兩個類別建模。

多標簽分類損失

log(1+\sum_{i \in \Phi_{neg}}{e^{s_i}}) + log(1+\sum_{j \in \Phi_{pos}}{e^{s_j}})

多標簽分類的label_smoothing

Float in [0, 1]. If > 0 then smooth the labels. For example, if 0.1, use 0.1 / num_classes for non-target labels and 0.9 + 0.1 / num_classes for target labels.

概率,odds與logits

發生比odds=p/(1-p),logits=log(odds)。當概率大于或小于0.5時,odds的取值范圍并不對稱。當概率從0.1增加到0.2,時,odds增加了0.139;當概率從0.8增加到0.9時,odds卻增加了5,當概率從0.2減少至0.1時,logits的增量是-0.811;當概率從0.8增加到0.9時,logits的增量也是0.811,我們可以直觀地感受到logits增量也是對稱的。

lr是非線性模型(具體是廣義線性模型),但是可以轉成線性模型求解(如果你的訓練集是x1,x2,...,xn, y或者說p,你用logistic回歸來求解,可以先轉換成 x1,x2,...,xn, ln(y/(1-y)或者說logits,經過sigmoid又變成p),然后用線性回歸來求解)。logistic回歸本質上是線性回歸,只是在特征到結果的映射中加入了一個sigmoid函數,即先把特征線性求和,然后使用非線性的函數將連續值映射到0與1之間。

另外,y=ax+bx^2+c也是線性模型,令x_1=x,x_2=x^2,則有y=ax_1+bx_2+c

sampled-softmax-loss

在分類網絡中,最后一層每個神經元輸出分別代表各類別的logits,logits代表各類別未經歸一化的概率分布,網絡就是學習映射關系f_{\theta}(x)=logits。logits經過softmax進行歸一化,后使用交叉熵計算損失。當類別數量很大時,可以從中采樣部分類別做softmax和交叉熵。

Q為采樣算法,C為采樣所得類別子集,K為與類別無關的常數,經過推算,有f_{\theta}(x,y|C)=f_{\theta}(x,y)-log(Q(y|x))+K。K不影響分類結果,即對于計算出來的f_{\theta}(x),減去log(Q(y|x))就得到采樣后子集的logits,把它f_{\theta}(x,y|C)作為softmax的輸入。

如果我們采用隨機采樣,則log(Q(y|x))也可認為是與類別無關的常量,那么像DSSM中直接用原始logits代替采樣后的logits也是可以的。

NCE loss

與sampled-softmax loss一樣是用于多標簽分類時提升計算效率的方法,采樣部分負樣本,每個樣本分別做二分類損失。理論上,負樣本數量越大,則越接近真實情況。實際使用中取1個正樣本,其他都是負樣本作為batch。

Activation

sigmoid & tanh

sigmoid(x)=1/(1+e^-x), tanh(x)=2sigmoid(2x)-1=(ex-e-x)/(ex+e-x)

共同優點:平滑易求導,共同缺點:導數小于1鏈式法則下易梯度消失,飽和區導數趨于0更新緩慢,冪運算耗時。

sigmoid值域(0,1),優點:作為概率輸出有解釋性,缺點:不以0為中心,可能導致模型收斂慢(比如w1,w2分別需要變大變小,Loss對f導數相同,上一層的x恒為正值,則w1,w2的變化方向相同,模型會走Z字優化,參考)。

relu

線性整流函數,=max(x,0)。

優點:單側抑制,稀疏性(防過擬合),沒有sigmoid的飽和區和梯度消失,計算簡單。

缺點:一個大梯度可能導致權重更新后該神經元進入負半軸,不會再次激活(對異常值敏感)。設置不過大的學習率能一定程度避免。leaky relu=max(\alpha x,x)也可能改善該問題。Prelu中\alpha是可學習參數。Random relu中\alpha在訓練時是隨機的,推理時固定,有點像一種dropout。Elu=\alpha(e^x-1) if x<0。Selu=\lambda elu,可歸一化數據使得權重和偏差的均值為0方差為1,它假設輸入服從高斯分布,需搭配lecun_normal初始化。另外,BN的歸一化基本不會有異常輸入,就不會有神經元死亡問題。

參考

阿里SDM召回
阿里DSIN排序
tf1.x教程
tfDataset
tfRecord
美團點評搜索相關性模型演進
谷歌雙塔研究:頂層參數共享使雙塔在同一個向量空間
訓練深度學習網絡時候,出現NaN是什么原因,怎么避免
多目標
多目標
GCN
GCN
阿里EGES召回
hash embedding
deep hash embedding
senet
esmm
mmoe
mmoe
連續變量離散化的原因

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容