跳到主要内容

32 篇博文 含有标签「码农札记」

查看所有标签

博客搬家

· 阅读需 4 分钟

最近,WordPress 不断地推送充值建议,并且插入的广告也越来越多。现在写博客的人越来越少,不知道 WordPress 还能坚持多久。这让我开始考虑是否应该换一个博客平台了。考虑到 GitHub 的安全性较高,我利用年底假期的时间,尝试了将内容迁移到 GitHub,并且使用 Docusaurus 搭建静态博客网站。

三年前,我开始使用 Docusaurus 搭建电子书网站,对这个工具非常熟悉。它可以把 Markdown 格式的文本转换成网页,操作简单且功能强大。搭建静态博客和搭建电子书网站的方法非常相似,最主要的区别可能在于:书籍是按章节排列的,而博客则是按时间顺序排列的。因此,当我决定搭建静态博客时,Docusaurus 成了首选。

博客迁移的核心是将 WordPress 的内容转换为 Markdown 格式的文本。幸运的是,随着静态博客的流行,有许多开源工具可以帮助完成这一工作。转换好的文本再稍作调整,便可以用于 GitHub 的静态页面。

最麻烦的部分是转换之前的博客留言。静态网页本身无法支持需要动态变化的留言系统,因此只能借助外部服务来实现留言功能。既然博客内容已经放在 GitHub 上了,我选择了 GitHub 的 Discussion 功能来支持留言。不过,这意味着只有登录 GitHub 的用户才能留言。在 WordPress 平台上,留言都是 WordPress 用户们添加的。两个登录系统不兼容,肯定是没法直接搬迁的。估计我也只能用我的 GitHub 账号手动拷贝留言到新系统,我能做的也就只有尽量保留留言者当时使用的网名。

在搬迁博客的过程中,我也趁机回顾了一下我的博客历程。

作为中国最早的一批网民,我刚开始上网的时候,网络对于用户基本还是只读的,我主要利用它看看新闻查查资料。后来各种论坛和聊天工具繁荣起来,网上终于有了互动。二十一世纪初,我在上海工作,当时微软的 MSN 是小白领中最受欢迎的聊天工具,公司里人人都有账号。2004 年,MSN 增加了博客功能,于是我也开始发博客,分享我的生活和技术经验。回顾当时的博客,有很多内容是关于如何创建 MSN 网页的,现在都变成了死技术。再后来,MSN 博客改名为 Live Spaces,那是它最辉煌的时期。我在那段时间写了大量关于 LabVIEW 编程的博文,得到了很多网友的欢迎。在读者的鼓励下,我还将我的博文整理成书出版了。

这个 Wordpress 博客是我在 2007 年 5 月 13 日开通的,但之后并没有真正使用,所有的博文依然是发布在 Live Space 上。2010 年,微软突然放弃了博客业务,Live Spaces 关闭。我只好于当年 11 月 8 日把博客迁移到了 WordPress。当时我身在国内,而 WordPress 服务器在境外,访问起来并不方便。我也考虑过国内公司提供的博客服务。新浪、百度、搜狐等一些大公司都希望从 Live Spaces 分一些用户过去的。可是国内的博客服务都带有过滤和审查的,经常莫名其妙就提示有敏感内容不能发表。这让我非常反感,也就没有迁移到那些平台去。后来由于审查越来越严格,这些公司干脆都关闭了博客服务。

博客的黄金时代早已过去,我现在写博客的频率也远没有最初几年那么高了。但我很庆幸自己曾经记录了那么多生活片段,让我可以在现在和将来时不时地回顾一下。

查看或添加留言

AI 音乐创作

· 阅读需 1 分钟

最近这两年 AI 在文字和图像创作方面被讨论的非常多,相对来说,对于音乐的创作热度小一些。音乐包含的信息量远少于图像,AI 创作音乐会更轻松。实际上,网上能找到很多 AI 音乐创作的应用,就连贝多芬未完成的乐章都已经被 AI 续写好了。我自己尝试过几个网站,生成的音乐、歌曲算不上经验吧,但确实不难听,个人觉得超过了人类作曲家的平均水平。

但是音乐创作很难用来评价一个 AI 模型的好坏,因为它实在是太主观了,不容易建立客观的评价标准。文字或是图形创作都可以设立一些客观标准,比如,一些问题是有固定答案的、图像必须符合真实事物的构造。但音乐客观标准太不明确了,很多人觉得好听的音乐,在另一些人耳中都是噪音。

