跳到主要内容

DALL·E 绘图

· 阅读需 1 分钟

申请到了 DALL·E 的账号,赶紧玩了几下。DALL·E 是个人工智能绘图程序,可以根据输入的文字绘制图片。它的水平肯定比不上经过训练的画师,但是对于我这种没有绘图能力的人来说,可能会有些帮助,比如,以后制作文档时,也许可以让它帮忙绘制一些插图。

我先画了一幅程序猿自画像: (Photo of a chimpanzee sitting in front of a computer and programming)

儿子也画了一幅自己喜欢的图画: (Cartoon of apples, peaches, grapes and many kinds of fruits growing on one tree under a clear sky with the moon shining on the background)

查看或添加留言

福特皮卡为啥卖的那么好

· 阅读需 2 分钟

最近开车自驾游了一圈,总共开了4千公里,最远到了密西根州的北部。一路上明显感受到了不同地区居民对于汽车品牌的偏好是非常不同的。我居住的波士顿附近,日韩品牌的汽车是最常见的,其次欧洲品牌,美国本土品牌的占有率反而不高。等我到了密西根境内,日韩品牌的车居然成了极少数,路上看到的不是福特就是通用。

以前看统计数据,在美国市场,家用轿车卖的最多的是丰田家的;而皮卡卖的最多的确是福特f150。我当时还在想,为什么福特做轿车不行,皮卡却比丰田做得好?现在有点想明白了:皮卡的客户主要分布在美国中部以及农村地区,这些地区的消费者明显比城里那些更爱国,它们会首选美国品牌,于是成就了福特的皮卡。

查看或添加留言

禁枪还是拥枪的一些想法

· 阅读需 19 分钟

最近的校园枪击事件再次引发了关于是否应该禁枪的广泛讨论。作为一个在中国和美国都生活过的人,我也想分享一下自己对于“安全”这一话题的感受。

首先,我要特别强调,这篇文章只侧重讨论枪支问题,但中美之间的差距,不仅仅是是否持枪的区别。其它更重要的问题留待以后再讨论。

拥枪与禁枪之间的差异,远不止是少了几起枪击案件那么简单,关于枪杀案件与其他犯罪案件的发生率,也仅仅反映了这一问题的一个侧面。无论是拥枪还是禁枪,都有其代价;有些代价显而易见,比如拥枪会导致更多的死亡事件;有些代价则较为隐晦,比如禁枪可能会剥夺人们的自我防卫能力。当一个人感到非常安全时,往往会认为武器是多余的,然而,他可能根本意识不到,他的安全感正是因为其他人拥有武器,使得潜在的威胁被遏制。

同学的故事

我第一次听说和枪支有关的案件,是我三位高中同学的所作所为。我的家乡素以民风彪悍著称,学校里打架和动刀的事情屡见不鲜,但枪支并非是普通学生能轻易获得的物品。校长在那几位同学案发后,向全校师生通报了他们的罪行。我的震惊程度令我对这件事至今记忆犹新:起因是,这三位同学有一次一起聊天时,都说到上学没有什么意义,不如早早去混社会,以抢劫为生。并且,说干就干。其中一位同学的父亲是警察,于是他偷了父亲的枪作为作案工具。他们的第一个抢劫目标,竟然是这位同学父亲的上司 - 当地警局的局长。之所以选定局长,是因为他家境富裕,而且看似并不难对付。他们的计划是由那位父亲是警察的同学诱骗局长开门,然后用枪威胁,抢走所有现金。然而,他们低估了局长的反抗能力和决心。类似的熟人入室的抢劫案件,通常不会留下活口。局长是警察出身,对着一套太熟了,尤其是他也拥有武器,于是毫不犹豫地进行了反击。那三位同学根本不是局长的对手,甚至连局长的衣角都没碰到,自己便被打伤了。等他们逃出现场时,发现其中一位同学已经中了枪,伤势严重。他们只得硬着头皮去医院,然后被守株待兔的警察一锅端。

入室盗贼

虽然中国是禁枪的国家,但这并没有让我感到更安全感。我当年在老家的时候,那里的抢劫案简直是家常便饭,许多亲戚都曾是这类事件的受害者。被刀抵住喉咙的感觉与被枪指着的感受,并没有太多区别。记得我家第一次遭遇盗窃时,我还是小学生。那天我最早回到家,进门就发现家里已被洗劫一空了。后来警察来调查现场,发现小偷将一柄斧头放在了门后,以防房主突然回来。幸好没有家人回来得太早。

另一件让我印象深刻的盗窃未遂事件发生在我工作后。当时,我已经定居在上海。上海是中国最安全的城市之一,但每家每户都装的跟鸽笼子一样。我住在四楼,想着这个高度应该足够安全了,便没有安装防盗窗。

在一个普通工作日的晚上九点左右,(上海晚上九点正是热闹的时候),我和老婆在客厅里看电视,隐隐约约听见饭厅那边有点动静。饭厅的窗帘是拉上的,看不到窗外。四楼的高度让我根本没有考虑过外面可能有人。谁知道,当我循着声音拉开窗帘,赫然发现一个黑影正站在窗外的空调挂机上,试图撬开我家的窗户。

幸好发现及时,贼还没进来。我立刻拨打报警电话,等警察赶到时,那个贼已经逃走了,没抓到。此事让我深刻反思了如何保障自身安全。晚上九点,是大多数人都在家而又没睡觉的时间,更何况我家里还开着灯,看来那贼并不仅仅只是想偷窃,而是已经为入室抢劫做了准备。我家附近那段时间曾发生过几起入室抢劫并伴有杀人灭口的案件,回想起来不禁让人毛骨悚然。

(我当时也写了一篇博客记录这件事)

武器是防卫的关键

假设我和劫匪都没有武器,那么我百分之百会被劫匪制服。劫匪能在四楼外的窗台间来回跳跃,可见其身手矫健;而我,一个程序员,主要的体力活动就是敲键盘,根本没有与他肉搏的能力。

事实上,劫匪手中是有武器的,至少我就看到他手里拿着一根一米来长的铁撬棍。尽管我也有机会拿起家中最致命的武器 - 一把菜刀,但菜刀的杀伤力实在有限。我一刀砍向劫匪,若他用胳膊挡住,也许连外套都不一定能切穿。而铁撬棍则不同,一棒挥来,如果我躲闪不及,当场就会重伤。我家的菜刀恐怕对最终结果影响不大。

倘若我能有一件比较趁手的冷兵器,比如一把军刺,虽然依旧无法单独击败劫匪,但至少我有了反击的资本。我只要自己不怂,抱着同归于尽的决心,就有很大的概率可以重伤匪徒了。考虑到我毕竟没有受过专业训练,我认为我有 10% 的机会能对劫匪造成致命伤。

更进一步地假设,如果我有枪。如果我都能有枪,匪徒很可能也有枪。就算匪徒是有备而来,但我占尽地利,可以躲在有利位置打黑枪。在这种情况下,我甚至有机会在不受伤的前提下击毙劫匪。保守估计,劫匪有 60% 的可能性会击毙我,而我则有 40% 的机会可以击毙劫匪。尽管还是劫匪的胜算较大,但他还会不会为了抢些钱,而冒着 40% 被击毙的风险轻率地作案呢?

事实上,普通人遭遇入室抢劫等恶性犯罪的概率并不高。相反,被政府欺压的可能性反而更大,尤其是当人民缺乏反抗能力的时候(当然,也有少数人可能借此机会去加入政府,欺压他人)。劫匪可能会抢走你的财物,而政府可以明目张胆剥夺你的房产。最严重的黑帮犯罪,可能一次性杀害几十上百人;而政府却可以一纸命令,就屠杀六百万犹太人,枪毙七十万“坏分子”,甚至饿死几千万农民。

枪能对抗政府吗?

移居美国不久,我就在收音机里听到一个新闻。事件大致是:政府看中了内华达州的一块地,打算在那建造一座太阳能电厂。征地时遇到了麻烦,一户农场主拒绝出售土地。政府软的不行就来硬的,他们查到了这家农场所在地也是某个濒危动物的栖息地,于是判处农场非法放牧,要没收农场的几百头牛。农场主一家不服,愤而亮枪,阻拦前来执法的警察。十里八村的乡亲们听闻此事纷纷前来支持农场主,当然是带着各式枪支的。最终警察无可奈何,只得撤退,拆迁的事不了了之。

经常有人问,人民有枪就能反抗政府了吗?政府有飞机、有坦克。对此,可以类比我与劫匪的博弈:即便我手中有一把枪,我也未必能打败劫匪。但这里的关键不在于我和劫匪谁的武力强,而在于劫匪要为犯罪承担多大的风险。我手中的枪是为了增加了劫匪作案的成本,从而迫使他们放弃犯罪的念头。歹徒抢劫要考虑成本,政府“抢劫”同样需要考虑成本。军警去拆迁跟上战场杀敌显然不会是同样的心态。战场杀敌,死了也落个好名声,光宗耀祖;在老百姓家里被打死了,能落个什么?政府打手就是这样,对于软蛋,他们可以肆意欺压;遇到硬茬,立马就怂。所以,绝对不是必须有压倒性武器才能致胜。作为防守方,只要你的武器能够给对方增加足够的成本,超过对方潜在的利益,对方就不会进攻了。

权利的终极后盾

在人类社会的运作中,契约扮演着至关重要的角色。无论是商业交易中的合同,个人之间的承诺,还是国家层面的社会契约,其核心都是相互信任与约束。然而,一个冷峻的现实是:倘若没有强有力的惩罚机制作为保障,契约就会沦为一纸空文。在缺乏惩戒手段的情况下,一方随时会为了自己的利益而违约。

同样的逻辑也适用于人民与政府之间的社会契约。按照现代政治哲学的基本设定,人民让渡部分自然权利,服从政府管理,以换取公共服务、社会秩序与安全保障。这种让渡是一种基于理性的选择,目的是集体协作以获取个体无法单独实现的福祉。但这份契约的有效运行,不能仅寄希望于政府的道德自律。历史屡次证明,一旦失去制约机制,无论是古代帝王还是现代政府,都会走向权力滥用。

在政府与人民的契约中,人民是相对弱势的一方。也只有拥有武器,才能稍微增强其维护自身权益的能力。支持枪权者强调自保权的不可剥夺,“生死看淡,不服就干”,是一种宁愿自己承担风险、也不轻易将命运交给他人的态度。与之相对,主张禁枪者则是打算将自己的安全与利益托付给政府,交给一些陌生人。回顾中国历史,在某些时期,不要说枪支,就连菜刀都被严格管控。但这并没用让百姓过上更加安全的生活。反而在面对外侮时,手无寸铁的百姓往往只能任人宰割。我常常想,如果当年中国人人拥枪,抗日战争还会打那么多年吗?

退一步说吧,假设政府永远是好的,从来不与民争利,反而主观上愿意保护人民。并且,保障市民的生命与财产的安全是警察的使命。虽然这听起来很崇高,但对于大多数警察来说,这不过是一份工作罢了。我不否认,有些警察不惧危险,冒死保护市民,我们也常常看到这样的宣传。但之所以宣传他们,正因为他们是典型,而非普遍现象。在日常生活中,指望警察为我们的利益冒生命危险,恐怕是一种奢望。倘若我们自己都不愿为自己的利益承担风险,又如何能指望别人为我们的利益奋不顾身?

代价

这世界上任何选择都是有代价的。是否允许人民合法持枪都有高昂的代价,但这两种选择的代价却显现出了巨大的差异。

首先,允许人民合法持枪的代价是显而易见的:那些在历次枪击案中受害的无辜平民。但禁枪的代价则更加隐蔽,且难以察觉。有多少潜在的犯罪者,因为担心对方手中有枪,而放弃作案?我们永远无法得知这个答案,因为犯罪没有发生。如果几百万的犹太人,人人有枪,还会被送进毒气室吗?我也不知道,因为历史不能假设。

其次,差异也体现在代价由谁来承担。禁枪的代价主要由人民承担,禁枪也就意味着放弃了反抗。政府的管理成本却可以因此大大降低,甚至可以更随心所欲。反观拥枪,虽然枪案的受害者付出了直接代价,但政府也不得不承担部分责任,每一次枪案的发生,都意味着政府会面临质询和责任。

因此,政府倾向于禁枪是非常自然的。美国至今尚未禁枪,已是一个难得的例外,未来对于枪支的管控势必会日益严格。

虽然我们无法确切知道,民间持枪究竟在多大程度上威慑了犯罪分子,减少了恶性事件的发生,但有些自卫的数据是有据可查的。我看的数据,其中一份是佛罗里达州立大学 1994 年整理的“用枪自卫的统计数据”,它是守法公民使用枪支后,在警察局留下的记录。记录显示,美国每年大约有 250 万人次守法公民用枪威慑或击退罪犯,其中约 15.7% 的报案人相信当时如果没有枪他们就死定了;约 14.2% 的报案人相信他们当时如果没枪很可能就死了。

查看或添加留言

古诗生成模型

· 阅读需 46 分钟

去年学习语言模型时,我尝试了一个小练习,训练了一个生成古诗的模型。虽然这个项目已经搁置了一段时间,但回顾其中的实践与思考,仍有不少值得总结之处。

背景

为什么选择古诗作为实验对象?

选择古诗而非其他文体作为实验对象,原因在于古诗相较其他文体的生成难度相对较低,尤其对于机器学习模型而言。主要体现在以下几个方面:

  1. 文本长度短,记忆力要求低
    文体的长度直接影响生成的难度。当前主流的语言模型“记忆力”有限,随着生成文字的增加,内容偏离主题的风险也随之提升。
    一首古诗不过几十字,这种长度对个人电脑的训练能力十分友好。而像散文,通常篇幅在几百字以上,若要生成高质量的结果,则需要更强的硬件资源和分布式计算支持。至于小说,动辄数十万字,还需考虑情节铺垫和悬念回收等复杂结构,这对现阶段的技术而言仍是巨大的挑战。(但是可以预见,将来的模型可处理的文本长度会大幅增加,这些可能就不再是问题了。)

  2. 训练数据丰富且无版权限制
    古诗作为历史文化遗产,其训练数据不仅数量丰富,而且大多不受版权限制。这一特性使得获取和使用数据的成本极低,为模型训练提供了良好的基础。

诗词的现状:从巅峰到小众

