深度学习的三个步骤
与之前的回归内容一样,可以概括为三个步骤。
第一步——定义模型(NN)
像神经元一样,设置输入层、隐藏层和输出层。层与层之间的权重我们用
θ
\theta
θ 表示。
“简单来说,深度学习就是有很多个隐藏层的神经网络。”
全连接是连接不同的神经元一种方式。当前层的任意神经元与下一层的每个神经元都有连接。
矩阵运算:
于是一个NN,就相当于函数内嵌函数(有几层隐藏层就内嵌几次)进行运算。这种运算用GPU速度会相对快些。
- 一般需要多少层隐藏层和多少个神经元是由经验、实验与尝试确定的,没有绝对的方法。
- 一些方法(Evolutionary Artificial Neural Netwo)可以自动确定神经网络的结构。
第二步——定义模型的好坏
假设我们做手写数字辨识。
这里我们用模型预测的结果和真实值之间的交叉熵之和
L
(
θ
)
=
Σ
i
=
1
n
C
i
L(\theta)=\Sigma^n_{i=1}C^i
L(θ)=Σi=1nCi 作为Loss Function,来定义模型预测的准确与否。交叉熵越小越好。
第三步——找到较优模型
寻找参数 θ ∗ \theta^* θ∗使得Loss Function最小的方法就是运用梯度下降(Gradient Descent),方式与回归内容中的一样,不再赘述。
- 深度学习中神经网络越深越好?
通过实验可以观测到,神经网络越深表现越好。有一个通用的理论:”对于任何一个连续的函数,都可以用足够多的隐藏层来表示“。
反向传播
神经网络里有很多的参数(一些模型里甚至有百万个),为了使梯度下降能够更有效率,我们运用到反向传播。
链式法则
反向传播中运用到地数学基础是链式法则。
具体细节
神经网络里的Loss Function是:
L
(
θ
)
=
Σ
i
=
1
n
C
i
L(\theta)=\Sigma^n_{i=1}C^i
L(θ)=Σi=1nCi。
则Loss Function对某个参数
w
w
w的偏微分是:
∂
L
(
θ
)
∂
w
=
Σ
i
=
1
n
∂
C
i
(
θ
)
∂
w
\frac{\partial L(\theta)}{\partial w}=\Sigma^n_{i=1}\frac{\partial C^i(\theta)}{\partial w}
∂w∂L(θ)=Σi=1n∂w∂Ci(θ)。
我们下面具体计算某一个data的
∂
C
i
(
θ
)
∂
w
\frac{\partial C^i(\theta)}{\partial w}
∂w∂Ci(θ),后续只需求和即可。
通过链式法则我们知道,
∂
C
∂
w
\frac{\partial C}{\partial w}
∂w∂C主要由
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z和
∂
C
∂
z
\frac{\partial C}{\partial z}
∂z∂C组合成。
我们先关注
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z这一部分。
通过神经网络一层传导的式子:
z
=
x
1
w
1
+
x
2
w
2
+
.
.
.
+
b
z=x_1w_1+x_2w_2+...+b
z=x1w1+x2w2+...+b,我们可以观察到
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z就等于
x
x
x。
而
x
x
x的计算就是神经网络由前往后一层层计算得到的,所以这个过程称为:Forward pass
再关注 ∂ C ∂ z \frac{\partial C}{\partial z} ∂z∂C这一部分。我们分为两种情况。
- Case 1. 输出层
我们可以直接计算 ∂ C ∂ z = ∂ y ∂ z ∂ C ∂ y \frac{\partial C}{\partial z}=\frac{\partial y}{\partial z}\frac{\partial C}{\partial y} ∂z∂C=∂z∂y∂y∂C
其中 ∂ C ∂ y \frac{\partial C}{\partial y} ∂y∂C我们是用交叉熵公式可以算得。 - Case 2. 非输出层
在非输出层,计算出 z z z后,还需要通过激活函数 a = σ ( z ) a=\sigma(z) a=σ(z)才传递到下一层,所以我们将 ∂ C ∂ z \frac{\partial C}{\partial z} ∂z∂C进一步分解成 ∂ a ∂ z ∂ C ∂ a \frac{\partial a}{\partial z}\frac{\partial C}{\partial a} ∂z∂a∂a∂C。
令 ∂ a ∂ z \frac{\partial a}{\partial z} ∂z∂a为 σ − 1 ( z ) \sigma^{-1}(z) σ−1(z),它是激活函数的反函数的值。
∂ C ∂ a \frac{\partial C}{\partial a} ∂a∂C这一项我们可以化成: ∂ z 1 ∂ a ∂ C ∂ z 1 + . . . + ∂ z k ∂ a ∂ C ∂ z k = w 1 ∂ C ∂ z 1 + . . . + w k ∂ C ∂ z k \frac{\partial z^{1}}{\partial a}\frac{\partial C}{\partial z^{1}}+...+\frac{\partial z^{k}}{\partial a}\frac{\partial C}{\partial z^{k}}=w_1\frac{\partial C}{\partial z^{1}}+...+w_k\frac{\partial C}{\partial z^{k}} ∂a∂z1∂z1∂C+...+∂a∂zk∂zk∂C=w1∂z1∂C+...+wk∂zk∂C.
其中 z i z^{i} zi是下一层第i个与当前神经元连接的神经元, w i w_i wi就是其权重。
那么我们在计算的时候,我们从后往前算,就能一步步得到每一层 ∂ C ∂ z \frac{\partial C}{\partial z} ∂z∂C的值,这个过程就称为:Backward pass
通过Forward pass与Backward pass,我们便可以算出 ∂ C ∂ w \frac{\partial C}{\partial w} ∂w∂C的值,进一步完成梯度下降的计算。