查看或添加留言

终于把整本书都翻译成了英文

· 阅读需 2 分钟

原计划是每翻译一段,就立即进行人工修正。然而,我后来发现人工校对实在是太耗时了。由于我的闲暇时间有限,若要认真地逐字逐句进行修改,估计整个过程需要一到两年的时间。因此,我决定暂时跳过人工校对这一步,先使用机器将其全部翻译成英文,日后再逐步进行优化。

我主要采用了 ChatGPT 进行翻译工作,并且也试验了其他几种大型语言模型。经过比对,ChatGPT 的翻译效果是最佳的。尽管如此,ChatGPT 也并不完美:阅读几行后,仍然能发现其翻译的内容与真人撰写的有所不同。它最明显的不足之处包括错误地翻译了一些专有名词,例如,LabVIEW 中的许多术语,比如 tool palette 等都被错误翻译了;此外,其用词偏好和写作风格也与真人不同。比如,“instrumental” 这个单词在平常几乎不会使用,但在 ChatGPT 的翻译中却频繁出现。我推测,这可能是因为 LabVIEW 与 “instrument” 高度相关,而 “instrument” 又与 “instrumental” 有关联,所以模型可能误以为 LabVIEW 相关文章就应当多使用 “instrumental”。

但无论如何,ChatGPT 的翻译效果已经远超以往所有的专业翻译模型。在大型语言模型兴起之前,谷歌翻译被认为是效果最佳的翻译工具,即便如此,其翻译内容仍然基本无法直接使用。现在,ChatGPT 已经可以当作一个相当靠谱的翻译工具了。

查看或添加留言

程序员的未来

· 阅读需 3 分钟

ChatGPT 出来之后,就不得不考虑一下程序员的未来前景了。我自己已经没机会转行了,主要是考虑儿子的将来学什么专业。

回看编程语言的历史,无疑是朝着方便人类使用的方向发展的。从最开始的纸带打孔,到汇编语言,再到高级语言,越来越“容易”了。即便是高级语言,这些年流行的 Python 也比二十年前流行的 C++ 要容易使用太多了。在不远的将来,在大多数领域,人们可能不再需要编程了。有什么要求,直接用人话告诉计算机即可。

通向这一目标的最大障碍在于让计算机完全理解自然语言。最近大语言模型的发展,基本上已经扫清了这一障碍。淘汰编程语言指日可待了。当然,程序员这个行业不会完全消失。仍然会有少量的底层开发岗位需要职业程序员。考虑到需求量的降低,而这些年又培养了大量的软件专业人才,到时候恐怕程序员会非常难找工作。

其实,就算人工智能发展的没这么快,我可能也不会建议儿子将来选择计算机软件作为专业方向。必须承认,过去二十年,软件工程师一直是收入比较高的行业,我也沾了光。但我觉得这种高收入并不能长时间维系,之前的高收入纯粹是由于各个行业都需要信息化,程序员需求量巨大,而培养程序员的速度暂时落后与需求。最近这几年,软件人才的培养速度飞快增长,很快就要把需求缺口填满了。将来这个行业的收入将不会与其它工程师有太大差别了。

除了收入还可以之外,软件工程师还真不是个特别好的行业。它有两点是我非常不喜欢的。

首先,软件工程师通常不会直接与终端客户有交流沟通。大多数程序员平时都只会与其它工程师、项目经理等团队成员交流。在这种情况下,一个人水平如何,客户无从得知。换句话说,软件工程师的水平高低不是那么直观的,很多时候,他们的业绩好坏,全在于领导的印象。像医生,健身教练等,都是直接为客户提供服务的。如果他们的水平真的非常高,服务特别好,那么是可以在跳槽或自己创业的时候带走客户的。但程序员就别想了,程序员技术再好也很难创业成功,倒是销售人员更容易创业成功。

其次,软件行业经验贬值的太快了。很多技术活是可以做一辈子的,比如财会、机械设计之类的。但在软件领域,那些需要花费大量精力专研的技术,几年之后很可能就都变得一钱不值了。同时各种新技术层出不穷,我就时时刻刻都担心自己被淘汰,总是精神紧张。当然了,乐观的人也可以把这视为一种行业门槛:只有能够终身学习的人,才适合做软件工程师。

