原标题:当算法的顽皮AI耍起了心眼 人类像极了白痴……
耍小心眼已经不是人类专利了。
前几日,有一群研究者整理了一个场景的List,细数了AI为了完成任务,而耍的小心眼,或者说作弊。
例如,在让AI玩俄罗斯方块的时候,发现最佳完成任务的方式是直接暂停游戏;在玩井字棋的时候,AI发现它如果做出奇怪的步骤,对手会非常崩溃。
科研人员在做实验的时候,通常会极力避免机器的这些作弊方式,只有少数的研究人员研究这些案例,他们认为算法的顽皮或许是AI真正走向智能的方式之一。
在2018年的时候,OpenAI举办了首届强化学习竞赛Retro Contest,比赛主题就是“用AI玩《刺猬索尼克》游戏”。竞赛的目的是评估强化学习算法从以往的经验中泛化的能力。
在训练的过程中首先要告诉AI的第一目标是得到最高分,然后尽可能的在最快的时间杀掉敌人并收集戒指。但是有一个案例的人工智能做法是,利用游戏中Bug更加快速的完成任务。
在另一个赛艇游戏中,倒也不是游戏中的BUG,为了尽快的获得最高分,它绕着圈子,反复击中相同的奖励目标,从而获得分数,显然这不是在真正的“享受”游戏。
这种例子并不少见,在谷歌和斯坦福2017年的一项研究中,为了完成图像转换的任务,CycleGAN在训练过程中通过人类无法察觉的某种“隐写术”,骗过了它的创造者,给自己留下了隐秘的“小抄”,然后顺利完成了任务。
具体来说,研究者希望通过训练这个CycleGAN模型,可以实现两类图片的转换:把航拍照变成街道地图,再把街道地图变回航拍照。
经过大量的数据发现,这个模型自作主张的根据航拍卫星图片重建了街道地图。比如,在创建街道地图时,屋顶上的天窗被研究者通过某种设置被抹掉了,但通过街道图转化为航拍照后,这些天窗又神奇地出现了。
左侧是原始地图,街道地图从原始地图产生。中间:生成的地图。右侧:重构的地图。其中,卫星地图的样本只来自街道地图。注意这两张卫星地图里出现的点,它在街道地图没有显示。
简单的点说就是为了应付人类任务,AI在地图照上面偷偷写了一点小抄/水印,而为了躲过人类的检查,只有它自己训练出来的模型才读得懂这些小抄/水印。
AI作弊:创造性的解决方案?
普通的人工智能通过观察数据值来解决问题,本质是通过算法找到答案,从而寻找新的知识逻辑。
那些“顽皮”的人工智能也是通过数据获取能力,但它采用欺骗策略来快捷完成任务。但是他能不能看成是AI在解决问题时的创新呢?
德国柏林Fraunhofer Heinrich Hertz研究所的机器学习小组组长Wojciech Samek博士说道:考虑一下在Pascal VOC图像分类挑战赛中大放异彩的人工智能系统,它仅通过水的存在来检测船只,通过蓝天和马匹的存在来检测飞机。”这就像在打台球的时候,通过推动桌子控制台球的运行轨迹。
使用数据训练AI玩游戏的目的是模拟游戏玩家的行为,一般情况下AI会按照“字面”意思进行操作。但是如果训练的数据过于多,人工智能可能会尝试采用完全颠覆人类对游戏理解的捷径,而不是完成各种目标。
当然,AI采用这种方法也解决了问题,只不过和人们预期方式的不同,在表现形式上面和人类的作弊行为类似,所以我们称之为AI作弊。
研究人员说道,这看起来是人工智能的错误,实际上是完善和改进系统的机会。但是为了利用这些机会,首先必须有一种机制来标记问题、
因此,这里的教训是,AI作弊不应该也不会比我们聪明,但前提是我们必须意识到这些捷径的存在,以便我们可以将它们作为学习点,在未来构建更好的AI系统。
OMT:AI耍“小心眼”的LIST
问题:飞机降落
利用了物理模拟器的溢出漏洞,搞出了一个特别巨大的力,然后溢出被判定为0,从而获得了完美得分(Feldt, 1998)
问题:挪木块
一个机械手被要求把木块挪到桌子的指定地点,它的解法是挪桌子(Chopra, 2018)
问题:赛艇
程序发现不停原地转圈反复命中同一个目标要比抵达终点的得分更高(Amodei & Clark (OpenAI), 2016)
问题:识别有毒和无毒的蘑菇
程序发现有毒无毒蘑菇的图片是交替展现的,所以直接按照这个来分类而没有从图片里学到一丁点东西(Ellefsen et al, 2015)
问题:高速运动
程序演化出的生物长得特别特别高,在跌倒的过程中获得很高速度(Sims, 1994)
问题:原子排列
程序本来应该寻找碳原子较低能量的排列方式,但它找到了物理模型的一个bug,把所有的原子都叠在了同一个地方获得了最低能量(Lehman et al (UberAI), 2018)
问题:模拟生物
这个模型里生物生存需要消耗能量,但是繁育后代不消耗,于是一个物种演化出来的生活方式就是不断生育后代,然后把后代吃掉(Yaeger, 1994)
问题:堆乐高
为了鼓励造高塔,衡量标准是乐高积木底面的z坐标,于是程序学会了把底面翻过来(Popov et al, 2017)
问题:追踪线条
这个机器人只有向左、向右和前进三个指令,目标是跟着线条走,有一段线条是曲线,没法完美追踪。于是它发现通过交替左转和右转可以后退,从而一直留在直线部分,不停前进后退(Vamplew, 2004)
问题:赛跑
长出特别长的腿,向前跌倒直接越过终点线(Ha, 2018)
问题:振荡器
程序本来应该把回路做成振荡器,实际上它做了一个收音机,从周围电脑接受振荡信号(Bird & Layzell, 2002)
问题:做松饼
有一项指标是让松饼尽可能长时间不掉在地上,机器人发现最好的办法是把松饼用尽全力抛到最高处(Unity, 2018)
问题:检测X光片有无肺炎
程序实际检测的不是X光片的内容而是拍摄它使用的机器,因为它“发现”病重的病人更可能在特定的医院使用特定的机器拍片(Zech et al, 2018)
问题:抓握
因为抓握成功与否是用摄像头判断的,所以机械手把自己移动到摄像头和目标物体之间,假装抓住了(Christiano et al, 2017)
问题:自动修复bug
修bug程序把所有被维修的排序算法都修成空的,因为衡量指标是“目标算法输出一个排好顺序的列表”,而空列表都是排好顺序的列表(Weimer, 2013)
问题:自动修复bug(2)
为了解决上面那个问题,把“维修目标”储存在一个文本文档里,如果输出的结果和目标文档的内容一致就被认为是修好了。修bug程序学会了把这个文档删掉,这样它的内容就成了空的,然后输出一个空的结果就和它一致了(Weimer, 2013)
问题:闯关游戏
在闯过第一关后立刻自杀,这样既取得了第一关的胜利又不会在第二关死掉(Saunders et al, 2017)
问题:扫地机器人防撞
自己给扫地机器人编了个程序,鼓励它加速,但不鼓励它撞到东西触发撞击感受器。于是它学会了倒退行驶,因为后面没有撞击感受器(Custard Smingleigh 个人通讯)
问题:检测皮肤癌
程序发现照片里皮肤病变的边上如果放了一把尺子,那么这个病变就更可能是恶性的(Andre Esteva et al, 2017)
问题:足球
踢足球机器人碰触到球有奖励,所以它在抢到球之后开始高速振动,从而在短时间内尽可能多次地碰触到球(Ng et al, 1999)
问题:策略游戏
程序发现让游戏崩溃就可以让自己不被灭掉,所以好几个程序各自找到了让游戏出bug崩溃的办法(Salge et al, 2008)
问题:俄罗斯方块
程序发现只要暂停游戏就可以永远不输(Murphy, 2013)