神经网络(Neural Network)
第四期分享会
汇报人:陈官富
2018.3.23
引言
神经网络被广泛应用在图像分类、图像分割、目标跟踪等领域
引言
引言
引言
引言
人工智能、机器学习、表示学习、深度学习和CNN之间的关系
引言
传统机器学习 VS 深度学习
引言
典型的图像分类Pipeline
目录
- 感知器(Perceptron)
- 梯度下降算法(Gradient Descent)
- 多层感知器(MLP)
- 反向传播算法(Back Propogation)
- 卷积神经网络(Convolution Neural Network)
- 循环神经网络(Recurrent Neural Network)
感知器
感知器
输入:样本的特征向量$x$
输出:样本的类别$y \in {-1, +1}$
模型:
$$f(x)=sign(w \cdot x+b)$$
$$sign(x)=\begin{cases}
1& if& x>0
0& if& x \leq 0
\end{cases}$$
其中$w$和$b$是感知器参数,$w$是权重(weight),$b$是偏置(bias),$sign$是符号函数。
感知器
$$y_i=sign(w^{(1)}x_i^{(1)}+w^{(2)}x_i^{(2)}+…+w^{(d)}x_i^{(d)}+b)$$ 其中$i=1,2,…,N,$,$N$为样本数,$d$为输入样本的特征维度,训练集为$T={x_1,x_2,…,x_N}$,$y_i \in {-1, +1}$,$+1$表示正样本,$-1$表示负样本。
感知器
感知器
计算简单的逻辑功能
感知器
感知器不能分割线性不可分的数据
感知器
- 线性可分(收敛)
- 线性不可分(贪心算法)
- 非线性可分(其他方法如SVM)
感知器
感知器学习策略(线性可分)
- 目标:求一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。
- 学习策略:损失函数极小化
- 损失函数,其中$M$是误分类点的集合: $$L(w,b)=-\sum_{x_i \in M}{y_i(w \cdot x + b)}$$ $$s.t.\ y_i(w \cdot x + b)<0$$
感知器
感知器学习策略(线性可分)
损失函数: $$L(w,b)=-\sum_{x_i \in M}{y_i(w \cdot x + b)}$$ $$s.t.\ y_i(w \cdot x + b)<0$$
感知器
感知器学习方法(线性可分)
学习问题转换为损失函数极小化问题:
$$\min{w,b} L(w,b)=-\sum{x_i \in M}{y_i(w \cdot x_i + b)}$$
梯度下降法 一次随机选取一个误分类点使其梯度下降,直至没有误分类点。
感知器
梯度下降算法
最小化$C(v)$,$v=v_1,v_2,…,v_N$,不妨取$N=2$ $$\Delta C \approx \frac{\partial{C}}{\partial{v_1}} \Delta{v_1} + \frac{\partial{C}}{\partial{v_2}} \Delta{v_2}$$
定义$\Delta v = (\Delta v_1, \Delta v_2)^T$和$\nabla C = (\frac{\partial{C}}{\partial{v_1}}, \frac{\partial{C}}{\partial{v_2}})^T$ 上述式子简化为: $$\Delta C \approx \nabla C \cdot \Delta v$$
感知器
梯度下降算法
$$\Delta C \approx \nabla C \cdot \Delta v$$ $$if\ \Delta v = -\eta \nabla C$$ $\Delta C \approx \nabla C \cdot \Delta v = \eta \nabla C \cdot \nabla C = -\eta ||\nabla C||^2 \leq 0$ $$v \rightarrow v^{\prime} = v - \eta \nabla C$$ 其中$\eta$是一个超参数,这里表示学习率。
感知器
梯度下降算法
感知器
感知器学习方法(线性可分)
感知器梯度下降算法方法学习 $$\min{w,b}L(w,b)=-\sum{x_i \in M}{y_i(w \cdot xi + b)}$$ $$w \leftarrow w-\eta \nabla{w}{L(w,b)}$$ $$b \leftarrow b-\eta \nabla_{b}{L(w,b)}$$
感知器
感知器学习方法(线性可分)
$$\min{w,b}L(w,b)=-\sum{x_i \in M}{y_i(w \cdot xi + b)}$$ 求取损失函数$L(w,b)$对$w$和$b$的梯度: $$\nabla{w}{L(w,b)}=-\sum_{x_i \in M} y_i xi$$ $$\nabla{b}{L(w,b)}=-\sum_{x_i \in M} y_i$$
感知器
感知器学习方法(线性可分)
感知器学习算法: 1.选取初值$w_0$,$b_0$ 2.在训练集中选取数据$(x_i,y_i)$ 3.如果$y_i(w \cdot x_i + b) \leq 0$ $$w \leftarrow w+\eta y_i x_i$$ $$b \leftarrow b+\eta y_i$$ 4.转至(2),直至训练集中没有误分类点
感知器
感知器学习方法(线性可分)
感知器
算法收敛性(线性可分)
课后题: 证明略,可参考李航《统计学习方法》P47
感知器
感知器学习算法(线性不可分)
感知器
感知器学习算法(非线性贪心算法): 1.选取初值$w_0$,$b_0$ 2.在训练集中选取数据$(x_i,y_i)$ 3.如果$y_i(w \cdot x_i + b) \leq 0$ $$\hat{w} \leftarrow w+\eta y_i x_i$$ $$\hat{b} \leftarrow b+\eta yi$$ 4.如果$L{\hat{w}, \hat{b}}<L_{w, b}$,更新$w=\hat{w},b=\hat{b}$,否则转至步骤(2),直至训练集中没有误分类点
感知器
总结: - 一种二类线性分类模型 - 损失函数为误分类样例到分离超平的距离之和 - 使用梯度下降算法学习 - 使用贪心算法学习线性不可分数据
多层感知器
多层感知器
单层感知器无法表示逻辑xor(异或)
$$x^{(1)}\ xor\ x^{(2)}=(x^{(1)}\ or\ x^{(2)})\ and\ not(x^{(1)}\ and\ x^{(2)})$$
多层感知器
神经元
其中$\theta(x)=\frac{1}{1+e^{(-x)}}$称为逻辑斯提函数,是一种常用的激活函数。
多层感知器
激活函数(Sigmoid函数)
$$\theta(x)=\frac{1}{1+\exp(-x)}$$
多层感知器
激活函数(双曲正切函数)
$$tanh(x)=2\theta(2x)-1$$
多层感知器
激活函数(ReLU函数)
$$ReLU(x)=max(0,x)=\begin{cases}
x& if& x \geq 0
0& if& x < 0
\end{cases}$$
多层感知器
激活函数(ELU函数)
$$ELU(x)=\begin{cases}
x& if& x \geq 0
\lambda \cdot (\exp(x)-1)& if& x < 0
\end{cases}$$
多层感知器
激活函数
各个激活函数的比较可参考 https://github.com/guanfuchen/statistics_model/tree/master/activation_function
多层感知器
神经元模型
神经元是多层感知器的基本单元,由线性单元(权重、偏置)和非线性激活函数(连续,感知器是不连续)组成。
多层感知器
基本组成结构: - 输入层 - 隐藏层 - 输出层
多层感知器
多层感知器
MNIST数据集
多层感知器
MNIST网络
多层感知器
- 权重$w_{jk}^{l}$,表示从第$(l-1)$层的第$k$个神经元到第$l$层的第$j$个神经元的链接上的权重。
- 偏置$b_j^l$,表示在第$l$层第$j$个神经元的偏置
- 激活值$a_j^l$,表示在第$l$层第$j$个神经元的激活值
- 带权输入$z^l$,第$l$层神经网络激活前的值$z^l$,其中$z_j^l$表示第$l$层第$j$个神经元的激活函数的带权输入
- 误差$\delta^l$,第$l$层网络的误差标记为$\delta^l$,$\delta_j^l$表示第$l$层第$j$个神经元上的误差,实际上就是代价函数对对应带权输入的偏导数$\partial{C} / \partial{z_j^l}$
多层感知器
多层感知器
神经网络第$l$层的第$j$个神经元的激活值$a_j^l$: $$aj^l=\sigma(\sum{k}{w_{jk}^l a_j^{l-1} + b_j^l})$$ 矩阵表示为: $$a^l=\sigma(w^l a^{l-1} + b^l)$$
初始化每一层的$w_{jk}^l$和$b_j^l$可以计算最后输出层,这个过程称为多层感知器的前向传播。
多层感知器
损失函数: $$C(w, b)=\frac{1}{2n}\sum_{x}||y(x)-a||^2$$ 其中$x$是输入向量,$y(x)$表示输入为$x$时最后得到的标签输出值,$a$表示多层感知器最后的输出值,这里使用均方差误差(使用交叉熵更好)。
梯度下降法求解
反向传播算法来加速梯度求解
多层感知器
反向传播算法
BP1 输出层误差的方程 BP2 使用下一层的误差表示当前层的误差 BP3 代价函数关于网络中任意偏置的改变率 BP4 代价函数关于任何一个权重的改变率 - (BP1) $\delta^L = \nabla_{a}{C} \odot \sigma^{\prime}(z^L)$ - (BP2)$\delta^l = ((w^{l+1})^T \delta^{l+1})) \odot \delta^{\prime}(z^l)$ - (BP3)$\frac{\partial{C}}{\partial{b_j^l}} = \deltaj^l$ - (BP4)$\frac{\partial{C}}{\partial{w{jk}}^l} = a_k^{l-1} \delta_j^l$
多层感知器
反向传播算法BP1推导
(BP1)$\delta^L = \nabla_{a}{C} \odot \sigma^{\prime}(z^L)$ $\delta_j^L = \frac{\partial{C}}{\partial{z_j^L}} = \frac{\partial{C}}{\partial{a_j^L}} \frac{\partial{a_j^L}}{\partial{z_j^L}} = \frac{\partial{C}}{\partial{a_j^L}} \sigma^{\prime}(z_j^L)$
多层感知器
反向传播算法BP2推导
(BP2)$\delta^l = ((w^{l+1})^T \delta^{l+1})) \odot \delta^{\prime}(z^l)$
$\delta_j^l = \frac{\partial{C}}{\partial{zj^l}} = \sum{k}{\frac{\partial{C}}{\partial{z_k^{l+1}}} \frac{\partial{z_k^{l+1}}}{\partial{zj^{l}}}} = \sum{k}{\frac{\partial{z_k^{l+1}}}{\partial{z_j^{l}}} \delta_k^{l+1}}$
$zk^{l+1} = \sum{j}{w_{kj}^{l+1} a_j^l + bk^{l+1}} = \sum{j}{w_{kj}^{l+1} \sigma(z_j^l) + b_k^{l+1}}$
$\frac{\partial{z_k^{l+1}}}{\partial{zj^{l}}} = w{kj}^{l+1} \sigma^{\prime}(z_j^l)$
$\deltaj^l = \sum{k}{ w_{kj}^{l+1} \sigma^{\prime}(z_j^l) \delta_k^{l+1}}$
多层感知器
反向传播算法BP3推导
(BP3)$\frac{\partial{C}}{\partial{b_j^l}} = \delta_j^l$ $\frac{\partial{C}}{\partial{b_j^l}} = \frac{\partial{C}}{\partial{z_j^l}} \frac{\partial{z_j^l}}{\partial{b_j^l}} = \delta_j^l$
多层感知器
反向传播算法BP4推导
(BP4)$\frac{\partial{C}}{\partial{w_{jk}^l}} = a_k^{l-1} \delta_j^l$
$\frac{\partial{C}}{\partial{w{jk}^l}} = \frac{\partial{C}}{\partial{z{j}}^l} \frac{\partial{z{j}}^l}{\partial{w{jk}^l}}=a_k^{l-1} \delta_j^l$
详细过程可参考 https://github.com/guanfuchen/statistics_model/tree/master/deep_learning
多层感知器
根据BP1和BP2可以计算每一个神经元的误差$\delta_j^l$,根据BP3和BP4可以使用$\delta_j^l$计算$\frac{\partial{C}}{\partial{bj^l}}$和$\frac{\partial{C}}{\partial{w{jk}^l}}$,那么多层感知器的学习算法使用梯度下降法更新参数:
$$w{jk}^l \leftarrow w{jk}^l-\eta \frac{\partial{C}}{\partial{w_{jk}^l}}$$ $$b_j^l \leftarrow b_j^l-\eta \frac{\partial{C}}{\partial{b_j^l}}$$
多层感知器
代码参考 http://10.14.42.229:8888/notebooks/deep_learning/deep_learning_sklearn.ipynb
卷积神经网络
卷积神经网络
- 卷积层
- 池化层
- 全连接层
卷积神经网络
卷积层
卷积神经网络
卷积层
全连接情况下:参数个数=$5*5*3*3=225$ 卷积情况下:参数个数=$3*3=9=0.04*225$
卷积神经网络
卷积层
对第$j$、$k$个神经元,输出为: $$\sigma(b+\sum_{l=0}^{kh-1}\sum{m=0}^{kw-1}w{l,m}a_{j+k, k+m})$$ 其中$k_h$、$k_w$分别为卷积核的高度和宽度,比如3*3卷积核
卷积神经网络
池化层
- 最大池化层(Max Pooling)
- 平均池化层(Avg Pooling)
卷积神经网络
池化层
- 最大池化层(Max Pooling)
卷积神经网络
反向传播
多层感知器反向传播回顾: 首先计算输出层的$\delta^L$:$\delta^L=\frac{\partial{C}}{a^L} \odot \sigma^{\prime}(z^L)$,然后利用数学归纳法利用$\delta^{l+1}$的值一步步的向前求出第$l$层的$\delta^l$,表达式为:$\delta^{l}=\delta^{l+1}\frac{\partial{z^{l+1}}}{\partial{z^l}}=(w^{l+1})^T\delta^{l+1}\odot\sigma^{\prime}(z^l)$,有了$\delta^l$的表达式,求出$W$,$b$的梯度表达式: $\frac{\partial{C}}{\partial{w^l}}=\frac{\partial{C}}{\partial{z^l}}\frac{\partial{z^l}}{\partial{w^l}}=\delta^{l}(a^{l-1})^T$以及$\frac{\partial{C}}{\partial{b^l}}=\frac{\partial{C}}{\partial{z^l}}\frac{\partial{z^l}}{\partial{b^l}}=\delta^{l}$
卷积神经网络
反向传播
- 池化层反向传播
- 卷积层反向传播
卷积神经网络
反向传播
池化层反向传播
- 误差上采样upsample
- 上采样upsample进行BP
例子,池化为2x2
$$
\delta_k^l=(
\begin{matrix}
2 & 8
4 & 6
\end{matrix}
)
$$
卷积神经网络
反向传播
池化层反向传播
$$
\delta_k^l=(
\begin{matrix}
2 & 8
4 & 6
\end{matrix}
)
$$
还原
$$
\left{
\begin{matrix}
0 & 0 & 0 & 0
0 & 2 & 8 & 0
0 & 4 & 6 & 0
0 & 0 & 0 & 0
\end{matrix}
\right}
$$
卷积神经网络
池化层反向传播
$$
\left{
\begin{matrix}
0 & 0 & 0 & 0
0 & 2 & 8 & 0
0 & 4 & 6 & 0
0 & 0 & 0 & 0
\end{matrix}
\right}
$$
最大池化:
$$
\left{
\begin{matrix}
2 & 0 & 0 & 0
0 & 0 & 0 & 8
0 & 4 & 0 & 0
0 & 0 & 6 & 0
\end{matrix}
\right}
$$
卷积神经网络
池化层反向传播
$$
\left{
\begin{matrix}
0 & 0 & 0 & 0
0 & 2 & 8 & 0
0 & 4 & 6 & 0
0 & 0 & 0 & 0
\end{matrix}
\right}
$$
平均池化:
$$
\left{
\begin{matrix}
0.5 & 0.5 & 2 & 2
0.5 & 0.5 & 2 & 2
1 & 1 & 1.5 & 1.5
1 & 1 & 1.5 & 1.5
\end{matrix}
\right}
$$
卷积神经网络
池化层反向传播
$\delta_k^{l-1}=\frac{\partial{C}}{\partial{a_k^{l-1}}}\frac{a_k^{l-1}}{z_k^{l-1}}=upsample(\delta_k^l) \odot \sigma^{\prime}(z_k^{l-1})$
卷积神经网络
卷积层反向传播
卷积层的前向传播公式: $a^l=\sigma(z_l)=\sigma(a^{l-1}*w^l+b^l)$ $\delta^{l}=\delta^{l+1}\frac{\partial{z^{l+1}}}{\partial{z^l}}$,推导出$\frac{\partial{z^{l+1}}}{\partial{z^l}}$即可 $z^l=a^{l-1} * w^l +b^l=\sigma(z^{l-1} * w^l)+b^l$ $\delta^{l-1}=\delta^{l}\frac{\partial{z^{l}}}{\partial{z^{l-1}}}=\delta^{l}*rot180(w^l)\odot\sigma^{\prime}(z^{l-1})$
*rot180*表示对一个矩阵翻转,上下翻转一次,左右翻转一次
卷积神经网络
卷积层反向传播
推导$w$和$b$的梯度 $z^l=a^{l-1} * w^l +b^l=\sigma(z^{l-1} * w^l)+b^l$ $\frac{\partial{C}}{\partial{w^l}}=\frac{\partial{C}}{\partial{z^l}}\frac{\partial{z^l}}{\partial{w^l}}=\delta^{l} * rot180(a^{l-1})$
$\frac{\partial{C}}{\partial{b^l}}=\sum{u,v}(\delta^l){u,v}$
卷积神经网络
代码实现 http://10.14.42.229:8888/notebooks/deep_learning/deep_learning_convolution.ipynb
循环神经网络
未完待续~~
SVM推导
问题
不借助深度学习框架用python中的numpy实现一个CNN框架(包括前向传播,反向传播)
参考资料
- Jake Bouvrie. “Notes on Convolutional Neural Networks”
- 马春鹏译. 《模式识别与机器学习》
- 李航. 《统计学习方法》
- 周志华. 《机器学习》
- Bengio. 《深度学习》
- Michael Nielsen. 《Neural Networks and Deep Learning》