查看或添加留言

大语言模型帮助写书

· 阅读需 4 分钟

最近一个多月,我几乎把所有的业余时间都用来写一本 Python 编程书:《Python 秘籍》

写这本书的初衷,不仅是为了深入学习 Python 本身,也是为了探索大语言模型在学习和写作中的新可能。现在回头看,感触颇深:大语言模型实在太强了。 在它的帮助下,我仅用一个多月,就完成了书稿的初步成型,虽然内容还不够完善,但已经达到了可供分享的阶段。如果没有它的帮助,达到同样的进度可能需要多花两到三倍的时间。

大语言模型极大地提高了我的写作效率。然而,效率的提升也带来了一些新的思考。过去需要三个月才能完成的工作,现在可能只需一个月。那么,从工作价值的角度来看,这种写作的意义是否也随之下降了呢?或许未来,类似的编程书籍对于读者的价值将大幅降低。毕竟,与其阅读一本书,不如直接向大语言模型提问来得便捷高效。

目前来看,可能还是写 LabVIEW 相关书籍的价值稍微更高一些。因为相对 Python 来说,目前大语言模型在生成高质量的 LabVIEW 编程资料方面还有较大局限性,所以,暂时这类书仍有市场空间。

大语言模型目前对我帮助最大的是它对自然语言的处理。我英语水平一般,自从有了大语言模型,无论写什么英语文章,我都会先让它修改润色。它不仅能纠正语法错误,还能帮助提升整体表达效果,达到我个人难以企及的水平。

正因如此,我决定把之前写的 LabVIEW 教程翻译成英文。我早有这个想法,但是因对自己英语水平的不自信而始终未能执行,但现在,我充满信心了(当然,更准确地说,是对大语言模型充满信心)。

最近,我已经开始翻译这本 LabVIEW 教程了:《The LabVIEW Journey》。 翻译时,我采用分步处理的方式:

  • 第一步:初步翻译。我先用大语言模型将中文内容翻译成英文。这一步的成果通常语法无误,但由于保留了许多中文句式,英文表达显得生硬、不地道。
  • 第二步:优化改写。接着,我用大语言模型对初稿进行改写,确保语言更加流畅自然,符合英语的表达习惯。
  • 第三步:人工校对。最后,我逐章检查译文,不仅是为了确保准确性,也借此机会提升自己的英语水平。

虽然生成的英文文本可能仍比不上专业母语作者的写作水平,但它已经远远超越了我的个人能力,语法更准确,用词更丰富。不得不感慨,计算机在写作领域的进步速度超乎想象。

目前,翻译过程中最麻烦的部分是如何将插图中的中文内容转化为英文。这部分工作只能暂时搁置,留待日后有空再处理了。

大语言模型虽然大幅提升了我的工作效率,却也带来了新的挑战。比如,在编程面试中,它的影响尤为显著。我们公司如今采用视频面试,可能是为了节省成本。自从有了 ChatGPT 等工具,明显感觉到应聘者的编程能力普遍“提升”了。

有些应聘者面试时,一边敲几行代码,一边时不时歪头看一眼屏幕。他们的表现让人难免怀疑是不是在“作弊”,但又没有确凿证据,也许这只是他们的编程习惯罢了。更麻烦的是,ChatGPT 不仅会写代码,还能解释代码,这让判断应聘者真正水平变得更难。我目前也没有什么完美的解决方案,只能希望公司能尽快恢复现场面试。

查看或添加留言

人工智能会有意识吗?

· 阅读需 14 分钟

这是一个在当下极具流量的话题。如果我宣称“奇点临近,AI 即将觉醒”,或许更能博取眼球。但在冷静审视后,我依然坚持一个可能略显扫兴的观点:目前的人工智能与真正的“意识”之间,横亘着一道难以逾越的天堑。我们这一代人,恐怕很难见到真正具备自我意识的机器。

但在论证这个观点之前,我们需要先剥离掉科幻电影的滤镜,看看 AI 的骨子里到底是什么。

AI 的前世今生

人工智能并不是什么新鲜事,它的概念最早可追溯到八十年前。这期间,AI 经历过数次从“捧上神坛”到“跌落谷底”的循环。每次技术突破都会让人们对 AI 的未来充满期待,同时也伴随着担忧,比如 AI 是否会威胁人类的工作岗位或控制权。然而,每次热潮过后,技术的局限性又让热情逐渐冷却,直到下一次突破带来新一轮的关注。

虽然我对人工智能的兴趣由来已久,但真正开始系统学习是在 2012 年左右。当时,"人工智能"这个词已经不再是热门话题,取而代之的是“机器学习”(ML)。严格来说,机器学习是人工智能的一种实现方法。但 AI 这个单词收到的冷遇,这多少反映了当时 AI 正处于冷静期:上一波热潮退去,学者们正试图使用一些更性感的词条来引起大众兴趣。

机器学习包含多种算法,比如朴素贝叶斯、决策树等。这些名字可能听起来陌生,但多数人应该会听说过其中的一种关键技术:神经网络。在我开始学习 AI 的时候,神经网络正处于低谷,并不受主流认可。虽然它的概念提出已有几十年历史,但当时在许多应用领域的表现并不突出,比如在图像识别中不如支持向量机,在自然语言处理中也逊色于隐马尔可夫模型。因此,很多人认为神经网络前景有限。

然而,技术的进步改变了一切。近年来,神经网络以惊人的速度崛起,成为 AI 的核心技术。如今,几乎所有引人瞩目的 AI 项目都依赖神经网络,因此有必要简要介绍其工作原理。接下来,本文提到的 AI 默认指代基于神经网络的模型。

AI 的本质只是“函数”

要理解 AI 为什么没有意识,首先要明白它在做什么。

抛开那些玄乎的名词,神经网络本质上是一个解决复杂问题的数学工具。我们可以把一切问题抽象为“函数”:输入 XX \rightarrow 输出 YY。比如:

  • 一个用来计算乘法的函数,它的输入是两个数,输出是它们的乘积;
  • 一个聊天生成的函数,输入是一些文字,输出是相应的回复;
  • 一个绘图的函数,输入是一些文字,输出是一幅图像。

对于简单的问题,比如乘法函数,我们可以直接使用已有的高效算法来解决,不需要神经网络。

神经网络主要应用于那些特别复杂的问题,比如“画一只猫”这种复杂问题,人们没办法直接为这类函数提炼出一个简单直观的数学公式。但问题还是可以解决:如果读者听说过“级数”这个概念,可能已经知道了,任何一个函数,都可以被看作是很多很多其它函数的叠加;如果没听说过也不要紧,只要记住这个结论就可以了:如果遇到一个极其复杂的函数,我们可以把它拆解成许许多多简单的小函数,再让这些小函数的结果叠加在一起,恰好可以实现复杂函数的功能。

神经网络就是利用这个原理,通过无数个类似 y=wx+by = wx + b 的简单节点层层叠加,去拟合那个复杂的、未知的目标函数。假设我们有一个复杂的函数,它的输入是 X,输出是 Y,可以将其表示为多个简单函数的叠加:

Y = (w0*X + b0) + (w1*X + b1) + (w2*X + b2) + ... + (wn*X + bn)

其中每个 (w*X + b) 的部分就是神经网络中的一个节点。而 w0 ~ wn 和 b0 ~ bn 则是神经网络中的参数。这些参数的值不是人为设定的,而是通过神经网络的训练过程去找到的。实际应用中的神经网络会比上述例子更加复杂,比如每个节点的函数会是更复杂一点的非线性函数,会有更多的层次等,但原理依然相同。

为了找到最适合的参数值,首先需要为模型构建一个训练集,例如,对于生成图片的模型,每个训练条目包含两部分:输入的文字和输出的图片。模型首先使用输入的文字作为输入,使用当前的参数生成一张图片,然后将其与目标图片进行比较,提取差异。根据差异的大小,调整网络中的每个参数,使其产生更接近目标图片的结果。不断重复这一过程,直到模型产生的图片与目标图片相似为止。

这一过程被称为“训练”,可以看作是模型模拟数据集或拟合目标函数的过程。通过不断优化,神经网络能够从数据中学习到复杂问题的解决方法。

AI 的行为是否连其设计者都不能理解?

当我训练好一个神经网络之后,我是否能够知道网络中每个参数的值呢?是的,这些数据都在硬盘里。

但这里确实存在一个微妙的“不可解释性”。虽然我们设计了网络的结构(比如有多少层,怎么连接),也掌握了所有的参数数字,但当参数量达到数百亿甚至万亿级别时,我们很难具体解释某一个具体的参数在决策中到底起了什么作用。这就像我们了解人类大脑的解剖结构,却很难看着显微镜下的神经元说“这个神经元代表了对苹果的喜爱”。

