深度学习系列(一):pytorch环境搭建和感知机模型

前言

这个系列是有关深度学习的内容,包括一些常见的神经网络模型的训练和实际应用。深度学习(Deep Learning)是机器学习(Machine Learning)的一个子类,特指使用人工神经网络来完成机器学习任务的一种方法。这篇文章首先介绍了深度学习环境的搭建,然后介绍了人工神经网络模型的基础:感知机模型的基本原理。

本人计算机配置好的环境:

  • 计算机系统:Window10,python版本为:3.7.4
  • 开发环境:PyCharm 2019.3.3
  • Pytorch版本:1.4.0
  • CUDA版本:9.2

Anaconda安装和新建环境

Anaconda是一个开源的python包管理工具,其本身就内涵了许多python的科学计算包,而且有了Anaconda之后,计算机里的python包的管理十分方便,不用担心安装不同的包会产生冲突。你计算机可以同时安装Tensorflow和Pytorch环境,且互不干扰。强烈建议使用这个工具!!

Anaconda的安装十分简单,直接去官网下载安装包按照步骤安装即可:https://www.anaconda.com/products/individual选择Windows版本就行了。
这里介绍Anaconda新建环境的方法。对于python而言,计算机中可能要安装很多个包来满足不同的需求,那么怎么保证不同的包之间不发生冲突呢?Anaconda提供了解决方法,就是在计算机中单独的创建不同的python环境,不同的包安装在不同的环境之中。首先打开Anaconda Prompt命令窗口,可以看到前面有个括号(base),说明当前处于的环境是base环境,这个环境是默认都有的,这个环境下预先安装了numpy的一系列的科学计算包。我们可以用以下指令来创建我们自己的一个新的环境:

1
conda create -n env_name python=3.7

其中env_name为你自定义的名称,3.7为想要安装的python版本。这里我使用prlearn为名称创建模式识别的环境。创建成功之后用下面指令来切换环境:

1
conda activate env_name

就可以切换至自己新建的环境了。还可以用以下命令删除某个不需要的环境:

conda remove -n env_name --all

下图为切换至创建好的prlearn环境,并验证python(这里我事先创建好了prlearn环境)。
Anaconda环境创建
实际上,Anaconda新建环境就是多在计算机上新建了一个文件夹,这个文件夹中有自己的python解释器,这在envs文件夹中可以看到:
envs文件夹

Pytorch环境搭建

Pytorch是一个开源的机器学习库,由Facebook基于Torch推出,可以很方便的实现包含自动求导的深度神经网络以及使用GPU加速网络的训练。

Pytorch的安装也十分简单,直接去官网选择相应的版本和CUDA版本(如果计算机没有NVIDIA显卡,可以在CUDA的选项选择None。)https://pytorch.org/
torch下载

然后下面会出现需要运行的指令,直接复制下来在Anaconda新建的环境下安装:
安装pytorch

安装的速度可能会比较慢,建议科学上网,速度会比较快!这里我已经安装过就不再安装,当然自己可以选择更高版本安装。
安装完成之后验证是否Pytorch安装成功以及CUDA是否安装成功:
验证是否安装成功

import成功且cuda可用,就说明环境搭建完成了!!

如果cuda可用返回False可能不是安装失败,可能是显卡的驱动需要更新,我就是这样!

感知机模型

我们首先从生物的神经网络谈起,事实上,人工神经网络也正是模仿生物神经网络而来的。

生物神经网络由神经元经过复杂连接组成,神经元包括四个主要部分:细胞体、树突、轴突和突触,「树突」的作用是用于接受周围其它神经元传入的神经冲动,「轴突」功能是向其它神经元传出神经冲动。每个神经元细胞在树突处接受其它多个神经元的信号,这些信号在细胞体中综合处理,如果该细胞接受到的兴奋信号较多,则被激活,从而向下一个神经元传递出一个脉冲信号。
因此,我们可以根据单个神经元建立感知机模型。
感知机模型

即我们可以将神经元的工作过程看作是将传入的x1x2...xnx_1 x_2 ... x_n等信号进行加权求和之后和阈值θ\theta比较,如果大于阈值则根据一定的规则ff进行输出,这个规则ff也就是激活函数,信号加权求和减去阈值成为净激励。激活函数有多种类型,若其以阶跃函数二值化输出:
激励函数

那么这个模型就是著名的感知机模型,也就是一个非常简单的二分类分类器。将一个样本的各个特征取值x1x2...xnx_1 x_2 ... x_n进行加权求和和偏置项θ\theta相减,很明显这是一个线性分类器,我们可以通过调整各个特征的权系数来调整我们的分类器,事实上感知机就是通过训练来不断调整权系数和阈值,使得模型具有较好的分类效果。接下来我们介绍以下如何训练一个简单的感知机模型。

给定训练集数据,权重ωi\omega_i和阈值θ\theta通过学习得到,阈值θ\theta可以看作是一个固定输入1-1对应的权重ωi+1\omega_{i+1},也就是说可以统一为权重的学习。

机器学习中常用的一种学习方法就是梯度下降的方法。什么是梯度下降呢?首先我们要设置一个损失函数LL,也就是我们的优化目标,我们总是希望这个损失函数取到最小值,即达到最好的优化结果。当然优化的过程就是调整待优化的参数ω\omega,梯度下降就是根据损失函数LLω\omega的梯度方向来调整ω\omega,也就是说往损失函数下降最快的方向来修正我们的优化参数。

以感知机模型为例,最简单的我们设置损失函数为:L=(yy^)L=(y-\hat y),即期望的输出值和当前的输出值之差,感知机权重按照下面式子调整:

ωiωi+Δωi\omega_i \gets \omega_i + \Delta \omega_i

其中:

Δωi=η(yy^)xi\Delta \omega_i = \eta (y-\hat y)x_i

式中η\eta为学习率,即调整步长;xix_i为损失函数LLωi\omega_i的梯度。这样我们根据感知机的目标输出和当前输出的差值来一步步的调整权重,最终能够收敛到比较好的结果。

需要注意的是:感知机是一个线性分类器,它解决不了非线性分类的问题,例如它无法解决异或问题。要想办法解决非线性可分问题,必须考虑多层的神经元,即神经网络。
神经网络
关于神经网络的结构和工作原理,下篇介绍。

总结

本篇主要介绍了Anaconda环境的搭建、Pytorch的安装以及神经网络的基础:感知机模型。下篇将介绍全连接神经网络,以及训练方法:反向传播算法。

参考资料

  1. 中国大学MOOC《人工智能之模式识别》北京理工大学的课件
  2. 周志华《机器学习》