神经网络

在机器学习中,神经网络(neural networks)一般是指“神经网络学习”。所谓神经网络,目前用得最广泛的一个定义是“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的反应”。它是一种黑箱模型,解释性较差,但效果很好。目前已有一些工作尝试改善神经网络的可解释性。

这一章的内容大致如下:

  • 神经元模型:什么是神经元模型?它的构造是怎样的?激活函数是什么?如何组建神经网络?
  • 感知机与多层网络:感知机的构造是怎样的?感知机不能解决什么问题?多层网络是怎样的?多层前馈神经网络有什么特点?
  • 误差逆传播算法:BP算法如何调整参数?有什么值得注意的地方?标准BP算法和累积BP算法有什么区别?如何设置隐层神经元的个数?如何处理BP神经网络的过拟合问题?
  • 全局最小与局部极小:什么是全局最小?什么是局部极小?如何跳出局部极小?
  • 其他常见神经网络:有哪些常见的神经网络?它们各自有什么特点?什么是竞争型学习?可塑性、稳定性、增量学习、在线学习各指什么?(没讲
  • 深度学习:深度学习是如何提升模型容量的?如何训练深度神经网络?怎么理解深度学习?

 

神经元模型

神经元(neuron)模型是神经网络最基本的组成成分,不妨对比一下生物学中的神经元和机器学习中的神经元:

在生物学中,每个神经元都有多个树突(dendrite),一个轴突(axon),以及一个细胞体(cell body)。当它兴奋时,就会向相连的神经元发送化学物质,从而改变它们内部的电位。如果一个神经元的电位超过了阈值(threshold,也称bias),那它就会被激活,也即兴奋,继而向其他相连神经元发送化学物质。

在机器学习中,最常用的是右图的M-P神经元模型(亦称为阈值逻辑单元(threshold logic unit))。树突对应于输入部分,每个神经元接收到若干个来自其他神经元的输入信号,这些信号通过带权重连接(connection)传递给细胞体,这些权重又称为连接权。细胞体分为两部分,前一部分计算总输入值(即输入信号的加权和,或者说累积电平);后一部分先计算总输入值与该神经元的阈值的差值,然后通过激活函数(activation function)的处理,从轴突输出给其它神经元。也即:

y=f(iwixiθ)(1)y = f(\sum_i w_i x_i -\theta)\tag1

最理想的激活函数是阶跃函数,但它不连续。类似于线性分类,可以采用Sigmoid函数来近似。因为这类函数能把较大范围内变化的输入值挤压到 (0,1) 输出值范围内,所以也称为挤压函数(squashing function)

多个神经元按一定的层次结构连接起来,就得到了神经网络。它是一种包含许多参数的模型,比方说10个神经元两两连接,则有100个参数需要学习(每个神经元有9个连接权以及1个阈值)。 。

 

感知机与多层网络

感知机

感知机(Perceptron)仅由两层神经元组成,如下图:

perceptron

两层是指输入层和输出层,但只有输出层是M-P神经元,也即只有一层功能神经元(functional neuron)。输入层只负责把每一个样本的各个属性传递给输出层(输入层的神经元数量等于样本的属性数目),不进行函数处理。其实说白了这个模型跟逻辑回归是一样的,不过按我的理解就是感知机的输出层可以有多个神经元,产生多个输出。而且线性模型中偏置项是和属性一起加权求和的,但神经网络中则是求属性加权和和预测的差。

有时候阈值 θ\theta 可以看作一个输入固定为 1.0-1.0 的哑结点(dummy node),连接权为 wn+1w_{n+1}。这样就可以把权重和阈值的学习统一为权重的学习了。更新权重的方式如下:

wiwi+Δwiw_i \leftarrow w_i + \Delta w_i

Δwi=η(yy^)xi\Delta w_i= \eta (y - \hat{y}) x_i

其中,η\eta 称为学习率(learning rate),取值范围是 (0,1)。感知机是逐个数据点输入来更新的。设定初始的权重后,逐个点输入,如果没有预测错就继续检验下一个点;如果预测错了就更新权重,然后重新开始逐个点检验,直到所有点都预测正确了就停止更新(所以这其实是一种最小化经验误差的方法)。

已经证明了,若两类模式是线性可分(linearly separable)的,即存在一个线性超平面能将它们分开。比如二维平面上可以用一条直线完全分隔开两个类别的点。由于感知机只有一层功能神经元,所以学习能力极其有限,只能处理线性可分问题。对于这类问题,感知机的学习过程必然收敛(converge)而求出适当的权向量;对于线性不可分问题,感知机的学习过程会发生振荡(fluctuation),难以稳定下来。

多层网络

使用多层的功能神经元可以解决线性不可分问题,比方说两层(功能神经元)的感知机就可以解决异或问题(在二维平面中需要使用两条直线才能分隔开)。

perceptron

在输入层和输出层之间的层称为隐层或者隐含层(hidden layer),隐含层的神经元也是功能神经元。

multi-layer feedforward neural networks

上图展示的最为常见的多层神经网络——多层前馈神经网络(multi-layer feedforward neural networks),它有以下特点:

  1. 每层神经元与下一层神经元全互连
  2. 神经元之间不存在同层连接
  3. 神经元之间不存在跨层连接

因为说两层网络时容易有歧义(只包含输入层输出层?还是包含两层功能神经元?),所以一般称包含一个隐含层的神经网络为单隐层网络。只要包含隐层,就可以称为多层网络。神经网络的学习其实就是调整各神经元之间的连接权(connection weight)以及各神经元的阈值,也即是说,神经网络学到的东西都蕴含在连接权和阈值中了。

 

误差逆传播算法

训练多层网络要比感知机复杂多了,感知机的学习方法是不够的。误差逆传播算法(error BackPropagation,简称BP)也称为反向传播算法,是最为成功的一种神经网络学习方法之一。一般而言,BP神经网络是指用BP算法训练的多层前馈神经网络,但BP算法也能训练其他类型的神经网络,如递归神经网络。

标准BP算法

假设要训练的是一个单隐层的前馈神经网络,BP算法使用均方误差作为性能度量,基于梯度下降(gradient descent)策略,以目标函数的负梯度方向对参数进行调整。

Example

这里以三层神经网络为例,其中训练集 D={(x1,y1),(x2,y2)...,(x1000,y1000),},xiRd,yiRlD=\{(\vec x_1,\vec y_1),(\vec x_2,\vec y_2)...,(\vec x_{1000},\vec y_{1000}),\},\vec x_i\in R^d,\vec y_i\in R^l ,即训练集有1000个样本,每个样本有 dd 个属性描述( dd 维向量),神经网络的输出 ll 维向量。根据神经元模型 部分给出的概念,神经网络中神经元有如下参数,我们选用 αi\alpha_i 代表隐含层中从上到下第 ii 个神经元的输入值,αi=k=13wki(1)xk\alpha_i=\sum_{k=1}^3w_{ki}^{(1)}x_k,其中 (1)(1) 指的应该是第一层到第二层神经网络间的权重值,用 bi(1)b_i^{(1)} 代表该神经元的阈值,用 hih_i 代表该神经元的输出,hi=f(αibi(1))h_i=f(\alpha_i-b_i^{(1)})。类似的,我们用 βj\beta_j 表示输出层中第 jj 个神经元的输入值,用 bj(2)b_j^{(2)} 代表其阈值,y^j\hat y_j 代表其输出。

我们采用均方差刻画损失函数,那么对于训练例 (xk,yk)(\vec x_k,\vec y_k),在神经网络的误差为:

Ek=12j=1l(y^jkyjk)2E_k=\dfrac12\sum_{j=1}^l(\hat y_j^k-y_j^k)^2

(其中 ll 是输出向量的维数)

EN=12n=1Nk=1l(y^knykn)2.E^N = \frac{1}{2}\sum_{n=1}^N\sum_{k=1}^l(\hat y_k^n-y_k^n)^2.

我们需要训练的就是神经网络中神经元间的连接权(权重)(即各层对应的向量 w\vec w)以及隐含层与输出层神经元的阈值(即各层对应的向量 b\vec b)。

在这些定义的基础上,我们使用梯度下降法(Gradient Descent)更新参数:

wnewl=woldlηEwoldl.w_{new}^l = w_{old}^l - \eta\frac{\partial E}{\partial w_{old}^l}.

bnewl=boldlηEboldl.b_{new}^l = b_{old}^l - \eta\frac{\partial E}{\partial b_{old}^l}.

梯度下降法更新权值主要是利用误差代价函数对参数的梯度,所以权值更新的目标就是让每一层得到这样的梯度,然后更新。

Backpropagation Pass反向传播与链式法则

Sigmoid函数的一个性质: f(x)=f(x)(1f(x))f'(x)=f(x)(1-f(x))

流程总结

流程如下:


输入:训练集 DD,学习率 η\eta

过程:
1:在 (0,1)(0,1) 范围内随机初始化网络中所有连接权和阈值
2:repeat\mathbf{repeat}
3:\quad for all\mathbf{for\ all} (xk,ykD)(\mathbf{x}_k,\mathbf{y}_k \in D) do\mathbf{do}
4:\quad \quad 根据当前参数计算出样本的输出 y^k\hat{\mathbf{y}}_k
5:\quad \quad 计算输出层神经元的梯度项 gjg_j
6:\quad \quad 计算隐层神经元的梯度项 ehe_h
7:\quad \quad 更新连接权与阈值
8:\quad endfor\mathbf{end for}
9:until\mathbf{until} 达到停止条件

输出:连接权与阈值确定的多层前馈神经网络


所谓逆传播其实就是从输出层开始逐步往后更新,因为输出层的误差确定后就可以对输出层的连接权和阈值进行更新,并且可以推算出隐含层输出的“真实值”,从而计算出隐含层的“误差”,然后更新隐含层的连接权和阈值。BP就是这样一种利用一层层倒推来最终更新整个神经网络的方法,每一层的更新公式其实和感知机用的是类似的。

在学习过程中,学习率 η\eta 控制着每一轮迭代的更新步长,太大则容易振荡太小则收敛速度太慢。有时为了精细调节,输出层和隐含层更新参数时会使用不同的学习率

累积BP算法

BP算法的目标是最小化训练集 DD 上的累积误差

E=1mk=1mEkE = \frac{1}{m}\sum_{k=1}^m E_k

而标准BP算法每输入一个样例就进行一次更新,所以它的参数更新非常频繁,而且不同样例可能会对更新起到抵消效果,从而使得模型需要更多次迭代才能到达累积误差的极小点。

标准BP算法和累积BP算法的区别类似于随机梯度下降标准梯度下降的区别。

如果把更新方式变为每输入一遍训练集进行一次更新,就得到累积BP算法,更新公式需要重新推导一下。这样更新一次就称为一轮(one round,亦称one epoch)学习

使用累积BP算法时参数更新的频率要低得多,但是!在很多人任务中,累积误差在下降到一定程度后,进一步下降会非常缓慢。此时标准BP算法能更快地获得较好的解(特别是训练集 DD 很大的时候)。

隐层神经元个数

已证明只需一个包含足够多神经元的隐层,多层前馈神经网络就能以任意精度逼近任意复杂度的连续函数。那么该怎样设置隐层神经元的个数呢?并不是越多越好,因为可能会出现过拟合问题而得不偿失。

目前尚未有成熟的理论可以确定怎样设置隐层神经元的个数还有隐层的层数。实际应用中主要靠试错法(trial-by-error)来调整,也即是不断改变设置,试验模型给出的应答,然后选择结果最好的。

过拟合问题

鉴于BP神经网络强大的表达能力,很容易会遇到过拟合问题。主要有以下两种应对策略:

  • 早停(early stopping):把数据集分为训练集和验证集,若训练集误差降低但测试集误差升高,就停止训练,并返回具有最小验证集误差的连接权和阈值。

  • 正则化(regularization):在目标函数中添加一个用于描述网络复杂度的部分,比如连接权和阈值的平方和。这样训练时就会偏好较小的连接权和阈值,从而令输出更“光滑”。为什么可以用正则化来避免过拟合呢?可以看看知乎上的解答。带正则化项的目标函数如下:

E=λ1mk=1mEk+(1λ)iwi2E = \lambda\frac{1}{m}\sum_{k=1}^m E_k + (1-\lambda)\sum_i w_i^2

其中 λ\lambda 是用于对经验误差和网络复杂度折中的参数,常通过交叉验证法来估计。

 

全局最小与局部极小

学习模型的过程其实就是一个寻找最优参数的过程,在谈到最优时,一般会提到局部极小(local minimum)全局最小(global minimum)

  • 局部极小解:参数空间中的某个点,其邻域点的误差函数值均不小于该点的误差函数值。
  • 全局最小解:参数空间中的某个点,所有其他点的误差函数值均不小于该点的误差函数值。

这两个解对应的误差函数值分别成为局部最小值全局最小值

要成为局部极小,只要满足该点在参数空间中梯度为0就可以了。局部极小可以有多个,全局最小则只有一个。全局最小一定也是局部极小,反之则不成立

因为用梯度下降搜索最优解可能会陷入非全局最小解的局部极小解,在现实任务中,人们会使用以下这些策略试图跳出局部极小

  • 以多组不同参数值初始化多个神经网络:经过训练后,取误差最小的解作为最终参数。这种方法相当于从多个不同的初始点开始搜索,从而增加找到全局最小解的可能性。

  • **模拟退火(simulated annealing)**技术:每次迭代都以一定的概率接收比当前解差的结果,从而有机会跳出局部极小(当然也有可能跳出全局最小),每次接受“次优解”的概率会随着时间推移逐渐减小,从而保证了算法的稳定。

  • 随机梯度下降(stochastic gradient descent,简称SGD):在计算梯度时加入了随机因素,因此即便陷入局部极小点,梯度依然可能不为0,从而有机会跳出局部极小,继续搜索。

除了这些方法之外,遗传算法也常用于训练神经网络以逼近全局最小。当这些技术大多是启发式,没有理论的保障。也就是说,这些方法指示基于直观或者经验构造的,能在可接受的时间和空间花费下给出待解决的组合优化问题的一个可行解,但不能估计可行解与最优解的偏离程度

其他常见神经网络:没讲

 

深度学习

理论上,参数越多,模型复杂度就越高,容量(capability,第12章中会讲到)就越大,从而能完成更复杂的学习任务。深度学习(deep learning)正是一种极其复杂而强大的模型。

怎么增大模型复杂度呢?两个办法,一是增加隐层的数目,二是增加隐层神经元的数目。前者更有效一些,因为它不仅增加了功能神经元的数量,还增加了激活函数嵌套的层数。但是对于多隐层神经网络,经典算法如标准BP算法往往会在误差逆传播时发散(diverge),无法收敛到稳定状态。

那要怎么有效地训练多隐层神经网络呢?一般来说有以下两种方法:

  • 无监督逐层训练(unsupervised layer-wise training):每次训练一层隐结点,把上一层隐结点的输出当作输入来训练,本层隐结点训练好后,输出再作为下一层的输入来训练,这称为预训练(pre-training)。全部预训练完成后,再对整个网络进行微调(fine-tuning)训练。一个典型例子就是深度信念网络(deep belief network,简称DBN)。这种做法其实可以视为把大量的参数进行分组,先找出每组较好的设置,再基于这些局部最优的结果来训练全局最优。

  • 权共享(weight sharing):令同一层神经元使用完全相同的连接权,典型的例子是卷积神经网络(Convolutional Neural Network,简称CNN)。这样做可以大大减少需要训练的参数数目。

事实上,深度学习可以理解为一种特征学习(feature learning)或者表示学习(representation learning),无论是DBN还是CNN,都是通过多个隐层来把初始与输出目标联系不大的输入表示转化为与输出目标更密切的表示,使原来只通过单层映射难以完成的任务变为可能。也即通过多层处理,逐渐将初始的“低层”特征表示转化为“高层”特征表示,从而使得最后可以用简单的模型来完成复杂的学习任务。

传统任务中,样本的特征需要人类专家来设计,这称为特征工程(feature engineering)。特征好坏对泛化性能有至关重要的影响。而深度学习为全自动数据分析带来了可能,可以自动产生好的特征。

 

参考

https://zhuanlan.zhihu.com/p/134089340

https://github.com/Vay-keen/Machine-learning-learning-notes

https://github.com/familyld/Machine_Learning

https://zhuanlan.zhihu.com/p/25994179

https://leovan.me/cn/2018/12/ensemble-learning/

https://easyai.tech/ai-definition/ensemble-learning/

https://zhuanlan.zhihu.com/p/72415675

https://www.zhihu.com/question/63492375

https://www.zhihu.com/question/27068705

https://www.zhihu.com/question/19725590/answer/241988854

https://tangshusen.me/2018/10/27/SVM/

https://www.joinquant.com/view/community/detail/a98b7021e7391c62f6369207242700b2

https://zhuanlan.zhihu.com/p/79531731

https://github.com/Charmve/PaperWeeklyAI/blob/master/03_Maiwei AI PaperWeekly/03_机器学习%26深度学习理论/机器学习算法之——K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解.md

https://blog.csdn.net/zc02051126/article/details/49618633

https://zhuanlan.zhihu.com/p/127022333

https://0809zheng.github.io/2020/03/30/ridge.html

https://www.cnblogs.com/wuliytTaotao/p/10837533.html

https://link.springer.com/referenceworkentry/10.1007/978-1-4899-7687-1_910#Sec13186

http://palm.seu.edu.cn/zhangml/files/mla11-mll.pdf

https://blog.csdn.net/zwqjoy/article/details/80431496

https://ryuchen.club/posts/0x000034/ (推荐)

https://zhuanlan.zhihu.com/p/78798251

https://zhuanlan.zhihu.com/p/622244758

https://www.biaodianfu.com/hierarchical-clustering.html

https://zhuanlan.zhihu.com/p/411533418

https://zhuanlan.zhihu.com/p/33196506

https://www.cnblogs.com/wry789/p/13125658.html

https://blog.csdn.net/qq_41485273/article/details/113178117

https://www.jianshu.com/p/7d4323c28716

http://lunarnai.cn/2019/01/02/watermelon-chap-13/

【周志华机器学习】十三、半监督学习

https://zhuanlan.zhihu.com/p/411533418

https://www.huaxiaozhuan.com/统计学习/chapters/12_semi_supervised.html

https://blog.csdn.net/tyh70537/article/details/80244490

https://zhuanlan.zhihu.com/p/37747650

7125messi.github.io

https://blog.csdn.net/qq_40722827/article/details/104515955

https://www.cnblogs.com/dyl222/p/11055756.html

https://www.zhihu.com/tardis/zm/art/392908965

https://blog.csdn.net/j123kaishichufa/article/details/7679682

https://www.cnblogs.com/heaad/archive/2011/01/02/1924088.html

https://www.cnblogs.com/stevenlk/p/6543628.html

baidinghub.github.io-PCA

baidinghub.github.io-LDA

等等