神经网络与深度学习课程总结(一)

0 前言

在此之前,我从未接触过关于“神经网络和深度学习”实现方面的内容,所以写一个前言简单介绍一下

0.1 代码框架

  • mxnet
  • pytorch
  • tensorflow
  • paddle

以前听人提起神经网络时,他们总是会附带着聊到这些名词,在接触到之后才知道,这些实际上就是搭建神经网络用的框架,当然也可以单纯地认为是函数库(刚学一周不知道理解得对不对)
pytorch为例,里面就定义了很多关于张量的计算(至于什么是张量:一维张量叫向量,二维张量叫矩阵),有各种线性非线性网络的API。

0.2 名词解释

有关于学习的名词实在是太多了,什么“神经网络”、“机器学习”、“深度学习”、“强化学习”、“卷积神经网络”、“监督学习”等等等,这里做一个名词解释和分类(刚学一周,有些名词还是不懂,有些则是懵懵懂懂):

  • 神经网络:似乎是指一种模型,一种框架,一种模式,但凡使用下图这种模式的算法,都可以叫做神经网络,在最基本的单层神经网络的基础上,发展出了很多变体,如:卷积神经网络,循环神经网络等等。神经网络由许多神经元组成,每个神经元都是一个节点,这个节点(其实就是一个函数)包含若干个输入和若干个输出

  • 机器学习:就是各种学习算法的统称,所谓深度学习就是一种具体的机器学习算法,而这些算法的核心思想就是神经网络

  • 学习过程:众所周知,机器学习算法工作模式可粗略分为两种,训练(根据数据集优化算法中的参数)和预测(利用优化好的参数,根据输入得到输出),其中预测过程很简单,就是我们用户和人工智能之间的交互的过程。但是训练过程就比较复杂,大致可以分为以下:

    • 监督学习:给定数据集,其中数据集中包含“特征”(输入)和“标签”(输出),如分类问题和回归问题
    • 无监督学习:给定数据集,其中数据集中包含“特征”,通常不包含“标签”,如聚类问题
    • 强化学习:似乎没有常规意义下的数据集,它需要模拟模型与环境进行交互,根据模型作出的动作进行评分,从而调整模型中的参数,如决策问题
    • 应该还有很多种过程,暂时没接触到,而在这些之下,又有离线学习和在线学习(顾名思义,离线学习就是把训练过程和预测过程分开进行,在线则相反)

0.3 基于神经网络的机器学习算法的整体思路

把要解决的问题建模成一个优化问题,然后求解。好像很多问题都是这种思路,区别在于,各自的目标函数和约束条件不一致导致选择的优化算法各有不同。

  • 在机器人路径规划方面,目标函数和约束是有轨迹、环境和机器人动力学等等构成的,目标是轨迹平滑,安全可行;
  • 在SLAM方面,目标函数和约束是由传感器和环境等等构成的,目标是各种估计的协方差尽可能小;
  • 而对于机器学习算法,它的目标函数似乎并没有什么物理意义(正因如此才使它适用于各行各业),至于约束条件,似乎没有约束条件,就算有(防止梯度爆炸,而限制参数不能过大),也是看不出什么物理意义

所以,机器学习算法的思路就很明晰了,按优化问题走就可以:

  1. 建模:不管什么问题,都建模成神经网络模型,这种模型满足以下的特点:

    • 单神经元模型:就是一个函数,有若干个输入和若干个输出
    • 整体模型由各个神经元输入输出连接在一起
    • 顶层神经元的输出就是模型的输出,底层神经元的输入就是模型的输入(参考上面那个图)
    • 可以灵活选择节点函数,典型的函数是 σ ( W X ) \sigma(WX) σ(WX),其中 σ ( x ) \sigma(x) σ(x)是激活函数, W W W是模型参数, X X X是输入的特征
  2. 优化变量:模型参数就是优化变量,每一个节点都有一个参数张量,节点越多,参数张量越多,优化变量维度就越大

  3. 目标函数:每个研究领域都有属于该领域的专业术语,路径规划问题中,目标函数叫cost function, 学习领域中,目标函数一般称为loss function

    • 对于监督学习,预测值(就是模型输出值) y ^ \hat{y} y^和标签值 y y y之间的距离常作为目标函数的一部分(最小化距离)
    • 对于强化学习,显然评分可以成为目标函数的一部分(最大化评分),但强化学习这种模式,输入是环境,输出是决策,例如马尔科夫决策问题,这就跟传统优化问题不太一样了(我愿称其为广义的优化问题,其优化算法就是模拟对局)
  4. 优化算法: 在学习领域最典型的优化算法是随机梯度下降法(跟普通的梯度下降不太一样,首先是随机,其次是对同一套参数有多个梯度,需要做梯度加权)

1 线性回归

以预测房价为例,根据房屋面积和房屋年限预测房价,此类问题被称为线性回归问题,求解该问题的步骤如下:

1.1 建模

单层神经网络便足够了,如下:

其中输入层不涉及计算,输出层节点的函数为:

y = h θ ( x ) = θ 1 ⋅ x a r e a + θ 2 ⋅ x a g e + θ 0 y =h_{\theta}(x)= \theta_1 \cdot x_{area} + \theta_2 \cdot x_{age} + \theta_0 y=hθ(x)=θ1xarea+θ2xage+θ0

1.2 优化变量

