杨臻:人工智能在软件工程领域的应用

阅读数:211 2019 年 10 月 7 日 14:01

杨臻:人工智能在软件工程领域的应用

从《黑客帝国》、《复仇者联盟》中的影视形象,到战胜柯洁的“阿尔法狗”,人工智能的概念已深入人心。你所理解的人工智能是什么样的?人工智能和软件有什么相关?程序员会被 AI 所取代吗?

在 NIUDAY 深圳站,CODING 资深全栈工程师、CODING Cloud Studio 研发总监杨臻,为我们带来了他的独到见解。

杨臻:人工智能在软件工程领域的应用

01 你所理解的人工智能是什么样的?

说到人工智能,相信从小就受各种影视文学影响的我们,头脑里一定会冒出很多形象:银翼杀手、瓦利、哆啦 A 梦等。虽然人工智能还没有完美实现,但对于大多数人来说已经是普遍接受的概念了。

杨臻:人工智能在软件工程领域的应用

这会造成一个现象:我们如果实现了一个人工智能,但它达不到电影里的程度,就不会被大多数人所接受,同时由于影视作品的影响,我们似乎在潜意识里觉得,如果人工智无法和真人一样聪明,就不算人工智能。

但以上这些想法可以说都是误解。我们看到的影视作品里,仿佛有一个国家就叫做机器,那个国家的人叫机器人,其余跟人没什么区别。不过按照现在的技术发展下去,人工智能达到人类智能水平所需要的时间是非常短的,可能现在我们觉得人工智能的智力程度不如小动物,但它达到人类智能的那一天时,可能在我们来不及反应的第二天,就把人类甩出去了。这是也很多人鼓吹人工智能威胁论的原因。

而在当今情况下,人工智能可以达到什么样的程度?我这里有一段视频,是上个月 GOOGLE I/O 大会上「劈柴哥」分享的 GOOGLE DUPLEX,他展示了人工智能是如何同人类进行对话的。

虽然我觉得这个 demo 是选取了效果最好的部分,但在我看来已足够震撼。通过他们发布的资料我们可以看出,Duplex 的核心是基于循环神经网络,由谷歌 TFX 搭建而成。

杨臻:人工智能在软件工程领域的应用

它在对话时语音非常自然,这也是基于最新的音频生成技术实现的。视频中的人工智能甚至会模仿人类的语气词,比如“嗯、啊”。据他们的博客所说,这些助词有利于对话的进展。因为人在对话时,对停顿非常敏感,要让人工智能在一个可接受的时间内快速的做出响应有时候比较困难,所以需要在等待时加入一些语气助词。要训练这个神经网络,首先需要通过谷歌自动语音转换系统 ASR,把众多的匿名电话记录的语音转换成文本,再输入到神经网络中。结合对话联系上下文语境去训练这个神经网络模型,最后得到的结果是视频里看到的样子。

这段视频公布以后,很多人觉得非常棒,但也有不少人发表他们的顾虑:如果某一天,我们无法分辨自己对话对象是人还是机器,那么就非常恐怖了。所以谷歌随后发声明说,如果他们把这个技术投入应用,会在前面加入提示,告诉通话者,他们正在和人工智能通话。同时进行技术保护,防止技术被滥用到电话诈骗等不正当场景下。

这个技术确实让我们觉得,我们离梦想中的人工智能更进一步。

02 人工智能的终极目标是什么?

所有开发者在学习写代码时,第一行永远都是 HELLO WORLD。让电脑自己说出这句话,自己有这个意识,是程序员的终极目标,也是人工智能的终极目标。可以说人工智能方面的所有技术,都是为这个目标服务的,比如自然语言处理、图象识别、神经网络、机器学习等。只是在完整搭建一个人工智能之前,我们发觉把这些技术单独拿出来用,就已经有非常广泛的应用前景了。

人工智能的应用场景

现在人工智能的应用场景已经很广泛,比如网站会用机器学习的算法,帮你推荐歌曲、电影;自动驾驶系统会根据图象识别等技术,来让车辆实行自动行驶。最近世界杯爆冷频出我们可能觉得赛果难以预测,但我相信背后的博彩公司肯定已经开始训练神经网络来更好地预测,所以你会觉得押什么都错。另外我听说现在的基金公司也正在训练神经网络,来更好的割韭菜。所以大多数人觉得如今买股票很难赚钱,没准这背后都是人工智能的锅。

杨臻:人工智能在软件工程领域的应用

无所不在的人工智能,仿佛在一夜之间突然出现,但事实上并不是这样的。它的历史几乎和计算机本身的历史一样久。

人工智能的发展演进

这里有一个简单的年表:

杨臻:人工智能在软件工程领域的应用

1943 年神经元的数学模型被提出,两年后冯诺依曼设计小组试制电子计算机,1948 年提出以简单神经元构成的再生自动机网络结构。只是以当时的能力来说,对其进行深入讨论比较困难,同时由于基于存储的指令式发展迅速,所以精力主要放在传统计算机程序方面。

到 1949 年时,赫布学习规则为神经网络的学习算法奠定了基础。1950 年图灵测试《计算机器与智能》提出。当时图灵预测计算机应能达到 30% 的被识别率,也就是在大概 30% 的人会认错但情况下,就可以认为是人工智能。

1952 年时,图灵还干了一件很有意思的事情。他虽然跟冯诺依曼同时代造出电子计算机,但项目是供英国做破译密码的用途,所以作为保密工作一直没有公开。后来因为拿不到预算,他改进这部计算机的构想就没有实现。不过他以构想中的计算机写了一个程序,用来跑国际象棋。虽然程序写出来了,但没有计算机执行这个程序,他就把自己当成一个计算机按照程序来跑,并赢了他同事的妻子。在那个年代,对他来说,计算机存不存在无所谓,只要算法写出来,就是成功了。

