1. 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表示爲:
具體到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不一定有預測結果。
改進方法:
-
增加數據(一個AST可以製造多個Queries,但由於padding後sequence的長度爲30k左右,報 memory error,我在想可以縮小sequence的長度不大於2K,因爲95%的數據長度小於等於2K )
-
簡化模型參數,縮小參數空間
#參考:
4. 理解NDCG
5. evaluating-recommender-systems
6. Mean_average_precision
7. 推薦系統常見評測標準之MAP與NDCG