跳到主要内容

禁枪还是拥枪的一些想法

· 阅读需 17 分钟

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

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

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

同学的故事

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

入室盗贼

虽然中国是禁枪的国家,但这并没有让我感到一丝安全感。我的家乡,抢劫简直是家常便饭,许多亲戚都曾经历过类似的事件。被刀抵住喉咙的感觉与被枪指着的感受,并没有什么区别。记得我家第一次遭遇盗窃时,我还在上小学。那天我最早回到家,却发现家里已被洗劫一空。后来才发现,小偷把一把斧头放在门口,以防房主突然回来。幸好没有家人回来的太早。

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

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

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

武器是防卫的关键

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

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

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

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

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

枪能对抗政府吗?

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

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

求人不如求己

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

拥枪本身,正是尚武精神与反抗精神的体现。那些主张拥枪的人,本质上是在为自己争取安全和利益,生死看淡,不服就干。主张禁枪的人,则是打算将自己的安全与利益托付给政府,交给一些陌生人。回望中国历史,在许多时期,不要说枪支,就连菜刀都是被限制的。结果,百姓并未因此过上更加安全的生活。反而每每有外敌入侵,就只有任人宰割的命运。我常常想,如果当年中国人人拥枪,抗日战争还会打那么多年吗?

代价

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

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

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

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

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

查看或添加留言

古诗生成模型

· 阅读需 30 分钟

去年学习语言模型的时候做了个练习,训练了一个生成古诗的模型,可以在这里测试: http://www.qizhen.xyz/
虽然已经有一段时间每碰它了,但还是抽空总结一些相关的想法。

为什么采用诗而不是其它文体做练习?

因为对于机器学习模型来说,写诗的难度远低于写其它文体。总的来说,文体的长度越短,越容易使用模型来创作。目前常见的机器学习模型的记忆力都比较有限的,生成的文字越多,可能就会越偏离最初的主题。
一首古诗一般就几十个字,用我的个人电脑就可以训练出一个效果还不错的模型。一篇散文常常要几百字,若想训练一个能产生满意结果的模型,就需要分布式运算了。至于写小说,设置一个悬念,几十万字之后再来解开悬念,机器学习要达到这种能力恐怕还需要些年头。
选择古诗做练习的另一个好处是,训练集数据丰富,而且没有版权问题。

诗词在当今社会几乎没有什么影响力了。诗词的黄金年代无疑是唐宋。即使是之后的朝代,民间对诗词的推崇有所下降,但诗词仍是练习科举作文的基本功,依然有刚性需求。然而当今这个年代,诗词的空间几乎都被其它文艺形式占据了。诗词成了只有极少数人还在关注的小众爱好。更糟糕的是,在这少数人中,年轻人的比例更低。
被大众接受的文艺形式必定是欣赏的人远多于创作的人。典型的例子是,视频网站多是靠观众养活的,或者收观众的会员费,或者让观众看广告买东西等。但诗词网站却是靠作者来养活的,收作者的会员费。曾经写诗是创作,而如今写诗却成为了一种消费。一个缺少观众的文体,创作者队伍也很难壮大。
诗词已经没有什么不可替代的应用场合了。如果一定列出一些应用价值,那大概就是在庆典活动中用来做点缀吧。作为点缀,观众甚至都不太会注意到诗词的质量,更别提欣赏了。还有就是社交价值,如果恰好遇到诗友可以聊聊天,就好像球迷们一起聊球。 至于鉴赏,海量的古诗词还鉴赏不过来呢,新诗词在艺术价值上完全没法与古诗词相提并论。

诗词没有市场需求,大型文体目前的模型又处理不了,那么语言生成模型还有啥适合的应用吗?还是有的,比如我现在最烦的是要定期写工作总结,还要给同事领导写评语。其它单位或者公司也都有定期的提交各种心得体会、思想进步之类的硬性要求。如果AI可以在这方面创作有所提高,必然前景不错。我如果有机会得到这方面的训练数据,肯定会尝试一下的。
再拓宽一点,文字创作的需求可能不如音乐创作的需求更强烈。现在哪个视频节目需要配乐呢,专业的视频内容可能无法自动生成,但配乐没什么特殊需求的,还是可以靠AI来大量制作的。

