我需要的灵活的神经网络框架支持什么功能
Created by: lcy-seso
@Superjom 建议写一些我作为用户,对神经网络框架会有什么样的功能需求。这里是简单写一些,不涉及具体的设计,仅抛砖引玉。
神经网络就像搭积木,当现有积木不能满足实现新的 idea 时,就需要自己来造积木,或者用旧积木拼新积木。开发新的模型,通常无外乎三件事情:写新的layer / op,写新的损失函数,动态连接网络。
-
写新的 layer / op
- 像写公式一样写前向反向,这一点我相信可以通过支持细粒度的 OP 来实现,以及通过将操作 Tensor 的各种运行也直接暴露给用户。
-
写新的损失函数
- 损失函数是学习任务的核心,深度学习的出现让花在“特征工程”上的时间,转向了“cost工程”。
- 除了学习任务的常见损失函数,实际上用户会定制各种千奇百怪的损失函数,即使是细粒度的 OP 也无法解决,这时需要对 Tensor直接操作。
- 把前向/反向怎么算扔给用户在(Paddle的)外部实现。前向/反向本质上只要返回 tensor,前向返回最终计算结果,反向返回对参数的导数,对输入的导数。
- 对 Tensor 直接操作的结果能够再次还给框架,继续参于网络其它部分的BP过程。
-
动态构建网络结构需要两种逻辑控制 :循环和条件
- 神经网络的构建类似于程序语言的三种执行逻辑:
- 顺序结构
- 只要依次 forward-backward 网络中的每一个计算单元(layer 或者 细粒度的operator),也就是静态图。
- 条件结构
- 需要支持逻辑运算operator,来判断条件是否成立,可能会包括:(1)与、或、非、异或;(2)判等、比大小
- 循环结构
- 循环结构三要素:循环变量、循环体和循环终止条件,只有循环终止条件是需要考虑和设计的,也同样是条件结构需要解决的问题。
- 顺序结构
- 神经网络的构建类似于程序语言的三种执行逻辑:
- 我个人认为,pytorch 的极端动态性是和python是一种动态语言绑定在一起
- 我见过的最大的一部分动态网络,用户是在向框架描述如何根据(1)输入数据;(2)前层计算结果来连接一些预定义子模型的连接策略,也就是需要:“条件”和“循环”两种操作。
- 我个人觉得“以静换动”已经可以满足很大一部分需要,因为连接策略始终是静态的,只有输入数据和运算结果是动态的,不必在一开始便追求极致地动态性。
- 灵活的输入数据操作 operator (这个基于 Tensor 其实比较简单)
- 当网络具有一定的动态性时,也会需要一些相应的数据处理:对 tensor 的选择行/列、裁剪、拼接,重组为神经网络中下一个op 需要的输入数据。
简单地总结一下,我需要框架能够非常方便(留给我处理的越少越好)实现两个大的功能:
- 直接操作 tensor (像numpy和matlab的矩阵操作):获取网络任一层的计算结果和梯度。
- 循环和条件 operator (含逻辑判断operator)