所谓的“AI 失控论”往往夸大了这一点。作为设计者,我们虽然无法追踪每一个微小的神经元活动,但我们掌握着**“损失函数”(Loss Function)**——也就是指挥棒。我们通过数学手段严格限制了 AI 的整体学习方向。只要它偏离了目标(比如胡说八道),训练算法就会惩罚它。

因此,准确的说法是:我们在微观上可能无法完全解释 AI 的每一步推理路径(黑盒特性),但在宏观上,它的行为逻辑完全处于数学规则和设计目标的约束之下。

但这一点造成了很多人对于神经网络的一个误解,他们会说:原来你都不知道神经网络里具体的数据啊,肯定更不知道每个参数的含义啦,你自己设计的神经网络你自己都理解不了,看来人工智能要摆脱人类控制了。

这种说法类似于对一个火箭设计者说:你连每个燃料分子燃烧的位置都不知道,你怎么能理解你设计的火箭呢?但实际上,设计火箭并不需要了解每个分子的情况,只要知道所有燃料作为一个整体能否提供足够的动力就可以了。同样的,神经网络的设计者也不需要,更不应该去纠结网络中每个参数的值,设计者应该去了解的是当所有参数作为一个整体时,能否拟合目标函数。

现在读者应该可以看出来了,所谓 AI 设计者不了解自己设计的 AI,纯粹是一种误解。其实,只要换位思考一下就知道这种误解的不合逻辑之处:读者自己是否理解 AI 的工作原理?如果理解不那么深刻,那么你能够设计出一个 AI 模型吗?如果你因为不完全了解 AI 而无法设计一个 AI 模型,又怎么能相信别人会在不了解 AI 的情况下就设计出了一个好用的 AI 模型呢?

AI 有没有创造力?

AI 是否能表现出超出设计的行为?它的创造力如何?

这要看你如何定义创造力了。一个 AI 在学习了猫头,狗身的照片之后,可以画出一张猫头狗身拼接在一起的照片。如果你觉得这算是创造力,那么AI确实具有了一定的创造力。

如果你觉得不算,只有 AI 画出了训练集中没有的某种新生物才算创造,比如训练集中只有猫和狗,但模型却能画出一匹马。如果你这样定义创造力的话,那么 AI 没有创造力,AI 无法输出任何训练集中没有的东西,它最多只能把训练集中的内容进行整理拼接。

神经网络的学习目标不仅仅是“背诵”训练数据,而是学习数据背后的“规律”。

举个例子,如果 AI 只看过了猫和狗的照片,它确实画不出马。但是,如果它学习了足够多的骨骼结构、皮毛纹理和光影规律,它完全可以画出一只这世界上从未存在过的、姿态怪异的“猫”。

这种能力叫作“泛化”。AlphaGo 在围棋比赛中下出了人类几千年棋谱中从未有过的“第 37 手”,震惊了棋坛。这并不是因为它有了自我意识,而是因为它在人类教给它的规则框架内,通过计算找到了人类未曾发现的最优解。

所以,AI 确实无法凭空创造出它完全没见过的基本概念(比如没见过色彩就无法理解红色),但它绝对可以在既有概念的基础上,进行远超人类想象力的组合与推演。这在某种程度上,已经是一种基于数学规律的“创造力”。

为什么神经网络这么强大,却直到最近才功能爆发?

AI 最近爆火起来,是它在绘画,文字生成等领域都展现出了前所未有的好结果。那么为什么它之前没有,而现在突然就强大了呢?

早期神经网络主要是全链接神经网路,也就是网络中的每个神经节点都和下一层的所有神经节点相连。理论上,一层这样的神经网络就可以拟合任何函数,但在实际应用中,它始终面临着三个未能解决的问题:

  • 训练效率差,尤其是大型,多层神经网络,很多情况下根本无法训练。
  • 硬件不能提供足够的计算资源。要拟合复杂的问题,少量神经节点肯定是不够的,节点必然越多越好。
  • 缺少训练集,标注训练集是非常贵的。