计算机作诗的各种算法

一、基于规则的写诗算法
人们最初使用计算机解决各种问题的时候采用的都是同样的思路,就是列出解题的规则,然后按步骤翻译成计算机指令一步一步执行就行了。很多诗词还是一些比较严格的规则的:篇有定句,句有定字,字有定声,联有定对。比如五言绝句必须四句,每句五字;第一句若是平平平仄仄,则第二句一般为仄仄仄平平;第二句若以韵母eng结尾,则第四句也应当是eng结尾等等。
规则是最容易被编程实现的,因此也是被早期写诗程序广泛采纳的算法。然而基于规则的写诗算法却几乎写不出任何通顺的诗来。比如,这一句就是在基本规则指导下产生的句子:“音挑山落但,下剩物拼贪。”没人会喜欢这样的诗句。
这首先是因为写诗仅仅遵循以上列出的几条规则还远远不够,写诗还要遵循词法语法的规则,比如声音洪亮可以,跑步洪亮不可以;还要遵循自然的规则,比如乌云密布就不可以同时晴空万里;还要遵循情感的规则,比如见到大海心情开阔,见到落花黯然神伤等等。且不说这里面大多数规则都是只可意会不可言传的,即便是那些明确的表面规则,若要写全,也需要逐字给每个字开列出一大串规则来。根本没人有能力和精力来做这样的工作。
其次,规则就是用来被打破的,真正的好诗才不会被规则所限制。比如“白发三千丈”可以无视自然规则。
能总结出来的规则都没什么用,有用的规则都是可意会而不可言传的。基于规则的算法就此也就走到头了。

二、从规则到规律
计算机和人的能力有个互补的地方,计算机可以一极快的速度列出所有符合规则的文字;人类这方面能力有限,即便是经过专业训练的,也只能一下子想出少部分这样的文字,其它的要借助查资料等辅助手段。而接下来,如何从众多符合规则的字词中选出一个合适的,则是人类远胜于计算机的地方。如果你不告诉计算机怎么挑,计算机只能随机选一些字,质量可想而知。
按直觉想,只要继续添加规则,指导计算机挑选出最合适的文字不就可以了嘛。但是这需要添加太多太多的细节规则,已经没人有能力列出所有这些规则来了。人虽然没能力了,让计算机帮忙归纳总结一下可不可以呢?

规则是人为制定的。这就意味着第一,它只会是少量的方向指导性的,并不能解决任何细节技术问题。第二,只要有前人制定了规则,就一会有后人来打破规则。规律是客观存在于已有作品中的,有些规律可能根本不是作者有意为之的,但它就是自发的形成了。既然规则指导不了细节,也许可以利用一下其它作品中的规律来做指导。这其实跟一个人学习写诗的过程也十分类似。开始学习了基本规则,然后还要大量阅读其他人的作品,体会他人的作品哪好哪不好,在用于自己的作品才能写出好诗来。

利用统计学的方法,还是可以比较容易的计算出古诗词中的一些规律来的。最直接的,高频词。比如,统计出来的《全宋词》高频词包括:东风,何处,人间,风流,归去,江南,西湖,斜阳,明月等。高频词就是大家看着最顺眼的那些词,如果计算机从这些刚频词中选词,而不是随机挑选,那么结果也会顺眼的多。比如将宋词中的高品词随机组合一下:“回首明月,悠悠心事空,西湖何事寂寞中,风吹斜阳匆匆”,不那么别扭了吧。这也是为什么总有人说计算机写出来的诗怎么感觉都眼熟的原因,因为大量使用了高频词啊。

