深度学习(更新中~)

前馈神经网络MLP

基础架构

前馈神经网络基础架构如下图,相邻层间每个神经元都彼此相连,且分为输入层、隐藏层、输出层三部分,用以拟合任意函数。

其中隐藏层层数 l l l为神经网络的深度,拟合函数 f : R n x → R n y f:\R^{n_x}\to\R^{n_y} f:RnxRny,输入、输出层宽度为 n x 、 n y n_x、n_y nxny,每层隐藏层的宽度为 n i n_i ni、状态向量为 h i \boldsymbol{h}_i hi,则每层的表达式为:
h i = g i ( W i h i − 1 + b i ) \boldsymbol{h}_i=g_i(\boldsymbol{W}_i\boldsymbol{h}_{i-1}+\boldsymbol{b}_i) hi=gi(Wihi1+bi)
其由一个非线性激活函数 g i g_i gi与一个 R n i − 1 → R n i \R^{n_{i-1}}\to\R^{n_i} Rni1Rni仿射变换组成。
在这里插入图片描述

激活函数

整流线性函数ReLU
g ( x ) = max ⁡ { 0 , x } g(x)=\max\{0,x\} g(x)=max{ 0,x}
目前最常用的激活函数,逐元素运算,缺陷是不能学习到 x < 0 x<0 x<0时梯度为零的样本,初始化时常将偏置 b i \boldsymbol{b}_i bi设为一个小的正值来保证多数神经元处于激活状态。

其有几个主要变体(主要是为了改善 x < 0 x<0 x<0时梯度为零的问题):

  • x < 0 x<0 x<0时设置一个非零梯度 α \alpha α g ( x ) = max ⁡ { 0 , x } + α min ⁡ { 0 , x } g(x)=\max\{0,x\}+\alpha\min\{0,x\} g(x)=max{ 0,x}+αmin{ 0,x} α = − 1 \alpha=-1 α=1时为绝对值整流; α \alpha α固定为一个小的超参数时为渗透学习单元; α \alpha α为要学习的参数时为参数化整流PReLU;
  • maxout单元:将输入均分为 n n n k k k大小的组,每个组使用最大值函数, R k n → R n \R^{kn}\to\R^n RknRn的映射: g ( x ) i = max ⁡ ( i − 1 ) k + 1 ≤ j ≤ i k x j g(\boldsymbol{x})_i=\mathop {\max }\limits_{(i-1)k+1\le j\le ik}x_j g(x)i=(i1)k+1jikmaxxj k k k称为块数;maxout相当于整流函数的一般化,可以学习激活函数本身,当使用足够大的 k k k时maxout函数可以以任意精度近似任意凸函数。但也由于参数较多比整流单元需要更多的正则化;

logistic函数

logistic sigmoid函数 σ ( x ) \sigma(x) σ(x)与双曲正切函数 tanh ⁡ ( x ) \tanh(x) tanh(x)
σ ( x ) = 1 1 + e − x tanh ⁡ ( x ) = e x − e − x e x + e − x \sigma(x)=\cfrac{1}{1+e^{-x}} \\ \tanh(x)=\cfrac{e^{x}-e^{-x}}{e^{x}+e^{-x}} σ(x)=1+ex1tanh(x)=ex+exexex
这两个函数由于广泛饱和性不适于前馈与卷积神经网络的激活函数,若必须要使用tanh函数往往比sigmoid函数表现更好;

由于对数似然代价函数可以在抵消指数的饱和性,这两个函数常用于输出层;循环神经网络、概率模型与自编码器有时映射到0~1的额外要求也会使用这两个函数。

无激活函数

无激活函数直接线性输出往往用于降秩以减少参数;

如一个两层网络 R n → R q → R p \R^n\to \R^q\to \R^p RnRqRp,第一层为无激活函数的线性层 h 1 = U x \boldsymbol{h}_1=\boldsymbol{U}\boldsymbol{x} h1=Ux,第二层为有激活函数的线性层 h 2 = g ( V h 1 + b ) \boldsymbol{h}_2=g(\boldsymbol{V}\boldsymbol{h}_1+\boldsymbol{b}) h2=g(Vh1+b);跳过中间直接映射 R n → R p \R^n\to \R^p RnRp h 2 = g ( W x + b ) \boldsymbol{h}_2=g(\boldsymbol{W}\boldsymbol{x}+\boldsymbol{b}) h2=g(Wx+b);则前者参数数为 ( n + p ) q + p (n+p)q+p (n+p)q+p,后者参数数为 n p + p np+p np+p,相当于做了一个 r a n k ( W ) = q rank(\boldsymbol{W})=q rank(W)=q的先验假设,当 q q q很小时以降秩为代价减少了参数。

