[Pytorch] 学习记录(一)

下了好久的决心要学习Pytorch但一直没有真正投入到学习中,后来决定在CSDN上记录自己的学习历程,本文将在python的基础上开始学习ML,希望能帮到大家。

资料来源:【莫烦Python】PyTorch 神经网络


(一)初步了解梯度下降

梯度,就是求导,在高数中学习的求导求微分都属于”梯度“。例如在神经网络中经常用cost函数来计算预测的值与实际值有多大差别,假设cost=(W-0)^2,则可画出如下图的曲线。

图1 梯度演示图

上图中蓝色的线为斜率,蓝点处为起始。我们要找寻一个cost的最低点,则需要沿着蓝线梯度下降,直至(0, 0)点蓝线躺平为止。 但这仅是在普通数学中的梯度,神经网络中的梯度要更复杂。

由于神经网络中通常不止有一个W,而是像这样 \begin{vmatrix} W_{00} & ... &W_{0j} \\ ...& & ...\\ W_{i0}& ... & W_{ij} \end{vmatrix} 有多个W,这种情况下就很难通过画图象的方式直观的理解。在图1中我们可以很轻松的在蓝线躺平的地方找的最小的cost,但很多情况像图2中这样,并不只有一个最小值,不同的W初始化位置也会带来不同的下降区域

图2 多个最小值

显然,图2中全局最优解的位置在原点处,其余的解都是局部最优解。但很多情况下我们很难精确的找到全局最优解,不过多数情况下优秀的局部最优解已经可以符合需求了。


(二)Variable变量

torch中神经网络的参数都是以variable变量的形式,它封装了Tensor,并整合了反向传播的相关实现。通常来讲与tensor没有太大差别,仅在反向传播上有所区别。

反向传播,即为误差的反馈,通俗解释:

        3*6=18

        3*6=1,(错了,等于18;)误差17

        3*6=10,(错了,等于18;)误差8

        3*6=15,(错了,等于18;)误差3……

x = Variable(tensor, requires_grad = True)

Varibale包含三个属性:

  1. data:存储了Tensor,是本体的数据
  2. grad:保存了data的梯度,本事是个Variable而非Tensor,与data形状一致
  3. grad_fn:指向Function对象,用于反向传播的梯度计算之用

既然前面提到了求导,在Pytorch中必然要有求导的方法。backward()方法是求导用的,在哪个变量后面就是对哪个求导 。比如:

v_out.backward()     #对 v_out 求导

(三)激活函数

激活函数的用处:解决不能用线性方程概括的问题。这里假设一个式子y=Wx,其中W是需要的参数,y是预测值,x是输入值。如果我们仅仅要绘制一条过原点的直线,W取个常数就行了。但!是,如果我们想绘制一条曲线,就很难通过初级方法来给定W的值,此时激活函数就要派上用场了。

图3 常见激活函数

新给定一个式子y=AF(Wx),其中AF即为激活函数,他一上场就能把直的Wx给掰弯。比方说我们选取relu,若Wx求出来是1则y为1,若Wx=-1则y就是0了。如果有更高层次的需求,也可以自己写激活函数,但注意一定要写一个可微分的函数!

在激活函数的选择上也是有窍门的,如果隐藏层比较少那选择的空间就很大(relu、tanh等);如果隐藏层很复杂则需要谨慎选择激活函数,否则可能会面临梯度爆炸、梯度消失等问题。

#下面是激活函数的简单使用

import torch.nn.functional as F        #引入包

y_relu = F.relu(x).data.numpy()        #采用 relu 这一激活函数
y_sigmoid= F.sigmoid(x).data.numpy()   #采用 sigmoid 这一激活函数

以上就是本篇的所有内容。下一章将进行激活函数的实际应用——回归、分类问题。

猜你喜欢

转载自blog.csdn.net/m0_55080712/article/details/122824122