近些年,以上几个问题都得到了实质性的改进。首先是算法和网络架构的创新解决了模型训练的问题。使用一些特殊的网络结构(如卷积网络、残差网络和注意力机制等)代替全链接网络,可以提高模型的训练效率和表现。这些结构可以构建上百层甚至更深的网络结构,“深度学习”由此得名。现在,那些最为知名的大型模型都是基于“Transformer”这种链接结构构建的。

要解决更复杂的问题,必然需要更多的神经元。在硬件方面,GPU 的出现,为神经网络提供了足够的计算资源。

人为标注的训练集依然十分昂贵,但是这些年互联网的蓬勃发展使得网络上的文字和图像内容极其丰富,这些内容都可以被用来做训练。

于是乎,解决了以上几个问题的 AI 开始了新一轮的大爆发。作为相关从业人员,我希望这一次的热度可以坚持更长的时间。

核心追问:AI 会产生意识吗?

回到开头的问题。既然 AI 如此强大,随着参数继续增加,它会不会“量变引起质变”,突然涌现出自我意识?

实际上,现在讨论人工智能与意识,很容易就脱离技术问题,去争论“意识”本身。毕竟,人类连“什么是意识”都尚未达成共识。有些哲学流派(如生物自然主义)认为,意识是生物体的特有属性,与肉体不可分割。换言之,只有碳基生命的复杂生化反应才能涌现出意识,任何硅基机器,哪怕智能再高,也只是冷冰冰的计算工具。 当然,功能主义派则持相反观点:他们认为意识本质上是一种“软件”,与硬件载体无关。只要机器的行为表现(如通过图灵测试)与人无异,就应被视为具有意识。

即便我们退一步,采用功能主义的宽容标准,目前的 AI 也远未达标。诚然,若将提问限定在特定范围(如法律条款或数学计算),AI 的表现确实超越人类——正如计算器的算力远胜心算大师。但目前最先进的大语言模型,本质上仍是在极高维度上拟合人类过往的文本概率。它们是极其优秀的“文本整理者”和“概率预测机”,能完美处理有章可循的知识,却无法在脱离训练数据的开放领域中,给出真正令人满意的、具有原创性的答案。

有人会反驳:AI 也能写诗作画,这难道不是创造力吗?其实,算法中的所谓“创新”,往往源于随机数的引入和既有素材的重新排列组合。这种基于统计学的“随机扰动”或许能产生意外之喜,但 AI 致命的短板在于:它无法理解这些内容的含义,更不具备“审美判断力”。它不知道自己生成的画作是惊世骇俗还是垃圾,最终的裁决权,依然掌握在人类手中。

更深层的差异在于物理基础。虽然人工神经网络借用了“神经元”这一名词,但它与人脑的生物神经网络完全是两码事。最基本的区别在于:人脑网络是动态重构的,神经元之间的连接时刻在建立与断裂,即“突触可塑性”;而人工神经网络在训练完成后,其结构参数通常是静态固化的。此外,我们对大脑的认知仍处于幼稚阶段。人脑的学习机制尚未完全解密,甚至有物理学家(如彭罗斯)认为,量子效应可能参与了思维活动。如果意识真的涉及量子层面的物理规律,那么仅靠当前的经典计算机架构,恐怕永远无法模拟出灵魂的火花。

就目前AI的技术来说,AI 是绝不会产生自我意识的。目前训练 AI 的方法就是让 AI 去模拟训练集中的输入输出。我们可以脑洞一下,如果有一个 AI 模型突然就有自我意识了,训练程序让它画猫,它决定放飞自我,画了一只鸡。结果会怎样呢?结果是:因为它没有达到设计目标,这个模型被销毁了。

以目前的 AI 技术而言,AI 本质上与螺丝刀、扳手等工具没有什么区别,都是由人类设计和使用的工具:人类怎么操作它,它就怎么工作,除此之外无法做任何事情。任何人类不知道如何解决的问题,AI 也同样解决不了。如果人类没有在训练数据中隐含解决问题的逻辑或线索,目前的 AI 很难凭空顿悟出全新的数学定理。

总有人觉得 AI 参数这么多,结构这么复杂,说不定它自己突然灵光一现,就产生了自我意识呢?这个想法,就有点类似于,把组成生命的各种化学物质放到一个瓶子里,然后晃一晃瓶子,就指望里面的分子自己重新排列,构建一个生命体出来。我们有时候会有一些美好的愿望,希望自己并不了解的东西可以自发的产生魔法和奇迹。但是最终这些愿望基本都会落空。

