PWWS开源代码各部分理解

这一部分是PWWS攻击方法的开源代码(地址在https://github.com/JHL-HUST/PWWS)中几个重点文件的梳理。主要用于记录自己的思路,还有一部分不太清楚,之后有更多了解再改正,有什么问题的话欢迎在评论区说明。

一、paraphrase.py

  1. 变量supported_pos_tags,标签列表,即支持的单词种类;
  2. SubstitutionCandiadate类,候选词池类。包含了四个属性,token_position,替换位置;similarity_rank,相似度;original_token,原词;candidate_work,候选词。
  3. 函数vsm_similarity,用于构造同义词,主要是调用了similarity函数。
  4. 函数_get_wordnet_pos,对词汇的词性进行标注。
  5. 函数_synonym_prefilter_fn,用于判断同义词是否可以用于替换。例如,当同义词是词组,与原词相同,词性不同,或者同义词是 'be' 时,均不可用于替换。
  6. 函数_generate_synonym_candidates,可以构造候选词池,返回的是一个以SubstitutionCandiadate类为元素的列表。重点部分,判断目标词的词性是否支持,若在supported_pos_tags中,则就其词性,并找同词性的同义词,并将处理后的词序列记录在synonyms中,在遍历synonyms内元素,构造supported_pos_tags变量,追加到候选池中。
  7. 函数_compile_perturbed_tokens,进行实际的替换操作。
  8. 函数PWWS。其中定义了函数softmax(),实现了论文中公式(8)。之后计算出了显著性序列,并且得到了实体列表和标记,之后,为每一句中的所有词找到同义词。这一步将同义词记录在candidates中,通过公式(4)(5),找到替换词,以及通过公式(7)计算出替换后分类概率的变化程序。再找到同义词后,按分类概率变化程度降序排列,并依次进行替换,最终打印替换结果。

二、adversarial_tools.py     其中调用了evaluate_word_saliency

  1. 函数ForwardGradWrapper,内部函数predict_prob计算分类概率和predict_classes预测其分类。
  2. 函数adversarial_paraphrase,主要功能是找出对结果影响最大的同义词。调用PWWS函数,并打印结果。除此之外,还包含了两个函数,一个是halt_condition_fn,对攻击类型进行判断,并添加扰动,预测添加扰动后的分类,若结果发生变化,则返回Ture。另一个函数是heuristic_fn,根据类型的不同,得到对应扰动样本,并计算干扰前后被分为正类的概率之差,并将其返回。

三、evaluate_word_saliency.py

内部仅包含一个evaluate_word_saliency函数。用于评估单词的显著性。整个过程,主要根据字符级和词汇级的不同,提取信息,计算公式(6)。

四、fool.py   该部分进行实际攻击,并可设置参数,如设置攻击干净样本的个数,攻击对象,使用的数据集等等

  1. 函数write_orgin_input_texts(路径,样本,攻击个数),主要功能是根据个数,将样本写入txt文件。
  2. 函数fool_text_calssifier 首先,根据选择样本和数据集,并调用函数write_orgin_input_texts,训练模型,并且用干净样本和对抗样本分别进行评估。

五、evaluate_fool_results.py

其中包含一部分配置GPU的内容。

  1. 函数read_adversarial_file  读文件,并用正则表达式处理。
  2. 函数get_mean_sub_rate  求平均替换率。
  3. 函数get_mean_EN_rate   与get_mean_sub_rate类似。
  4. 主函数  从数据集中读取数据并挑选模型,在干净样本和对抗样本上评估模型的精度并打印结果。

你可能感兴趣的:(代码分析,人工智能,算法)