第1811章 哥,你什么时候来的?(2/2)

“我的提议是,放弃手工特征,直接从像素学起。”曹鹏在“特征提取”框上打了个叉,“但不是用传统的全连接神经网络,参数量太大,且忽略图像的空间局部性。我设计了一个多尺度稀疏自编码器结构。”

他又在白板上画出三层结构,第一层是小感受野的卷积核,提取边缘纹理,第二层卷积核变大,整合局部结构,第三层是全连接层,但施加l1稀疏约束。每一层都用无监督预训练初始化,再用反向传播微调。

“关键在这里,”曹鹏在第三层旁写下公式,“我们不在像素空间做稀疏,而是在特征空间做。将每张图的特征激活视为一个信号,用字典学习找到过完备基,然后求解稀疏系数。”

“这样,分类问题转化为,在字典空间中找到最具判别力的稀疏模式。”

说着,写下一串数学符号。然后转向实际问题,“我在caltech101数据集上试了初步版本。64x64的图,三层结构,第一层用6x6卷积核,步长2,得到16个特征图;第二层……”

“等等。”维杰终于举手,语气带着质疑,“曹,你算过时间复杂度吗?光是第一层卷积,假设输入是64x64的rgb图,6x6核,步长2,输出16个特征图,一次前向传播就需要多少乘加操作?这还没算上稀疏编码的迭代优化。你的模型能在合理时间内完成训练吗?”

问题尖锐,但曹鹏预料到了。他保持平静,甚至微笑。

“好问题。我算过。”他走到白板另一侧,快速写下算式,“第一层卷积,输入64x64x3,核6x6x3x16,步长2,输出特征图尺寸30x30x16。乘加次数约:(6x6x3)x(30x30)x16 = 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万。作为对比,一个三层的全连接神经网络,输入是64x64x3=维,隐层若取500单元,参数量就超过600万。”

曹鹏从容应对,“至于过拟合,我用到了数据增强,平移、旋转、缩放、dropout,以及在损失函数中加入权重衰减。五折交叉验证的方差在0.8%以内。”

滴水不漏。维杰靠回椅背,终于露出一丝苦笑,“行吧,看来你都考虑到了。”

“不,还有问题。”曹鹏忽然说。所有人都看向他。他指向白板上的一处,“稀疏编码的字典学习,我目前用的是在线梯度下降,但初始化敏感。我试了ksvd和mod,效果都不稳定。”

“这是我今天想请教大家的:有没有更好的字典初始化策略?或者,我们是否该换一种思路,不学固定的字典,而学一个能生成字典的函数?”

问题抛回给小组。一直沉默的瑞迪教授此时开口,声音里带着赞许,“很棒的思考,曹。字典初始化……让我想到非线性降维中的局部线性嵌入。或许可以将lle的邻域重构思想迁移过来,用局部样本的线性组合初始化字典原子。”

讨论就此转向更深的技术细节。维杰出用拉普拉斯特征映射约束字典原子的平滑性,艾米丽建议在损失函数中加入判别性项。汤姆贡献了一个cuda加速的idea。虽然实现细节有待商榷。

曹鹏听着,不时点头,在笔记本上记录。辩论时的锋芒收起了,此刻他是海绵,吸收每一点有用的灵感。当艾米丽提出一个巧妙的正则化方法时,他眼睛一亮,迅速推演了几步,抬头说,“这个可以和我之前想的流形约束结合。”

“如果我们把特征空间视为黎曼流形,你的正则化项其实就是对流形曲率的惩罚。艾米丽,会后能详细聊聊吗?”

艾米丽笑着点头。

维杰插话,“曹,你总能把不同领域的东西缝在一起。上次是稀疏编码和视觉注意力,这次是流形几何。你的脑子怎么长的?”

“多读书。”曹鹏认真回答,“《微分几何基础》和《压缩感知理论》一起读,有时候会在凌晨三点产生奇怪的联想。”

众人都笑了。

瑞迪教授看着弟子们,眼神欣慰。他喜欢这种氛围,严谨但不死板,竞争却又合作。

曹鹏尤其让他惊喜,不仅天赋惊人,更难得的是懂得如何将锋芒包裹在谦逊之下,在扞卫自己观点时不伤及同僚自尊,在吸收他人意见时不忘真诚致谢。

会议在十一点半结束。曹鹏被围住,回答关于代码实现的问题。他耐心解释,答应晚点把优化后的卷积核计算代码分享给大家。

出门时,维杰走到他身边,拍拍他肩,“今天又被你碾压了,曹。不过那个字典初始化的问题,我昨晚其实有点想法……”

“一起吃午饭?我想听听。”曹鹏自然而然地接话,仿佛刚才的激烈交锋从未发生。

两人并肩走向食堂。

窗外,匹兹堡的天空湛蓝如洗,几朵白云停在卡内基梅隆大学红色屋顶的上空,像在等待什么。

曹鹏想着下午要跑的对比实验,脑中已开始规划代码结构。但此刻,他更愿意听维杰说话。谁知道呢?也许“有点想法”,能点亮下一盏灯。

走在橡树掩映的小径上,他忽然想起昨夜笔记本边缘写下的一句自语,“算法如棋,妙手偶得,但妙手之前,是十年厚积。”

他笑了笑,推开了食堂的门。冷气混合着意面酱的香气扑面而来,而他的思绪,已飘向下午将要书写的、那些无人见过的代码行。

只不过,当看到一个人高马大,正嘬着一杯可乐,迎面的朝自己走来的圆寸脑袋的时候,那笑容忽然变得激动起来。

“哥,你什么时候来的?”