8 前馈神经网络
阅读文章之前需要了解的内容见 前馈神经网络前置知识这篇文章,主要包括感知机算法、激活函数等知识,下面主要介绍前馈神经网络的内容,主要有:
- 8.1 前馈神经网络结构
- 8.2 神经网络参数的学习
- 8.3 误差反向传播算法
- 8.4 tensorflow中自动梯度计算原理
- 8.5 机器学习或者深度学习中的非凸优化是如何求解的
1 前馈神经网络结构
1.1 网络结构
- 前馈神经网络算是神经网络模型一般化的结构,所有神经元之间全部连接,又称全连接神经网络,结构如下:由一个输入层、多个隐藏层和一个输出层构成。
- 神经网络中的层都由多个神经元组成
- 输入层神经元是数值型特征如x = (x1,x2,x3,x4)构成,
- 隐藏层神经元是激活函数
- 输出层神经元是线性函数(回归)、sigmoid函数(二分类)或softmax函数(多分类)
- 神经元之间的连线(边)代表权重,指向同一个神经元的边进行线性组合,再通过神经元输出。
1.2 网络模型
-
前馈神经网络模型以下式进行前向传播:
{ z i = W i a i − 1 + b i a i = s i g m o i d ( z i ) \begin{cases} z^{i}=W^{i}a^{i-1}+b^{i} \\ a^{i}=sigmoid(z^{i} ) \end{cases} {zi=Wiai−1+biai=sigmoid(zi) -
令 a 0 = x 令a^{0}=x 令a0=x, 以第i层为视角,对于连接的任意两个神经元:
- 前一隐藏层输出/输入层输入: a i − 1 a^{i-1} ai−1
- 隐藏层输入/输入层输出: z i = W i a i − 1 + b i z^{i}=W^{i}a^{i-1}+b^{i} zi=Wiai−1+bi
- 隐藏层输出: a i = s i g m o i d ( z i ) a^{i}=sigmoid(z^{i}) ai=sigmoid(zi)
- 不断迭代直到满足模型结构
-
通用近似定理:常见的连续非线性函数都可以用前馈神经网络来近似。
-
深度学习以神经网络模型为主,神经网络模型可以看作一个复杂的高阶的非线性函数。
-
机器学习以简单模型为主,人工特征工程非常重要,在模型中起决定性作用。然而,手动特征需要耗费大量时间设计和验证,且容易造成信息损失,因此引入神经网络自动学习特征表达方式。
2 前馈神经网络参数的学习
- 参数学习方法:类似机器学习,神经网络参数的学习也是以损失函数最小化为目标,最优化方法使用常见的梯度下降。
2.1 目标函数
R ( W , b ) = 1 N ∑ n = 1 N L ( y n , y ^ n ) + λ ∣ ∣ W ∣ ∣ F 2 其 中 ∣ ∣ W ∣ ∣ F 2 = ∑ l L ∑ i M l ∑ j M l − 1 w i j 2 R(W,b) ={1\over N}\sum_{n=1}^NL(y^n,\hat y^n)+\lambda||W||_F^2 \\ 其中||W||_F^2 = \sum_l^L\sum_i^{M_l}\sum_j^{M_{l-1}}{w_{ij}^2} R(W,b)=N1n=1∑NL(yn,y^n)+λ∣∣W∣∣F2其中∣∣W∣∣F2=l∑Li∑Mlj∑Ml−1wij2
2.2 梯度下降
- 最终输出的
y
^
\hat y
y^与y构造的损失函数对第
l
l
l层参数(更新)
W
l
、
b
l
W^l 、b^l
Wl、bl求梯度有:
∂ R ( W , b ) ∂ W l = 1 N ∑ n = 1 N ∂ L ( y n , y ^ n ) ∂ W l + λ W l ∂ R ( W , b ) ∂ b l = 1 N ∑ n = 1 N ∂ L ( y n , y ^ n ) ∂ b l {\partial R(W,b) \over \partial W^l} = {1\over N}\sum_{n=1}^N{\partial L(y^n,\hat y^n) \over \partial W^l} + \lambda W^l \\ {\partial R(W,b) \over \partial b^l} = {1\over N}\sum_{n=1}^N{\partial L(y^n,\hat y^n) \over \partial b^l} ∂Wl∂R(W,b)=N1n=1∑N∂Wl∂L(yn,y^n)+λWl∂bl∂R(W,b)=N1n=1∑N∂bl∂L(yn,y^n) - 每一层参数的求解都需要用到整个训练集,神经网络通常使用随机梯度下降法进行单样本的参数更新或者min-batch梯度下降法进行批量样本的参数更新。
- 通过计算参数的梯度表达式对参数进行更新效率较低,神经网络通常使用误差反向传播算法实现梯度的高效计算。
3 误差反向传播算法
- 链式法则:
∂ L ( y n , y ^ n ) ∂ W i j l = ∂ L ( y n , y ^ n ) ∂ z l ∂ z l ∂ W i j l ∂ L ( y n , y ^ n ) ∂ b l = ∂ L ( y n , y ^ n ) ∂ z l ∂ z l ∂ b l {\partial L(y^n,\hat y^n) \over \partial W_{ij}^l } = {\partial L(y^n,\hat y^n) \over \partial z^l } {\partial z^l \over \partial W_{ij}^l } \\ {\partial L(y^n,\hat y^n) \over \partial b^l } = {\partial L(y^n,\hat y^n) \over \partial z^l } {\partial z^l \over \partial b^l } ∂Wijl∂L(yn,y^n)=∂zl∂L(yn,y^n)∂Wijl∂zl∂bl∂L(yn,y^n)=∂zl∂L(yn,y^n)∂bl∂zl
- 因式分析
-
∂ L ( y n , y ^ n ) ∂ z l {\partial L(y^n,\hat y^n) \over \partial z^l } ∂zl∂L(yn,y^n)是重复项,所以只需要计算三项即可:
-
∂ L ( y n , y ^ n ) ∂ z l {\partial L(y^n,\hat y^n) \over \partial z^l } ∂zl∂L(yn,y^n) 是损失函数对第 l l l层线性组合的导数,最后通过神经元传导,反映了第 l l l层及其以后神经元对损失函数的影响大小,由于包含损失函数被称作误差项。
-
∂ z l ∂ W i j l 、 ∂ z l ∂ b l {\partial z^l \over \partial W_{ij}^l } 、 {\partial z^l \over \partial b^l } ∂Wijl∂zl、∂bl∂zl类似感知机算法,梯度求法类似。
-
主要困难是对误差项的求解:反向传播算法
-
- 误差反向传播迭代公式
δ ( l ) = ∂ L ( y n , y ^ n ) ∂ z l = ∂ L ( y n , y ^ n ) ∂ z l + 1 ∂ z l + 1 ∂ a l ∂ a l ∂ z l = δ ( l + 1 ) W l + 1 s i g m o i d ′ ( z l ) \delta(l) = {\partial L(y^n,\hat y^n) \over \partial z^l } ={\partial L(y^n,\hat y^n) \over \partial z^{l+1} } {\partial z^{l+1} \over \partial a^l} {\partial a^l \over \partial z^l} = \delta(l+1)W^{l+1}sigmoid'(z^l) δ(l)=∂zl∂L(yn,y^n)=∂zl+1∂L(yn,y^n)∂al∂zl+1∂zl∂al=δ(l+1)Wl+1sigmoid′(zl)
-
误差项可以通过迭代求解,其他几项都比较容易计算
-
误差反向传播算法
- 前馈计算每一层的线性输出 z l z^l zl和非线性输出 a l a^l al
- 对于最后一层当作单层感知机计算误差项(容易计算)、梯度、更新参数
- 接下来根据迭代公式依次反向传播计算每一层的误差项
- 计算每一层感知机的梯度并更新参数
4 tensorflow中自动梯度计算原理
- 计算图:tensorflow中利用计算图这样的数据结构实现梯度的自动计算
- 计算图基本概念:
-
计算图将复杂计算过程进行分解,利用中间节点⭕表示运算操作,将中间计算结果放在节点⭕的箭头(边)上,其他指向中间节点⭕的为叶节点代表常量或者变量。
- 计算图支持局部计算,即将中间结果进行运算,所以在导数计算过程中可以通过保留中间结果,进行局部导数的计算,然后传递给下一层
- 计算图从左往右看是神经网络的正向传播公式,所以可以从计算图来看误差反向传播,即计算图从右往左看。
- 计算图中关于加法的局部导数是1;关于乘法的局部导数为另一个因式;
-
前向模式利用链式法则计算梯度的中间结果需要对W的每一维进行计算,反向模式利用链式法则计算梯度的中间过程只涉及Z的每一维度计算。因此当输出维度远小于输入维度时应该使用反向传播算法。
-
tensorflow中计算图分为静态计算图、动态计算图以及Autograph
- 静态计算图: 首先先使用TensorFlow的定义各种算子创建完整计算图,然后再开启一个会话Session,显式执行计算图。一旦定义,不能再改变。
- 动态计算图:每次使用算子,该算子就会自动加入默认计算图中,不需要开始session,直接执行即可得到结果。方便调试,可以改变。
- Autograph:可以使用@tf.function装饰器将定义好的Python函数转换成对应TensorFlow静态计算图构建代码。
5 深度学习中的非凸优化
- 深度学习中的损失函数一般都是非凸的,神经网络的损失函数为什么是非凸的?
- 非凸优化
- 目标函数不是凸函数
- 可行集不是凸集:Lasso\稀疏矩阵分解都属于这类
- 大量局部最优解,局部最优解不一定是全局最优解
- 一般使用梯度下降法求解
- 非凸优化求解思路
- 凸松弛:拉格朗日对偶法修改目标函数(凸函数)和约束条件(凸集)
- 非凸投影梯度下降:Lasso/推荐系统中的矩阵分解,将稀疏矩阵投影到低秩矩阵,秩条件形成非凸集。梯度下降、投影更新、梯度下降、投影更新…
- 交替优化:在ALS算法中,虽然目标函数是非凸函数,但是在某一分量方向可能是凸函数
- EM算法等
- 算法可参考:Non-convex Optimization for Machine Learning
- 神经网络优化问题
- 高维存在大量鞍点,不容易陷入局部最优
- 为了保证泛化能力,防止过拟合,不一定非得求解全局最小值