9 月 26 日,杜克大学陈怡然教授在微博秀出了组里博士生的成绩——杨幻睿同学的论文被 NeurIPS 评为最优的 Oral 级别,并不忘强调“还是家里领导最牛”,狠狠向粉丝撒了一把狗粮。
根据陈怡然随微博贴出的邮件显示,本次 NeurIPS 2020(Conference on Neural Information Processing Systems)收到了破纪录的 9454 篇论文,合计 1900 篇论文通过评审,其中包括 280 篇 Spotlight 以及 105 篇 Oral,Oral 级别论文比例仅 1.1 %。
本次杨幻睿提交的论文名称为“DVERGE: Diversifying Vulnerabilities for Enhanced Robust Generation of Ensembles”,旨在保证模型识别精度的情况下同时提高模型的鲁棒性,这项技术的应用前景广阔,属于人工智能,尤其是图像识别、机器视觉领域的前沿基础方法。
DeepTech 联系到杨幻睿,请他介绍了该论文的具体内容及自己不寻常的成长路径。
神经网络的双刃剑
2015 年左右,随着深度学习技术的发展,对抗性攻击(Adversarial Attack)以及 对抗性鲁棒性(Adversarial Robust)被人们愈加重视。
此前,在深度学习的应用场景中,技术人员所选取的训练数据与测试数据往往是 “清洁” 的,仅包含少量的天然噪声,这时候基本不存在显著的 “鲁棒性” 的问题。
但后来,技术人员出于种种目的,为神经网络的测试数据加入了特别设计过的“噪声”,这些数据可以骗过模型,极大程度上改变网络的中间层隐含特征,最终导致错误的输出结果,即识别失败。
这个过程被称作对抗性攻击。对神经网络鲁棒性的研究主要旨在增强其对这类攻击的免疫性。
为图片加入 “噪声” 的具体做法大概是这样:通过某些算法选取图片中的部分或全部像素,再通过特定算法让这些被选取像素点的颜色在小范围微调,就可以得到一张肉眼看不出太大差别,但却能影响模型识别的图片。
图 | 一张具备对抗性攻击属性的图片,右侧的图片可用作对抗性攻击
杨幻睿介绍道,目前常见的攻击大都属于 “无目的攻击” 类型,即只要模型的输出结果错误,就标志着攻击成功。目前的网络环境这类攻击行为已经比较普遍。
这项技术有许多有价值的应用场景,比如互联网公司在用户执行一些如注册、登录、抢红包等敏感操作的时候大都有填写验证码的操作,为了防止被自动化程序利用,这些验证码的图片就会被加入“噪音”,以降低恶意程序的识别成功率。
当然还有一些负面的应用,比如此前有研究者撰文,他们专门设计出针对自动驾驶程序的干扰贴纸,将这种贴纸贴在路牌上,可以在不影响人类驾驶员的情况下,让计算机产生误判。这种情况可能导致非常严重的后果。
图 | 一个会被计算机识别成限速 45 英里(72 公里)/ 小时的路标
此前,针对这种场景,技术人员的普遍做法是进行对抗性训练。
思路也很简单直接,既然现有的神经网络对这类加了 “噪声” 的数据识别效果不好,干脆将这些加了 “噪声” 的数据加入到神经网络的训练过程之中。通过噪声与模型对抗的方式逐步提高模型的鲁棒性。
这样的方式,的确会让神经网络更好地识别带有 “噪声” 的数据,但是代价就是较大地牺牲了对正常数据的识别精度(10% 以上),所以这种 “简单粗暴” 的方式并不一定满足实际应用的需求。。
Ensemble——博采众长
为了既能提高模型的鲁棒性,又能保持对清洁数据的高识别度,杨幻睿和同事想到了引入 “Ensemble” 的方式训练模型。
“Ensemble”的原意是“合唱”,国内有人将它直译为“集成”,也有人根据它的特点翻译成一个颇为诗意的词汇——“博采众长”。这是一个比深度学习更加古老的概念,早期的研究者大多用这种方式来提高模型的准确率。
具体的做法是,训练多个不同模型组成一个模型集合,然后单个模型依次进行识别任务,最后再将集合内所有模型的识别结果汇总,以投票或平均的方式对外给出统一答案。在这一过程中,通过对不同模型设置不同的学习目标或优化方法,每个模型在测试集上犯下的错误就会各不相同。通过这种方式,即使单个模型的准确率并不高,这个模型集合体的识别成功率得到了较大提升。
同样的训练原理也可以作用于提升模型的鲁棒性上。在训练多个不同模型组成一个模型集合的过程中,但通过一系列的操作让不同模型之间对噪声输入的识别结果或中间特征保持一定的“差异性”,以避免在遇到噪声时时模型集体“沦陷”,就可以在一定程度上提升集合体的鲁棒性。前人的工作探索过多种基于模型输出、权值以及梯度的差异化训练方式,并在针对自然噪声或应对训练集分布外数据等应用领域取得了不错的结果。
然而当面对对抗性攻击噪声时,传统的让模型之间保持 “差异性” 的方法往往表现不佳。其中原因就不得不提到对抗性攻击的一个比较烦人的特点——迁移性。
目前很多模型是根据公开的数据集进行训练的。对抗性攻击的发起者虽然不知道目标模型的具体训练方式,但如果他也根据同一套数据集训练一套自己的模型,然后针对这个模型生成对抗性攻击的数据,那么有很大的概率,这些带有 “噪声” 的数据依旧会对基于同一数据集训练的其他模型造成很大的困扰,这就是对抗性攻击的迁移性。
对于同一数据集上同样方式训练的模型, 对抗攻击的迁移成功率往往高达 98% 以上。前人提出的差异化训练方式可以将迁移成功率降至 65% 左右,但这还远远不足以让集成模型展现较高的对抗鲁棒性。
而杨幻睿和同事则创造性地从全新角度提出了针对对抗性攻击的差异化训练方式,通过有效降低对抗攻击成功率显著提高模型的鲁棒性。
前人在研究中观察到,某种角度上说,对抗攻击展现出的高迁移性并不是模型的一个 “缺陷”,而是由于模型的“学习” 方式所导致的一个必然的结果。
当使用真实数据进行训练时,模型更多地学到的是 “非鲁棒” 的特征,这种特征在数据集里广泛存在,而且非常容易被“学会”。不同模型在同一数据集上训练,也基本上都会学到这些特征,并且往往学到的特征有很大的相似性。
在这种情况下,一旦对抗性攻击影响了模型已经学会的非鲁棒特征的识别,那么这类攻击就可以波及到几乎所有模型。
而对抗性训练的本质是让模型抛弃非鲁棒特征,转而去学习不易受到噪声影响的鲁棒特征。
可问题在于相比较于非鲁棒性特征,鲁棒性特征非常“少”,并且往往需要更高层次的特征处理与认知能力,不是很容易被神经网络学会。这也是对抗性训练往往带来较低准确率的重要原因。
基于这些观察,杨幻睿和同事们提出了一种新的思路:对抗性攻击之所以产生迁移性,是因为不同的模型,学会了相同的非鲁棒的特征。那么,如果让不同的模型,学会不同的非鲁棒特征,迁移问题会不会迎刃而解呢?
答案是肯定的。
具体的做法是,首先,通过分析卷积神经网络的中间隐含层,提取模型集合中所有模型的非鲁棒特征。
杨幻睿说,当一张猫的图片被某一模型错误地分类成狗时,就意味着该图片一定包含了狗中的一些非鲁棒特征,他们所要做的就是避免让别的模型使用这些特征。
然后,利用这些提取到的非鲁棒特征,去依次训练其他的模型,并在这个过程中纠错,由此得到了对该非鲁棒特征具备鲁棒性的模型。进而不同模型具备了不同的鲁棒性,模型集合则具备了比较全面的鲁棒性。
由于训练的过程只要求不同模型习得不同的非鲁棒特征,而并不强求他们去学习鲁棒特征,因此最终可以在几乎不损失识别准确性的前提下实现显著的鲁棒性提升。
图 | 核心伪代码计算过程。这是一个循环的训练过程,假设 ensemble 里面有 3 个 sub-model,则用 A 模型的非鲁棒性特征训练 B、C;用 B 模型的非鲁棒性特征训练 A、C;用 C 模型的非鲁棒性特征训练 A、B。
实验得出的结果显示,杨幻睿的方法是有效的。
以 CIFAR-10 数据集下训练的 ResNet-20 模型为例。
如果不考虑对抗性攻击,使用正常数据集训练,单个模型的准确率大概为 92.6%。当训练三个模型构成集合之后,准确率提高到了 94.1%。但此时模型对对抗攻击毫无抵抗能力。幅值为图片像素范围 1% 的黑盒(由其他模型迁移而来)对抗性噪声就可以将这一集成模型的准确率降低至 10%。
当对这一集成模型进行对抗性训练后,其对正常测试数据的识别准确率会掉到 76.7%。受低准确率的拖累,尽管模型学到了鲁棒特征,其对于之前提到的黑盒攻击的识别准确率也只有 75.5%。
以杨幻睿及同事论文中提出的方法进行差异性训练之后,模型在正常数据集的准确率仅会下降到 91.4%,而对攻击的准确率提升至 83.9%。在牺牲了少量准确率的情况下,制造了高鲁棒性的模型。在面对幅值更大的黑盒攻击时,本文提出的方法也得到了显著高于前人集成学习方法得到的鲁棒性。
图 | 基准训练和 DVERGE 训练决策平面对比。同种颜色代表同一类别,棕色为正确的结果。可以看到,在基准训练中,蓝色的错误部分,在不同模型中全部存在,并且全部存在于棕色正确部分的下方,这就带来了迁移性。而在 DVERGE 训练之中,每个模型的棕色部分旁边的颜色都不一致,这就代表非鲁棒特征并没有在不同模型之间迁移。因而最左侧展示的集合模型可以取得高鲁棒性
杨幻睿说,“我们不是第一个使用集成学习的方式来增加模型鲁棒性的,但我们真正做到了有效。使用 DVERGE 几乎杜绝了对抗性攻击在不同模型之间的迁移。使用此前的方法迁移成功率大概还有 65% 左右,但我们将这个数字降低到了 3%-5% 左右。”
“同时,当将我们的方法同对抗性训练结合到一起,将会得到一个既高准确率,又有高白盒攻击鲁棒性的模型。”
图 | DVERGE 训练下模型最终的黑盒、白盒鲁棒性
不难想象,杨幻睿的方法为人工智能技术的广泛应用排除了部分技术层面的障碍,有望成为人工智能从业者的通用解决方案,极大提高现有模型对恶意行为的容错。
目前,杨幻睿已经在模型压缩和增强模型鲁棒性方面都有了一定积累,他准备在博士毕业之前将这两个部分整合,期望能得出一套稳定产出精简、高鲁棒性、高识别率模型的方法。
不普通的人生
杨幻睿出生于 1998 年,因为父亲在清华机械系任教,所以自小他便在清华校园长大。耳濡目染着国内顶级的学术氛围,身边的同学也大都是清华的“子弟”。
现年 22 岁的他,18 岁就从清华大学电子工程系毕业,如今已经是美国杜克大学(Duke University)博士四年级学生。
同考入清华大学相比,杨幻睿更不寻常的地方是毕业于北京八中“少儿班”(杨幻睿于 2009 年入学,是八中少儿班自 1985 年开班以来的第 16 届,即“少 16 班”)。
这是一个专门为智力超常儿童所准备的超常教育体系,进入到这个体系的学生将脱离小升初以及中考的窠臼,用 4 年的时间完成小学六年级及初高中共七年的全部课程,然后直接参加高考。虽然时间短,课业重,但这些孩子基本都身心健康且出色地完成了学业,清北率不输最优秀的哥哥姐姐。
图 | 杨幻睿
杨幻睿总结道,这四年的经历为他带来了根本性的改变。在八中 “志向高远,素质全面,基础扎实,特长明显” 的育人理念的激励与少儿班独特的教学方式的培养下,杨幻睿不仅构建完成了初步的人生观、价值观,更主要的是习得了快速获取知识并应用的能力与乐于探索新鲜事物的学习态度。
2016 年初,DeepMind AlphaGo 击败了李世石的消息如平地惊雷,让全世界的目光都聚焦到了人工智能的身上。大学三年级的杨幻睿也不例外。他调整自己的专业课选课方向,同时凭借极强的自学能力,系统地学习机器学习与深度学习相关理论与方法,就此打下了在深度学习领域的坚实基础。
此后在毕业设计的导师刘勇攀教授的介绍下认识了现在的博士导师、学术 “神雕侠侣” 陈怡然和李海教授。
在访谈的过程中,DeepTech 感受到了杨幻睿乐在其中的求学态度,说到得意之处便发出爽朗的笑声。翻阅他的朋友圈,则看到了他的另一面,喜欢 F1、NBA、冰球等体育比赛,时不时还以景咏怀,即兴赋诗。
父亲曾用曹丕《典论 · 论文》中的话教导他,“盖文章,经国之大业,不朽之盛事。年寿有时而尽,荣乐止乎其身,二者必至之常期,未若文章之无穷”。
随着年龄的增长,杨幻睿对这些话的理解愈加深刻,“我将终身追求不朽之事”,他说。
道翰天琼CiGril机器人API
道翰天琼CiGril认知智能机器人API用户需要按步骤获取基本信息:
- 在平台注册账号
- 登录平台,进入后台管理页面,创建应用,然后查看应用,查看应用相关信息。
- 在应用信息页面,找到appid,appkey秘钥等信息,然后写接口代码接入机器人应用。
开始接入
请求地址:http://www.weilaitec.com/cigirlrobot.cgr
请求方式:post
请求参数:
参数 | 类型 | 默认值 | 描述 |
userid | String | 无 | 平台注册账号 |
appid | String | 无 | 平台创建的应用id |
key | String | 无 | 平台应用生成的秘钥 |
msg | String | "" | 用户端消息内容 |
ip | String | "" | 客户端ip要求唯一性,无ip等可以用QQ账号,微信账号,手机MAC地址等代替。 |
接口连接示例:http://www.weilaitec.com/cigirlrobot.cgr?key=UTNJK34THXK010T566ZI39VES50BLRBE8R66H5R3FOAO84J3BV&msg=你好&ip=119.25.36.48&userid=jackli&appid=52454214552
注意事项:参数名称都要小写,五个参数不能遗漏,参数名称都要写对,且各个参数的值不能为空字符串。否则无法请求成功。userid,appid,key三个参数要到平台注册登录创建应用之后,然后查看应用详情就可以看到。userid就是平台注册账号。
示例代码JAVA:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class apitest {
/**
* Get请求,获得返回数据
* @param urlStr
* @return
*/
private static String opUrl(String urlStr)
{
URL url = null;
HttpURLConnection conn = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try
{
url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5 * 10000);
conn.setConnectTimeout(5 * 10000);
conn.setRequestMethod("POST");
if (conn.getResponseCode() == 200)
{
is = conn.getInputStream();
baos = new ByteArrayOutputStream();
int len = -1;
byte[] buf = new byte[128];
while ((len = is.read(buf)) != -1)
{
baos.write(buf, 0, len);
}
baos.flush();
String result = baos.toString();
return result;
} else
{
throw new Exception("服务器连接错误!");
}
} catch (Exception e)
{
e.printStackTrace();
} finally
{
try
{
if (is != null)
is.close();
} catch (IOException e)
{
e.printStackTrace();
}
try
{
if (baos != null)
baos.close();
} catch (IOException e)
{
e.printStackTrace();
}
conn.disconnect();
}
return "";
}
public static void main(String args []){
//msg参数就是传输过去的对话内容。
System.out.println(opUrl("http://www.weilaitec.com/cigirlrobot.cgr?key=UTNJK34THXK010T566ZI39VES50BLRBE8R66H5R3FOAO84J3BV&msg=你好&ip=119.25.36.48&userid=jackli&appid=52454214552"));
}
}