50 年代末诞生了基于多层神经网络的「感知机」。1956 年人工智能被正式做为一门学科提出。但他们不断努力的结果,始终受制于当时的技术和计算机算力,同时当时人们普遍有一个错觉,认为传统指令式的程序一样可以完成任何人们需要的工作。因此经历了大概 20 年,无论人们怎么努力,做出来的结果仍然像一个玩具,完全没有办法实现人工智能。

在 70 年代,人们开始放弃指令式的程序,人工智能进入第一次高潮。在 80 年代由于卡内基梅隆大学的专家系统横空出世,人工智能进入第二次高潮。

人工智能的第三次高潮就是现在:1997 年计算机深蓝战胜国际象棋世界冠军;2006 年深度学习算法带来语言识别领域但飞速进展;2011 年 IBM 的问答机器人「沃森」在知识节目战胜人类;2016 年 AlphaGo 在围棋比赛中击败李世石。特别是「阿尔法狗」的出现,我们认为依靠人类经验和直觉才能获胜的围棋领域也被机器人击败,大家才开始意识到,真正的人工智能离我们已经不是特别遥远了。

03 人工智能和软件的关系

说到人工智能和软件的关系,其实本质上说人工智能也是一种软件。可以预见,最后的影响结果一定是人工智能可以自己写程序,所有程序员都不用上班了。当然,这可能还比较遥远。目前来看,只能说人工智能在软件开发的各个环节上都可有所作为,包括估算交互时间,进行项目任务管理、自动测试和修复 BUG、代码自动补全和代码分析。

杨臻:人工智能在软件工程领域的应用

CODING 对代码分析所做过的尝试

CODING 曾经在代码分析上做过尝试,当时对一万个程序员提交的代码进行分析,通过评估他们的代码质量,试图给程序员的代码水平进行打分。再根据打分给项目需求方推荐适合的开发者。构想很美好,但结果并不是很乐观。这是当时总体上的分析结果。

杨臻:人工智能在软件工程领域的应用

图中 X 轴是代码质量,Y 轴是数量,大体上呈正态分布。这跟我们的直觉也比较相符:处于中间的程序员比较多,最好或最差的比较少。虽然总体上是正态的,但相对于个体来说还不是非常精准。

这套代码系统可以对代码里各种方面进行评分,包括有效代码行数、重复率、测试覆盖率、代码可读写性等,最后试图得出能够衡量程序员水平的分数。在拿到分析结果后,我们也会反馈给程序员,比如你的代码里哪里有些问题可以修复。但经过一段时间的尝试、优化之后,我们最后还是放弃了这个系统。因为这个分数如果不准,还不如不要。我们这个项目暂时暂停了,但如果有朝一日有更好的算法或者第三方服务出现,我们可能会再次将它启动。

用人工智能优化软件开发流程的创业公司

这里是一些尝试用人工智能来优化软件开发流程的创业公司。下面选取几例,为大家进行介绍。

杨臻:人工智能在软件工程领域的应用

mabl

mabl 是由原谷歌雇员组建的创业公司,业务主要在自动化测试领域。在他们的平台上,你可以对你的应用程序进行操作,来训练他们的测试程序。在完成训练之后,测试程序又会对你但程序更新进行测试。

applitools

applitools 是采用自适应的算法来进行可视化测试,自动判断当前的新版本是不是有 BUG。

diffblue

这家公司比较激进,他们给每个项目创建数学模型,通过对数学模型的训练,试图自动发现程序运行里的错误,来自动修复错误。但进展也不是特别好。

kite

kite 是一款代码提示工具,安装之后会通过人工智能,搜索当前互联网上的代码进行匹配。比如当你写程序时,它会猜测你当前需要的代码片段是什么,从而给出提示。据使用过的人说,效果还不错。

人工智能可以自己写代码么?

有了代码提示之后我们肯定会想,有没有可能让人工智能自己写代码?我看了现在的状况,唯一可能实现这个梦想的,是通过遗传算法生成代码。

杨臻:人工智能在软件工程领域的应用

这边有一个项目 AI Programmer,由于传统的算法不太合适做遗传算法,所以他们用只有 8 个指令的编程语言来做。虽然只有 8 个指令,但仍然是图灵完备的,所以从理论上来说它可以完成任何可解决的工作。它的原理是给每一个操作设定了一个浮点数的取值范围。开始时随机生成一串浮点数数组,这个数组可以对应出一堆操作符。但因为这套东西是随机出来的,大多数情况下肯定是没法执行的。但不断尝试的结果下,总有一次生成的代码是有意义的,能生成一些结果。

遗传代码会把能够执行的代码保留出来,对它进行演化,通过不断的迭代,最后得到理想的结果。大家可能听到过一个「无限猴子」的说法。如果给一个猴子一台打字机,它总有一天能打出一部莎士比亚全集。这个与之相似,只是遗传算法会把很多无效的随机干掉,根据他们的论文,最后的成果是如果想输出一个“ Hi ”需要 57 万次的迭代,输出一个“ Hello world ”需要 58 万次的迭代。

那么时至今日,我们需要担心人工智能会让程序员失业吗?我觉得暂时不用。我们要做的是调整好心态,学习新技能,尽量把 AI 用在自己当下的工作上,提高创造力。假如有一天,人工智能真的能替换程序员,那么基本上已经没有人需要工作了。

我的分享就到这里,谢谢大家!

本文转载自公众号七牛云(ID:qiniutek)。

原文链接:

https://mp.weixin.qq.com/s/drdwGoaFKweMB-QSIOqdBQ

评论

发布