心法利器
本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。
2022年新一版的文章合集已经发布,累计已经60w字了,获取方式看这里:CS的陋室60w字原创算法经验分享-2022版。
往期回顾
前言
最近复盘了一些项目的技术迭代过程,发现一些技术选择和长期规划的思路,因此写了这篇文章。感觉会比较流水账,大家可以在看的过程中详细,
前期的技术选择
一般情况,前期是属于没有数据、没有机器资源、性能要求还不低的阶段,相比于模型,规则或者词典就可能是更加优先的方案。
模型之所以并不可用,尤其是比较专的垂直领域,我们往往缺少足够的数据来支持模型的训练,而预训练模型又专注开放域,落地仍旧依赖一定数据来做fine-tuning,所以在资源匮乏的前期,其实并不好直接使用模型。
当然,严谨的,前期不建议使用模型,并不是因为前期本身,而是因为背后资源的缺乏,如果已经能够找到足够的数据,足够的资源能够支撑,别说是经典的小模型,还是直接上预训练模型,其实都是可以的。当然,更加严谨地,虽然我们可以直接尝试通过模型得以构造完整可靠的算法体系,但是建议仍旧不能抛弃词典等方案的做法,毕竟他们拥有很强的可定性和可知性,有些结果只要配置了设计了就一定能出,但是模型可能无法调整,也不具有很高的可控性,所以如果是完整的系统,仍旧建议两条腿都要走的起来。
中期的迭代和升级
前面说到,在项目早期资源匮乏的情况下,规则和词典是主流,然而随着项目逐渐迭代,上模型肯定就是一个比较迫切的事,毕竟模型的泛化能力很高,计算上灵活性会很好,这点应该是众所周知的。那么,什么时候该开始把上模型写上日程,模型从无到有的时机是什么,继续总结下。
回到原本的问题根源,之所以一开始不上模型,就是因为资源的不足,尤其是数据,然而,在规则和词典的支持下,其实一个baseline模型能够搭建起来。
通过规则和词典,其实已经能预测出一系列结果,如果这个结果的准确率足够高,那对模型的训练而言,就是可用的。例如对于NER任务,基于词典的最大逆向匹配就已经可以构造出一批NER样本,这批样本的准确率往往很高(我自己的经验看能轻松到达90%以上)。
在线使用的过程中,部分场景会有用户的行为,在假设用户行为是可靠的前提下,数据就可用了,推荐系统和搜索系统中大量使用了这个思路。
有了数据的支持,其实模型就可以很快得到训练,在经过一定的调优,模型的效果会达标,逐步覆盖甚至超越规则方案,此时就能够上线了。
当然了,这里还需要考虑一个问题,就是有没有必要。如果,规则和词典就已经能覆盖在线用户几乎所有的问题,那上模型的意义其实就很小了,所以这个是需要评估,而这个要看出来,就需要拉在线的数据下来进行分析,也就是我常说的case分析, 如果发现很多同义词的确实,说法的缺失,这种规则词典难以解决的问题,那就需要通过模型和相应配套的数据增强策略来解决,这就是所谓上模型的必要性。
上线,自然要考虑服务的包裹上线以及在线的服务维护,这点不能忘记,简单的模型,其实可以部署在原有的服务里,不需要单独维护别的服务了。当然,如果不怕麻烦,或者是需要GPU了,那就可以把模型独立出来单独部署,这个是需要根据设备依赖、服务依赖来权衡选择的。
模型升级迭代的节奏
同样考虑到资源问题,尤其是NLP领域,大模型的上线往往不是一蹴而就的,大模型的训练成本高,在线的部署成本也高,除非是非常前沿的实验,或者已经有成熟的落地方案,否则直接上大模型可以说是非常困难的,我的建议是这些因素不具备的话,不要轻易一步到位,而使用经典的方案先构造baseline并上线,后续再找机会上预训练模型,例如分类模型常用的fasttext、textcnn,NER任务的bilstm-crf,语义相似度模型的ESIM等。
先重点聊聊baseline和预训练模型的关系。我们总能很轻易地看到,预训练模型吊打各种经典的小模型,这个增幅可以说是非常大的,甚至是质变的,这点总让我们垂涎,但实际场景可能并不如实验室所用的开放域数据有关,我们的样本可能有错,可能覆盖情况不足等,这些问题都会至于无论是小模型还是大模型的上限,上线一旦限制,两者的差异可能就没有的那么大了,收益被大大稀释,既然如此,上预训练模型的意义何在?所以,我们可以借助小模型,让我们逐步了解数据,清洗和升级数据,等到逐步触碰到天花板了,再来考虑升级到预训练模型。
所以,常规的模型升级迭代节奏是,先搭建baseline模型上线,后续跟随数据、特征、训练策略的优化进行迭代,等逐步触碰到天花板的时候,再来考虑上更大的模型甚至是预训练模型。这个节奏的优势是,收益提升稳定,风险也可控,如果直接上预训练模型,会出现问题定位困难,数据特征短板无法发现,提升不稳定且风险高的问题。
升级模型的时机
那么,基线模型升级到预训练模型的时机是什么,什么时候该升级,这点值得说道说道。我总结的点如下:
数据增强等的一些数据调整,已经对模型总体的准招影响很小,case分析层面会发现这些数据策略会导致顾此失彼的情况。
剩下的bad case大都会依赖一些知识背景,尤其是通用的知识背景,如果没这些数据或者知识,就会有些过拟合,如一些客服类的问题,很可能会把法律问题归为正类,因为正样本很容易出这两个字,而负样本就没有。
训练的loss下降或训练acc提升困难。
详细解释下。首先,第一第二点其实挺好理解,其实就是为预训练模型扫清障碍,让模型更关注于模型自己的能力问题,不用考虑外部数据、特征的问题了。而第三点,是有我的一些理解吧,在数据质量足够的情况下,模型理论上是能够倾其全力去拟合训练集的,但是训练阶段却做不了,这个很大程度就和模型的拟合能力有关了,更多是欠拟合,例如二维平面上一条直线无法把空间切成三块一样,此时就是到了模型本身的上限了,只有进一步升级模型,才能够更好地解决这个问题。