阅读文章之前需要了解的内容见
前馈神经网络前置知识这篇文章,主要包括感知机算法、激活函数等知识,下面主要介绍前馈神经网络的内容,主要有:
- 8.1 前馈神经网络结构
- 8.2 神经网络参数的学习
- 8.3 误差反向传播算法
- 8.4 tensorflow中自动梯度计算原理
- 8.5 机器学习或者深度学习中的非凸优化是如何求解的
1 前馈神经网络结构
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)=N1?n=1∑N?L(yn,y^?n)+λ∣∣W∣∣F2?其中∣∣W∣∣F2?=l∑L?i∑Ml??j∑Ml?1??wij2?
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)?=N1?n=1∑N??Wl?L(yn,y^?n)?+λWl?bl?R(W,b)?=N1?n=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中利用计算图这样的数据结构实现梯度的自动计算
- 计算图基本概念:
图2 计算图(《神经网络与深度学习》(邱锡鹏))
-
计算图将复杂计算过程进行分解,利用中间节点?表示运算操作,将中间计算结果放在节点?的箭头(边)上,其他指向中间节点?的为叶节点代表常量或者变量。
- 计算图支持局部计算,即将中间结果进行运算,所以在导数计算过程中可以通过保留中间结果,进行局部导数的计算,然后传递给下一层
- 计算图从左往右看是神经网络的正向传播公式,所以可以从计算图来看误差反向传播,即计算图从右往左看。
- 计算图中关于加法的局部导数是1;关于乘法的局部导数为另一个因式;
-
前向模式利用链式法则计算梯度的中间结果需要对W的每一维进行计算,反向模式利用链式法则计算梯度的中间过程只涉及Z的每一维度计算。因此当输出维度远小于输入维度时应该使用反向传播算法。 -
tensorflow中计算图分为静态计算图、动态计算图以及Autograph
- 静态计算图: 首先先使用TensorFlow的定义各种算子创建完整计算图,然后再开启一个会话Session,显式执行计算图。一旦定义,不能再改变。
- 动态计算图:每次使用算子,该算子就会自动加入默认计算图中,不需要开始session,直接执行即可得到结果。方便调试,可以改变。
- Autograph:可以使用@tf.function装饰器将定义好的Python函数转换成对应TensorFlow静态计算图构建代码。
5 深度学习中的非凸优化
- 深度学习中的损失函数一般都是非凸的,神经网络的损失函数为什么是非凸的?
- 非凸优化
- 目标函数不是凸函数
- 可行集不是凸集
- 大量局部最优解,局部最优解不一定是全局最优解
- 一般使用梯度下降法求解
- 非凸优化求解思路
- 凸松弛:拉格朗日对偶法:修改目标函数(凸函数)和约束条件(凸集)
- 非凸投影梯度下降:推荐系统中的矩阵分解
- 交替优化:在ALS算法中,虽然目标函数是非凸函数,但是在某一分量方向可能是凸函数
- EM算法等
- 神经网络优化问题
- 高维存在大量鞍点,不容易陷入局部最优
- 为了保证泛化能力,防止过拟合,不一定非得求解全局最小值
|