只考虑词频显然还不够,就算都是频词搭配起来也可能还是非常别扭的,比如:“江南大漠凭栏鱼”。所以还要考虑搭配,比如“流水”经常搭配“浮萍,恋恋,落花,相随”等词。那么,如果诗中如果已经选了流水,就应该尽量从搭配流水的高频词里继续选。其它的还有很多规律可以总结,比如对账的规律“云对雨,雪对风,晚照对晴空”,等等。

有了这么多细节的规律帮助,写诗程序可能依然还是很烂。说实话,研究这些的大多是写诗外行,包括我在内,我自己都不会写诗,又能想到多少有用的规律呢?更多的规律是我想不到的,比如很可能在某个特定的地方放个特定的夸张就会有神奇的功效?或者放个谐音梗?或者就是我完全想象不出来的。

我想不出来的,能不能让计算机去想呢?让计算机不但帮我把规律的数据计算出来,还要帮我研究需要总结哪些规律,甚至是我都想象不到的规律?

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

“机器学习”从名字也能看出来就是让计算机自己学习,简单来说,你给计算机提供一个训练集,比如以《唐诗三百首》为训练集。也不必告诉计算机怎么学,学什么,反正计算机自己去研究吧,然后计算机利用它学习到的知识输出一些东西出来。
机器学习不是什么新东西,也发展了几十年了。
在自然语言处理方面机器学习的应用也是十分广泛的。然语言处理常见的几种问题包括:分类(比如判断一封信是否是垃圾邮件);知识问答;总结中心思想;翻译;聊天对话等等。不过所有这些问题都是相通的,用一个文字生成算法就可以解决所有问题。文字生成是指给计算机一段上文,然后计算机生成一段下文。比如,上文是一封信,下文“是”或“否”,就可以用来判断垃圾邮件了;上文给一段中文,下文生成英文就是翻译;上文是上联,下文生成下联,就解决了对联问题;上文标题,下文生成诗句,就解决了写诗问题。
机器学习中有各种各样的算法,简单问题,比如垃圾邮件分类,使用简单的贝叶斯分类算法就可以得到比较完美的解决。不过像文字生成这样复杂的问题,就必须用到人工神经网络了。人工神经网络借鉴了动物大脑的结构,依靠神经元组成的网络来模拟和解决各种问题。人工神经网络可以学习,然后根据学习到的东西输出一些数据。对于复杂的人工神经网络,人类已经不能完整的分析出它们到底学了什么内容,只知道学习的效果不错。
当年在学校学习是做的人工神经网络作业,建立的网络只有二十几个节点(神经元)。后来解决一些稍微复杂点的问题也不过就用几百个节点,还比不上蚯蚓的“大脑”。生成文字问题可是复杂的多的问题,小的神经网络很难产生满意的效果。生成单词词组一般至少需要上千个节点;生成句子就要再多几个数量级:我训练的诗词生成模型的节点数已经过亿了。目前,在文字生成领域表现的比较好的一个模型叫GPT3,它有超过一千七百亿个节点。这个数量已经超过人类大脑皮层神经元的数量了,不过不用担心,人工神经网络的效率远远不及人脑,人工神经网络的节点数很可能每年都有翻倍,但即便如此,它们也不会在未来几年内具有真正匹敌人类的创作能力,尤其是像小说这样的大部头文字。
有了这么强大的机器学习功能,我这种门外汉也不需要太了解诗词创作的技巧了。把现有的诗词交给机器,让它学就是了呗。可是这样学出来的机器也只会输出它学过的那些诗词里有的东西啊。举个例子,假如《唐诗三百首》里只有关于牛的诗,没有任何提到羊的诗,那么机器很容易就学会了,牛吃草,牛挤奶。机器也只会写牛吃草,牛挤奶之类的东西,它永远也不会自主写出羊吃草,羊挤奶,虽然对于人类来说这是非常自然的可以借鉴过去的。

