Bye Torch

Torch停止更新已经是几月之前的事情了。这两天仍旧还在改进一些历史遗留的Torch代码。在修了好几个bug之后的感觉torch确实有太多的问题了。鉴于我研究生阶段的大部分deep learning代码都是用torch写的,我觉得我还是有足够的发言权,今天来黑一黑torch的。

顶层设计

Torch主要的问题其实来源于库之间的不一致,这一点上,略微缺乏远见的顶层设计起到了推波助澜的恶作用。

nn.Module

我们从位于模块最顶层的 nn.Module 说起。这个类可以认为是所有层需要遵循的接口,主要需要实现的是以下几个函数

weight和gradWeight

torch官方库中,通常把参数都放在weight和bias两个变量中,而将对应的梯度存放在gradWeight和gradBias中。随意在很多代码中我们可以看到layer:clone(‘weight’,’bias’,’gradWeight’,’gradBias’)来实现共享参数。然而,这样的设计并没有得到贯彻。在一些不使用weight存放参数的库中,使用上面的方法共享参数就会造成无法训练的问题。而这样的问题并不会在执行中产生异常,所以经常让初学者轻易以为自己的想法不work。

缺少broadcast

lua

lua是一个相当优秀的语言,但是将它用于深度学习,还是造成了很多困难。很多lua的语言特性比如: