为什么学习PyTorch?
- 掌握一个框架不能一劳永逸,深度学习框架无绝对的垄断地位。
- TensorFlow及Caffe都是命令式的编程语言,而且是静态的。对于Pytorch通过一种自动反向求导技术,可以任意修改中间的过程。
- Pytorch的设计思路线性、直观且易于使用,新手和学术界比较受欢迎。
PyTorch安装
- Windows推荐使用Anaconda GPU版本自动安装。
- Linux根据显卡驱动版本选择对应版本的Cuda、Cudnn、PyTorch,使用Anaconda GPU版本辅助安装,注意替换国内镜像源。
- 安装完毕后确定环境正常使用。
import torch print(torch.__version__) print('gpu:', torch.cuda.is_available())
基本概念
张量: Pytorch中最基本的操作对象Tensor,表示一个多维的矩阵和numpy对应可以相互转换,在GPU运行。
变量: 变量Variable和Tensor本质没有区别,但是会放进一个计算图中然后进行前向传播,反向传播,自动求导。
简单示例,自动求取梯度:
import torch
from torch import autograd
x = torch.tensor(1.)
a = torch.tensor(1., requires_grad=True)
b = torch.tensor(2., requires_grad=True)
c = torch.tensor(3., requires_grad=True)
print(b.dim())
y = a**2 * x + b * x + c
print('before:', a.grad, b.grad, c.grad)
grads = autograd.grad(y, [a, b, c],retain_graph=True)
print('after :', grads[0], grads[1], grads[2])
y.backward(retain_graph=True)
print(a.grad)
y.backward()
print(a.grad.norm())
证明:沿梯度反方向移动自变量可以减小函数值
泰勒展开:
f ( x + ϵ ) = f ( x ) + ϵ f ′ ( x ) + O ( ϵ 2 ) f(x+\epsilon)=f(x)+\epsilon f^{\prime}(x)+\mathcal{O}\left(\epsilon^{2}\right) f(x+ϵ)=f(x)+ϵf′(x)+O(ϵ2)
代入沿梯度方向的移动量 η f ′ ( x ) \eta f^{\prime}(x) ηf′(x):
f ( x − η f ′ ( x ) ) = f ( x ) − η f ′ 2 ( x ) + O ( η 2 f ′ 2 ( x ) ) f\left(x-\eta f^{\prime}(x)\right)=f(x)-\eta f^{\prime 2}(x)+\mathcal{O}\left(\eta^{2} f^{\prime 2}(x)\right) f(x−ηf′(x))=f(x)−ηf′2(x)+O(η2f′2(x))
f ( x − η f ′ ( x ) ) ≲ f ( x ) f\left(x-\eta f^{\prime}(x)\right) \lesssim f(x) f(x−ηf′(x))≲f(x)
x ← x − η f ′ ( x ) x \leftarrow x-\eta f^{\prime}(x) x←x−ηf′(x)
多维梯度下降:
∇ f ( x ) = [ ∂ f ( x ) ∂ x 1 , ∂ f ( x ) ∂ x 2 , … , ∂ f ( x ) ∂ x d ] ⊤ \nabla f(\mathbf{x})=\left[\frac{\partial f(\mathbf{x})}{\partial x_{1}}, \frac{\partial f(\mathbf{x})}{\partial x_{2}}, \dots, \frac{\partial f(\mathbf{x})}{\partial x_{d}}\right]^{\top} ∇f(x)=[∂x1∂f(x),∂x2∂f(x),…,∂xd∂f(x)]⊤
f ( x + ϵ ) = f ( x ) + ϵ ⊤ ∇ f ( x ) + O