更多的知识可能并不在训练集中,要让模型掌握这些知识,仅仅使用训练集是不够的。需要首先使用预训练集对模型进行初步训练。比如使用维基百科上的所有内容对模型进行预训练,让模型先学会一些基本知识,比如牛和羊是非常相关、类似的动物。这样之后,在使用诗词对模型进行训练,模型会利用之前预训练时掌握的一些知识。在诗词训练集中学到了牛吃草,那么,模型也会根据之前掌握的知识,创作出羊吃草这样的文字。

我做的练习模型

一、模型选择
我在自己做练习之前,先查看了一下能够找到的别人写的一些诗词生成模型。使用简单的LSTM、seq2seq等模型是不太容易生成行文自然的诗句的。真正效果好的模型都是最近两年在超大模型比如BERT,GPT等基础上构架上训练的。我在github上看到一些例子,效果真的很好,我作为理科生,已经分辨不出某些诗句是AI还是真人写的了。

肯定是越大的模型效果越好,但是越大的模型训练越费时费钱。
另外一个考虑的因素是,有的预训练模型可以直接做文本生成,有的还需要在附加一些神经网络层才可以。我用了GPT2的小型模型做练习,这个模型写大文章可能差点,但应付诗词还可以;而且GPT2可以直接生成文字,用起来很方便。
GPT2在某些情况下,可能还是太费钱了一些。训练一个GPT2模型一般最多两三天吧,就算用GPU,只租两天也不算是太贵。可是要长期发布就麻烦了。这个GPT2模型如果只使用CPU做预测,当下主流电脑做一个预测需要十秒钟以上,有点太长了。使用GPU,速度可以快一百倍左右,但价格也差不多要高一百倍。目前租一个云服务器,只用CPU的话,第一年只需要¥70左右;租一个带GPU的,需要¥7000每年。

二、训练集选取
整个项目里,整理训练集是最费时间和精力的工作。对于多数机器学习项目,都是训练集越大效果越好,但是做诗词生成也学并不是的。古人创作过无数的诗词,能广为流传的是极其少数的一部分。也就是说,我们能够整理出来的诗词大多数其实写的并不好,如果让电脑跟它们学,恐怕也学不了多好。理想情况是只收集那些高水平的诗词。另外,太多的训练数据会激励算法使用一些不太常用的字词来作诗。这些词语如果应用不当,就非常影响作品可读性。反之,风月、云雨、山水等高频词,无论如何搭配,读起来都不至于太别扭。

当然小数据集也有缺点,它只会覆盖部分主题。我实验有了相对较小的数据集,主要包含了《千家诗》、《唐诗三百首》和其它一些我个人比较喜欢的诗词。训练好的模型对于处理风花雪月这类常见题材是可以产生出相对不错的结果,但是如果让它写个没训练过的内容,比如关于建设现代化等的题材,就没办法生成的很好了。

如果资源足够,采用大训练集,给不同质量的诗词配上不同的权重,应该可以获得更好的训练结果。

合辙押韵是诗词的一个非常重要的属性,但是我在练习中没有考虑这一问题。为程序添加人为指定的平仄,尾韵等规则并不是一个好的办法。因为那些最为脍炙人口的古诗中,很大一部分,以现在的读音朗读都不在押韵,或者至少不是精确的押韵了。一首诗读起来顺不顺耳,最主要的还不在于是否押韵,而是是否耳熟。我们从小就背着那些不再精确押韵的古诗,审美早已适应这种宽松的规则了。过度强调押韵反而会影响生成诗词的质量。

最好的办法还是让模型自己去学习韵律。我的训练集只包含文字,没有文字的发音信息,所以模型无法学到发音规律。只要把字音信息也加入数据集,把数据集中的每一个字都扩展为“字+拼音”的格式。比如,原本数据集中的文字是“风雨送悲声”,改为“风feng1雨yu3送song4悲bei1声sheng1”。这样一来,文字的平仄韵律信息就都有了。模型自然也就可以学习到如何押韵了。
同理,我在训练的时候也没有把文字是如何书写的这个信息传递给模型,所以模型绝对不会掌握比如对拆字联这样的功能。如果把文字的书写信息(使用图像,或者抽象成偏旁部首)加入训练集,那么模型就可以学习到与书写有关的功能了。

