DNNClassifier与DNNLinearCombinedClassifier对比:去浅层路径后是否等同?
其实答案是不完全相同——哪怕你把DNNLinearCombinedClassifier的线性浅层路径彻底禁用,它和DNNClassifier之间还是存在不少细微但值得留意的差异:
构造参数的默认配置有区别
两个类的初始化参数默认值不一样,比如DNNLinearCombinedClassifier的dnn_optimizer默认是AdagradOptimizer,而DNNClassifier的optimizer默认也是Adagrad,但具体的参数初始化逻辑有细微差别;另外在特征列的处理上,DNNLinearCombinedClassifier原本是为双路径设计的,哪怕禁用线性部分,内部对DNN特征列的预处理逻辑还是保留了双路径框架的痕迹,和DNNClassifier的单路径特征处理逻辑不完全一致。底层实现的架构残留
DNNLinearCombinedClassifier的核心代码是围绕“线性+DNN”的双路径架构写的,就算你关掉线性路径,它内部还是会保留一些为双路径准备的判断逻辑、损失计算流程。比如计算损失时,它会先检查线性路径是否启用,再处理DNN部分的损失;而DNNClassifier是直接针对单DNN路径计算损失,两者的执行流程不一样,虽然最终损失值可能相近,但底层的处理逻辑有区别。后续扩展与配置灵活性不同
如果你之后想重新启用线性路径,DNNLinearCombinedClassifier只要修改参数就能快速切换,但DNNClassifier本身不支持扩展线性路径;另外在正则化配置上,DNNLinearCombinedClassifier是分别给线性部分和DNN部分设置正则化的,哪怕禁用线性部分,正则化的处理逻辑还是基于双路径框架,和DNNClassifier的全局正则化设置逻辑有差异。
当然,要是你手动把两个模型的所有关键参数(比如优化器、隐藏层单元数、正则化系数、特征列等)都设置成完全一致,那它们在大多数业务场景下的预测表现会非常接近,但从代码实现和内部逻辑的角度来说,两者并不是完全相同的。
内容的提问来源于stack exchange,提问作者Josiah Yoder

