记忆-归纳模型
推荐系统中常见的深度学习模型由Embedding表和神经网络两部分组成,其中Embedding部分起记忆表征作用,神经网络起到分析和归纳作用。实际上,神经网络在的分析能力是很有限的,更多是表现为归纳。而归纳的效果非常依赖表征的丰富程度,故Embedding部分的参数量往往远大于神经网络部分,当神经网络还在10MB量级时,Embedding表可以达到百GB乃至TB量级。
假定使用64位ID及16维参数表示一项Embedding,则全精度尺寸为72B,半精度尺寸为40B。可以推算1TB左右大小的模型大概有130-250亿项Embedding,而每一项Embedding背后是一个离散特征,换言之TB级模型约等于常说到的百亿特征千亿参数模型。推荐模型如此庞大根源就出在这百亿特征上。
哪来的百亿特征
推荐场景中最为庞大的特征组就是User和Item的ID,哪怕对于头部业务而言两者加起来无非也就10亿的量级,靠原始数据要凑出百亿特征几乎不可能。这个时候,就该登场离散特征交叉技术登场了。
分类语义派生
User或Item自身不同属性之间可以交叉派生出更细的分类,这是最为常见的手法。由于实体ID和实体自身属性间的交叉派生是徒劳的,分类语义派生特征虽然最常见,但是一般不会成为百亿特征的直接来源。
交互语义派生
在User和Item的属性之间做交叉派生也是相当常见的,派生出的特征体现了一种交互语义。可以用Item的ID和User的性别、年龄进行三联交叉派生,特征空间能达到Item量级的百倍,有亿级Item的场景光这一项就能产出百亿特征。
组合语义派生
以拳皇对局为例,可以直接将选角排列用作特征,同时将每个选中角色单独作一项特征然后pooling,还可以对选角排序产生获得结果组合并用作特征。组合虽然是原始排列的子集,不过和排列的语义有差异,不能共享特征空间。此类特征三管齐下往往会比单选一种处理要更为有效。
弱语义派生
细心的你大概已经发现了,上述几种特征派生的语义实际上是建立在共现性的基础上的。然而脱离了共现性,还是可以对特征做交叉派生,例如在游戏商城场景用过去一个月用得最多的英雄的ID和待售的皮肤ID进行交叉。这种派生操作虽然很难给出清晰的语义,不过有些时候可能会有意想不到的效果。
大维度Embedding vs 海量Embedding
如果没有百亿特征又想要TB级模型,是不是可以发扬“土法大炼钢”精神,把Embedding维度统统提到100以上呢?形式上当然是可以的,不过这样做恐怕背离了做大模型的初衷。做大模型不是为了验证系统承载能力,而是为了更好记忆业务场景数据。尽管笔者并没有找到大维度Embedding不如海量Embedding的理论依据,不过据观察在当前的条件下细嚼慢咽依然比囫囵吞枣更有效。