NLP实战高手课学习笔记(5):深度学习框架简介

265 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情

说明

本系列博客将记录自己学习的课程:NLP实战高手课,链接为:time.geekbang.org/course/intr… 本篇为09节的课程笔记,主要介绍如何选取深度学习框架的内容。

深度学习框架包括什么

首先,我们需要需要明确一个成熟的深度学习框架需要具备哪些特性。我们都知道,深度学习对张量(Tensor)进行计算操作,所以张量计算是所有深度学习框架最最基础的功能;其次,框架应该能够帮助开发者进行快速开发,需要具有成熟的训练和推断体系;最后,当一个模型的计算过程被定义完成后,如果框架可以自动对梯度进行求解,将可以大大减轻开发者的工作量。

image.png

选择深度学习框架的准则

那么,我们该如何选择深度学习的框架呢?这里给出了几个主要的考虑点:

  • 生态圈:用户社群是否广泛和活跃,这样能够及时的解决问题;
  • 易用性:代码开发流程是否便于使用;
  • 功能是否完整:能否支持绝大多数的模型开发;
  • API 是否稳定:API尽量不要频繁变更,最大限度的保证代码的重用性;
  • 效率:运行效率如何。

目前而言,主流的深度学习框架主要有两个:

  • TensorFlow
  • Pytorch

他们的优缺点如下图所示:

image.png

image.png

整体对比而言,TensorFlow由于是静态图框架,运气的效率会更高,但是由于其复杂的代码逻辑和频繁的API变更,导致其不那么容易上手;Pytorch是目前学术界最广泛使用的深度学习框架,它支持动态图网络的开发,比较灵活,而且API稳定,易于新手快速上手。

以下为Pytorch官方网站上的一个示例:

# -*- coding: utf-8 -*-
import torch
import math

x = torch.linspace(-math.pi, math.pi, 2000)
y = torch.sin(x)

p = torch.tensor([1, 2, 3])
xx = x.unsqueeze(-1).pow(p)

model = torch.nn.Sequential(
    torch.nn.Linear(3, 1),
    torch.nn.Flatten(0, 1)
)

loss_fn = torch.nn.MSELoss(reduction='sum')

learning_rate = 1e-6
for t in range(2000):

    y_pred = model(xx)

    loss = loss_fn(y_pred, y)
    if t % 100 == 99:
        print(t, loss.item())

    model.zero_grad()

    loss.backward()

    with torch.no_grad():
        for param in model.parameters():
            param -= learning_rate * param.grad

linear_layer = model[0]

print(f'Result: y = {linear_layer.bias.item()} + {linear_layer.weight[:, 0].item()} x + {linear_layer.weight[:, 1].item()} x^2 + {linear_layer.weight[:, 2].item()} x^3')

可以看到,其流程开发非常方便简洁。

实际上,各种框架之间不存在绝对的好坏之分,TensorFlow由于是谷歌开发的框架,因而对谷歌云、TPU等的支持更好一些,而Pytorch作为后起之秀,目前也支持TPU的部署开发。

总结

本文介绍了深度学习框架的基本要求、选取标准和目前主流的两个深度学习框架TensorFlow和Pytorch的优缺点分析对比,希望对您有所帮助。