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