仅针对聚类和采样的方式对方法进行改进,统一使用对模型所有错误样本的标签进行修改,保留前25个epoch重训练得到的模型,共1000个。
特征向量表示方式
如果使用最后softmax层的cos相似度替代原来0/1表示,其实几乎没有什么差别,不能细化测试用例之间的差距
🌟🌟🌟对于某个测试用例,如果它的值在变异模型和原始模型上的预测结果不同,应该分类讨论,如果它在原始模型上的pcs值比较低,那么它结果的改变就很有可能是因为它是一个边缘样本而非错误样本
1.先统计现有的一组方法最后从每簇中选择出的样本的pcs值的分布
以k=2为例
2.如果继续使用KMeans,那么在类内采样时,可以先多选r%的样本,然后再根据pcs或者其他的metric进一步筛选样本
🌟🌟🌟使用最后一层隐藏层的cos相似度代替原来的0/1(现有的测试用例选择和排序方法几乎都是提取的测试用例在最后一个隐藏层上的信息)
🌟🌟🌟使用softmax层的欧氏距离代替原来的0/1(记得归一化)
🌟🌟🌟使用softmax层的曼哈顿距离代替原来的0/1(记得归一化)
1.利用现有的0/1表示向量和KMeans算法聚类的效果
cifar10_vgg16 | cifar10_reset20 | mnist_lenet5 | |
---|---|---|---|
2 | 8512 0.9591 348 1488 0.3878 911 |
8101 0.9801 161 1899 0.6224 717 |
9755 0.9975 24 245 0.5755 104 |
3 | 8022 0.9733 214 966 0.6542 334 1012 0.2974 711 |
7101 0.9913 62 1796 0.8597 252 1103 0.4887 564 |
9631 0.9989 11 234 0.8803 28 135 0.3407 89 |
4 | 7765 0.9778 172 846 0.7435 217 735 0.2299 566 654 0.5352 304 |
6438 0.9944 36 1698 0.9211 134 1086 0.7716 248 778 0.4087 460 |
9519 0.9992 8 236 0.9322 16 135 0.8148 25 110 0.2818 79 |
5 | 7492 0.9818 136 807 0.8116 152 624 0.2083 494 567 0.649 199 510 0.4549 278 |
6026 0.9959 25 1014 0.8531 149 1633 0.9498 82 739 0.6779 238 588 0.3469 384 |
9429 0.9993 7 124 0.879 15 98 0.7857 21 240 0.9708 7 109 0.2844 78 |
6 | 7271 0.9858 103 773 0.8499 116 509 0.7132 146 552 0.192 446 434 0.5806 182 461 0.423 266 |
5697 0.997 17 963 0.8962 100 1454 0.9663 49 737 0.8128 138 616 0.6429 220 533 0.3358 354 |
9370 0.9994 6 129 0.8915 14 257 0.9844 4 103 0.8641 14 48 0.625 18 93 0.2258 72 |
7 | 7131 0.9879 86 739 0.8525 109 450 0.78 99 517 0.1779 425 392 0.6454 139 405 0.3975 244 366 0.571 157 |
5579 0.9971 16 956 0.9069 89 1461 0.9719 41 534 0.706 157 417 0.5228 199 676 0.8373 110 377 0.2944 266 |
9329 0.9995 5 95 0.8737 12 233 0.9828 4 82 0.8902 9 125 0.936 8 45 0.6 18 91 0.2088 72 |
8 | 7124 0.9881 85 732 0.8579 104 443 0.7765 99 296 0.3345 197 370 0.6568 127 305 0.4721 161 301 0.588 124 429 0.1562 362 |
4987 0.998 10 1403 0.9815 26 745 0.8913 81 949 0.9557 42 521 0.6987 157 417 0.5252 198 603 0.8358 99 375 0.2933 265 |
9329 0.9995 5 82 0.878 10 233 0.9828 4 87 0.8851 10 121 0.9339 8 39 0.6667 13 71 0.0986 64 38 0.6316 14 |
9 | 7003 0.9894 74 717 0.8703 93 421 0.8076 81 332 0.747 84 284 0.3415 187 271 0.6015 108 291 0.4639 156 252 0.5476 114 429 0.1562 362 |
4967 0.998 10 1391 0.9813 26 730 0.9014 72 920 0.9576 39 437 0.7666 102 375 0.632 138 315 0.4698 167 561 0.8307 95 304 0.2467 229 |
9328 0.9995 5 50 0.9 5 71 0.8592 10 232 0.9828 4 59 0.8475 9 119 0.958 5 34 0.6176 13 71 0.0986 64 36 0.6389 13 |
10 | 6909 0.9897 71 404 0.8416 64 290 0.7379 76 256 0.3008 179 702 0.8889 78 261 0.6935 80 272 0.4191 158 243 0.535 113 269 0.5985 108 394 0.1574 332 |
4754 0.9979 10 1342 0.9873 17 488 0.8709 63 904 0.9668 30 648 0.9228 50 415 0.7542 102 357 0.6246 134 312 0.4744 164 304 0.2467 229 476 0.834 79 |
9190 0.9998 2 72 0.9028 7 254 0.9803 5 56 0.875 7 148 0.9797 3 91 0.9231 7 52 0.8654 7 30 0.5667 13 71 0.0986 64 36 0.6389 13 |
如果如果仅仅在k=2时对现有的测试用例聚类,然后在较小的簇中采样,50~500,观察错误样本所占的比例
50 | 100 | 150 | 200 | 250 | 300 | 350 | 400 | 450 | 500 | |
---|---|---|---|---|---|---|---|---|---|---|
mnist_lenet5 | 0.36 | 0.29 | 0.34 | 0.375 | ||||||
cifar10_vgg16 | 0.62 | 0.6 | 0.567 | 0.59 | 0.588 | 0.593 | 0.589 | 0.57 | 0.584 | 0.574 |
cifar10_resnet20 | 0.34 | 0.33 | 0.36 | 0.335 | 0.348 | 0.35 | 0.351 | 0.348 | 0.347 | 0.332 |
如果k的数量增加,在除去最大簇的其他簇按比例采样然后观察错误样本所占的比例,不如k=2时。
按离中心的距离选有一定的效果,但依然有改进的空间。
当k=2时,对于较大的簇(正确样本所占比例较大),尽可能使得选出的都是正确样本
对于较小的簇(错误样本所占比例较大),尽可能使得选出的都是错误样本
- 按与聚类中心的距离选(减少噪声的影响)
- 按pcs值由高到低选(pcs越低越有可能是因为它是一个边缘样本才被分到这个簇中)
- 按kill_rate来选,kill_rate越高意味着杀死变异模型的数量越多,越有可能是一个错误样本
- 参照pace中使用过的基于mmd-critic的原型采样方法
❗️❗️❗️❗️❗️
在较小的簇中采样时,当根据整个簇大小的10%、20%、……、100%采样时,错误样本所占的比例如下表:
排序方式 | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | 1 | |
---|---|---|---|---|---|---|---|---|---|---|---|
mnist_lenet5 | distance | 0.417 | 0.367 | 0.342 | 0.296 | 0.287 | 0.333 | 0.345 | 0.367 | 0.400 | 0.424 |
pcs⬇️ | 0.083 | 0.122 | 0.247 | 0.265 | 0.279 | 0.333 | 0.351 | 0.362 | 0.386 | 0.424 | |
pcs⬆️ | 0.750 | 0.673 | 0.603 | 0.561 | 0.574 | 0.531 | 0.497 | 0.500 | 0.464 | 0.424 | |
killnum⬇️ | 0.250 | 0.122 | 0.096 | 0.122 | 0.148 | 0.204 | 0.228 | 0.301 | 0.364 | 0.424 | |
killnum⬆️ | 0.958 | 0.918 | 0.890 | 0.755 | 0.697 | 0.626 | 0.567 | 0.500 | 0.445 | 0.424 | |
mmd | 0.500 | 0.510 | 0.479 | 0.469 | 0.443 | 0.435 | 0.439 | 0.429 | 0.427 | 0.424 | |
cifar10_vgg16 | distance | 0.568 | 0.589 | 0.587 | 0.590 | 0.599 | 0.600 | 0.609 | 0.617 | 0.633 | 0.612 |
pcs⬇️ | 0.459 | 0.512 | 0.525 | 0.529 | 0.546 | 0.550 | 0.575 | 0.594 | 0.603 | 0.612 | |
pcs⬆️ | 0.703 | 0.684 | 0.697 | 0.704 | 0.679 | 0.667 | 0.649 | 0.638 | 0.629 | 0.612 | |
killnum⬇️ | 0.419 | 0.407 | 0.410 | 0.434 | 0.458 | 0.491 | 0.512 | 0.552 | 0.582 | 0.612 | |
killnum⬆️ | 0.885 | 0.852 | 0.845 | 0.793 | 0.766 | 0.732 | 0.698 | 0.664 | 0.633 | 0.612 | |
mmd | 0.777 | 0.717 | 0.679 | 0.650 | 0.632 | 0.621 | 0.614 | 0.618 | 0.613 | 0.612 | |
cifar10_resnet20 | distance | 0.344 | 0.348 | 0.346 | 0.341 | 0.335 | 0.344 | 0.333 | 0.325 | 0.332 | 0.378 |
pcs⬇️ | 0.037 | 0.098 | 0.132 | 0.169 | 0.209 | 0.242 | 0.274 | 0.307 | 0.342 | 0.378 | |
pcs⬆️ | 0.698 | 0.660 | 0.619 | 0.581 | 0.547 | 0.517 | 0.483 | 0.448 | 0.415 | 0.378 | |
killnum⬇️ | 0.159 | 0.158 | 0.169 | 0.190 | 0.213 | 0.231 | 0.259 | 0.298 | 0.331 | 0.378 | |
killnum⬆️ | 0.799 | 0.699 | 0.654 | 0.598 | 0.543 | 0.503 | 0.467 | 0.432 | 0.402 | 0.378 | |
mmd | 0.598 | 0.485 | 0.457 | 0.422 | 0.406 | 0.395 | 0.386 | 0.380 | 0.382 | 0.378 |
上述的结果和我一开始的想法相悖,反而那些pcs值较小的或者能杀死的变异模型数量较少的测试用例更有可能是揭错样本,在较大的簇中时,规律相同。
在较多的簇中采样时,当采样的个数为50,100,……,500时,其中错误样本的个数(因为错误样本个数较少,而簇本身较大,展示比例可能区别不明显)如下表所示:
排序方式 | 50 | 100 | 150 | 200 | 250 | 300 | 350 | 400 | 450 | 500 | |
---|---|---|---|---|---|---|---|---|---|---|---|
mnist_lenet5 | distance | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
pcs⬇️ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
pcs⬆️ | 5 | 9 | 11 | 11 | 13 | 13 | 15 | 15 | 18 | 18 | |
killnum⬇️ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
killnum⬆️ | 7 | 11 | 14 | 15 | 17 | 17 | 18 | 18 | 20 | 20 | |
mmd | |||||||||||
cifar10_vgg16 | distance | 4 | 10 | 12 | 17 | 20 | 21 | 23 | 28 | 32 | 32 |
pcs⬇️ | 0 | 0 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 4 | |
pcs⬆️ | 12 | 19 | 28 | 38 | 50 | 62 | 71 | 82 | 89 | 94 | |
killnum⬇️ | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | |
killnum⬆️ | 18 | 34 | 47 | 55 | 70 | 83 | 97 | 112 | 125 | 136 | |
mmd | |||||||||||
cifar10_resnet20 | distance | 1 | 2 | 2 | 2 | 3 | 3 | 3 | 4 | 5 | 5 |
pcs⬇️ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
pcs⬆️ | 12 | 15 | 29 | 39 | 52 | 60 | 70 | 77 | 80 | 84 | |
killnum⬇️ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
killnum⬆️ | 6 | 11 | 16 | 25 | 28 | 37 | 44 | 47 | 50 | 58 | |
mmd |
假设k=2,然后对较大的簇依据killnum从大到小选样本(选出来的就是正确样本)
然后对较小的簇依据killnum从小到大选样本(选出来的都是错误样本)
测试用例数量 | 大簇的大小 | 大簇中正确样本个数 | 大簇中错误样本个数 | 小簇的大小 | 小簇中正确样本个数 | 小簇中错误样本个数 |
---|---|---|---|---|---|---|
50 | 49 | 49 | 0 | 1 | 0 | 1 |
100 | 98 | 98 | 0 | 2 | 0 | 2 |
150 | 146 | 146 | 0 | 4 | 0 | 4 |
200 | 195 | 195 | 0 | 5 | 1 | 4 |
250 | 244 | 244 | 0 | 7 | 1 | 6 |
300 | 293 | 293 | 0 | 7 | 1 | 6 |
350 | 341 | 341 | 0 | 9 | 1 | 8 |
400 | 390 | 390 | 0 | 10 | 1 | 9 |
450 | 439 | 439 | 0 | 11 | 1 | 10 |
500 | 488 | 488 | 0 | 12 | 1 | 11 |
最初的设想是尽可能在较大的簇中选择正确样本,在较小的簇中选择错误样本。(几乎可以实现,但问题在于采样的时候是根据簇的大小按比例采样,即使实现了上述的设想最后我选择出的 正确样本:错误样本 其实就相当于 size(较大的簇):size(较小的簇))