诗词曾是中华文化的瑰宝,尤其在唐宋时期达到辉煌的巅峰。然而,随着时代变迁,其社会影响力和受众群体逐渐式微,最终沦为一种小众爱好。其现状可以从以下几点观察:

  1. 失去大众市场
    在唐宋之后,诗词逐渐退居二线,但由于科举制度的存在,写诗依然是士子必备的基本功。然而,现代社会中诗词的实际需求几乎消失,取而代之的是各种大众化的文艺形式,比如影视、音乐和网络文学。诗词不再具备广泛的市场需求。

  2. 观众寥寥,创作者维艰
    任何文艺形式要兴盛,必然依赖大量广泛的观众群体。然而,今天的诗词圈正好相反:许多诗词网站依赖创作者支付会员费用维持运营,而不是通过吸引观众带来收益。写诗从一种创作行为变成了消费行为。这种缺乏观众支持的现状,也让新一代的创作者难以壮大。

  3. 应用价值局限
    如今诗词的实际应用多局限于形式上的点缀——例如庆典活动中的背景装饰,甚至观众对这些诗词的质量关注甚少。相比古诗词的艺术价值,当代诗词的创作难以企及同样的高度,其鉴赏价值也因此受到限制。

语言生成模型的潜在应用

尽管诗词的应用价值有限,但语言生成模型在其他领域仍大有可为。以我的个人经验为例,工作中定期需要撰写总结、评语、心得等各类文档,这些任务虽繁琐,却遵循固定格式,具备一定的规律性。如果语言生成模型能够在这方面实现更高水平的自动化,将极大提高效率。若能获取相关训练数据,我非常愿意尝试这一方向的模型开发。

此外,拓展到更广泛的文艺创作需求,相较于文字生成,音乐生成或许更具市场潜力。比如,许多视频节目需要配乐,而大部分配乐需求并不涉及复杂的艺术创作。如果AI能够实现这一领域的批量化、定制化创作,无疑会是一个广阔的应用场景。

计算机作诗的各种算法

一、基于规则的写诗算法

早期的计算机解决问题时,大多遵循一种简单直接的思路:将解题规则逐步列出,再将其翻译成计算机可以执行的指令。这种方法在写诗领域也有过尝试,尤其是针对诗词中那些结构严谨、规则分明的特点。例如:

  • 篇有定句,句有定字,字有定声,联有定对
    五言绝句需四句,每句五字;平仄格律也有固定规律,例如首句平平平仄仄,则次句多为仄仄仄平平。
  • 押韵规则
    若第二句以韵母“eng”结尾,则第四句通常也需押同一韵。

这些规则易于形式化,因而成为早期写诗程序最常采用的方法。然而,基于规则的算法产出的诗句却鲜有令人满意者。例如,这样的句子就出自规则生成的结果: “音挑山落但,下剩物拼贪。”这样的句子不但无法理解,也谈不上美感。

为何基于规则的写诗算法难以奏效?原因可归结为以下几点:

  1. 诗意的复杂性远超规则本身
    写诗远非仅遵循表面格律规则即可,它还需兼顾以下层面:

    • 词法和语法
      句子必须符合语言使用习惯,比如“声音洪亮”可以接受,但“跑步洪亮”则不通顺。
    • 自然规则
      诗句需与常识吻合,例如“乌云密布”与“晴空万里”不应同时出现。
    • 情感逻辑
      诗中情感需符合人类共鸣,例如“大海”让人心胸开阔,而“落花”容易触发伤感。

    这些层面的规则复杂且微妙,很多只能意会而难以言传。即便是明确的规则,逐字逐句罗列其所有约束条件也是一项极为繁重且几近不可能完成的任务。

  2. 规则本身也需要灵活性
    优秀的诗歌并非一味遵循规则,而是懂得如何在恰当时机打破规则。例如:“白发三千丈”这一夸张的表达,完全无视自然界的真实情况,却以极强的画面感和情感力量成为传世佳句。由此可见,遵循规则是基础,但超越规则是艺术。

  3. 有用的规则往往不可量化
    基于规则的写诗算法只能处理那些可量化的形式规则,而真正决定诗歌优劣的,是深植于人类经验、文化积淀和艺术直觉中的隐性规律。这些规律很难被精确描述,更难以转化为计算机可执行的指令。

正因如此,基于规则的算法在写诗领域难以突破,最终停滞不前。尽管它为后续的发展奠定了探索的基础,但也暴露了这种方法的局限性:仅靠规则,计算机难以触及诗歌的艺术核心。

以下是改进后的版本,增强了逻辑性、可读性和文采:

二、从规则到规律

计算机与人类在能力上存在显著互补:计算机能够以极快的速度生成大量符合规则的文字,而人类在从中挑选出最合适的表达时展现了远超计算机的直觉和审美能力。换句话说,计算机擅长的是“量”,而人类擅长的是“质”。然而,当你不明确告诉计算机如何挑选最佳结果时,它只能随机组合文字,产生的质量自然不容乐观。

一种看似简单的改进思路是不断添加更多规则,为计算机挑选出更合适的文字提供指导。然而,问题在于:

  1. 规则的复杂性
    写诗涉及的规则过于繁多且细致,想要全面罗列几乎不可能。人类的直觉和经验虽能在某些情况下提供灵感,但要系统化地表达这些隐性规则,无论从数量还是复杂度来看,都是极大的挑战。

  2. 规则的局限性
    规则是人为制定的,往往只提供方向性指导,无法涵盖所有细节问题。而且,规则本质上是动态的:前人制定规则,后人便可能通过创新打破规则。例如,“白发三千丈”这种夸张的表达,若完全依赖既定规则,很可能永远无法生成。

相比之下,规律是一种客观存在,深植于大量已有作品之中。这些规律有些是作者刻意为之,有些则是在创作中自然而然形成的。规律不仅超越了规则的局限性,还更贴近真实创作过程。想象一下,一个人学习写诗的历程:从掌握基本格律开始,到大量阅读经典作品,体会何为“好诗”,再到尝试借鉴这些特点,最终形成自己的风格。这种学习路径其实就是通过“发现规律”来指导创作。

从统计中发现规律

利用统计学方法,我们可以从现有的诗词作品中提炼出一些显而易见的规律。例如:

  1. 高频词的统计
    《全宋词》中的高频词包括“东风”“何处”“人间”“风流”“归去”“江南”“西湖”“斜阳”“明月”等。这些词因为使用频率高,往往容易被大众接受且令人感觉“顺眼”。如果计算机优先从这些高频词中选择,而非完全随机挑选,其生成的诗句就显得自然得多。例如,将这些高频词随机组合,便能得到这样的句子:
    “回首明月,悠悠心事空;西湖何事寂寞中,风吹斜阳匆匆。”
    虽非佳作,却不再令人别扭。

  2. 词语的搭配规律
    仅靠高频词仍显不足,因为即便词语本身流行,搭配不当也可能产生极为拗口的句子,比如:“江南大漠凭栏鱼”。因此,还需引入词语搭配的统计规律。例如,“流水”常与“浮萍”“落花”“恋恋”“相随”等词搭配。如果诗句中已经选择了“流水”,后续用词便应优先从这些搭配中挑选。

  3. 对仗与修辞的规律
    对仗是古诗中一项重要技巧。例如,“云对雨,雪对风;晚照对晴空。”通过总结这样的对仗规律,计算机可以更准确地生成符合古典风格的句子。此外,夸张、比喻、谐音等修辞手法也可以通过数据挖掘找到适当的应用场景。

超越已有规律

尽管基于统计的规律挖掘能显著提升计算机作诗的能力,但它的潜力仍然受到研究者视野的限制。大多数规律总结工作是由缺乏创作经验的外行完成的,包括我在内,我并不擅长写诗。即便我们能提取出高频词、对仗结构和搭配习惯,也无法触及那些更为隐秘但至关重要的规律 - 比如何时使用特定的夸张手法能创造强烈的艺术冲击,或何种谐音梗能令人拍案叫绝。这些深层次规律往往超出人类的想象。

