晨光不是一下子泼进来的,而是像一种极淡的、掺了灰的柠檬黄,先洇湿了东边天际线那些锯齿状的屋顶与教堂尖顶,再缓缓漫过阿勒格尼河面尚未散尽的、牛奶般的雾气。
曹鹏租住的肖雷镇一栋老砖墙公寓楼的顶层,朝东的窗玻璃上,爬山虎肥厚的叶子将光线滤成细碎而晃动的绿斑,在他合着的眼皮上温柔地骚动。
五点四十七分,比闹钟早了十三分钟,他的生物钟精确得像经过梯度下降优化过的算法。
躺着没动,闭眼在脑中复盘昨晚推导到一半的稀疏表示模型。那些符号在黑暗里自动排列组合,如自律的士兵。三分钟后才睁开眼,起身,赤脚踩在微凉的地板上。
单人床、书桌、书架、三台并排的显示器、地板上蜿蜒的数据线缆和摞起来的专业期刊,构成了这个不足十五平方米空间的全部秩序,被曹鹏整理得像一篇逻辑严谨的论文。
窗台上的那盆绿萝在晨光中舒展着肥厚的叶片,这是曹鹏从学校实验室里救回来的,如今已蔓生出近一米长的气根,像一道绿色的瀑布垂着。
书桌左边堆着三摞论文打印稿,每摞都用不同颜色的便利贴做了标记:蓝色是待精读,黄色是需要重验推导,红色则是存疑待讨论。一台显示器上开着一个终端窗口,一行行代码正以某种催眠般的节奏向上滚动。
书架按领域分层,最上层是统计学习理论经典,中层是近年顶会论文集,下层是些“杂书”,《庄子》、《围棋定式大全》、《哥德尔、艾舍尔、巴赫》。
拉开那扇有些滞涩的窗户。匹兹堡夏日清晨特有的空气涌了进来,并不清新得过分,带着河流的水汽、远处尚未关闭的钢厂一丝微弱的硫磺暗示,以及这个老工业城市在清晨舒展筋骨时呼出的、混合了砖石、沥青和茂密植被的复杂体味。
远处,卡内基梅隆大学校园那些现代与古典杂糅的建筑轮廓,在渐亮的天光中逐渐清晰。
一个深呼吸,走到小厨房,烧水,从铁罐里捏出李乐给的剩的不多的茶叶。等待水开的间隙,他做了一套自创的“唤醒操”,其实只是缓慢转动颈椎和肩关节。
长期编程的人,颈椎是阿喀琉斯之踵。水沸了,冲茶,看蜷曲的叶片在玻璃杯里舒展成完整的春天。
六点整,曹鹏坐到电脑前,先花十分钟浏览arXiv上新挂的预印本。此时计算机视觉领域正处在变革前夜,支持向量机仍是主流,但已有零星论文开始讨论“多层神经网络”在图像识别上的潜力。
他快速扫过摘要,标记出三篇值得细读的,拖进待读文件夹。这个动作他做了四年,文件夹如今有1176篇文献,每篇都经他标注、分类、交叉引用。
知识图谱在他脑中自行构建,如城市地下管网般错综却有序。
七点,起身煮燕麦粥,加一勺蜂蜜、几颗核桃。吃饭时,他翻开笔记本,本子上是昨夜睡前草就的证明思路:关于如何将流形学习嵌入到卷积结构的初始化策略中。
字迹瘦劲,公式与文字交错,边缘处有小小的问号和待验证的引理编号。他看了一会儿,在某个等号旁打了个叉,重写。粥喝完时,证明已补全。
七点半,冲澡,换上灰T恤和卡其裤,匹兹堡的七月潮湿闷热,但实验室的空调总是开到需要穿外套。
出门前,他看了眼墙上钉着的照片,和姐姐曹艳、奶奶一起在清大二门下的合影,和其其格手拉手,坐在长城台阶上的笑脸,左手抱着李笙、右手托着李椽,在石榴树下够石榴的瞬间,一张他与拉吉·瑞迪的合照,去年在NIPS会场,那位图灵奖得主搂着他的肩,笑得像个发现宝藏的孩子。
最后一张,是李乐一手搂着自己肩膀,一手摁着李家成的脑袋,站在坐在沙发上的李晋乔和曾敏身后的腼腆,曹鹏嘴角弯了弯,背上包,锁门。
七月的匹兹堡有种特别的静谧,本科生大多已经离校,校园里只剩下研究生和暑期项目的中学生。
曹鹏骑着一辆不知道几手的自行车骑向Gates Center,途经梅隆学院的老楼,红砖墙上爬满常春藤。
有轨电车叮当驶过,晨跑的人喘着粗气与他擦肩。骑得不快,脑中却在模拟今天组会可能出现的辩论,关于他提出的“多尺度稀疏编码用于图像分类”的方案。这个想法萌芽于三周前与实验室来自大毛的博士后捷尔任斯基的一次深夜讨论,经过十几次迭代,如今已初步成型。
不过组里那个一看就是婆罗门长相的胖子维杰总爱质疑,喜欢用“计算复杂度”说事。
好在准备了三组对比实验数据和两个简化模型的变体,足以应对任何诘问。但他希望不必用上全部弹药,好的合作该像交响乐,而非军备竞赛。
把车子停到计算机学院那座标志性的“机器人厅”门口时,他瞥见里面几个本科生模样的学生正围着一个六足机器人调试代码,动作中透着暑期实习特有的那种既兴奋又疲惫的混合感。
继续阅读,后面更精彩!
“曹!”
一个声音从身后传来。曹鹏回头,看见胖子维杰小跑着赶上来,手里还捏着一个吃了一半的甜甜圈。
“昨晚又睡在实验室了?”
“算法收敛前的最后一组实验,”维杰咧嘴一笑,露出被咖啡渍略微染黄的门牙,“我赌我的新特征选择方法能在Caltech-101上比你的方法高至少两个百分点。”
“赌什么?”
“输了的人吃一周的咖喱。”
“这不公平,你可以一辈子吃咖喱糊糊。”
“那你说。”
“办公室一周的卫生。”
“行.....行吧。”
两人走进盖茨计算机科学中心时刚好八点十五分。电梯里贴着几张海报:下个月将在西雅图召开的CVPR会议征稿通知,卡内基梅隆与英特尔合作研究项目的招聘启事,还有一张,瑞迪教授不知道又获得什么奖项的新闻剪报。
项目组会议室在五楼东侧。两人推开门时,里面已经坐了三四个人。
长条会议桌一端,瑞迪教授正低头翻阅着一沓打印稿,鼻梁上架着那副标志性的半框眼镜。这位图灵奖得主今天穿了件浅蓝色的牛津纺衬衫,袖子挽到手肘,露出小臂上浓密的汗毛。
“曹,你的报告在第三个,”瑞迪头也不抬地说,“我希望看到完整的误差分析,而不仅仅是准确率数字。”
“明白,教授。”
曹鹏坐到最边上,从包里取出笔记本电脑和一份打印好的资料。他习惯纸质备份,在这个PDF和PowerPoint已经普及的年代,这显得有些老派,但他喜欢在汇报时用铅笔快速标注重点的感觉。
组会准时开始。第一个汇报的是博士三年级生艾米丽·陈,一个除了姓氏,其他各方面已经和华裔都不沾边的女生,包括长相,毕竟,作为第一批来到丑国的华工后代,你要相信基因的力量。
她做的是基于主动轮廓模型的医学图像分割。汇报到一半时,瑞迪打断了她。
“你的能量函数中正则项系数是固定的?”
“是的,目前是0.3。”
“试过自适应调整吗?根据图像局部梯度?”
艾米丽愣了一下,“这……会增加计算复杂度。”
“先验证有效性,再优化效率。”瑞迪的语气平和,却带着不容置疑的权威,“下周三之前,给我三组对比数据。”
曹鹏低头在自己的笔记本上快速记下一行字,“正则项自适应,可用于多尺度特征权重分配?”他的思维总是这样,即使在听别人的汇报,也会下意识寻找与自己课题的交叉点。
第二个汇报的就是胖子维杰。
他提出了一种基于互信息的特征选择方法,用于降低高维特征空间中的冗余。
汇报过程中,曹鹏三次举手提问,一次关于互信息估计中核函数带宽的选择依据,一次关于该方法在类别不平衡数据集上的鲁棒性,还有一次关于计算复杂度的实际评估。
每次提问都朝着要害而去。维杰的回答起初还游刃有余,到第三个问题时,额头已渗出细密的汗珠。
“计算复杂度方面,”维杰翻动着幻灯片,试图找到相应的分析页面,“理论上是On2,但实际实现中我们采用了近似算法……”
“近似算法的误差界是多少?”曹鹏追问。
会议室安静了几秒。瑞迪抬起头,目光在两人之间扫过,嘴角似乎微微上扬了一毫米—,这是他对学生间高质量辩论的认可。
“这……我们还在分析。”维杰最终承认。
“那么在你的实验结果中,至少应该标注‘使用近似算法’的说明。”曹鹏的语气没有得意,只是陈述事实,“否则对比是不公平的。”
维杰点头坐下时,曹鹏对他眨了眨眼,这是两人之间的默契,辩论归辩论,不影响午饭时一起吐槽系里新出台的服务器使用规定。
瑞迪教授朝曹鹏点头,“上周我们讨论了SIFT特征在动态场景中的漂移问题。曹鹏提出了一个新框架的初步想法。今天,请他详细展开。”
曹鹏起身,在靠近白板的位置坐下,他没用投影,有些思路,手写更能体现思考的脉络。
“谢谢教授。”他转向小组,目光扫过每个人的脸。
维杰抱着手臂,眉头微皱,艾米丽已打开笔记本,二年级博士生汤姆眼神放空,大概还没从昨晚的Dota战中回神,而博士后捷尔任斯基,则冲曹鹏眨眨眼。
“我们现有的图像分类流程:特征提取、编码、池化、分类器。”曹鹏画了四个方框,“问题在于,手工设计的特征,比如SIFT....在类别增多、视角变化剧烈时,区分度下降。而编码阶段用的K-means或稀疏编码,本质是假设特征服从单一分布。”
说到这儿,他等等,看是否有人提问。维杰动了动嘴唇,但最终选择放弃。
“我的提议是,放弃手工特征,直接从像素学起。”曹鹏在“特征提取”框上打了个叉,“但不是用传统的全连接神经网络,参数量太大,且忽略图像的空间局部性。我设计了一个多尺度稀疏自编码器结构。”
继续阅读
他又在白板上画出三层结构,第一层是小感受野的卷积核,提取边缘纹理,第二层卷积核变大,整合局部结构,第三层是全连接层,但施加L1稀疏约束。每一层都用无监督预训练初始化,再用反向传播微调。
“关键在这里,”曹鹏在第三层旁写下公式,“我们不在像素空间做稀疏,而是在特征空间做。将每张图的特征激活视为一个信号,用字典学习找到过完备基,然后求解稀疏系数。”
“这样,分类问题转化为,在字典空间中找到最具判别力的稀疏模式。”
说着,写下一串数学符号。然后转向实际问题,“我在Caltech101数据集上试了初步版本。64×64的图,三层结构,第一层用6×6卷积核,步长2,得到16个特征图;第二层……”
“等等。”维杰终于举手,语气带着质疑,“曹,你算过时间复杂度吗?光是第一层卷积,假设输入是64×64的RGB图,6×6核,步长2,输出16个特征图,一次前向传播就需要多少乘加操作?这还没算上稀疏编码的迭代优化。你的模型能在合理时间内完成训练吗?”
问题尖锐,但曹鹏预料到了。他保持平静,甚至微笑。
“好问题。我算过。”他走到白板另一侧,快速写下算式,“第一层卷积,输入64×64×3,核6×6×3×16,步长2,输出特征图尺寸30×30×16。乘加次数约:6×6×3×30×30×16 = 1,555,200次。对于Caltech-101的9144张图,一个epoch是142亿次操作。在双Xeon 3.0GHz的服务器上,用高度优化的C++和SSE指令,一个epoch大约需要47分钟。”
数字精确到个位。会议室安静了。
“但这只是朴素实现。”曹鹏继续,“我做了三处优化,一,将卷积转化为矩阵乘法,用Strassen算法加速,二,利用特征图之间的独立性,并行计算。三,稀疏编码阶段,我用了改进的迭代收缩阈值算法,将收敛速度提升了40%。最终,完整训练一轮的时间是28分钟,在可接受范围内。”
维杰盯着算式,手指无意识敲着桌面。几秒后,他抬头,“准确率呢?你说了这么多计算,但分类效果比SIFT+SPM的空间金字塔匹配好多少?”
“Caltech-101,SIFT+SPM的最好结果是78.3%。”曹鹏抽出打印好的图表,贴在白板上,“我的方法,在相同训练、测试划分下,目前是81.7%。错误分析显示,提升主要来自动物类和交通工具类。”
“这些类别视角变化大,手工特征容易失效。”
3.4个百分点的提升,在视觉领域已算显着。艾米丽轻声赞叹,汤姆也坐直了身体,只有捷尔任斯基,小声的吹了个口哨。
但维杰还没放弃,“你的模型参数量多大?过拟合风险呢?”
“参数量,卷积层约1.7万,全连接层约12万,总计不到14万。作为对比,一个三层的全连接神经网络,输入是64×64×3=维,隐层若取500单元,参数量就超过600万。”
曹鹏从容应对,“至于过拟合,我用到了数据增强,平移、旋转、缩放、Dropout,以及在损失函数中加入权重衰减。五折交叉验证的方差在0.8%以内。”
滴水不漏。维杰靠回椅背,终于露出一丝苦笑,“行吧,看来你都考虑到了。”
“不,还有问题。”曹鹏忽然说。所有人都看向他。他指向白板上的一处,“稀疏编码的字典学习,我目前用的是在线梯度下降,但初始化敏感。我试了KSVD和MOD,效果都不稳定。”
“这是我今天想请教大家的:有没有更好的字典初始化策略?或者,我们是否该换一种思路,不学固定的字典,而学一个能生成字典的函数?”
问题抛回给小组。一直沉默的瑞迪教授此时开口,声音里带着赞许,“很棒的思考,曹。字典初始化……让我想到非线性降维中的局部线性嵌入。或许可以将LLE的邻域重构思想迁移过来,用局部样本的线性组合初始化字典原子。”
讨论就此转向更深的技术细节。维杰出用拉普拉斯特征映射约束字典原子的平滑性,艾米丽建议在损失函数中加入判别性项。汤姆贡献了一个CUDA加速的idea。虽然实现细节有待商榷。
曹鹏听着,不时点头,在笔记本上记录。辩论时的锋芒收起了,此刻他是海绵,吸收每一点有用的灵感。当艾米丽提出一个巧妙的正则化方法时,他眼睛一亮,迅速推演了几步,抬头说,“这个可以和我之前想的流形约束结合。”
“如果我们把特征空间视为黎曼流形,你的正则化项其实就是对流形曲率的惩罚。艾米丽,会后能详细聊聊吗?”
继续阅读,后面更精彩!
艾米丽笑着点头。
维杰插话,“曹,你总能把不同领域的东西缝在一起。上次是稀疏编码和视觉注意力,这次是流形几何。你的脑子怎么长的?”
“多读书。”曹鹏认真回答,“《微分几何基础》和《压缩感知理论》一起读,有时候会在凌晨三点产生奇怪的联想。”
众人都笑了。
瑞迪教授看着弟子们,眼神欣慰。他喜欢这种氛围,严谨但不死板,竞争却又合作。
曹鹏尤其让他惊喜,不仅天赋惊人,更难得的是懂得如何将锋芒包裹在谦逊之下,在扞卫自己观点时不伤及同僚自尊,在吸收他人意见时不忘真诚致谢。
会议在十一点半结束。曹鹏被围住,回答关于代码实现的问题。他耐心解释,答应晚点把优化后的卷积核计算代码分享给大家。
出门时,维杰走到他身边,拍拍他肩,“今天又被你碾压了,曹。不过那个字典初始化的问题,我昨晚其实有点想法……”
“一起吃午饭?我想听听。”曹鹏自然而然地接话,仿佛刚才的激烈交锋从未发生。
两人并肩走向食堂。
窗外,匹兹堡的天空湛蓝如洗,几朵白云停在卡内基梅隆大学红色屋顶的上空,像在等待什么。
曹鹏想着下午要跑的对比实验,脑中已开始规划代码结构。但此刻,他更愿意听维杰说话。谁知道呢?也许“有点想法”,能点亮下一盏灯。
走在橡树掩映的小径上,他忽然想起昨夜笔记本边缘写下的一句自语,“算法如棋,妙手偶得,但妙手之前,是十年厚积。”
他笑了笑,推开了食堂的门。冷气混合着意面酱的香气扑面而来,而他的思绪,已飘向下午将要书写的、那些无人见过的代码行。
只不过,当看到一个人高马大,正嘬着一杯可乐,迎面的朝自己走来的圆寸脑袋的时候,那笑容忽然变得激动起来。
“哥,你什么时候来的?”
回档:换个姿势再来一次