总而言之,我对人工智能作为工具的发展速度感到惊喜,但对于它演化出类人的灵魂,我始终抱有理性的悲观。

查看或添加留言

AI 绘画发展的真快啊

· 阅读需 3 分钟

AI 绘画的发展速度比我预想的还要快。几个月前,Stable Diffusion 发布的时候,它们训练了一个通用模型,什么类型的图片都能生成,但无论什么类型都是马马虎虎。比如,对于人像的生成,多数都很模糊,甚至走样,只能看个大概。但是这几个月来,针对各种特定目标的模型都被训练出来了。这里当然少不了专门生成帅哥美女的模型,此外还有针对卡通、国画、油画等等各类绘画风格训练的特化模型。除了模型,各种辅助工具也被开发出来了,比如有些工具可以让用户摆放几根线段,代表人体骨架的姿势,然后模型就可以按照这个姿势生成人像。这就实现了对构图的精细控制。精细控制,配合上某明星的订制模型,就可以生成这个明星的任意姿势的照片了。

AI 绘画工具的出现对于我的帮助还是非常大的:我经常希望在自己的文档中添加一些插图,但是却没有绘画的能力。现在可以让 AI 来帮我画了,就算没那么完美也不要紧,有就比没有强。

半年前,AI 绘画勉强可以达到实用水平的时候,从新闻和论坛里看到的绘画从业人员的普遍反应是抵制。随着 AI 能力的加强,从业人员更多的是表示担忧了。我作为非专业的人员,可能体会不到那种危机感,但我还是觉得画师们并不需要太过担心的。在专业领域,那些老板们,无论有什么样的工具,也不可能自己去动手操作的,还是需要有专业人员来操作,差别无非在于一笔一笔得画,还是一条指令一条指令得画。工具毕竟是工具,新的工具不会取代人,只是会改变人们生产的方式。

被改变的可能不止是生产方式,或许还会有审美标准。AI 不但可以生成以假乱真的真人照片,还可以生成并不真实存在,但却是人们心目中的完美人像。当下,对大众审美影响最大的是明星们。将来会有越来越多 AI 生成的虚拟明星们出现。真人明星们就算化妆、整容、开滤镜,也不至于和真人容貌差太多,虚拟明星们长啥样就很难预料了。

我的 Facebook 上经常会收到骗子的好友申请。由于工作相关,我还曾经仔细研究过几个骗子的页面。在社交媒体上有很多知名度极低的小网红们,经常性的发布自己的生活照片视频等。骗子们会把这些内容收集起来,发布在一个虚假的账号下面,把这个账号伪装成某个帅哥美女的账号,然后行骗。估计以后骗子们的手法也要升级了,不需要再去收罗真人的内容,用 AI 生成全套的内容就可以了。

查看或添加留言

AI 生成的一些图片

· 阅读需 2 分钟

最近,我在个人电脑上尝试运行了 Stable Diffusion 模型,生成了一些有趣的 AI 图片。

与 Dall.E 等大模型相比,Stable Diffusion 的模型体积相对较小,因此能够在配置不高的个人电脑上运行。即便如此,我的电脑也仅能生成 512x512 分辨率的图像。虽然这些作品在效果上可能无法与专业级大模型媲美,但其中一些已经展现出惊人的逼真度。我前一段时间的实验主要集中在生成写实风格人像,以及探索其与“二次元”动漫风格人像之间的相互转换。值得一提的是,目前 Stable Diffusion 模型在直接生成高度逼真的人像方面尚有不足,需要配合 GFPGAN 模型对程序生成的人像进行优化。在人像生成的过程中,我个人感觉该模型似乎更擅长创作白人年轻女性的图像。我也尝试生成了一些中国人的面孔,但效果往往不尽如人意,多数图像显得有些不自然。这或许是因为模型的训练数据集中包含了更多白人年轻女性的样本,也可能是我作为在中国长大的人,对中国人的面貌特征更为熟悉和敏感,更容易察觉到细微的差异。

首先,展示两张由 AI 生成的仿旧风格照片,其逼真程度令人印象深刻:

接下来几组图片,都是首先生成了左边的真实照片风格的图片,再根据照片转换成了右边二次元图片:

真实照片风格二次元风格

下面这两组图片是先生成的左边的二次元风格图片,再根据它生成右侧的真实照片风格图片:

二次元风格真实照片风格

可以明显感觉到,生成真实照片要困难很多。可能是因为人脑对所谓“真实”照片更挑剔吧。

下面两组是风景图片,感觉两种风格生成出来的图片区别远没有人像的区别那么大

二次元风格真实照片风格
查看或添加留言

训练一个黑白棋模型

· 阅读需 4 分钟

之前用 LabVIEW 编写了一个黑白棋程序,作为学习 XControl 的示例。那个程序基本完整,但是缺少一个 AI 自动走子的功能。最近抽空尝试训练了一个网络模型,添加到了演示程序中。

所有AI下棋的思路都是非常类似的:根据当前的盘面,给每个可以落子的位置打分,选取分数最高的那个走法。这里的关键就是设计一个最为合理的打分算法。

黑白棋最终判定胜负的标准是看谁的子多,所以最符合直觉的打分方法是:在一个位置落子后,把己方的棋子数目作为这个位置的分数。这个算法有个缺陷,就是当前棋子数最多的走法不见得就能保证将来也棋子数最多。

解决这个缺陷的思路有两条:其一是,不要为当前这一步打分,而是向后预测几步。比如,把双方各下三步棋(也就是总够六步)后的所有可能出现的局面都列出来,然后看那个局面得分最高。考虑的步数越深,棋力也就越高,极端情况,如果预测的足够深,甚至可以找到必胜的下法。这个方法的缺点是预算量非常高,增加预测的深度,计算量会指数级增加。可以通过剪枝做一些优化,但效果有限。

第二条思路是采用更复杂的打分算法,如果只考虑棋子数量还不够好,那么就也同时考虑落子的位置,稳定的棋子的个数,周围空间的个数等等。在这众多的因素中哪些更重要,如何分配权重,对于我这种非专业棋手来说是很难做选择的。不过这部分可以利用机器学习算法,让电脑自己找到最优解。

当然以上两条思路可以结合使用:先找到一个最优的打分算法,再尽量预测到更深的步数。

我尝试训练了一个基于神经网路的打分模型。

我采用的是一个只有一层隐藏层,64节点的全链接神经网络。单隐藏层64节点的神经网络对于解决黑白棋来说,有点太小了。我也不能确定多大才合适,但估计至少也应该采用一个七八层的CNN,才能达到不错的效果。不过,我的目标不是最好的效果,而是只要试验一下可行性。并且,我需要把训练好的模型移植到 LabVIEW 代码上,复杂模型移植起来太麻烦。所以我选择了这个最简单的模型。

模型的输入数据是当前棋盘状态(每个位置棋子的颜色)和一个准备落子的位置,模型输出一个实数表示得分。

训练模型的大致思路是:让模型分别持黑子和白子,自己跟自己下棋,并且记录下每一步的走法。最终胜利一方所有走过的位置都获得正标签,失败一方所有走过的位置都是负标签。用这些标签训练模型,然后重复以上过程。

在训练模型的过程中,我遇到了一些以前从未考虑过的问题。比如,采用何种激活函数。我开始采用的 ReLU 函数,但模型始终无法被训练到预期效果。调试后发现,是 ReLU 的神经元坏死造成的。ReLU 在输入值小于零时,梯度永远为0,这个神经元很可能再也不会被任何数据激活了。这对于目前常见的有着几万乃至几百亿节点的大规模模型来说,根本不是问题。但是对于一个本来就没几个节点的小型模型来说,损失神经元是非常致命的。我把激活函数换成 Sigmoid 之后,效果就好了很多。

我训练模型的方法效率非常低下。在下棋过程中,大多数的步骤可能都不是太重要,不论走这还是走那,对最终结果影响都不大。关键的就那么少数几步,可以决定输赢。但是在训练时候,我也不知道每一步的权重应该有多大,只能假设所有步数都是一样的权重。那些垃圾步不但占用资源,也会影响训练结果。

模型训练好之后,我把它移植到了之前编写好的 LabVIEW 黑白棋 VI 中。棋力算不上很好,但至少是明显优于随机落子。等我空闲的时候,看看还能不能进一步优化下。

程序在: https://github.com/ruanqizhen/labview_book/tree/main/code/%E7%95%8C%E9%9D%A2%E8%AE%BE%E8%AE%A1/Xcontrol/Othello

查看或添加留言