那么,我们能否进一步解放计算机的潜力?不仅让它总结规律,还能让它主动发现那些超出我们认知范围的隐性规律?让计算机不仅充当“辅助分析工具”,更成为“创作规则的研究者”,甚至在一定程度上超越我们的视野?答案或许正藏在深度学习和生成模型的潜力之中。

三、基于机器学习的写诗算法

“机器学习”,顾名思义,是让计算机通过学习从数据中自动归纳出知识,而非依赖人工设定规则。简单来说,研究者向计算机提供一个训练集,比如《唐诗三百首》,不需要明确告诉它学习的具体细节,只需让它通过数据中的模式自行学习,并根据这些知识生成输出。

虽然“机器学习”这一概念并不新鲜,它的历史可以追溯到几十年前,但近年来,由于算法改进和硬件性能的飞跃,其应用在自然语言处理领域取得了巨大的突破。在自然语言处理中,常见的任务包括分类(如垃圾邮件检测)、问答、摘要生成、翻译、对话生成等。尽管这些任务看似各异,它们实际上可以用统一的“文字生成”框架来解决。所谓文字生成,就是根据输入的“上文”生成合适的“下文”。例如:

  • 输入是一封邮件的文本,生成的“下文”是“是垃圾邮件”或“不是垃圾邮件”,这就实现了垃圾邮件分类。
  • 输入一段中文,输出对应的英文,即实现翻译功能。
  • 输入一个上联,生成对应的下联,便完成了对联创作。
  • 输入一个标题,生成诗句,则解决了诗词生成问题。

人工神经网络:从简单到复杂

对于简单的任务,例如垃圾邮件分类,可以用朴素贝叶斯分类器等传统算法解决,并且效果相当不错。然而,文字生成是一个极其复杂的问题,必须借助更先进的技术——人工神经网络

人工神经网络模仿生物大脑,通过大量“神经元”相互连接组成的网络进行学习和推理。它们能够通过训练数据学习复杂的模式,并基于所学内容生成输出。然而,复杂的人工神经网络内部往往呈现“黑箱”特征:人类难以直接理解它们具体学到了什么,但可以通过实验验证其效果。

人工神经网络的发展从“小型”开始。当年我在学校做人工神经网络的作业时,仅仅设计了包含二十几个节点的小型网络。稍微复杂些的问题,可能需要几百个节点,也不过相当于蚯蚓的“大脑”规模。而文字生成问题则复杂得多,仅生成单词和短语通常需要成千上万个节点,生成完整句子需要更大的网络规模。我曾训练的诗词生成模型,节点数已达上亿。

如今,在文字生成领域表现出色的模型如GPT-3,其参数(节点数)超过了1700亿个,规模已经超过人类大脑皮层中神经元的数量。然而,即使如此,人工神经网络的效率远不及人脑。尽管神经网络的规模仍在快速增长,预计短期内它们还无法真正达到人类创作的深度和灵感,尤其在涉及长篇叙事或复杂情感表达的领域,如小说创作。

从数据到创作:机器学习的局限与改进

有了强大的机器学习能力,像我这样的诗词门外汉似乎也无需了解太多创作技巧,只需将现有的诗词交给模型,让它“学习”即可。然而,这样训练出的模型只能复制已有数据中的特性,难以超越其局限性。例如:

假设《唐诗三百首》中只有关于“牛”的诗句,却没有提到“羊”。模型可以轻松学会“牛吃草,牛挤奶”,并在创作中重复这些内容。但它很可能永远不会主动生成“羊吃草,羊挤奶”,尽管在人类看来,这种类比是显而易见的。这暴露了机器学习模型的局限性:它只会重复训练集中的模式,而缺乏人类直觉中那种跨领域的类比能力。

引入预训练:突破训练集的局限

为克服上述问题,现代语言模型通常引入预训练机制。在正式训练模型生成诗词之前,先用更大、更广泛的语料库(例如维基百科)进行预训练,让模型学习普遍的世界知识和语言规律。通过这种方式,模型能够建立更全面的认知。例如,通过预训练,模型知道“牛”和“羊”都是食草动物,具有相似的生活习性。当进入诗词训练阶段时,即便训练集中只有“牛吃草”的诗句,模型也能推理出“羊吃草”这样的创作内容。

这种方法显著扩展了模型的创作潜力,使其不再局限于训练集中的内容,而是能够结合预训练知识进行更有创造力的生成。事实上,预训练的引入也是近年来大规模语言模型取得成功的重要原因之一。通过这种方式,机器不仅能够学习规则和规律,还能在一定程度上模拟人类的类比和联想,为写诗等创作任务注入更多灵感与可能性。

我做的练习模型

一、模型选择

在开始练习之前,我先研究了一些公开的诗词生成模型。简单的LSTM(长短期记忆网络)或seq2seq(序列到序列)模型虽然在处理语言生成问题上有一定的表现,但生成的诗句通常缺乏自然流畅感。真正效果较好的模型,几乎都是近年来基于超大预训练模型(如BERT、GPT)训练而成的。我在GitHub上找到了一些例子,其中某些生成的诗句质量之高,甚至让我这个理科生都难以分辨是AI创作还是人类创作。

模型大小与性能的权衡

通常情况下,模型越大,生成效果越好。然而,模型规模越大,训练所需的时间和资源成本也随之增加。此外,不同的预训练模型在使用上也有差异:有些可以直接用于文本生成,而另一些则需要额外添加神经网络层进行调整。

出于学习和练习的目的,我选择了GPT-2的小型模型。这种模型虽然在长文本生成方面可能稍显不足,但在诗词生成的场景中已经足够胜任。更重要的是,GPT-2可以直接进行文本生成,使用起来非常方便。

成本与效率的现实考量

尽管GPT-2的小型模型已经简化了训练和使用过程,但其成本仍然需要仔细权衡。以下是一些关键的成本和性能因素:

  1. 训练成本
    使用GPU进行模型训练可以显著提高速度。训练一个小型GPT-2模型通常需要一到两天时间,即使租用云端GPU,费用仍在可接受范围内。然而,对于长期部署和发布,GPU的成本可能成为一大障碍。

  2. 预测性能
    使用CPU运行GPT-2模型进行预测时,每次生成大约需要十秒钟,这对于实时应用来说显得过慢。相比之下,使用GPU可以将预测时间缩短到十分之一甚至更少,但同时也显著增加了运行成本。

  3. 云服务器成本
    当前云服务的价格差异较大。例如,仅使用CPU的云服务器,每年费用大约¥70;而配备GPU的服务器,每年费用则高达¥7000左右。这种成本差距直接影响到模型的实际部署选择。

综合考虑了性能和成本,我最终选择在本地用GPU完成短期训练任务,而在日常运行中依赖CPU。虽然这种配置可能牺牲了一些响应速度,但在预算限制内,仍然是较为平衡的方案。

二、训练集选取

在整个项目中,整理训练集是最耗时费力的一项工作。对于大多数机器学习项目来说,训练集通常是“越大越好”,但在诗词生成任务中并非如此。虽然古人创作了大量诗词,但真正流传至今、被认可为高水平作品的只是极少数。如果将质量参差不齐的诗词都纳入训练集,模型很可能学不到优秀的创作风格,反而会受到劣质样本的干扰。