softplus函数
ζ ( x ) = ln ⁡ ( 1 + e x ) \zeta(x)=\ln(1+e^x) ζ(x)=ln(1+ex)
整流函数的平滑版本,但经验表明整流函数优于该函数。

架构设计

万能近似定理:MLP若具有线性输出层与至少有一层具有“挤压”性质激活函数的隐藏层,则只要隐藏层宽度足够大,便可以以任意精度近似任意有限维的Borel可测函数,导数也可以任意好的近似。

一般来说更宽的宽度能使网络近似地更好,更深的网络能使网络泛化地更好。

若MLP深度为 l l l、输入维数为 d d d、隐藏层宽度均为 n n n、激活函数为整流,则MLP能表示的线性区域数量为 O ( ( n d ) d ( l − 1 ) n d ) O\left(\binom{n}{d}^{d(l-1)}n^d\right) O((dn)d(l1)nd) ( n d ) = C n d \binom{n}{d}=C_n^d (dn)=Cnd);若MLP采用的是块数 k k k的maxout激活函数,则MLP能表示的线性区域数量为 O ( k ( l − 1 ) + d ) O(k^{(l-1)+d}) O(k(l1)+d)

反向传播算法

前向传播通过计算图由输入到输出最后计算各节点状态与代价函数,计算图上每个节点代表变量每条边代表操作函数;反向传播通过计算图由代价函数到各参数节点最后计算各参数的代价函数导数;

设代价函数为 J J J,要计算导数的参数为 u k u_k uk path ( u π 1 , ⋯   , u π t ) ∈ P a ( J , u k ) \text{path}(u_{\pi_1},\cdots,u_{\pi_t})\in Pa(J,u_k) path(uπ1,,uπt)Pa(J,uk)为计算图上 u k u_k uk J J J的任一条路径,其中 u π 1 = u k , u π t = J u_{\pi_1}=u_k,u_{\pi_t}=J uπ1=uk,uπt=J,则有:
∂ J ∂ u k = ∑ path ( u π 1 , ⋯   , u π t ) ∈ P a ( J , u k ) ∏ i = 2 t ∂ u π i ∂ u π i − 1 \cfrac{\partial J}{\partial u_k}=\sum_{\text{path}(u_{\pi_1},\cdots,u_{\pi_t})\in Pa(J,u_k)} \prod\limits_{i=2}^{t} {\cfrac{\partial u_{\pi_i}}{\partial u_{\pi_{i-1}}}} ukJ=path(uπ1,,uπt)Pa(J,uk)i=2tuπi1uπi
若直接计算该表达式,由于不同的路径有重复的表达式,会造成很大存储与计算成本,特别是当节点增多时路径数会随节点指数倍增长;而反向传播算法避免了重复计算相同表达式,对于 n n n个节点的计算图计算与存储成本为 O ( n 2 ) O(n^2) O(n2),而神经网络多为链式结构成本往往只有 O ( n ) O(n) O(n),其原理基于链式法则:
∇ x z = ∇ x y ∇ y z \nabla_{\boldsymbol{x}}\boldsymbol{z}=\nabla_{\boldsymbol{x}}\boldsymbol{y}\nabla_{\boldsymbol{y}}\boldsymbol{z} xz=xyyz
标量链式计算图

若计算图节点都为标量,且以特殊的方式排列使得从父节点 u 1 u_1 u1开始沿序号上升的顺序到子节点 u n u_n un,记 u i u_i ui的子节点集合为 H i H_i Hi即若 u j ∈ H i u_j\in H_i ujHi j > i j>i j>i

从节点 u l ( 1 ≤ l ≤ n ) u_l(1\le l\le n) ul(1ln)开始,计算 ∂ u l ∂ u i ( 1 ≤ i ≤ l ) \cfrac{\partial u_l}{\partial u_i}(1\le i\le l) uiul(1il)的BP算法为:

输入:计算图结构,每个变量 u i ( 1 ≤ n ) u_i(1\le n) ui(1n)的取值状态,每个子节点关于父节点的偏导解析式
过程:
∂ u l ∂ u l = 1 \cfrac{\partial u_l}{\partial u_l}=1 ulul=1
for i=l-1:1
∂ u l ∂ u i = ∑ j ∈ H i ∂ u l ∂ u j ∂ u j ∂ u i \cfrac{\partial u_l}{\partial u_i}=\sum_{j\in H_i}\cfrac{\partial u_l}{\partial u_j}\cfrac{\partial u_j}{\partial u_i} ui

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值