summary4.27 - 28

1. loss

各種參數下的loss

1.1 時間複雜度降低

以前:batchsize = 1, traing set 有大約40k棵AST,跑一個epoch 需要90min左右,現在: batchsize = 10,對照github的mini seq2seq修改了model。現在一個epoch大約需要25min左右。

1.2 loss下降

1.模型結構和特徵工程存在問題 (借鑑了loss 下降的seq-to-seq translation)
2.數據集未打亂 (加入了shuffle)
3.數據集有問題 (training set不再出現label爲UNK的數據)
4.權重初始化方案有問題 (將需要隨機初始化的參數改爲可訓練的參數)
5.正則化過度 (之前loss不降,才加的dropout)
6.選擇合適的激活函數、損失函數 (改成最原始的attention mechanism)
7.選擇合適的優化器和學習速率 (batch size = 10, optimizer從SGD改爲Adam)
8.batch size過大 (batch size 從128降到10)
On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima討論太大的batch size 容易陷入sharp minima,泛化性不好。 batch size = 1 loss 也是有下降的。
9.訓練時間不足 .(正在running)

2. Ranking metrics

之前說過NDCG是對order敏感的Ranking metrics,
基於兩個前提:
我們希望把最相關的結果放到排名最靠前的位置,因爲大部分用戶都是從上往下閱讀的,那麼最相關的在前面可以最大程度減少用戶的閱讀時間;
我們希望整個列表的結果儘可能的和query相關;
NDCG允許相關值是實數值。
MAP(Mean Average Precision)使用二值(1表示相關,0表示不相關)

2.1 MAP

MAP即使對數據集中單個query的AP( Average Precision)求mean。
AP是Average precison. 基於三個前提:

  • we can recommend x items for each user
  • it pays to submit all x recommendations, because we are not penalized for bad guesses
  • order matters, so it’s better to submit more certain recommendations first, followed by recommendations we are less sure about
    AP可以看作是對 order敏感的recall。
    formulation表示爲:
    AP=k=1n(P(k)×rel(k))number of relevant documents\operatorname{AP} = \frac{\sum_{k=1}^n (P(k) \times \operatorname{rel}(k))}{{number\space of \space relevant \space documents}}

MAP=q=1QAP(q)Q​\operatorname{MAP} = \frac{\sum_{q=1}^Q \operatorname{AP(q)}}{Q} \!
具體到code suggestion
要預測node: {“type”:“NameLoad”,“value”:“x”},預測結果

predicted top5 node relevent score(rel)
“type”:“NameStore”,“value”:“x” 0
“type”:“NameLoad”,“value”:“x” 1
“type”:“num”,“value”:“6” 0
“type”:“NameLoad”,“value”:“y” 0
“type”:“NameLoad”,“value”:“z” 0

AP = (0 + 1/2 + 0 + 0 +0 )/ 1 = 50%
只有當top1 = 1 時AP = (1 + 0 + 0 + 0 +0 )/ 1 = 100%.
理想情況時越大越好,只要MAP >20%,就可以保證基本在top5中就可以找到結果。

code

def AP(data):
    Ap = 0
    for i in range(len(data)):
        if data[i] == 1:
            Ap = Ap + 1/(i+1)
    return Ap
def MAP(data):
    A_P = 0
    for i in range(len(data)):
        A_P  +=  AP(pre[i])
    mAp = A_P / len(data)
    return mAp

pre = [[0,1,0,0,0],[1,0,0,0,0]]
MAP = MAP(pre)
print(MAP)
## output: 0.75

3. 結果

過擬合,而且MAP不大於20%,也就是top5不一定有預測結果。
等明天拋出結果,可以補上這一塊
改進方法:

  1. 增加數據(一個AST可以製造多個Queries,但由於padding後sequence的長度爲30k左右,報 memory error,我在想可以縮小sequence的長度不大於2K,因爲95%的數據長度小於等於2K )
    在這裏插入圖片描述在這裏插入圖片描述

  2. 簡化模型參數,縮小參數空間

#參考:
4. 理解NDCG
5. evaluating-recommender-systems
6. Mean_average_precision
7. 推薦系統常見評測標準之MAP與NDCG

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章