理想情况下,训练集应仅包含那些公认的高水平诗词。此外,过大的训练集还可能激励模型生成一些不常用的生僻字或词。这些词语若使用不当,会显著降低作品的可读性。而高频词汇如“风月”“山水”等,无论如何搭配,通常都能保证生成的诗句具有较好的流畅性和观感。

数据集规模与主题覆盖

小规模的高质量训练集虽然能够提升生成内容的质量,但其覆盖的主题往往较为有限。我目前使用的训练集相对较小,主要包括《千家诗》《唐诗三百首》以及一些我个人偏爱的诗词作品。这个数据集在常见的风花雪月题材上表现尚可,但在涉及未训练过的主题(如现代科技或建设类题材)时,生成效果明显不足。

如果资源允许,可以采用更大的训练集,同时为不同质量的诗词样本分配权重。这样一来,高质量的作品可以对模型的训练产生更大的影响,提升整体生成效果。

韵律与押韵

诗词的合辙押韵是一项重要特性,但我在练习中并未对此进行专门处理。直接向程序添加人为指定的平仄、尾韵等规则并非最佳方案。事实上,许多流传千古的经典古诗在现代普通话语音体系下,已经不再完全押韵,或仅实现宽松的韵律要求。审美上,人们对这些诗词早已适应,因此过度强调押韵可能反而影响生成诗词的自然性与美感。

最优解是让模型通过学习数据集中的韵律信息,自主掌握如何生成自然的押韵诗句。然而,目前我的训练集中仅包含文字信息,缺乏音韵相关的标注。解决办法是将发音信息加入数据集。例如,将“风雨送悲声”扩展为“风feng1雨yu3送song4悲bei1声sheng1”。通过这种“字+拼音”的格式,模型可以学习到平仄与押韵的规律,从而提升生成的诗词在韵律上的自然性。

扩展能力

目前的训练集也未包含文字的书写信息,因此模型无法掌握诸如拆字对联等更复杂的诗词创作功能。如果将汉字的结构信息纳入数据集,例如通过图像表示文字的书写方式,或者将其抽象为偏旁部首的组合,模型就有可能学习到与汉字结构相关的创作技巧,从而实现更多元化的生成能力。

三、损失函数

在机器学习中,损失函数是衡量模型预测结果与真实值之间差异的指标。训练模型的本质就是不断调整模型参数,以最小化损失函数。我最初的尝试中,为了简化流程,使用了语言模型常用的默认损失函数——交叉熵损失(Cross-Entropy Loss)

交叉熵损失主要衡量模型预测的词语概率分布与真实分布之间的差异。具体来说,对于一个给定的句子,模型会预测每个位置上出现各个词语的概率。交叉熵损失会惩罚模型预测的概率分布与真实分布之间的偏差。例如,如果真实句子中某个位置的词语是“明月”,而模型预测“清风”的概率很高,那么损失就会比较大。

然而,仅仅使用交叉熵损失进行训练,并不能很好地捕捉诗歌创作中的一些特有规律,例如押韵、对仗、意境等。这是因为交叉熵损失只关注词语层面的预测准确性,而忽略了诗歌的整体结构和艺术性。正如我之前提到的,一些规则,例如押韵和用词的丰富性,模型很难仅通过大量文本数据自行学习,尤其是在数据集规模有限的情况下。

为了解决这个问题,可以考虑引入一些额外的损失函数或修改训练策略,以显式地引导模型学习诗歌的特有规律:

  1. 韵律损失(Rhyme Loss): 可以通过计算生成诗句的韵脚与目标韵脚之间的差异来定义韵律损失。例如,可以使用编辑距离(Levenshtein Distance)或基于发音相似度的指标来衡量韵脚的相似程度。将韵律损失与交叉熵损失加权求和,可以促使模型生成更符合韵律要求的诗句。更进一步,可以考虑平仄格律,设计更精细的韵律损失函数。

  2. 对仗损失(Parallelism Loss): 对于律诗等讲究对仗的诗歌形式,可以设计对仗损失来衡量上下句之间的结构相似性和语义关联性。例如,可以计算上下句词向量的余弦相似度,或者使用句法分析等方法来比较句子的结构。

  3. 主题一致性损失(Topic Coherence Loss): 为了保证生成的诗歌围绕一个中心主题展开,可以引入主题一致性损失。例如,可以使用主题模型(如LDA)提取诗歌的主题向量,并计算生成诗句与主题向量之间的相似度。

  4. 词语多样性损失(Word Diversity Loss): 为了避免模型生成重复或单调的词语,可以引入词语多样性损失。例如,可以惩罚模型生成高频词或重复使用某个词语的行为。一种简单的方法是计算生成诗句中不同词语的数量,并将其作为损失函数的一部分。

除了修改损失函数,还可以通过调整训练数据来弥补模型学习的不足。例如,在训练集中尽量避免包含过多重复词语的诗句,或者人为地标注诗句的韵脚、对仗关系等信息,以帮助模型更好地学习这些规律。通过精心设计损失函数和训练数据,可以有效地提高模型生成诗歌的质量和艺术性。

四、训练时间

模型训练时间是一个重要的考量因素,它直接关系到开发效率和资源成本。正如我之前的经验,使用GPU进行训练可以显著提高速度,相比CPU训练,速度提升可达一到两个数量级。这主要是因为GPU拥有强大的并行计算能力,能够高效地处理神经网络中的大量矩阵运算。

训练时间的长短与多种因素相关,包括:

  • 模型大小: 模型参数越多,训练所需的计算量越大,时间越长。
  • 数据集大小: 数据量越大,模型需要学习的模式越多,训练时间也越长。
  • 硬件配置: GPU的型号和数量、内存大小等都会影响训练速度。
  • 优化算法和超参数: 不同的优化算法和超参数设置(如学习率、批次大小等)也会影响收敛速度。

在我最初的实验中,由于模型和数据集规模相对较小,使用GPU训练一两个小时就能取得不错的效果。然而,在这个阶段,模型偶尔会产生一些“莫名其妙”的结果,例如不符合语法规则的句子或意义不明的词语组合。这通常是由于模型尚未充分学习到语言的内在规律。

增加训练时间可以使模型更好地拟合训练数据,从而减少此类错误。然而,过长的训练时间也可能导致过拟合(Overfitting),即模型过度学习了训练数据中的噪声和细节,而失去了泛化能力,导致在新的数据上表现不佳。此外,正如我个人的感受,过长的训练时间可能会使模型变得过于“规范”,从而削弱了预训练数据带来的“天马行空”的创造力。

这种现象可以用偏差-方差权衡(Bias-Variance Tradeoff)来解释。较短的训练时间可能导致模型偏差较大,即未能充分学习到训练数据中的规律;而过长的训练时间则可能导致模型方差较大,即对训练数据中的噪声过于敏感。理想的训练时间应该在偏差和方差之间取得平衡,使模型既能准确地捕捉数据中的规律,又能保持一定的泛化能力和创造力。

因此,确定最佳的训练时间需要进行仔细的实验和调优。一种常用的方法是使用**验证集(Validation Set)**来监控模型的训练过程。在每个训练周期结束后,使用验证集评估模型的性能,并根据验证集上的表现来调整训练参数和提前终止训练,以避免过拟合。

总之,训练时间的选择是一个需要在效率、泛化能力和创造力之间进行权衡的过程。通过合理的实验和调优,可以找到最佳的训练策略,使模型既能生成规范的诗句,又能保持一定的创造性和艺术性。

