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

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