用python自制深度学习框架
🔢

用python自制深度学习框架

Categories
Frame
Text
使用python来制作一个深度学习框架,能够支持CNN、RNN等基础网络的训练。
Date
Apr 23, 2024

机器学习框架的目标

  • 支持使用者设计不同的神经网络
  • 自动微分
  • 数据管理与处理
  • 模型训练和部署
  • 硬件加速器(比如可以使用GPU训练或MindSpore可以使用昇腾芯片训练)
  • 分布式执行

机器学习框架的实际意义

机器学习需要充分发挥设备的算力,这需要使用C或C++这样的编程语言,但往往机器学习用户只会Python或Rust这样的高抽象层次的编程语言,机器学习框架做的就是这样一件事:让使用者使用python等高层次语言即可尽量达到C或C++的性能。
要想实现以上作用,就需要能够将底层的C和C++函数自动生成相应的Python函数。使用Pybind可以实现

机器学习框架的演进

现在还有另一种高层次的库,就是像Modelscope这样的直接封装tensorflow和pytorch机器学习框架的库,可以运行在不同的机器学习框架之上。
Mindspore则支持华为研发的Ascend作为华为后端芯片。
同时,越来越大的模型规模让分布式成了机器学习框架的核心需求。

未来机器学习框架的研究方向

  • 如何更好地实现高阶导数的编程表达,实现高阶优化器
  • 如何自动模型并行

机器学习框架的编程范式:函数式编程

首先要声明一点,虽然函数式编程在科学计算、分布式方面有着独特的优势,但在实际应用中没有能够成为主流开发范式。纯函数式会让学习曲线陡增,易用性变差。
 

框架的基础:FunctionVariable

Function

Function是一个抽象类,体现不同函数之间差异的是两个抽象方法,forward()backward(已有梯度)方法,forward方法实现了节点的正向传播;backward则是计算需要传递给前层的梯度。

代码

class Function: def __call__(self, input): x = input.data y = self.forward(x) output = Variable(as_array(y)) output.set_creator(self) self.input = input self.output = output return output def forward(self, x): raise NotImplementedError() def backward(self, gy): raise NotImplementedError() class Square(Function): def forward(self, x): y = x ** 2 return y def backward(self, gy): x = self.input.data gx = 2 * x * gy return gx

Variable

代码

class Variable: def __init__(self, data): if data is not None: if not isinstance(data, np.ndarray): raise TypeError('{} is not supported'.format(type(data))) self.data = data self.grad = None self.creator = None def set_creator(self, func): self.creator = func # 函数是变量的创建者 def backward(self): if self.grad is None: self.grad = np.ones_like(self.data) funcs = [self.creator] # 使用循环来实现反向传播 while funcs: f = funcs.pop() x, y = f.input, f.output x.grad = f.backward(y.grad) if x.creator is not None: funcs.append(x.creator)
为什么使用循环而不用递归来实现反向传播?一般来说,循环占用内存小,不过也有方法能让递归以循环的方式执行。