五、生成结果

对于任何生成模型而言,最终的评判标准都落实在其输出质量上。由于我并非诗词领域的专家,因此只进行一些最浅显的比较分析。

1. 对联生成:展现一定的理解能力

对联是对诗歌创作能力的初步考察。以“倦鸟无心归去”为上联,模型生成的下联“野花有意偷开”展现出一定的理解能力。“倦鸟”与“野花”构成意象上的对比,“无心”与“有意”形成情感上的反差,“归去”与“偷开”则在动作上呼应,整体对仗工整,意境也颇为和谐。虽然我并不认为模型真正“理解”了野花的“有意”,但它成功地捕捉到了训练数据中“野花”与“开放”、“烂漫”等意象的关联,并将其运用到对联生成中。

然而,模型也并非总是表现出色。例如,看到这一副生成的对联时,我差点一口老血喷到屏幕上:“千家百姓,共建和谐社会;三宫六院,同沾雨露春风”。这副对联虽然在形式上对仗工整,但内容上却显得格格不入。“和谐社会”是现代政治语境下的概念,“三宫六院”则是古代帝王生活的写照,两者在时空和语境上存在巨大的冲突。这表明模型在理解语境和常识方面仍然存在不足。

2. 诗歌生成:空灵意境与主题缺失

模型生成的诗歌在描绘自然景物方面表现出一定的优势,能够营造出空灵的意境,例如:

风牵残阳过,云披暮雨收。红尘千里远,白发几时休。故国关山外,天涯岁月悠。相思不可寄,惟有旧时愁。

这首诗描绘了夕阳西下、暮雨初歇的景象,表达了漂泊天涯、思乡怀人的情感。诗句流畅自然,意境较为完整。

然而,模型生成的诗歌也暴露出一些问题:

  • 主题不够突出: 虽然诗句描绘了景物和情感,但整体主题不够鲜明,缺乏深刻的内涵。
  • 情感表达较为单一: 模型倾向于表达一些较为普遍的情感,例如思乡、忧愁等,而难以表达更复杂、更细腻的情感。
  • 缺乏个人风格: 模型生成的诗歌虽然符合古典诗歌的格律和意境,但缺乏独特的个性和风格。

正如我之前所说,诗人一生的经历和情感都会融入到作品中,而模型缺乏人类的经历和情感,因此难以创作出具有深刻内涵和独特风格的诗歌。从某种意义上说,模型更擅长生成“空洞”的诗歌,即那些不需要具体内容支撑、以描景抒情为主的诗歌。但这并非完全是缺点。在某些场景下,例如商业宣传、节日祝福、对领导歌功颂德等,这种“空洞”的诗歌反而更受欢迎。

3. 示例诗歌:展示生成能力

以下是一些我挑选的、认为还不错的生成诗歌,供读者参考:

城南雨过花含泪,陌上风来柳泣音。远客扶杖回首问,长亭别后共谁言。

晓光照野烟,春风轻拂山。谁家新酿熟,香透小楼间。

水静月高影自长,山空竹瘦共疏凉。世间多变心如水,春雨随风落蕊香。

痒处难禁手自抓,一番搔过又重加。无穷欲念生烦恼,忍得方知气自华。

太虚无色夜澄清,万象悠悠映远星。俗世尘埃皆是幻,心归净土自安宁。

一念不生即是禅,何劳经卷细研传。拈花微笑菩提意,明心见性自天然。

独住栖真境,岚烟锁竹扉。翠霭笼云舍,霜英点槿篱。 荷锄携月返,闭户焚香迟。醉卧松根石,蝶梦逐流溪。

《忆秦娥·春思》 飞花坠,纷纷一晌逐东风。逐东风,凝眸处,烟浦锁离愁。 鲛绡浥泪,淡匀红粉春衫冷;鸿雁声里,年年肠断,梦杳锦书凭。

这些例子展示了模型在生成诗歌方面的潜力。虽然仍然存在一些不足,但考虑到这只是一个个人练习项目,取得这样的结果已经相当不错。

查看或添加留言

孤僻、内向的进化优势

· 阅读需 2 分钟

我是个性格比较孤僻、内向的人,不太喜欢社交活动。还没有严重到社交恐惧,就只是不喜欢社交活动。我不善言辞,而且业余爱好都是比较冷门的。像平时大家谈论的比较多的八卦、体育之类的内容我都毫无兴趣,所以经常觉得跟别人无话可说,自然也就不喜欢参与群体活动了。

在当下的社会中,我这样的性格是一种明显劣势。无论什么工作,想做的好,做出成就,都离不开与人交往。不善社交可能是阻拦很多人成功的主要障碍。有时候我就想,内向的性格既然处于明显劣势,怎么就没在进化中被淘汰呢。直到这次疫情出现,我才意识到,内向性格也有进化优势的一方面。讨厌社交的人,总是避免与别人接触,得传染病的几率会低很多。尤其是出现现代医学之前,传染病引起的大瘟疫动则就消灭几分之一的人口,结果筛选出了大量讨厌社交的基因。

查看或添加留言

我们的世界是虚拟的吗?

· 阅读需 7 分钟

在计算机产业兴起之前,恐怕很少有人会考虑我们的世界是不是虚拟的。尽管很早就有“缸中之脑”这个概念了,但之前也只有哲学爱好者或专业人士会去认真探讨。随着计算机运算能力越来越强,玩家在游戏软件中的体验越来越趋近于现实世界,普通大众也开始思考了:我们的世界或许也只是一款游戏软件。一些著名的电影也体现了这一想法,比如《第十三层楼》(The Thirteenth Floor),《黑客帝国》(The Metrix)等。

有一些人坚信我们的世界是虚拟的。有两个主要的原因支撑了他们的信念。

第一条是从概率上来推算的,有点类似费米悖论。既然人类都可以做出比较逼真的虚拟世界了,可以想象,比人类更高级的文明是一定也会创建虚拟世界来模拟和研究他们遇到的问题的。而且一旦掌握了虚拟技术,一个高级文明可以创建成千上万的虚拟世界。所以,虚拟的宇宙的数量应该是大大高于真实的宇宙的数量的。这样看来,我们生活在虚拟宇宙中的概率要大于生活在真实宇宙中。

第二条与科学的发展相关,尤其是量子力学的发展。以前人们自然的想法是物质和能量都应该是连续可分的。比如我用力推桌子,这个力可以是任意大小,可以是无限小。但是在近代,科学家们开始认识到,这个力不是连续的,它是有最小单位的,一份能量的最小值就是普朗克常数。并且,物质和能量只是同一种东西的不同表现方式。能量不可无限细分,物质同样不能,物质由不可再分的基本粒子构成。
一个很神奇的现象是基本粒子具有全同特性,这是由玻色最先提出来的。我们日常基础的宏观物体中,没有两个物体是完全相同的。比如两把椅子,看起来可能差不多,但观察细节总能找到不同。但是电子和另一个电子之间却具有完全相同的属性。他们的状态可能不同,但是所有属性都是一模一样的,比如所有的电子在相同状态下都具有完全相同的质量,完全相同的电量等等。对于基本粒子的全同特性有两种主要解释(都是假说)。
第一种是,每种基本粒子在宇宙中可能都是只有一个个体。比如整个宇宙只有一个电子,我们看到的每一个电子都是同一个电子,所以他们的属性当然都一样。虽然在人类的感知中,时间只能朝一个方向运动,但基本粒子也许不受此限制。一个电子也许已经在时间维度上来回运动无数次了,以至于我们在当前的时刻可以观察到无数个电子。
另一种解释是,基本粒子并不是一个具体的物质,它们只是一些抽象的逻辑单元。想象一下,我们在计算机里使用软件虚拟了一个世界。这个虚拟世界极其复杂,以至于生活在虚拟世界中的智慧生物已经开始研究这个世界的构成了。这些智慧生物发现他们的世界的最基本构成就是一种二进制逻辑单元,这就是他们世界的“基本粒子”。他们同样会发现,他们世界的基本粒子是全同的:每个粒子都是一个只有两种状态(0,1)的单元。所以,这是不是也说明我们世界同样是被虚拟出来的,我们已经发现了这个虚拟软件的基本逻辑单元?

真的能够通过科学的手段证明我们这个世界是真实的或是虚拟的吗?我觉得是不行的,这已经超过“科学”的范畴了,只能用哲学方法来讨论了。因为,一切可以证明世界是真实的证据都有可能是被虚拟出来的;反之,一切可以证明世界是虚拟的证据,也都有可能就是真实世界的本来样貌。

在我看来,世界是虚拟的这种思想就是神创论的一个变种或者说发展。很多人的内心是需要一个万能的规则制定者来主宰的。我不是坚定的无神论者,我觉得上帝是有可能存在的。但是,我同时也觉得上帝一定不会在意人类的一切。不论我们的世界,对于上帝来说是不是“虚拟的”,对于我们来说,它就是真实的。

查看或添加留言

中美医疗制度的一些不同之处

· 阅读需 8 分钟

最近上海封城,搞得民怨沸腾。我在跟家人朋友讨论的时候,想了很多事情。大多数想法都没时间记录下来。因为正好给个朋友介绍了一下我在美国看病的经历,就写了一点关于中美医疗制度的比较。

(我只能比较一下波士顿和上海这两个我最熟悉的城市。这两个城市在各自国家都是拥有最好医疗资源,其它地区的情况可能并不相同。)

其中一个区别是:在中国,医院从病人那里收费,病人再从保险公司拿钱;而在美国,医院直接从保险公司收钱。

在中国,医院为了多赚钱,会倾向于过度医疗。病人只要还负担的起,一般不会为了省钱而承受耽误病情的风险。我在上海工作的时候,只要觉得有哪疼了,哪不舒服了,就立刻去医院。医院通常有用的,没用的,CT,B超之类的都查一遍。我小时候更是,只要一感冒就去医院,一去医院就是打一个星期的青霉素。长大之后才知道,青霉素对于感冒一点用都没有,小时的疼全白受了。长大之后,医院都改成一发烧就挂水,其实,也基本上就是安慰剂作用。

在美国,如果保险公司认为有过度医疗的嫌疑是会拒绝向医院付款的,所以医院为了避免收不到钱,会倾向于谨慎治疗。只要符合规定,能不治疗的就不治疗,能不检查就不检查。我大约20年前第一次体验了在美国看病。我当时发高烧,感觉自己快要不行了。强打精神来到医院,结果医生根本不当回事,让我自己去药店买两片非处方的退烧药吃。美国医院和药房也是彻底分开的,不能靠卖药赚钱,所以对于开处方药也是非常谨慎。后来在美国常住,多数时候去医院,连专科医生都见不到。打发我的都是“全科医生”或者叫家庭医生,相当与中国医院里挂号台的。当然,这个比喻有点夸张。在中国挂号台,护士一般也就问一句话:“哪不舒服”,然后就告诉你去什么科。全科医生问的非常全面,还要听听看看,几十分钟才会做结论。我多数时候得到的结论都是:你没病,回家去吧。试过几次后,我也就不像在上海时候那样,总往医院跑了。

一个典型的例子是我和我爸看耳石症的经历。这不是个传染病,但我们俩恰好差不多同时期都得了这个病,症状都是眩晕、呕吐。我爸在中国看的,CT、核磁一通操作下来,并没有什么真正的发现,然后开了一大堆不相关的药回家。我在美国看的病,医生跟我聊过之后,让我做了一些特定的动作供她诊断。最后她告诉我这是耳石症,过几天自己会好,就让我回家了。

美国这边,如果医生觉得你的病不需要治疗,或者是已经没得治了,是有可能会不顾病人感受而放弃治疗的。有些人可能还一下子接受不了这样的处理方式。新冠刚出现那会,大家心里都是比较害怕的。我们这里有位女士阳性了,跑去医院看病。她可能以为这么严重的病情应该进重症室监护室了,结果医生却让她回家。医生大概是觉得根本不用治疗,就别来浪费资源。但那位女士却无法接受,于是隐瞒病情飞回国,结果没进重症室,却进了拘留所。

中美这两种制度都有各自优缺点的。

中国的方式容易造成资源浪费,中国的医疗资源本就不及美国。我每次去医院,医院都挤满了人,排队要排几个小时。可能那里面相当一部分人都跟我一样,纯粹是去找安慰的。尤其是遇到新冠疫情这样的情况,大家都很恐慌的时候。医院会被轻症患者挤满,从而耽误了救治那些更需要被救治的重症患者。

美国这边医院里的患者就少的多了。即便在新冠疫情最严重的时期,我也没有在医院里见到拥挤不动的病人。因为余量够大,在疫情出现的时候才可能应对的更从容。美国的医生,一般每天只接待十来个病人,压力相对(中国医生)小多了,收入又高,所以他们对待病人的态度非常好。对待儿童更是格外的好,小画书、玩具、冰激凌都是现成的。我在美国遇到的每一个医生态度的特别好,绝对不亚于商店里向我推销的售货员。在中国,一个门诊医生一天处理上百个病人都是常态,别说好态度,能耐心听完病人讲话的就算不错了。我还遇到过张口就骂病人的医生。

美国医疗最大的问题就是贵。医生准入门槛高,又不能像中国那样薄利多销,于是就高收费。跟医生聊几句,至少也要付个几百美金的。一个国内收费一千人民币的门诊小手术,在美国可能要上万美金。还是说我看耳石症的经历吧,我爸在中国做了一大堆检查,拿了一大堆药;我在美国只是和医生聊了二十分钟。虽然过程差别巨大,但最后效果差不多,我俩付给医生和医院的钱也是差不多的。虽然直接付款的是保险公司,但羊毛出在羊身上,最终还是导致大家都要缴纳高昂的收入税和医保费。

查看或添加留言

优化旧照片

· 阅读需 5 分钟

最近测试了一些翻新旧照片的算法,主要是试着把模糊的小照片翻新成清晰的大照片。据说淘宝上有很多人做这个生意,主要是靠手工来修复的。网络少也有不少PS修复旧照片的教程。不过我不会使用PS,所以只能依靠算法了。修复旧照的人工智能的算法也是有一些的,但目前来说,人工智能算法的修复效果在总体上还是比不了人工修复的,但某些情况下表现也还不错。

第1步 选照片

首先找一张老照片:

要想效果好,照片一定要找上图这样的:大头照,而且只有少量折痕和磨损。我也测试了一些质量更差的照片(人脸所占像素太小,有大片磨损等),人工智能对于它们目前还还无能为力。

第2步 去网纹

