要深刻理解这个问题,我们需要先回顾一下近现代社会生产方式的变化:
1794年,瓦特改良了蒸汽机,把大量劳动力从在田地里劳作,赶进了工厂。
1981年,DOS系统投入使用,计算机开始大量替代纸张、打字机。
1994年,网景浏览器第一版发布,互联网进入千家万户。互联网兴起。知识工作者离不开互联网了。
2010年,iphone4发布。移动互联网正式走上快车道。人们工作和生活都开始离不开移动设备。
2023年,ChatGPT被科技圈外的人所熟知,被称为‘AI元年’,对很多工种产生了颠覆性的影响。
计算一下以上大变革之间的时间差,分别是187、13、16、13。你会发现,后面三个数字都在14左右,这个14代表了什么呢?代表了,14年,社会红利点,就会发生巨大变革。和我们相关的,就是生产力、生产关系发生变革。
说得再直白一点,我们具体的工作技能,14年过去,可能就变得没用了,被更高效的方式替代或者进行重大迭代。
进一步具象化,1981年之前,程序员写Ada、Fortran、COBOL、C五花八门,程序员是少数群体;1981之后,C\C++逐渐成为主流,软件出现了热潮,后来也经历了泡沫;1994年之后,开始变迁到C\C++,PHP,操作系统开始集中到Linux、Windows,互联网工程师需求大量涌现;2010之后,操作系统扩展到Linux、Windows、IOS、Android,终端程序员成为香饽饽。
看一下这个过程,就会发现,从社会需求、产业需求、编程语言、每个岗位的需求量、各种岗位的待遇,都是在不断变化的,而且,约14年就有一个特别大的变化。
现在2023年了,站在这个节点上,这些需求侧的变化摆在那里,我们程序员,脱不了干系。如果你不去适应这些变化,这些变化将直接影响你是否还能找到一份体面的工作。
多数程序员不了解机器学习、深度学习,把它当成了黑盒。觉得它神秘,被ChatGPT所震惊,觉得它很神奇。我这里就做个超级简要的讲解,给GPT模型祛魅。
首先,我们要理解,这个世界,处处是概率。我们经常说:可能,但是不知道我们口中的可能具体对应的概率是多少而已。有时候,我们言之凿凿,有时候,我们心里觉得‘这事儿概率其实并不大’。
概率,所有机器学习模型,都是一个概率模型!具体到ChatGPT这样的对话模型,它就是根据你的问题的N个词,和已经做出预测的答案的M个词,M+N个词,计算出概率最大的下一个词。为了控制词表的大小,每次预测概率的时候可以让候选词少一点。
它采用了BPE编码(Byte Pair Encoder,双字母组合编码)。很常见的词表大小是5-10万。概率,我们都或多或少都知道一些。我们会想问,概率有这么厉害么?这里我就要引入一个新的概念:后验概率。用一个抛硬币的例子来解释后验概率。
我们知道,硬币抛出正反面的概率是50%。但是,现实中,是每一枚硬币的概率都正好总是50%么?不一定,因为不可能存在完全一模一样的两枚硬币,他们的概率值总是不同的。认为总是50%的是流派是经典概率流派,认为不一定是50%概率的流派,是贝叶斯概率,后验概率的流派。
如上图,我们认为硬币正面朝上的概率是θ,我们现在投掷一枚硬币5次,如图里的公式缩写,我们得到一个L(θ)的公式,它就表示我们持续为5次这一系列投掷结果存在的概率。
然后,存在即合理!既然我们已经投掷出了这个结果,那么让L(θ)最大化的θ值就是θ的客观存在的值。通过求导(微分)计算出来,θ的值是60%。也正好符合我们的直观猜测,5次投掷,3次正面,3÷5=60%。这个计算方法,就叫极大似然估计。换个说法,就是要最大化现实已经发生的事情的概率值,反向计算某个原子事件的概率。
那么,上面讲到的θ就是一个计算出来的参数。而GPT-3模型,有1750亿个参数!这些参数就组合起来,描绘了当前M+N个词出现之后,接下来所有词的概率,算出概率最大的那一个。训练数据是什么呢?训练数据就是现实中已经存在的文本段落。存在即合理!去计算里面原子性的概率关系。
要实现上面这个目标,我们就要设计一些参数的排列结构。自然语言处理,常常是sequence to sequence模型。比如,对话就是问题字符序 to答案字符序列;机器翻译就是中文单词序列to英文单词序列。如下图:
最常见seq2seq模型结构,是RNN循环神经网络,结构如图:
我就不过多展开网络细节。毕竟我们这不是一个技术教学,大家理解意思就行。但是,大家一定会问,为什么现在的神经网络是多层的?为什么参数要分层?这里,我就列出两个公式:
第一个公式H=X*W1+b,X是输入,W是模型参数,b是偏置,H是输出。我们搞两层,就有了一个类似的第二个公式。我们把第一行代入第二行,会发现,参数W1和W2可以合并成第三行公式的W。
参数个数被化约减少了!为了有更多的参数数量,我们就需要在线性的第一行公式和第二行公式之间加上一个非线性的函数,叫做激活函数。结果,模型为了拥有更多的可学习参数,就被分成了被激活函数所切割的很多层。
至此,深度学习模型最核心的框架,你就已经了解了。它神秘么?它根本不神秘。已经初步了解了GPT模型的最基础的特点,我们就能更好地讨论它了,它并不是什么万能的魔法。但是,我们已经看到了,ChatGPT很厉害,GPT-3已经学习了这个世界的世界性知识,世界性知识包含常识。
至于为什么已有文本内部存在着规律?这不是一个科学问题,这更像一个哲学问题。我们隐约感觉,应该有这么一个基于概率的规律。技术上讲,而GPT的模型结构厉害的地方是,它能很好地把这些规律挖掘出来,让它可以被模型所训练出来。
哲学上讲,你可以了解一下维特根斯坦和他的逻辑哲学论、语言哲学,他是分析哲学的重要奠基人,分析哲学就是从语言本身入手。还有福柯的《词与物》。顾名思义,也能看出,这些哲学讲解了语言内在存在逻辑。
前面祛魅了AI,现在,我们要讲AI和软件工程/编码之前的关系之前,我们要再澄清一下:什么是软件工程和写程序?我们认为我们很了解程序,很了解软件,是真的了解么?我们不需要认字,就能用中文说话,不学写字,不学语文,我们真的懂文字,懂语言组织,懂表达?我们常常不懂我们日常反复使用的东西。
软讲工程和写程序,都是关乎程序的。程序的本质是什么?有一本书叫《逻辑的引擎》(马丁*戴维斯),程序最本质的是布尔逻辑。直接面对01布尔逻辑,太复杂了,所以,程序员构建了汇编语言、C语言、Java、golang、很多DSL等等语言。这是从工具角度去看程序技术的体系。从应用角度看,你看看下面列举的书目,又构建了什么体系,你都了解么?
然后,我们程序员加入一个项目,开始写代码之前,需要有很长的时间去熟悉项目的现存代码。这对GPT模型来说,就是它开始生成代码,开始工作所需要了解的上下文(context)。
然而,现在开放的GPT-4只能支持到64K长度的上下文。如果我们程序员加入了一个代码很烂、编码模式非常不统一的项目,这个项目的信息,根本没法作为context输入模型,模型就很难做出正确的‘下一个词应该是什么’的推理。同时,GPT-4有看起来很酷炫的reasoning能力,但是,和理解复杂项目所需要的reasoning能力,还差得很远。所以,
这些需求,会因为模型的特点:
模型在10年内吧,都做不到这些很复杂的事情。这就是你作为程序员、工程师面对模型的竞争力。模型因为不善于处理垃圾项目代码,不善于理解产品经理描述模糊的需求,不能精准理解计算机过于复杂的知识体系而不会替代我们。听起来好像有点悲哀,但是,这确实是现实。
但是,就像汇编让我们摆脱写01,C让我们不用写汇编,Java/Golang让我们不用写C一样。GPT模型会帮助我们非常多,可能会诞生一些比Java/Golang还高级的AI辅助的声明式高级编程语言。
最终的最终,我们只需要写逻辑严谨的中文,模型在接收到文字信息后,告诉我们描述哪里还不够明确,最终,通过自然语言去写代码、做工程。14年为一个周期的话,至少这个形态,不会在这个2023年开始的周期内实现。
首先,大家可能听过‘精英统治世界’这个说法。这不是一个乱说的说法,社会学三大奠基人之一的马克思 · 韦伯用历史唯物的方法很认真地研究和论述了这个问题。布尔迪厄继续了韦伯关于精英统治论的思考。
那么,简单粗暴地说,这个社会需要精英引领生产力的发展,创造更多价值。把这句话换个角度说,就是精英更多地掌握了分配方案的定制,决定了社会的走向。我们再换个角度,那么,是不是存在一种排序,10个人里面,到了前2,你就拥有了关于货币这个一般等价物更多的支配权?关于工作状态、工作内容,你就有更多主动权?那么,请问,你现在在自己的公司里,在同行业里,自己的排序是什么样的?
聊到排序,大家不免想到‘论资排辈’。精英享受了附带的好处,他也有指责,就是‘引领生产力的发展’,如果一个人不能,他终将被提出‘精英’这个不能明确定性的范畴。
40岁必须要知道天命了,什么是知天命?一个人能掌控的只有自己,如果你想达到的目的需要和这个社会交互,那么,总有很多你无法控制的因素。知天命,就是要知道自己作为一个人,是有很大的局限性的。你要达成目的,一定要看‘天时、地利、人和’。我随便举几个例子:
我认识了我的有限性,知道了需要凑齐天时、地利、人和。我能干啥呢?这里我讲个简单的道理:当你是leader,接收到了一个很困难的任务,你需要在下属里选择一个人来跟你一起攻坚。你会选择对这个问题有了解,有思考,甚至有经验,有深度思辨的人。他参与了这个困难的项目,取得了成绩,获得了成长。那么,他的排序是不是上升了?
那么问题来了,我们如何成为这个被选择的人呢?我们需要提前付出。我们需要有学习能力,并且有对行业的洞察,去学习更有机会被用上的知识。我们需要有一个较好的预判发展趋势的能力,做出预判,提前付出,然后,获得机会。然后,再提前付出,再抓住机会。这是个正循环。循环可能断掉,可能很曲折,这是天命。如果你想积极探索AI时代自己应该干什么,你需要‘尽人事,听天命’。
那么,AI时代,如何尽人事?
更进一步说,我觉得,这个社会现在需要这样的程序员:
思考自己的核心竞争力是什么。这种能力在社会上的存量是怎样的。都知道要做‘不可替代的人’,什么是‘不可替代’,要展开才能看明白。不可替代性本身也在剧烈变化:
大家需要学习AI,了解AI。但是,AI现在的难题,本质不是算法/科学的难题,是工程的难题。有一个团队需要30天训练完一次模型,另一个只需要3天,同样是365天,他们做的实验的数量完全不同,积累的经验完全不同。
此刻,显卡的算力要支撑175B规模GPT模型的训练,成本是非常高昂的。更好的工程能力,是支撑模型训练实验的关键。INTEL聘请康奈尔大学的博士,每天拿着价值百万美元的硅晶元做实验,每次尝试成本很高,但是他还是得一点点尝试,才能出成果。请问,这个实验过程中,什么最重要,让事情变得可行?答案是工程能力支撑:
最终,在市场中,这个团队获得‘比较优势’,他就用更低的成本,更快的速度做出更好的产品,占领市场,获得收益,扩大再生产。
AI的赛道,亦是如此。所以,你想参与AI,不一定就是做算法,其实,更广大的程序员更应该参与这事儿,把工程做得更好。毕竟,对算法做出独特贡献的人,人数并不会很多,是不?
要回答这个问题,论据不够充分,只能根据现有资料来预测了。
我觉得,深刻理解自己运用的编程工具的本质的人,是接下来社会更需要的。而不是要求你直接投身AI算法基础研究、应用研究。前面讲了,最后需要的研究人才数量不会很大,数据量更多的依然是工程人才。
只是,因为有了AI工具的辅助,做事情会变得更高效,‘体力活’会被大量替代。工程师、程序员需要更多地思考抽象层次更高的问题。深刻理解操作系统、测试之道、Site Reliability Engineering、DDD、依赖管理、数据索引、大数据处理的本质。了解这些方向需要用到的工具是如何设计和组合的,用到的各种工具、技术背后的设计思路。具体来说,这些工程师要理解些啥?
这张图里说的内容就是一个例子,我们对硬件的IO速度理解有多少?面对一个新的系统性的需求,如果一个工程师对IO速度了解不够,他如何能设计一个真正的大规模系统?图里的数据源自Jeff Dean十年前的技术分享 Achieving Rapid Response Times in Large Online Services。
但是,未来优秀的工程师,一定是了解AI的。甚至是了解AI算法细节的,了解AI训练、推理所面对的大概工程问题的。
你会想“每个人都要学,不太可能吧?哪儿能都学得懂?”。事实,没有你想得那么难。发明牛顿力学需要牛顿,但是要学会牛顿力学,只需要初高中生。机器学习、深度学习的核心课程,也只是斯坦福大学计算机系二年级的课程而已。我在学习大数据处理系统时,当然是无力自己研发一个spark的。但是,完全不妨碍我读懂《深入理解Spark:核心思想与源码分析》一类的书籍。
现在AI的爆发式发展,至少就像电车打破了油车市场的格局一样,程序员、工程师所在的行当一定会迎来变革。我觉得,想保持自己在市场中的相对优势的工程师,需要懂 AI 技术栈、利用好 AI 工具。
务实地说,以前很多工程问题因为涉及需要过多的人而无法落地,以后在AI的帮助下,很多很难的项目都会变得可行。AI扩大了工程能力的边界,让工程师得以解决更复杂的工程,市场会给解决更复杂的工程问题的人以回报。那么,对工程师本人来说,AI 是实现工程能力跳跃式发展,打破此刻的发展惯性的机会。
机遇、风险、困难同在。答案,不是藏在从事工程或者AI相关岗位的选择里;答案,藏在不断学习中,不断实践里,不断提升理解、分析事物/技术的方法然后做出趋势预判、选择的过程中。
格物致知、知行合一。祝君好运!
# 腾讯技术show #
主持人和数字人同台主持,真假难辨?
本周三晚 7:30,快来玩!
扫码预约,get开播提醒
# 腾讯技术直播 #
腾讯工程师分享技术干货:
扫码预约,get开播提醒
往期文章:
设为星标,下次再见👋