深度学习—00入门 神经网络 pytorch 损失函数 梯度下降

1、深度学习简介

       深度学习是机器学习的一个分支,简单来说就是通过人工神经网络,强行在业务的 输入输出 之间,暴力耦合一个出一个数学模型。

1.1 深度学习特点

1、由于是暴力耦合出来的模型,自然模型可解释性很差,如果模型要准确,就需要非常大量的数据进行训练。

      因此,如果客户说,我们的数据比较少,那就不能用深度学习来做,选择更符合客户业务场景的传统机器学习算法来做(比如 支持向量机,随机森林,卡尔曼滤波,等等)

2、简捷,应用场景多,只要数据量到位了,啥都可以用深度学习来做,效果也非常好。比起去学一堆其他机器学习算法,舒服多了。

1.2 深度学习框架

我的博客 主要介绍Pytorch

2、神经网络 和 神经元

 2.1 神经网络  

     第一节已经介绍了,深度学习就是通过人工神经网络,强行在业务的 输入输出 之间,暴力耦合一个出一个数学模型。

       神经网络就是 一系列 线性 和 非线性 的函数,一般线性函数放在前面,即y=wx+b ;非线性函数(就是什么Sigmoid,tanh,Rule等等)根据业务场景不同(是做分类? 还是做  回归拟合?),放在最后。

        神经网络就是不停的在数据 正向,反向 传播过程中,去修改线性方程的 权重系数,直到损失最低。简单说,就是不停调整 w,b。解出最优的w和b,模型就训练完成了,即可以用来预测或者分类了。

 值得注意的是:“深度学习” 的神经网络,比传统“机器学习”的神经网络,更长,更深

 2.2 神经元

      神经网络里面的每个节点,都是神经元。最终成型的暴力数学模型,就是所有神经元共同作用的结果。简单来说,每个神经元,就是一个  z=wx+b,几百万的 z=wx+b 就能暴力出想要的输出啦。

3.激活函数

      激活函数在神经网络的最后一层,直接决定系统输出一个值(做预测),还是多个值(做分类)。用户需要根据业务场景来选择使用什么激活函数。你是要做分类问题,二分类?多分类? 还是做拟合回归?

常见激活函数如下:

 具体该用什么,在业务场景下多做实验.

4. Pytorch

深度学习框架非常多,我的博客采用比较流行的Pytorch深度学习框架

4.1 Pytorch安装

安装方法:直接通过百度去 Pytorch 官网 Start Locally | PyTorch

安装前置条件:

(1)装好了 python3.x

(2)装好了 Conda(这个类似java的Maven,能够快速帮你装好需要的第三方库以及库要正确运行需要配套的依赖)

详细步骤:

(1)进入官网,选择好环境

 复制 安装命令 conda install pytorch....... nvidia

备注:CUDA指GPU上运行,现在也没得哪个电脑用cpu去玩AI吧

(2)进入Anaconda Prompt

 

 复制安装命令 进小黑窗   回车,等待,即可安装完成

4.2 Pytorch—张量

      Pytorch作为一个通用深度学习框架,自然必须 有一定的通用性。Pytorch定义张量,来作为神经网络的输入。由于Pytorch定义好了张量的各种运算(加、减、乘、除,开方,微积分,求导等等),所有运算都是张量的运算,所以一切输入,都要先转化为张量。

备注:初学者比较喜欢纠结啥是张量,看一堆文献,越看越晕。不用纠结这些,任何输入皆是张量,张量可以是一个数,可以是一组数,可以是一个矩阵,可以是高维向量。

#直接创建张量
import torch

t1 = torch.Tensor([1,2,3])

#将numpy转换为张量
import torch
import numpy as np

array1 = np.arrange(12).reshape(3,4)

torch.Tensor(array1)

5. 神经网络的传播

      还没开始进行训练时,Pytorch提供了一个初始通用模型,所有最终模型,都是这个初始模型经过不同方向的训练,训练出来的。通过神经网络,每次对这个初始模型优化一点点。

      神经网络每完成一次 正向/反向 传播后(即完成一次训练),就离最终目标的数学模型更进一步。几十万次 正向/反向 传播后(几十万次训练),模型就暴力做出来了。当然,我们的目标是训练次数尽可能少,这样也少占计算资源。

初始通用模型,就是很多个 y= wx + b,神经网络,来回传播一次,就更新一次各个神经元的 w 和 b

5.1 损失函数

     在最终目标的数学模型被暴力做出来之前,预测结果都是不准的,神经网络每完成一次往返传播,模型精度会提高那么一点点。我怎么知道每次训练后,模型精度提高了那么一点点,就是因为损失函数输出值越来越小,直到损失小来可接受了。模型也就训练完成了。

     损失函数L = 初始(过程)模型的预测值 - 真实值

备注:刚开始,初始模型的预测值是非常不准的,误差非常大。经过1、2、..1万次训练后,模型越来越准,和真实值的差,越来越小。

5.2 梯度

     看这个教程的,都修过高数吧。那就都还记得求导数,如果只有一元函数求导,比如对f(x)求导, 一元函数定义域在直线上,x可以从左边趋近x0,也可以从右边趋近x0,两边趋近的速度是不一样的。

    同理,如果是二元函数,对f(x,y)求导,二元函数定义域在平面上了,x,y可以从平面的360度方向来趋近x0,y0 ,趋近速度最快的方向,就是梯度

     更高维度的函数类似。

 

前面讲了,每次神经网络传播的目标是让模型更准一点,即更新一次w和b,从梯度的角度去更新,效率更高。

 ▽L(w)和▽L(b)分别表示损失函数L对w和b的梯度

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>