三、损失函数
我偷懒,使用了默认的损失函数,也就是说,训练时没有添加额外规则。但实际上这样会影响模型的效果。一些规则,模型是很难自己学习到的,尤其是数据集也不够大的情况。比如,押韵、用词要丰富多彩等一些规则,模型自己领悟不到。
通过挑选训练集,可以弥补一部分不足,比如比如尽量避免有重复词的诗句,以方便模型更快的掌握这个规律。

四、训练时间
看别人的经验,训练时间在使用GPU的情况下一般一两天。这与模型大小和数据集有关。我试验的模型和数据集都不算太大,用GPU一两个小时效果就已经不错了。这时候,模型还会时不时产生一些莫名其妙的结果。增加训练时间,可以让模型产生更规范的结果,但同时,也会削弱预训练数据的作用。个人感觉,虽然这时候模型的输出减少了明显错误,但也同时减少了惊艳的诗句。可能模型也跟人一样,要有创造力、要天马行空才能写出神句来。学习的太多,反而影响创造力。
我也试了一下只使用CPU做训练,比使用GPU要慢一两个数量级。

五、生成结果
我个人纯理工背景,文采很差,对于诗词的好赖,只能大致一评。

我觉得程序生成的诗词基本还行吧,虽然也有一些不足。首先是生成的诗完全没有考虑押韵。其次是生成的诗不是每一首都令人满意的。当然也可能我的水平太差,看不懂模型生成文字的深意。不过以我的水准来评判,程序有时还是会产生一些相当不错的诗句的。我在计算机生成的诗篇里挑拣了一些,个人认为还算可以的,发表到了一些诗友论坛。诗句文采怎样先不论,至少没有读者跳出来说你这根本不是人话,也算是成功了。

首先测试作对。吟诗常以做对为基础嘛。以“倦鸟无心归去”为上联,电脑对下联“野花有意偷开”。对的妙啊,能把“花”和“开”联系起来就算不错了,还能把“野”和“偷”关联上,已经超出我的预料了。我不相信电脑真的明白什么是野花,也许只是在训练集或预训练集中野花总和偷摸之类的词在一起吧。但无论怎样,这表明电脑水平还是可以的。
有时候模型写的对联思路极其开阔。比如看到这一副生成的对联时,我差点一口老血喷到屏幕上:“千家百姓,共建和谐社会;三宫六院,同沾雨露春风”。

诗人一生的经历都会体现在作品里,比如,读李煜的诗,就总是会联想到他亡国之君的悲伤;读苏轼的诗,会让人燃起在逆境中乐观的态度。计算机没有任何过往经历,它堆出来的词再美丽也也没有任何内涵。但反过来,(高情商说法)也可说电脑作诗最擅长那些不需要具体内容的空洞题材,比如说泛泛的写景,赞美称颂等等。而且,前面也讨论过,如今社会有使用需求的恰恰也是这一类的诗。比如写马屁诗,模型一分钟至少能写八百首。

模型可以日夜不停的写,我却没有精力去读,随便摘取了一些:

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

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

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

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

查看或添加留言

孤僻、内向的进化优势

· 阅读需 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

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

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

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

处理后的效果

查看或添加留言

LabVIEW 的 unicode 问题

· 阅读需 9 分钟

https://lv.qizhen.xyz/appendix_problem

以前从来没有意识到过这个问题,直到最近,我试图去查看自己很久之前写的一些VI的时候才开始注意到它的。

先简略的介绍一下unicode的背景:

