第四周【任务2】前馈神经网络补充(笔记)

4.5 层数比较深的网络训练

4.5.1 监督性区分性分层训练

比如训练一个20层的网络,直接去训练难以收敛,此时可以这么做

  1. 先用部分数据训练前7层,但是要加上一层到输出的线性变换层。
  2. 训练完后,去掉最后一层线性变换层,加入后7层和新的一层到输出的线性变换,去训练这个14层的网络,此时这14层的网络都做了梯度更新
  3. 加入后6层进行新的训练
  4. 在经历以上步骤后,就有了一个20层的初始网络,在这个初始网络的权重基础上正常进行全量数据的训练

4.5.2 加入残差结构

在这里插入图片描述

输入 x x x在经过三个神经网络block之后,得到输出 y 1 y_1 y1, 然后我们把输出 y 1 y_1 y1加上输入残差 x x x,有
y 1 = f ( x ) y 2 = y 1 + x = f ( x ) + x \begin{array}{l} y_1=f(x) \\ y_2=y_1+x=f(x)+x \end{array} y1=f(x)y2=y1+x=f(x)+x
如果损失函数对输入 x x x求导【对应上一讲中的 ∂ J ∂ h L = ∂ J ∂ Z L d Z L d h L \dfrac{\partial J}{\partial h_{L}}=\dfrac{\partial J}{\partial Z_{L}} \dfrac{d Z_{L}}{d h_{L}} hLJ=ZLJdhLdZL】,我们有
∂ J ∂ x = ( ∂ J ∂ y 2 ) ( ∂ y 2 ∂ x ) = ( ∂ J ∂ y 2 ) ( f ′ ( x ) + 1 ) = f ′ ( x ) ∂ J ∂ y 2 + ∂ J ∂ y 2 \frac{\partial J}{\partial x}=\left(\frac{\partial J}{\partial y_2}\right)\left(\frac{\partial y_2}{\partial x}\right)=\left(\frac{\partial J}{\partial y_2}\right)\left(f^{\prime}(x)+1\right)=f^{\prime}(x) \frac{\partial J}{\partial y_2}+\frac{\partial J}{\partial y_2} xJ=(y2J)(xy2)=(y2J)(f(x)+1)=f(x)y2J+y2J

在不加残差前,那么就只有 f ′ ( x ) ∂ J ∂ y 2 f^{\prime}(x) \dfrac{\partial J}{\partial y_2} f(x)y2J, 如果 f ′ ( x ) ≪ 1 f^{\prime}(x)\ll1 f(x)1,那么整个梯度就几乎消失。

在加了残差之后,显然梯度 ( ∂ J ∂ y 2 ) ( f ′ ( x ) + 1 ) \left(\frac{\partial J}{\partial y_2}\right)\left(f^{\prime}(x)+1\right) (y2J)(f(x)+1)就不会消失,因为 f ′ ( x ) + 1 > 1 f^{\prime}(x)+1 > 1 f(x)+1>1

4.5.3 中间加入损失函数

在这里插入图片描述

通过分流出来的线性分类层,我们可以多出一个损失函数,用分流出来的损失函数对输入求梯度,就可以得到一个相对距离较近,没有消失的梯度

4.5.4 非线性激活函数尽量不要用sigmoid,尽量用relu

对这两个函数分别有
y = relu ⁡ ( x ) = { x x > 0 0 x < 0 ∂ J ∂ x = ∂ J ∂ y d y d x = { ∂ J ∂ y , x > 0 0 , x < 0 y = sigmoid ⁡ ( x ) ∂ J ∂ x = ∂ J ∂ y d y d x = ∂ J ∂ y y ( 1 − y ) \begin{array}{l} y=\operatorname{relu}(x)=\left\{\begin{array}{ll} x & x > 0 \\ 0 & x<0 \end{array}\right. \\ \dfrac{\partial J}{\partial x}=\dfrac{\partial J}{\partial y} \dfrac{d y}{d x}=\left\{\begin{array}{c} \dfrac{\partial J}{\partial y}, & x > 0 \\ 0, & x<0 \end{array}\right. \\ y=\operatorname{sigmoid}(x) \\ \dfrac{\partial J}{\partial x}=\dfrac{\partial J}{\partial y} \dfrac{d y}{d x}=\dfrac{\partial J}{\partial y} y(1-y) \end{array} y=relu(x)={x0x>0x<0xJ=yJdxdy=yJ,0,x>0x<0y=sigmoid(x)xJ=yJdxdy=yJy(1y)
显然,relu条件下的梯度在输入大于0的时候回保证有一个较大的梯度值,但是在sigmoid条件下,梯度就取决于y的值。如果我们把 y ( 1 − y ) y(1-y) y(1y)作为二次函数画出来,可以看到 y ( 1 − y ) y(1-y) y(1y)的最大值也不过 1 / 4 1/4 1/4, 而且很多时候会偏移到两边接近0的区域。

4.5.4 svd分解在前馈神经网络中的应用:加速以及减少参数

在这里插入图片描述

在上图中,我们首先由两层全连接的隐藏层, w w w参数数量是 2048 × 2048 2048\times 2048 2048×2048. 我们可以通过增加一层维度小的中间层来做’svd’: w 1 = 2048 × 512 , w 2 = 512 × 2048 w_1=2048\times 512, w_2=512\times 2048 w1=2048×512,w2=512×2048, 这样总的参数数量就是 2048 × 1024 2048\times1024 2048×1024,比原来的数量少了整整一半!矩阵操作就变为
w 2 w 1 x = w 1 x ′ w_{2}w_{1}x = w_1 x^{\prime} w2w1x=w1x
因此训练步骤就变为

  1. 初始化训练原始网络
  2. 在原始网络中间加入中间层,做svd分解,可以灵活配置每一层,简单有效,最常用的加速方法。
  3. 然后对新的网络再做fine tuning.

注意:权重矩阵分解中间,也就是中间层不用加relu

svd: A m × n = U m × m ν m × n V n × n ≈ U m × k ν k × k V k × n = U ˉ m × k V k × m ( k ≪ m , n ) A_{m\times n}=U_{m\times m}\nu_{m\times n} V_{n\times n} \approx U_{m\times k}\nu_{k\times k} V_{k\times n} = \bar{U}_{m\times k}V_{k\times m} (k \ll m, n) Am×n=Um×mνm×nVn×nUm×kνk×kVk×n=Uˉm×kVk×m(km,n)

4.5.5 特征降噪、变换

神经网络也可以作为自编码器做非监督学习

  1. 特征变换,降维度

在这里插入图片描述

假设我们把x输入放入一个神经层进行训练,输出维度与输入维度相同( x ⇔ y x\Leftrightarrow y xy), 通过损失函数 J = ∥ y − x ∥ J=\|y-x\| J=yx我们可以得到一个维度降低的特征 x ˉ \bar{x} xˉ。也就是self-encoder

  1. 特征降噪

同样是上图,我们如果在输入中加入噪声 x + Δ x x+\Delta x x+Δx,再进行训练,而输出的损失函数依然是 J = ∥ y − x ∥ J=\|y-x\| J=yx,我们就能够让隐藏层学到如何去除噪声 Δ x \Delta x Δx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值