神经网络与深度学习课程总结(一)
0 前言
在此之前,我从未接触过关于“神经网络和深度学习”实现方面的内容,所以写一个前言简单介绍一下
0.1 代码框架
- mxnet
- pytorch
- tensorflow
- paddle
- …
以前听人提起神经网络时,他们总是会附带着聊到这些名词,在接触到之后才知道,这些实际上就是搭建神经网络用的框架,当然也可以单纯地认为是函数库(刚学一周不知道理解得对不对)
以pytorch
为例,里面就定义了很多关于张量的计算(至于什么是张量:一维张量叫向量,二维张量叫矩阵),有各种线性非线性网络的API。
0.2 名词解释
有关于学习的名词实在是太多了,什么“神经网络”、“机器学习”、“深度学习”、“强化学习”、“卷积神经网络”、“监督学习”等等等,这里做一个名词解释和分类(刚学一周,有些名词还是不懂,有些则是懵懵懂懂):
-
神经网络:似乎是指一种模型,一种框架,一种模式,但凡使用下图这种模式的算法,都可以叫做神经网络,在最基本的单层神经网络的基础上,发展出了很多变体,如:卷积神经网络,循环神经网络等等。神经网络由许多神经元组成,每个神经元都是一个节点,这个节点(其实就是一个函数)包含若干个输入和若干个输出
-
机器学习:就是各种学习算法的统称,所谓深度学习就是一种具体的机器学习算法,而这些算法的核心思想就是神经网络
-
学习过程:众所周知,机器学习算法工作模式可粗略分为两种,训练(根据数据集优化算法中的参数)和预测(利用优化好的参数,根据输入得到输出),其中预测过程很简单,就是我们用户和人工智能之间的交互的过程。但是训练过程就比较复杂,大致可以分为以下:
- 监督学习:给定数据集,其中数据集中包含“特征”(输入)和“标签”(输出),如分类问题和回归问题
- 无监督学习:给定数据集,其中数据集中包含“特征”,通常不包含“标签”,如聚类问题
- 强化学习:似乎没有常规意义下的数据集,它需要模拟模型与环境进行交互,根据模型作出的动作进行评分,从而调整模型中的参数,如决策问题
- 应该还有很多种过程,暂时没接触到,而在这些之下,又有离线学习和在线学习(顾名思义,离线学习就是把训练过程和预测过程分开进行,在线则相反)
0.3 基于神经网络的机器学习算法的整体思路
把要解决的问题建模成一个优化问题,然后求解。好像很多问题都是这种思路,区别在于,各自的目标函数和约束条件不一致导致选择的优化算法各有不同。
- 在机器人路径规划方面,目标函数和约束是有轨迹、环境和机器人动力学等等构成的,目标是轨迹平滑,安全可行;
- 在SLAM方面,目标函数和约束是由传感器和环境等等构成的,目标是各种估计的协方差尽可能小;
- 而对于机器学习算法,它的目标函数似乎并没有什么物理意义(正因如此才使它适用于各行各业),至于约束条件,似乎没有约束条件,就算有(防止梯度爆炸,而限制参数不能过大),也是看不出什么物理意义
所以,机器学习算法的思路就很明晰了,按优化问题走就可以:
-
建模:不管什么问题,都建模成神经网络模型,这种模型满足以下的特点:
- 单神经元模型:就是一个函数,有若干个输入和若干个输出
- 整体模型由各个神经元输入输出连接在一起
- 顶层神经元的输出就是模型的输出,底层神经元的输入就是模型的输入(参考上面那个图)
- 可以灵活选择节点函数,典型的函数是 σ ( W X ) \sigma(WX) σ(WX),其中 σ ( x ) \sigma(x) σ(x)是激活函数, W W W是模型参数, X X X是输入的特征
-
优化变量:模型参数就是优化变量,每一个节点都有一个参数张量,节点越多,参数张量越多,优化变量维度就越大
-
目标函数:每个研究领域都有属于该领域的专业术语,路径规划问题中,目标函数叫
cost function
, 学习领域中,目标函数一般称为loss function
- 对于监督学习,预测值(就是模型输出值) y ^ \hat{y} y^和标签值 y y y之间的距离常作为目标函数的一部分(最小化距离)
- 对于强化学习,显然评分可以成为目标函数的一部分(最大化评分),但强化学习这种模式,输入是环境,输出是决策,例如马尔科夫决策问题,这就跟传统优化问题不太一样了(我愿称其为广义的优化问题,其优化算法就是模拟对局)
-
优化算法: 在学习领域最典型的优化算法是随机梯度下降法(跟普通的梯度下降不太一样,首先是随机,其次是对同一套参数有多个梯度,需要做梯度加权)
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)=θ1⋅xarea+θ2⋅xage+θ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=1∑m(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=1∑m∇J
也可以直接求解析解
θ = ( X T X ) − 1 X T ⋅ y \theta = (X^TX)^{-1}X^T \cdot y θ=(XTX)−1XT⋅y
2 线性二分类
以好苹果分类为例,该类问题的输入为苹果的直径和外观评价,输出为是否为好苹果.这类问题与回归问题最大的区别在于分类问题的输出是有限的类别,在此做如下处理:
-
构造这个二分类的分界直线
-
一边是负值,一边是正值。越属于这类,值越大(正),反之越小(越负)
-
将输出变换到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)的导数
- 目标函数关于损失项和正则化项的导数
∂ J ∂ s = 1 , ∂ J ∂ L = 1 \frac{\partial J}{\partial s} = 1, \frac{\partial J}{\partial L} = 1 ∂s∂J=1,∂L∂J=1
- 目标函数关于输出的梯度
∂ J ∂ o = ∂ L ∂ o = o − y \frac{\partial J}{\partial o}=\frac{\partial L}{\partial o} = o-y ∂o∂J=∂o∂L=o−y
- 目标函数关于 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=∂o∂LhT+λW(2)
- 目标函数关于 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} ∂h∂J=∂h∂L=W(2)T∂o∂L
- 目标函数关于 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) ∂z∂J=∂z∂L=∂h∂Lϕ′(z)
- 目标函数关于 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=∂z∂LxT+λW(1)
其中 ϕ \phi ϕ为激活函数, λ \lambda λ为正则项系数