计算机是在美国被发明的,所以很自然的最开始只考虑了处理英文。早期最著名的关于如何在计算机中表达字符的标准是ASCII标准(American Standard Code for Information Interchange,美国信息互换标准代码)。它定义了128个字符,包括英文字母大小写,数字,常用的标点和一些特殊符号。当时世界上所有的计算机都用同样的 ASCII 方案来保存英文文字。这个方案最大的问题是只包含了英文字母,于是其它国家,组织和公司纷纷开始扩展这个标准用以支持其它字符,比如制表符、数学运算符号、中文字、日文字等等。比如在中国最常用的标准 GB2312,GBK,GB18030 等都是对 ASCII 的中文扩展。之后扩展出的这些标准有个很大的问题,就是同一个数值在不同的标准中被定义了不同的含义。某一数值在中文的标准下可能是一个中文字符,放到韩国的系统的某标准下,可能就是一个完全不相关的制表符。这就造成了,在中文环境下开发的软件,运行到韩国系统下显示的就完全是乱码。如果有人需要在一个系统下同时运行一个中国软件和一个韩国软件,恐怕就不行了。

为了解决这个问题,1990年开始,计算机业界开始研发一种编码标准,它可以覆盖全世界所有的字符,这样任何一个字符都有自己独占的编码,这样就不会出现换个系统就乱码的问题了。这就是unicode,也叫万国码、单一码。unicode规定了字符集,但是这套字符集也还有多重不同的编码格式。Windows采用了UTF-16LE格式的unicode编码(UTF全称为 Unicode Transformation Format),使用16位的(双字节)数据表示一个字符。但是当前最流行的unicode编码格式却是 UTF-8,这是一种变长的编码方式,根据字符的常用程度,可能由1到6个字节来表示。目前大多数的unicode文档采用的都是 UTF-8 编码的。

目前,大多数的软件也都是基于unicode的了。但是LabVIEW始终没有支持unicode。虽然Windows很早就开始支持unicode了,但是为了兼容那些还没有支持unicode的软件,Windows系统保留了一个默认字符集的设置,对于非unicode的软件,Windows会使用默认的字符集来解释那些字符编码。国内使用的电脑几乎都设置了默认的字符集为中文字符集,所以,一个软件是不是支持unicode,对于绝大多数中国用户来说根本感觉不到什么差别。所以,我之前也从来没觉得LabVIEW不支持unicode有什么问题。

直到最近我才发现了问题。我家里有两台电脑,一台操作系统安装了英文的Windows,并且没有修改过默认的非unicode字符集;另一台操作系统是中文Deepin Linux。我在两台电脑上都安装了社区版的LabVIEW 2021。我想在两台电脑上查看一下自己十年前写的一些VI,这时才发现,如果VI的路径中包含中文,是无法在Windows上被LabVIEW打开的。不过,我主要使用的是Linux,在Linux上还可以打开大部分的VI。但很快我就又发现,如果那些VI中如果有我以前设置的中文的常量或注释,在Linux下是无法正确显示的。但是呢,我还可以再Linux下添加中文常量或注释。之后,又遇到了更严重的问题:以前那些项目中,如果有中文名的子VI,或是库中、类中有中文名的VI,就通通都打不开了。我开始还以为是不是10年过去了,LabVIEW系统有什么变化,但是没听说过啊。于是我开始怀疑是不是文字编码的问题,我把Windows的默认字符集换乘了中文,果然在Windows下一切正常了。而且我还发下,在Linux下,给VI添加的中文注释,拿到Windows下,看到的全是乱码。

总结我看到的现象,我深刻怀疑,目前LabVIEW在Windows下是不是用unicode的,字符编码由Windows系统决定,对于大部分中国用户来说,采用的是GB18030中文编码;但在Linux下却使用了UTF-8编码。

