共计 11422 个字符,预计需要花费 29 分钟才能阅读完成。
文章和代码曾经归档至【Github 仓库:https://github.com/timerring/dive-into-AI】或者公众号【AIShareLab】回复 神经网络根底 也可获取。
神经网络入门
- 神经网络与多层感知机:基础知识,激活函数、反向流传、损失函数、权值初始化和正则化
- 卷积神经网络:统治图像畛域的神经网络构造,倒退历史、卷积操作和池化操作
- 循环神经网络:统治序列数据的神经网络构造,RNN、GRU 和 LSTM
学习资源举荐
- 吴恩达的深度学习课程: https://www.deeplearning.ai
- 李宏毅的深度学习课程
- 《deeplearning》俗称花书: https://github.com/exacity/deeplearningbook-chinese
- 周志华的《机器学习》
人工神经元
Artificial Neural Unit
人工神经元:人类神经元中形象进去的数学模型
1904 年钻研出人类神经元,其中:
- 树突:相似于 input
- 细胞核:相似于 operation:解决操作 + 激活函数
- 轴突末梢:相似于 output
1943 年心理学家 W.S. McCulloch 和数理逻辑学家 W.Pitts 钻研出人工神经元, 称为 M -Р模型。
$$
f(\sum_{i=1}^{N} I_{i} \cdot W_{i})=y
$$
人工神经网络:大量神经元以某种连贯形式形成的机器学习模型
第一个神经网络:1958 年,计算机科学家 Rosenblatt 提出的 Perceptron(感知机)
$$
o=\sigma(\langle\mathbf{w},\mathbf{x}\rangle+b)
$$
$$
\sigma(x)=\{\begin{array}{ll}
1 & \text {if} x>0 \\
0 & \text {otherwise}
\end{array}
$$
引发了第一波神经网络的热潮,但感知机的致命毛病是:Minsky 在 1969 年证实 Perceptron 无奈解决异或问题。本源在于,二维层面上神经网络是一条直线。无奈划分异或的区间。
$$
\begin{array}{rlr}
0 & =\sigma(\mathrm{x}_{0} \mathrm{w}_{0}+\mathrm{x}_{1} \mathrm{w}_{1}+\mathrm{b}) \\
0 & =\mathrm{x}_{0} \mathrm{w}_{0}+\mathrm{x}_{1} \mathrm{w}_{1}+\mathrm{b} \\
\mathrm{x}_{1} \mathrm{w}_{1} & =0-\mathrm{x}_{0} \mathrm{w}_{0}-\mathrm{b} \\
\mathrm{x}_{1} & = -\frac{\mathrm{w}_{0}}{\mathrm{w}_{1}} \mathrm{x}_{0}-\frac{\mathrm{b}}{\mathrm{w}_{1}} \\
\mathrm{y} & = \mathrm{kx}+\mathrm{b}
\end{array}
$$
多层感知机
多层感知机(Multi Layer Perceptron,MLP): 单层神经网络根底上引入一个或多个暗藏层, 使神经网络有多个网络层,因此得名多层感知机。
暗藏层的输出权重矩阵是 $\mathrm{W}_{4 \times 5}$
暗藏层的权重矩阵是 $W_{5 \times 3} $
前向流传:(以下不便起见省略了偏置)
$$
\begin{array}{l}
\sigma(\mathrm{X}_{1 \times 4} \cdot \mathrm{W}_{\mathrm{h}})=\mathrm{H}_{1 \times 5} \\
\sigma(\mathrm{H}_{1 \times 5} \cdot \mathrm{W}_{\mathrm{o} \times 3})=\mathrm{O}_{1 \times 3}
\end{array}
$$
整个过程如果没有激活函数,网络进化为单层网络,上面证实:
$$
\begin{aligned}
\boldsymbol{H} & =\boldsymbol{X} \boldsymbol{W}_{\mathrm{h}}+\boldsymbol{b}_{\mathrm{h}} \\
\boldsymbol{O} & =\boldsymbol{H} \boldsymbol{W}_{\mathrm{o}}+\boldsymbol{b}_{\mathrm{o}} \\
\boldsymbol{O} & =(\boldsymbol{X} \boldsymbol{W}_{\mathrm{h}}+\boldsymbol{b}_{\mathrm{h}}) \boldsymbol{W}_{\mathrm{o}}+\boldsymbol{b}_{\mathrm{o}}=\boldsymbol{X} \boldsymbol{W}_{\mathrm{h}} \boldsymbol{W}_{\mathrm{o}}+\boldsymbol{b}_{\mathrm{h}} \boldsymbol{W}_{\mathrm{o}}+\boldsymbol{b}_{\mathrm{c}}
\end{aligned}
$$
可见,最终网络还是能够化简代替,进化为 XW+ b 的单层网络。
当暗藏层退出 激活函数,可防止网络进化
$$
\begin{array}{l}
\mathbf{h}=\sigma(\mathbf{W}_{1} \mathbf{x}+\mathbf{b}_{1}) \\
\mathbf{0}=\mathbf{w}_{2}^{\mathrm{T}} \mathbf{h}+\mathbf{b}_{2}
\end{array}
$$
激活函数
作用:
- 让多层感知机成为真正的多层,否则等价于一层;
- 引入非线性,使网络能够迫近任意非线性函数(详见:万能迫近定理,universal approximator)
激活函数须要具备以下几点性质:
- 间断并可导(容许多数点上不可导),便于利用数值优化的办法来学习网络参数
- 激活函数及其导函数要尽可能的简略,有利于进步网络计算效率
- 激活函数的导函数的 值域 要在 适合 区间内,反向流传中会应用到激活函数的导函数,数值会影响到权重的更新,不能太大也不能太小,否则会影响训练的效率和稳定性。
常见激活函数:Sigmoid(S 型),Tanh(双曲正切),ReLU(修改线性单元)
Sigmoid(S 型)
罕用于 RNN 以及二分类中。做二分类的输入的激活函数;做循环神经网络中门控单元的激活函数。
有饱和区,导函数的饱和区(神经元的值差不多,梯度差不多),更新艰难。
$$
\begin{array}{c}
g(z)=\frac{1}{1+e^{-z}} \\
g^{\prime}(z)=g(z) *(1-g(z))
\end{array}
$$
Tanh(双曲正切)
特点,零均值。同样存在 饱和区 ,不利于梯度流传。两头的是 线性区。
$$
\begin{array}{c}
\tanh (x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} \\
g^{\prime}(z)=1-(g(z))^{2}
\end{array}
$$
ReLU(修改线性单元)
不存在饱和区,卷积神经网络中常常应用。
$$
\begin{array}{c}
\text {Relu}=\max (0, x) \\
g^{\prime}(z)=\{\begin{array}{ll}
1 & \text {if} \mathrm{z}>0 \\
\text {undefined} & \text {if} \mathrm{z}=0 \\
0 & \text {if} \mathrm{z}<0
\end{array}.
\end{array}
$$
反向流传(Back Propagation)
前向流传
输出层数据从前向后,数据逐渐传递至输入层
$$
\begin{array}{l}
\mathrm{z}=\mathrm{x} \cdot \mathrm{W}^{(1)} \\
\mathrm{h}=\phi(\mathrm{z}) \\
\mathrm{O}=\mathrm{h} \cdot \mathrm{W}^{(2)}
\end{array}
$$
反向流传
损失函数 开始从后向前,梯度 逐渐传递至一层
反向流传作用:用于权重更新,使网络输入更靠近标签
损失函数:掂量模型输入与实在标签的差别,$Loss=f(\hat{y}, y)$
反向流传原理:微积分中的链式求导法令
$$
\mathrm{y}=\mathrm{f}(\mathrm{u}), \mathrm{u}=\mathrm{g}(\mathrm{x}) \quad \frac{\partial \mathrm{y}}{\partial \mathrm{x}}=\frac{\partial \mathrm{y}}{\partial \mathrm{u}} \frac{\partial \mathrm{u}}{\partial \mathrm{x}}
$$
其中,$\phi(Z)$ 代表激活函数。$L$ 代表损失函数。
$$
\begin{array}{l}
\frac{\partial L}{\partial W^{(2)}}=\operatorname{prod}(\frac{\partial L}{\partial O}, \frac{\partial O}{\partial W^{(2)}})=\frac{\partial L}{\partial O} \cdot h^{\top} \\
\frac{\partial L}{\partial h}=\operatorname{prod}(\frac{\partial L}{\partial O}, \frac{\partial O}{\partial h})=W^{(2)\top} \cdot \frac{\partial L}{\partial O} \\
\frac{\partial L}{\partial z}=\operatorname{prod}(\frac{\partial L}{\partial O}, \frac{\partial O}{\partial h}, \frac{\partial h}{\partial z})=\frac{\partial L}{\partial h} \odot \phi^{\prime}(Z) \\
\frac{\partial L}{\partial W^{(1)}}=\operatorname{prod}(\frac{\partial L}{\partial O}, \frac{\partial O}{\partial h}, \frac{\partial h}{\partial z}, \frac{\partial z}{\partial W^{(1)}})=\frac{\partial L}{\partial z} \cdot X^{\top}
\end{array}
$$
其中,prod(x,y) 示意 x 与 y 依据形态做必要的替换,而后相乘。$\odot$ 示意逐元素相乘。通过上述式子,能够容易发现,存在链式关系,即后一项的梯度能够用于前一项的梯度上。
从 Loss 登程有多少条通路,梯度就有多少项,进行相加。上图所示,只有一条通路。用蓝笔画的圆圈,则是两条通路。
梯度降落法(Gradient Decent)
梯度降落法 (Gradient Decent):权值沿梯度 负方向更新,使函数值减小
导数:函数在 指定坐标轴上 的变化率
方向导数:指定方向上的变化率(在多维空间)
梯度:一个向量,方向为方向导数获得最大值的方向。
学习率(Learning Rate)
学习率(Learning Rate):管制更新步长
沿梯度 负方向更新:
$$
\boldsymbol{w}_{\mathrm{i}+1}=\boldsymbol{w}_{\mathrm{i}}-\boldsymbol{g}(\boldsymbol{w}_{\mathrm{i}})
$$
例:
$$
\begin{array}{l}
\mathrm{y}=\mathrm{f}(\mathrm{x})=4 * \mathrm{x}^{2} \\
\mathrm{y}^{\prime}=\mathrm{f}^{\prime}(\mathrm{x})=8 * \mathrm{x} \\
\mathrm{x}_{0}=2, \quad \mathrm{y}_{0}=16, \mathrm{f}^{\prime}(\mathrm{x}_{0})=16 \\
\mathrm{x}_{1}=\mathrm{x}_{0}-\mathrm{f}^{\prime}(\mathrm{x}_{0})=2-16=-14 \\
\mathrm{x}_{1}=-14, \quad \mathrm{y}_{1}=784, \mathrm{f}^{\prime}(\mathrm{x}_{1})=-112 \\
\mathrm{x}_{2}=\mathrm{x}_{1}-\mathrm{f}^{\prime}(\mathrm{x}_{1})=-14+112=98, \quad \mathrm{y}_{2}=38416 \\
\end{array}
$$
比照:
无学习率:$\boldsymbol{w}_{\mathrm{i}+1}=\boldsymbol{w}_{\mathrm{i}}-\boldsymbol{g}(\boldsymbol{w}_{\mathrm{i}})$
有学习率:$\boldsymbol{w}_{\mathrm{i}+1}=\boldsymbol{w}_{\mathrm{i}}- LR * \boldsymbol{g}(\boldsymbol{w}_{\mathrm{i}})$
不同学习率的影响:别离为 1——0.25——0.24——0.1
损失函数(Loss Function)
损失函数:掂量模型输入与实在的标签之间的差距
损失函数(Loss Function)
形容的单样本的差别值
$$
\operatorname{Loss}=\mathrm{f}(\hat{\mathrm{y}}, \mathrm{y})
$$
代价函数 (Cost Function)
形容的是总体样样本 \ 整个数据集的 Loss 的平均值
$$
cost=\frac{\mathbf{1}}{\mathrm{N}} \sum_{i}^{N} f(y_{i}^{\wedge}, y_{i})
$$
指标函数(Objective Function)
模型输入与标签之间的差别 + 正则项(管制模型复杂度避免过拟合景象)
$$
Obj= Cost + Regularization Term
$$
两种常见损失函数
MSE
MSE (均方误差, Mean Squared Error):输入与标签之差的平方的均值,常在 回归工作 中应用。计算公式:
$$
\mathrm{MSE}=\frac{\sum_{\mathrm{i}=1}^{\mathrm{n}}(\mathrm{y}_{\mathrm{i}}-\mathrm{y}_{\mathrm{i}}^{\mathrm{p}})^{2}}{\mathrm{n}}
$$
公式中 p 代表 predict。
例: label =(1,2) pred =(1.5,1.5)
$$
\mathrm{MSE}=\frac{[(1-1.5)^{2}+(2-1.5)^{2}]}{2}=0.25
$$
CE
CE(Cross Entropy,穿插熵):穿插熵源自信息论,用于掂量两个 散布 的差别,常在 分类工作 中应用。计算公式:
$$
\mathrm{H}(\mathrm{p}, \mathrm{q})=-\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{p}(\mathrm{x}_{\mathrm{i}}) \log \mathrm{q}(\mathrm{x}_{\mathrm{i}})
$$
p 是指真是散布,q 是模型的散布,试图用 q 去迫近 p。散布之间的间隔是没有对应关系的。在给定 p 的状况下,如果 q 和 p 越靠近,穿插熵越小;如果 q 和 p 越远,穿插熵就越大。
- 自信息:$I(x)=−logP(x)$ , p(x) 是某事件产生的概率
信息熵:形容信息的不确定度,信息熵越大信息越不确定,信息熵越小
信息熵 = 所有可能取值的信息量的冀望,即
$$
\mathrm{H}(\mathrm{x})=\mathrm{E}_{\mathrm{x}-\mathrm{p}}[\mathrm{I}(\mathrm{x})]=-\mathrm{E}[\log \mathrm{P}(\mathrm{x})]=-\sum_{\mathrm{i}=1}^{\mathrm{N}} \mathrm{p}_{\mathrm{i}} \log (\mathrm{p}_{\mathrm{i}})
$$
绝对熵 :又称K- L 散度, 掂量两个散布之间的差别。用概率分布 q 来近似 p 时所造成的信息损失量.KL 散度是依照概率分布 q 的最优编码对实在散布为 p 的信息进行编码,其均匀编码长度(即穿插熵)𝐻(p, q) 和 p 的最优均匀编码长度(即熵)𝐻(p) 之间的差别.
$$
\begin{aligned}
\mathrm{D}_{\mathrm{KL}}(\mathrm{P} \| \mathrm{Q})=\mathrm{E}_{\mathrm{x} \sim \mathrm{p}}[\log \frac{\mathrm{P}(\mathrm{x})}{\mathrm{Q}(\mathrm{x})}] & =\mathrm{E}_{\mathrm{x}-\mathrm{p}}[\log \mathrm{P}(\mathrm{x})-\log \mathrm{Q}(\mathrm{x})] \\
& =\sum_{\mathrm{i}=1}^{\mathrm{N}} \mathrm{P}(\mathrm{x}_{\mathrm{i}})(\log \mathrm{P}(\mathrm{x}_{\mathrm{i}})-\log \mathrm{Q}(\mathrm{x}_{\mathrm{i}}))
\end{aligned}
$$
由上式可知,$\mathrm{H}(\mathrm{p}, \mathrm{q})=\mathrm{H}(\mathrm{P})+\mathrm{D}_{-} \mathrm{KL}(\mathrm{P} \| \mathrm{Q})$ , 即 穿插熵 = 信息熵 + 绝对熵。
又因为信息熵是一个对于 p(实在散布)的常数,因而 优化穿插熵等价于优化绝对熵。
举例:计算损失函数(分类工作)
$$
\begin{array}{l}
\mathrm{H}(\mathrm{p}, \mathrm{q})=-\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{p}(\mathrm{x}_{\mathrm{i}}) \log \mathrm{q}(\mathrm{x}_{\mathrm{i}})\\
\operatorname{loss}=-(0^{\star} \log (0.05)+0^{\star} \log (0.1)+1^{\star} \log (0.7)+0^{\star} \log (0.15))=0.36
\end{array}
$$
这里 predict 应该是一个概率分布的模式,模型输入如果想化为概率的模式,能够采纳 softmax 函数。
softmax
Softmax 函数能够将多个标量映射为一个概率分布。(将数据变换到合乎概率分布的模式)
概率有两个性质:
- 概率值是非负的
- 概率之和等于 1
$$
\mathrm{y}_{\mathrm{i}}=\mathrm{S}(\boldsymbol{z})_{\mathrm{i}}=\frac{\mathrm{e}^{\mathrm{z}_{\mathrm{i}}}}{\sum_{\mathrm{j}=1}^{\mathrm{C}} \mathrm{e}^{\mathrm{z}_{\mathrm{j}}}}, \mathrm{i}=1, \ldots, \mathrm{C}
$$
概率 | Softmax |
---|---|
概率值是非负的 | 取指数,实现非负 |
概率之和等于 1 | 除以指数之和,实现之和为 1 |
没有一个适宜所有工作的损失函数,损失函数设计会波及算法类型、求导是否容易、数据中异样值的散布等问题。
更多损失函数可到 PyTorch 网站:https://pytorch.org/docs/stable/nn.html#loss-functions
函数解读:https://zhuanlan.zhihu.com/p/61379965
权值初始化(Initialization)
权值初始化:训练前对权值参数赋值,良好的权值初始化有利于模型训练
简便但谬误的办法:初始化为全 0——使网络层进化,多少个神经元都等于一个神经元,没有训练的意义。
随机初始化法
高斯分布随机初始化,从高斯分布中随机采样,对权重进行赋值,比方 N~(0,0.01)
3$\sigma$ 准则: 数值散布在(μ-3$\sigma$,μ+3$\sigma$)中的概率为 99.73%
控制权值的尺度:不能让权值太小,如果权值过小,相当于网络进化。例如如果权值过大,会使得一些值落入 sigmoid 函数中的饱和区域,饱和区域中的梯度靠近于 0,使梯度隐没,不利于模型的训练。
自适应标准差
自适应办法随机散布中的标准差
Xavier 初始化:《Understanding the difficulty of training deep feedforward neural networks》2010
$$
\mathrm{U}(-\sqrt{\frac{6}{a+b}}, \sqrt{\frac{6}{a+b}})
$$a 是输出神经元的个数,b 是输入神经元的个数。假如 $-\sqrt\frac{6}{a+b}$ 为 A,$\sqrt\frac{6}{a+b}$ 为 B,则可知 $\frac{A+B}{2}=mean=0$,$std=\sqrt\frac{(B-A)^2}{12}$。
- Kaiming 初始化 /MSRA:《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》2015
正则化(Regularization)
Regularization:减小 方差 的策略,艰深了解为 加重过拟合 的策略
误差可分解为:偏差,方差与噪声之和。即 误差 = 偏差 + 方差 + 噪声 之和(西瓜书)
- 偏差 度量了学习算法的冀望预测与实在后果的偏离水平,即刻画了学习算法自身的拟合能力
- 方差 度量了同样大小的训练集的变动所导致的学习性能的变动,即刻画了数据扰动所造成的影响
- 噪声 则表白了在当前任务上任何学习算法所能达到的冀望泛化误差的下界
过拟合景象:方差过大;在训练集体现良好,在测试集体现蹩脚。
损失函数(Loss Function):形容的单样本的差别值
$$
\text {Loss}=\mathrm{f}(\hat{\mathrm{y}}, \mathrm{y})
$$
代价函数 (Cost Function):形容的是总体样样本 \ 整个数据集的 Loss 的平均值
$$
\text {Cost}=\frac{1}{N} \sum_{i}^{N} \mathrm{f}({\hat{y_{i}}}, \mathrm{y}_{\mathrm{i}})
$$
指标函数(Objective Function):模型输入与标签之间的差别 + 正则项(束缚)管制模型复杂度避免过拟合景象。
$Obj= Cost + Regularization Term$
L1 Regularization Term: $\sum_{\mathrm{i}}^{\mathrm{N}}|\mathrm{w}_{\mathrm{i}}|$
L2 Regularization Term: $\sum_{\mathrm{i}}^{\mathrm{N}} \mathrm{w}_{\mathrm{i}}^{2} $
两个权值 w1 和 w2 组成的权值等高线,在所有等高线中抉择 L2 正则化最小的(即圆与椭圆相切),L1 正则化最小的(即方框与椭圆相切)。
参考深度学习花书 第七章
L2 Regularization
weight decay (权值衰减)L2 正则化含有权值衰减的作用。
指标函数(Objective Function):
$$
\begin{array}{l}
\boldsymbol{O} \boldsymbol{b} \boldsymbol{j}=\text {textCost}+ \text {Regularization Term} \\
\boldsymbol{O} \boldsymbol{b} \boldsymbol{j}=\boldsymbol{L} \boldsymbol{o s s}+\frac{\lambda}{2} * \sum_{\mathrm{i}}^{\mathrm{N}} \boldsymbol{w}_{\mathrm{i}}^{2}
\end{array}
$$
无正则项:
$$
\mathrm{w}_{\mathrm{i}+1}=\mathrm{w}_{\mathrm{i}}-\frac{\partial \mathrm{obj}}{\partial \mathrm{w}_{\mathrm{i}}}=\mathrm{w}_{\mathrm{i}}-\frac{\partial \text { Loss}}{\partial \mathrm{w}_{\mathrm{i}}}
$$
有正则项:
$$
\begin{aligned}
\mathrm{w}_{\mathrm{i}+1}=\mathrm{w}_{\mathrm{i}}-\frac{\partial \mathrm{obj}}{\partial \mathrm{w}_{\mathrm{i}}}=\mathrm{w}_{\mathrm{i}} & -(\frac{\partial \mathrm{Loss}}{\partial \mathrm{w}_{\mathrm{i}}}+\lambda^{*} \mathrm{w}_{\mathrm{i}}) \\
& =\mathrm{w}_{\mathrm{i}}(1-\lambda)-\frac{\partial \mathrm{Loss}}{\partial \mathrm{w}_{\mathrm{i}}}
\end{aligned}
$$
这里 $\lambda$ 相当于一个系数, $0<\lambda<1$,看更关注 Loss 还是更关注正则项的一个调节系数。通过有无正则项的比照,能够看出 L2 正则化的确起到了衰减权值的作用。
Dropout
Dropout:随机失活
长处:防止适度依赖某个神经元,实现加重过拟合
随机:dropout probability(eg:p=0.5)
失活:weight = 0
注意事项:训练和测试两个阶段的 数据尺度变动,例如测试的时候会应用去全副的神经元,而在训练的时候会 dropout 一部分神经元。
测试时,神经元输入值须要乘以 P(概率:肯定概率失落神经元)
例如:
测试时数据规模是 100:$\sum_{i=1}^{100} W_{i} \cdot x_{i}=100 \times P_{p}=50$ 这时须要乘一个随即失活的概率 $P_{p}$,使数据规模与训练时统一。
训练时数据规模是 50:$\sum_{i=1}^{50} W_{i} \cdot x_{i}=100 \times 0.5=50$ 这里有 50% 概率 $P_{p}$ dropout 每个神经元。
其余正则化办法:BN, LN, IN, GN.
- Batch normalization:《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
- Layer Normalization:《Layer Normalization》
- Instance Normalization:《Instance Normalization: The Missing Ingredient for Fast Stylization》
- Group Normalization:《Group Normalization》