优化变量为 θ = [ θ 0 , θ 1 , θ 2 ] T \theta = [\theta_0, \theta_1, \theta_2]^T θ=[θ0,θ1,θ2]T, 训练数据集的特征为 x = [ 1 , x a r e a , x a g e ] T x = [1, x_{area}, x_{age}]^T x=[1,xarea,xage]T, 训练数据集的标签为 y = y p r i c e y = y_{price} y=yprice

1.3 目标函数

目标函数为:

J ( θ ) = 1 2 ∑ i = 1 m ( y ( i ) − h θ ( x ( i ) ) ) 2 J(\theta) = \frac{1}{2}\sum_{i=1}^{m}(y^{(i)}-h_{\theta}(x^{(i)}))^2 J(θ)=21i=1m(y(i)hθ(x(i)))2

1.4 优化算法

随机梯度下降法:

θ k + 1 = θ k + η m ∑ i = 1 m ∇ J \theta_{k+1} = \theta_{k} + \frac{\eta}{m}\sum_{i=1}^{m}\nabla J θk+1=θk+mηi=1mJ

也可以直接求解析解

θ = ( X T X ) − 1 X T ⋅ y \theta = (X^TX)^{-1}X^T \cdot y θ=(XTX)1XTy

2 线性二分类

以好苹果分类为例,该类问题的输入为苹果的直径和外观评价,输出为是否为好苹果.这类问题与回归问题最大的区别在于分类问题的输出是有限的类别,在此做如下处理:

  1. 构造这个二分类的分界直线

  2. 一边是负值,一边是正值。越属于这类,值越大(正),反之越小(越负)

  3. 将输出变换到0~1之间,用概率表示类别,考虑使用sigmoid函数

此时,该二分类问题与回归问题除了输出层函数不同之外,其他步骤都一致,其中sigmoid常被成为激活函数

3 BP算法

在面对实际问题时,以上设计的单层神经网络模型往往难以精确描述问题,容易出现欠拟合现象.为应对这种现象,常常在输入与输出层之间加入几层隐藏层,在隐藏层和激活函数(是的,激活函数必不可少,要不然模型始终是线性的)的作用下,多层神经网络便能够拟合我们遇到的大部分问题,在这种情况下,应用随机梯度下降法进行优化过程中,梯度的计算就比较复杂,在实际应用中,一般使用反向传播法(backpropagation),实际就是链导法则,只不过是由输出到输入去计算并相乘.
在推导BP算法之前,有必要再引入几个名词:

  • 前向传播:从输入到输出,计算神经网络中各层的结果
  • 反向传播:从输出到输入计算目标函数关于该层输入的梯度,最后相乘便是输出关于优化变量的梯度
  • 权值正则化:所谓正则化,就是把权值系数的平方和作为软约束添加到目标函数中,防止系数过大
  • 计算图:如下所示,J为目标函数,X为特征输入,y为标签,o为输出

BP法的目标便是计算J关于 W ( 1 ) W^{(1)} W(1) W ( 2 ) W^{(2)} W(2)的导数

  1. 目标函数关于损失项和正则化项的导数

∂ J ∂ s = 1 , ∂ J ∂ L = 1 \frac{\partial J}{\partial s} = 1, \frac{\partial J}{\partial L} = 1 sJ=1,LJ=1

  1. 目标函数关于输出的梯度

∂ J ∂ o = ∂ L ∂ o = o − y \frac{\partial J}{\partial o}=\frac{\partial L}{\partial o} = o-y oJ=oL=oy

  1. 目标函数关于 W ( 2 ) W^{(2)} W(2)的梯度

∂ J ∂ W ( 2 ) = ∂ L ∂ W ( 2 ) + ∂ s ∂ W ( 2 ) = ∂ L ∂ o h T + λ W ( 2 ) \frac{\partial J}{\partial W^{(2)}}=\frac{\partial L}{\partial W^{(2)}} + \frac{\partial s}{\partial W^{(2)}} = \frac{\partial L}{\partial o}h^T + \lambda W^{(2)} W(2)J=W(2)L+W(2)s=oLhT+λW(2)

  1. 目标函数关于 h h h的梯度

∂ J ∂ h = ∂ L ∂ h = W ( 2 ) T ∂ L ∂ o \frac{\partial J}{\partial h}=\frac{\partial L}{\partial h} = W^{(2)^T}\frac{\partial L}{\partial o} hJ=hL=W(2)ToL

  1. 目标函数关于 z z z的梯度

∂ J ∂ z = ∂ L ∂ z = ∂ L ∂ h ϕ ′ ( z ) \frac{\partial J}{\partial z}=\frac{\partial L}{\partial z} =\frac{\partial L}{\partial h}\phi^{'}(z) zJ=zL=hLϕ(z)

  1. 目标函数关于 W ( 1 ) W^{(1)} W(1)的梯度

∂ J ∂ W ( 1 ) = ∂ L ∂ W ( 1 ) + ∂ s ∂ W ( 1 ) = ∂ L ∂ z x T + λ W ( 1 ) \frac{\partial J}{\partial W^{(1)}}=\frac{\partial L}{\partial W^{(1)}} + \frac{\partial s}{\partial W^{(1)}} = \frac{\partial L}{\partial z}x^T + \lambda W^{(1)} W(1)J=W(1)L+W(1)s=zLxT+λW(1)

其中 ϕ \phi ϕ为激活函数, λ \lambda λ为正则项系数

Logo

更多推荐