<![CDATA[Memolog]]> https://memolog.us/https://memolog.us/favicon.pngMemologhttps://memolog.us/Ghost 5.74Fri, 05 Jan 2024 21:33:31 GMT60<![CDATA[由正则表达式所引发的]]>https://memolog.us/you-zheng-ze-biao-da-shi-suo-yin-fa-de-2/656c023a23b0502492ed3cc9Sun, 03 Dec 2023 04:31:31 GMT

2017年的时候,我记录了一篇博客,叫做浅谈正则表达式,转眼间,六载光阴一晃而过,生成式人工智能已经如火如荼。我记得那时候我还在实验室搬着计算机视觉相关的砖,广州的春天不算寒冷,因为闷热已经触手可及。兴许我那会儿需要采集一些数据,因而需要使用爬虫技术,在爬取信息的过程中,则要用正则表达式来更为精确地匹配到需要的信息。正则表达式相当于一门字符匹配类的编程语言,它的可读性相比其他的通用编程语言是差很多的,因此,写正则表达式并不是一件那么友好的事,因为它强制你在它定义的有限语义下编程,虽然那时候也有很多工具来帮助你可视化字符匹配的过程。

2023年初的时候,ChatGPT开始流行,越来越多的人开始接触并使用AIGC(生成式人工智能),如今,你只需要向ChatGPT提问,它就会告诉你它所知道的答案,那些由过去四五十年积累的互联网语料,通过成千上万的GPU日夜辛勤审阅,一层又一层,成千又上万遍,在概率论的时空背景下一一被安排得明明白白的答案,效果是真的惊人。比如,我问ChatGPT如何用正则表达式在下面这段话中找出字母a和字母e之间的字符

write regular expression to capture all characters between a and e, don't do it greedily: Tall trees stand, their leafy embrace, Witness to a moment, time cannot erase. Warm sun paints the scene with grace, A poem of fall, a tranquil space. ‌

a(.*?)e

上面是它给出的正确答案,加粗的就是被这段正则表达式标记出的字符,核心就是我在浅谈正则表达式里提到的非贪婪匹配。这段正则表达式看似简单,但假设我不是一个经常使用正则表达式的人,那么我一时可能难以想起非贪婪匹配的语法,因此,按照六年前的思路,我可能要搜索一下,假使匹配变得更加复杂,那么我可能需要在不同的网页间切换再总结出一个思路,这就涉及到一个时间成本的问题。

2023年的人类,聪明地给自己和机器之间找了一个翻译员,在这之前,我们需要自己去和机器交互,使用机器能理解的语言来解释自己的需求,如今,ChatGPT相当于翻译员,让那些不懂机器语言的人也能通过自己日常交流的语言来指挥机器实现自己的需求。但我们知道,翻译是有损的,从一种语言翻译到另一种语言多少会损耗一些原始的信息。我们经常说的信达雅,则是翻译的最高境界。一个具有最高翻译水准的翻译员,不仅能够翻译得信达雅,而且还要能够辨别出原始信息里面的表述误差,用这种容错能力将真实的意图翻译出来。在这一点上,ChatGPT是远远不及的。ChatGPT的回复准确性依赖于使用者对自己需求的准确描述,也就是我们说的prompt(提示)。于是,2023年的人类将自己与机器长期以来打交道的工作,转化为了人类与翻译员交互的工作,如何培训这位翻译员成了一个艰难或持久的问题,在这之前,我们需要扮演好人类的角色,学习向翻译员精确地传达自己的意图。这是一种进步吗?当然!

自钻木取火以来,人类在不停地朝着解放生产力的步伐前进,文明与科技的进步往往伴随着将人类的双手转移到更为精密复杂更具创造性的工作上去。在软件工程领域,无数的框架或者库的构建是为了让工程师更好地专注于与需求强相关的形态各异的部分。而ChatGPT则扮演了这个框架的角色,它让你的双手可以更安心地放在那些更复杂、更昂贵、更耗时间的创造上面。

