这篇文章由Austin Z. Henley撰写,他是卡内基梅隆大学的副教授。文章回顾了他25年来在人工智能(AI)和机器学习(ML)领域的冒险经历。
If 语句和随机数
我之前谈过我是如何开始编程的:学习 HTML 太难了,所以我做了一个编译器。但在此过程中,我也尝试制作视频游戏(就像任何孩子一样)。
我记得在 VB6 中制作的第一个项目是基于Tamagotchi宠物的游戏。
不幸的是,我不知道如何让宠物“活过来”。
我想到最好的办法是每隔X秒触发一些效果加上一些条件:
- 每 10 秒增加宠物的饥饿度。
- 如果饥饿度大于 5,则每 3 秒减少健康度。
- 如果健康度达到 0,则昏倒。
在高中时期,制作了一个2D太空射击游戏,通过硬编码的if语句和随机数来动态生成敌人波次。使用随机数、你玩了多长时间、你射击了多少次、你的生命值等来确定下一波要派出哪一波敌人。最后,它感觉很动态,而且不是完全可预测的。它甚至几乎很有趣。但没有人会玩超过几分钟。
2000 年代中期,我购买了《游戏 AI 编程示例》(亚马逊)。虽然花了几年时间才证明它有用...
状态机和高阶函数
上大学后,我更上一层楼,开发游戏。数百万玩家都在玩这些游戏,我甚至还赚到了钱!我的编程技能终于成熟了,我可以将书上的知识付诸实践,而我的室友则把醒着的每一刻都花在制作游戏上。
每个单位、每种武器和每颗子弹都被赋予了一组行为函数,这些函数将执行每一帧来确定接下来会发生什么(例如,武器将以爆发的方式射出子弹,子弹的形状是一个窄锥体,左右摆动 25 度;子弹将稍微瞄准最近的目标,并有 1% 的跳弹几率)
我发现,逐渐增加一点动态效果(即基于游戏状态和玩家的输入)和变化(即通过随机性和可组合性改变行为)让我的游戏变得更加有趣。但这需要层次。我需要将其添加到所有内容中:精灵、粒子发射器、音效、敌人、子弹和动画,而不仅仅是敌人的行为。
游戏开始变得生动起来!
但这不是人工智能,对吧?归根结底,它只是一些手工制作的 if 语句和精心设计的函数调用。
一阶逻辑、知识表示、支持向量机和神经网络
毕业后,我在最后一刻报名参加了 MS 课程(即截止日期之后和春季学期开始之前)。这意味着大多数课程都已满员。我报名了仅有的几门课程,其中包括人工智能和神经网络。我原本希望参加编译器课程!
当我发现这些课程都没有涉及任何编码或如何实施我们所学的知识时,我感到很失望。这些课程的水平很高,我们花了很多时间争论定义。
人工智能课程包括课堂讨论,剖析著名书籍《人工智能:现代方法,第三版》(亚马逊)。我学习了规划、代理、一阶逻辑和知识表示。它给了我一些思考这些问题的词汇,但我无法应用其中任何一个。
神经网络课程理论性很强。我们讲解了感知器、支持向量机、前馈网络、霍普菲尔德模型和反向传播。教科书没什么用,所以我就不贴链接了。我问教授如何才能真正构建神经网络,他说:“我认为有一个 MATLAB 软件包”。
我花了整个夏天和秋天的时间尝试运用这些知识
我开发了一个低带宽视频聊天程序。我使用 OpenCV检测面部,提取面部区域,然后使用分类器确定这些区域的状态。例如,嘴巴是否向上弯曲?左眉毛是否上扬?右眼是否睁开?当时我从某个开放数据库中获取了数百张带标签的面部图像。该应用程序通过套接字发送二进制状态,用于使用 OpenGL绘制头像。
它的效果并不好。修改起来很繁琐,对光照极其敏感,参数的微小变化都会产生很大的影响,OpenCV 使用起来很麻烦,训练需要很长时间。
我真的不知道自己在做什么,但最终我学到了很多东西,并让它有点发挥作用!
决策树、聚类和推荐算法
当我攻读博士学位时,我需要统计方法来分析代码编辑器的日志数据。
- 我能否识别程序员何时陷入或迷失在代码中?
- 我能预测他们接下来会浏览哪个文件吗?
- 我能准确地推荐感兴趣的代码吗?
我学会了如何使用C4.5 算法生成决策树、使用k-means和DBCSCAN对事件进行聚类,以及使用Apriori和协同过滤来查找事件之间的关联。
虽然这些算法相当简单,但它们却非常强大。事实上,我想说,大多数时候,你认为你需要一个大型神经网络,但其实你并不需要!
这些方法确实奏效了。我发表了论文,做了许多实习,并构建了涉及这些方法的开发工具,最终毕业了。
如果你想了解这些项目的更多信息,我建议你从以下文章开始:
- 关于开发人员如何寻找信息的数据分析:从根本上说,搜寻和导航:开发人员对价值和成本的预测( pdf )
- 我的微软实习经历:构建代码审查机器人:当用户从来不使用他们要求的功能时
智能用户界面
作为 2018 年的新终身教授,我需要一个可以作为我所有研究基础的技巧。我选择了智能开发者工具,尽管当时这个概念在我脑子里还很模糊。上任第一周,我提交了一份资助提案,其中我将使用预测模型来预先识别和纠正程序员的错误观念。
该提案的摘要称:
具体来说,该项目将开发新颖的工具设计,以实现三个相互支持的目标:
- 利用程序分析技术和预测模型来识别新手程序员对其程序行为的误解,
- 纠正新手程序员的误解并在不打扰程序员的情况下解释其基本原理,
- 通过为新手程序员生成测试代码来捕捉程序行为的意外变化,从而防止未来的误解。
我在我的文章“一个好奇的代码编辑器:在你知道有错误之前就克服错误”中总结了这个项目。
接下来,我合作了一个项目,我们将使用模型来预测程序员的信息需求并动态为他们生成用户界面(例如,如果他们正在查看 git 历史记录以查找相关代码,则生成一个可视化效果来比较一组推荐的提交)。
然后,我将所有这些工作整合到我的宏伟愿景中:好奇的编程环境作为新手和专家的学习环境。您可以查看该提案(pdf)以及我关于如何撰写该提案的博客文章(500,000 美元的资助提案是什么样的)。
然而,我在收到资助通知的时候就辞职了,所以我没有取得更多的进展。
程序合成和大型语言模型
2022 年,我加入了微软的程序综合团队。现在我全身心投入人工智能领域。时机恰到好处,因为 ChatGpt 于 10 个月后发布,而世界将LLM大模型强加于一切事物上。
尽管我身处 AI 团队,但我经常反对应用 AI,除非我们有令人信服的理由。我们试图解决的用户问题是什么?我们真的需要 LLM 吗,还是几个 if 语句就足够了?我们确定自然语言是适合这种情况的界面吗?我继续分享我的观点:自然语言是懒惰的界面,不要把我困在聊天窗口中。
我参与了很多很酷的项目。包括:
- 研究现有的 LLM 注意力权重是否可以用来预测人类开发人员下一步将关注的位置
- 后续关注:开发人员和神经模型代码探索的实证研究(pdf)
- 数据科学人工智能导师
- 动机:计算机科学教学的痛点
- 动机:数据科学学生常犯的错误
- IntelliCode 的多行代码编辑建议用户体验
- 面向数据科学家的基于法学硕士的工具
- 动机:ChatGPT 能做数据科学吗?
pdf ">*]工具:通过交互式任务分解改进人工智能辅助数据分析中的指导和验证[/i- 工具:使用 Data Wrangler 进行数据整理
- 动机:ChatGPT 能做数据科学吗?
- 为学生提供基于法学硕士的工具
- 动机:
- 工具:CodeAid:基于 LLM 的编程助手的课堂部署
pdf ">*]工具:利用人工智能生成的代码探索认知参与技术的设计空间以增强学习[/i
- 企业如何打造副驾驶的实证研究
自从离开微软后,我继续改进自己的 AI 工具,例如Mirror和Promptclipper。
这25年过得很快乐。
下一步是什么?我将继续教学、学习和建设。