很多老照片都不是光滑的,像纸上有排列规则的凸点,扫描之后的图片上就会有网纹。上图的旧照片上可以明显看到这些网纹。我找的几个人工智能程序都是解决特定问题的,无法很好的处理这些网纹,所以先要人工去除这些网纹。网上搜了一下,没有专门去除网纹的程序,只有PS相关的教程。PS是收费软件,我也没有。好在有一些免费的图像处理软件可以替代PS。我用了GIMP(GNU Image Manipulation Program)加上FFT插件。FFT是快速傅里叶变换的缩写,用于把时域信号转换为频域信号。

上图经过傅立叶变换,在频域上的图像如下(灰度图部分):

由于原照片里的网纹是规则的(有固定频率),频域图会在一些特定的频段里出现高能量区域,也就是上图用红圈圈出来的部分。我只画了三个圈,但其它那些亮点(除了中心低频区域外),都是网纹造成的,只要把这些亮点全部涂黑,再做反傅立叶变换,新生成的图片就是被去除了网纹的照片了。

第3步 上色

GitHub上最受欢迎的黑白照片上色程序是这个:https://github.com/jantic/DeOldify

我试了一下,效果只能说马马虎虎,上了色的照片看上去还是像旧照片,只是把原来的纯黑白色调中加入一点肉色,一看就不是真的彩色照片。

如果会PS的,肯定还是PS效果好。

第4步 清晰化

我在GitHub上找到了两个照片变清晰的软件,一个是微软的 https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life

一个是腾讯的 https://github.com/TencentARC/GFPGAN

两个软件各有千秋,比如微软的可以修复裂痕,但腾讯的可以放大照片。具体那个效果更好,要针对不同情况测试一下。

这两个软件都是侧重于对人头像进行优化,对其它区域的优化会差一些,所以经过它们优化的照片常常是人脸非常清晰,但衣服还是模糊的。再有它们对于眼镜的处理都不太好。常把眼镜当成皱纹;或者把眼镜上的反光当作眼睛来处理。有时候生成的照片非常诡异吓人。

另外,它们也没法处理太小的人像,或是有缺损的人像。

处理后的效果

查看或添加留言

重新制作了书籍网页

· 阅读需 3 分钟

最近学习了 React,并借助 Docusaurus 重新制作了书籍网页:https://lv.qizhen.xyz/

实际上,Docusaurus 已经帮我做了绝大部分工作,React 技能几乎没派上用场,毕竟书籍的格式还是比较简单固定的,不需要非常炫酷的界面。

之前我使用 Docsify 制作网页,对其简洁的界面和实用的功能一直很满意。然而,Docsify 的最大问题在于它采用客户端渲染,导致搜索引擎无法有效爬取页面内容。在墙外,Google 几乎垄断了搜索市场,但它对客户端渲染页面的支持并不理想。国内的搜索市场竞争虽然激烈,但各大引擎在这方面表现得比 Google 更差。因此,为了提高网页的可见性和 SEO 效果,我决定寻找更适合服务端渲染的工具,最终选择了 Docusaurus。

Docusaurus 确实比 Docsify 更复杂,入门门槛也稍高。Docsify 专注于文档页面,而 Docusaurus 除了文档,还支持个人主页和博客等多种内容形式。因此,Docusaurus 的配置和插件系统更为复杂,但灵活性也更高。Docusaurus 支持服务端渲染,生成静态 HTML 页面,这使得 Google 可以顺利爬取我的网页内容。尽管国内搜索引擎目前依然无效,但问题可能出在我的域名未通过工信部认证,而非 Docusaurus 本身的限制。与 Docsify 的“所见即所得”不同,Docusaurus 需要经过 build 步骤才能生成最终页面,这对初学者来说可能有些不习惯。此外,作为较新的工具,Docusaurus 的中文资料相对较少,但社区活跃,更新速度快。

尽管学习曲线略陡,但 Docusaurus 的整体体验非常令人满意。特别是在 SEO、功能扩展和界面设计上,Docusaurus 显示出强大的潜力和灵活性。

查看或添加留言

制作电子书网站的一点想法

· 阅读需 6 分钟

初次尝试搭建电子书网站时,由于缺乏经验,许多技术问题都是在实践中逐步暴露的。先大致总结一下。

最开始弄的时候,没有借助任何工具,直接就开始搭网页了。当然底层的库用的还是别人写好的,比如最主要的部分,把Markdown格式文档(MD)转换成HTML格式用的是marked.js。上层的代码也并非完全从头开始写, 我也参考了别人的代码。不用工具,自己写的最大好处是让我学习了很多以前不会的技能。以前是没做过网站前端开发的,Javascript也没用过。现在能做个简单网页了。

但是学习过后,发现如果把网页功能完善起来,全自己开发太费时间了。而且继续花时间对我学习的帮助也没有之前那么大了。于是我还是用了工具把网页从新做了一边。最著名的工具大概是 gitbook-cli,一个GitBook发布的旧版本的开源工具。这个工具是在线下把Markdown格式文档转换成HTML格式文档的。更新一个页面的流程大约是这样:找到需要更新的MD文档,修改保存,运行gitbook-cli,生成HTML文档,把生成的HTML文档上传至GitHub。步骤有点繁琐,不是我想要的。而且gitbook-cli有四五年没更新了吧,直接下载后不做点配置都根本运行不起来了。所以放弃了。

后来是用的Docsify重新生成了网站。Docsify还是很简单易用的,不过bug也是很多。有一些bug我直接在本地修改了,但有一些是我没法改的,比如最简单的,它对于HTML tag中图片的路径解析跟别人都不一样,比如:<img src="images/image192.png">。它用绝对路径来解析,而其它MD转换工具全部用的相对路径。这个问题我估计Docsify自己也没法改了。不过我现在还有临时解决办法,先将就着用一段时间吧。Docsify生成的网站最大的问题还是没办法被搜索引擎检索,当然也可以说这是搜索引擎不够强大,但是我也没法改变搜索引擎,只能再改进自己的网页了。

Docsify和我最开始写的网页原理完全相同,都是在客户端做渲染,服务器并没有给客户端发送任何HTML格式内容,而现在的搜索引擎只认HTML,它们是不会运行渲染程序的。所以也就没法抓到任何内容。要想被搜索引擎认识,还是得有HTML文件才行。有些网站是可以帮我们做这件事的,比如GitBook。我在GitBook上也生成了一份电子书,https://labview.qizhen.xyz/ 。在GitBook上做电子书网页,基本没有任何可以配置的东西,所有的网页都长一个模样。这也不是设么大问题,但它无法提供留言功能,还是非常不爽的,我就喜欢看留言。GitBook收费版可能有留言功能,不过穷人并没有尝试付费版。

穷人也不是完全没办法,我们开可以利用GitHub Actions这个免费功能来实现HTML文档的自动生成和部署。GitHub Pages默认就集成了一个Action流程,它可以在每次用户更新 MD 文件之后就调用Jekyll这个工具,为更新的MD文档生成HTML文档在部署到服务器上。只不过GitHub Pages默认的工具对生成的网站有一定格式限制,比较适合做博客,不适合发布书籍。其实可以不用它默认的工具,而是利用GitHub Actions调用一个更适合电子书的转换工具,在MD文件更新后做自动转换和部署。近期我还不会尝试这件事,因为React这个东西我才学了一半,业余时间就那么一点,先抓紧时间学完React再去建新网页。至于转换工具,我会去使用 Docusaurus,因为它使用React写的,正好让我学完了可以实践一下。

查看或添加留言