但是,ChatGPT也仅仅是框架。科幻小说《你一生的故事》的作者特德·蒋年初在纽约客上面发表了一篇文章ChatGPT Is a Blurry JPEG of the Web,他将ChatGPT对于互联网语料整合并输出的这种行为比喻为图片的有损压缩,我其实很喜欢他这个比喻,很具科幻浪漫主义气质,但是,我认为他的阐述是不完全正确的。他更多地是站在艺术创作者的角度来评价ChatGPT,而显然的,ChatGPT所展现的创造性不仅是有限的,更是东拼西凑而非博采众长的。就拿它所依赖的图片生成工具DALL·E来说,我至今没有看到过一张自己喜欢的由DALL·E生成的图片,因为所有这些图片的Artificial Intelligence气息都太浓了,当然这和个人的审美有主要的关联。这种互联网压缩的比喻其实很像现在的短视频,通过短视频你是无法深入地了解并学习一门知识的,那些魔鬼般的细节往往又是如此地决定性,从艺术的角度来说,掌握了无数绘画技巧的你和梵高画同一幅画,远远看去差不多,但是,有人会说你和梵高画得一样好吗?但刨除艺术的部分,如果从工程领域的实用主义角度出发,ChatGPT代替的是搜索引擎的角色。原来,你需要一页一页翻找你所查询的知识,如今ChatGPT直接提炼出那些知识点,当然你会说,这不就是一种压缩吗?但事实上,互联网里面无数的网页几乎没有价值或者说充斥着废话,这不正是该被丢弃的部分吗?从这个角度来说,压缩是真压缩,但是不是有损,倒不一定。即使是有损压缩,你依然可以回到纷繁的网页中去佐证它的压缩损耗,而它所带来的便利性,却可以解放你的双手。因而,作为框架的ChatGPT是光明的,但作为AGI(通用人工智能)的ChatGPT却依然虚幻。

]]>
<![CDATA[浅谈正则表达式]]>https://memolog.us/qian-tan-zheng-ze-biao-da-shi-2/642f8bf19305f08369ce726dSat, 11 Mar 2017 00:00:00 GMT

我不想让你在看到这个标题的时候就下意识地以为我又要罗列一大堆正则表达式的语法,这样就显得太无聊了,当然,我现在这种谈论无聊的资本主要是建立在别人的辛勤耕耘上——你尽可以在网络上搜索到一堆正则表达式的教程,泛滥在信息的海洋里,通过二进制的姿态传输到你的内存,纤毫毕现地在屏幕上勾勒着那些单调与乏味。

我想说说我的浅薄历程。我一开始接触正则表达式也被那些语法塞得一团糟,很快就忘了。直到后来我要写一些爬虫,我才重新去学习那些语法。这时候我才发现正则表达式的厉害之处。就拿最常用的非贪婪匹配.*?来说,这简直是极度有用的一种语法,假设你要匹配一段字符串中间的一些字符,你可以用一些定位字符作前后限定,然后用(.*?)来获得中间这段字符。不要小看了这个语法,我在写爬虫的时候用得最多的就是这种形式或者变种,写多了也就不觉得无聊,效率也提高了。

我提到这个例子无非就是想说明两点:第一,学习正则表达式的最好方式就是实践,埋头看语法有点浪费时间。第二,正则表达式在文字处理方面是一个很有用的工具,可以提升不少效率。无论是不是专业人员,我都建议学习一两种脚本语言,比如Python,调用正则表达式模块处理文字还是非常方便的。

最后,推荐一个学习正则表达式的网站:RegExr,这个网站可以让你实时地看到自己写的正则表达式的匹配结果。

]]>
<![CDATA[Faster RCNN - 错误汇总]]>https://memolog.us/faster-rcnn-cuo-wu-hui-zong/642f84639305f08369ce724eFri, 10 Mar 2017 00:00:00 GMT

你要知道,我的导师是研究光电技术的,我在实验室搬砖的项目和图像识别相关,当时我选择了Faster RCNN这个开源框架来识别各种纷繁复杂(黑白分明)的OCT图像,OCT的全称是Optical Coherence Tomography,也就是光学相干断层成像,它和大家熟悉的CT成像(计算机断层扫描)是属于一个范畴的技术,OCT的主要优点在于对人体的伤害小(相对于CT成像而言)。

Faster RCNN是一个图像识别的工具,基于CNN,具有更快的速度,它不仅可以识别出图像中的物体,还可以用矩形框定位该物体并给出置信度。初期,实验室老师给了我少量图像让我识别,我手动标注了几百张,训练之后测试效果还不错。过了一段时间,老师得到了更多的数据,此时手动标注显然是不现实的,因为所有图片加起来有几千张,我一天最多能标注几百张而已,而且标注之后我感到很想睡觉,困乏无力,于是我将整张图片当作单个物体的区域,坐标类似于(0, 0, length, width)的形式,然后将图片放进去训练,没想到在训练的第一阶段就出现错误了。

错误的具体信息我记不得了,当时也没有截图,都是Python的一些错误提示(没错,我爱Python),大致如下:

  • 数值越界
  • Key Error

当时试过很多方法,比如修改学习率,重新制作数据集,结果都无效,也不知道后来灵感怎么就闪现出来了,竟发现了问题所在,解决了这两个bug。

数值越界是因为我前面提到过的,我将整张图片作为单个物体的区域,也就是区域坐标为(0, 0, length, width),因为坐标里面含有0,导致Faster RCNN在训练区域的时候出现了负数,因而报错,解决方法就是将左上角坐标(0, 0)稍微向右下角偏移一些,比如变成(5, 5),这对训练的影响不大。

Key Error的原因是没有删除之前用Faster RCNN训练所产生的cache,删除即可。

]]>