在Linux由于系统和LabVIEW采用的都是unicode,所以一个VI在不同Linux版本下应该行为都是一致的。但Windows系统用的是unicode,LabVIEW用的却不是。我们现在假设一个项目中有两个VI,本别是“界面.vi”和“任务1.vi”,其中“任务1.vi”是“界面.vi”的子VI。在操作系统层面,有两个文件:“界面.vi”和“任务1.vi”,它们的名字都是使用unicode保存的。但是在“任务1.vi”内部,它记录了自己要调用“任务1.vi”,却用的是非unicode编码保存的子VI的名字。所以LabVIEW中用于记录这个子VI的一段二进制数据与操作系统中记录这个子VI文件名使用的二进制数据是不同的。每次LabVIEW需要操作系统找到相应的VI文件时,还需要做一次编码转换,把文字转为系统认识的unicode编码。如果保存VI,和读取VI都是在中文Windows中,这没有问题,VI名字总能被正确转换。但是把之前在中文Windows系统下保存的项目拿到非中文Windows(默认语言编码不是中文)下打开,文件名编码转换这一步就会出错,LabVIEW就无法找到正确的VI了。同理,中文Windows下保存的VI,如果有中文名,拿到Linux下打开会出错;反过来也是一样会出错。

总之,由于LabVIEW在Windows下没有使用unicode,造成了中文显示在不同系统下的不一致行为,切换系统就会出现乱码,甚至VI无法被加载。目前没有什么好办法可以解决这个问题。我只好将来在LabVIEW中只使用英文,不是用中文了。

查看或添加留言

重新制作了书籍网页

· 阅读需 3 分钟

最近学习完了React,又使用Docusaurus重新为书籍制作了网页:https://lv.qizhen.xyz/

实际上,Docusaurus已经帮我作为绝大部分工作,我学习的React技能基本没有用上,毕竟书籍的格式还是比较简单固定的,不需要非常炫酷的界面。

之前是用Docsify制作的页面。我对于Docsify的界面和功能已经非常满意了,最主要的问题是它制作的网页是客户端渲染的,搜索引擎都不会爬取。墙外的搜索市场已经被Google垄断,恐怕Google是不会有动力去支持搜索客户端渲染页面了。国内的搜索市场竞争还更激烈一点,可以它们居然做的都比Google还差很多,也没有指望。只能自己修改网页了。

Docusaurus使用起来比Docsify麻烦不少,所需技术门槛也稍高。这一是因为Docsify只支持制作文档网页,而Docusaurus还可以制作个人主页和博客,功能复杂了不少,虽然都是我都用不上的。二是因为Docusaurus是制作服务端渲染页面的,多了一个Build步骤。再有Docusaurus比较新,资源相对来说少一些。

但不管怎么样,Docusaurus也是非常令人满意的。现在Google可以爬取我的页面了,国内的搜索引擎都还不行,但这不是网页的问题,最可能是我的域名没有工信部认证,国内引擎不愿意访问。

Docusaurus开发团队非常活跃,应用前景应当超过其它类似工具。非常推荐用于创建静态的个人主页、博客、文档等。

查看或添加留言

最近更新了书里的一些内容

· 阅读需 1 分钟

https://lv.qizhen.xyz/

毕竟不是专业做LabVIEW编程了,写作速度也大为减缓。因为之前太久没维护了,近期我还是会尽可能多的做一些修改。长期的来说,希望保持每年可以更新一两章的内容。

将来会逐渐补充一些我比较了解的内容,比如:面向对象编程,泛型编程,数据结构,设计模式,网络编程,调用Python等。当然这些都是很长远计划了,不能期望太高。

查看或添加留言

试了一下LabVIEW2021社区版

· 阅读需 1 分钟

只大致看了看前后面板。发现跟10年前差别不大,功能有所增加,但也没有太多,没有2000~2010那十年变化大。这也可以理解,编程语言的基础部分还是要稳定一些的。重大的功能添加可能主要会以插件的形式发布了。

也有可能NI过去10年精力主要都放在了LabVIEW NXG上面。看看下个十年会怎么样吧。

查看或添加留言