《深度学习入门:基于Python的理论与实现》学习笔记

基于《深度学习入门:基于Python的理论与实现》学习深度学习入门

感知机

感知机这个算法是上个世纪提出来的,时间已经非常遥远,但确实引入神经网络非常好的一个算法

x1,x2x 1,x 2x1,x2 是输入信号,y 是 输 出 信 号,w1,w2w1,w2w1,w2是权重(w 是 weight 的首字母)。中间的圈代表着神经元。输入信号被送往神经元时,会被分别乘以固定的权重(w1x1、w2x2w 1 x 1 、w 2 x 2w1x1w2x2 )。

神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出 1。这也称为“神经元被激活” 。这里将这个界限值称为阈值,用符号 θ 表示。

在这里插入图片描述

感觉这个就是一个基本的感知机模型,有权重,接下来就是加偏置

神经网络

感知机到神经网络

具体地讲,神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数。

在这里插入图片描述

用公式表示

y=h(b+w1x1+w2x2)(3.1) y = h(b + w 1 x 1 + w 2 x 2 ) \tag{3.1} y=h(b+w1x1+w2x2)(3.1)

(3.1)式完全简化了感知机,也就是神经网络,输入信号的总和会被函数 h(x)h(x)h(x)转换,转换后的值就是输出 y。

h(x)={1(x⩾0)0(x<0)(3.2) h(x)= \begin{cases} 1 &(x\geqslant0)\\ 0 &(x<0) \end{cases} \tag{3.2} h(x)={10(x0)(x<0)(3.2)

然后,式(3.2)所表示的函数h(x)h(x)h(x),在输入超过 0 时返回 1,否则返回 0。

激活函数

sigmod 函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以 0 为界,输出发生急剧性的变化。sigmoid 函数的平滑性对神经网络的学习具有重要意义。

h(x)=11+e−x h(x) = \frac{1}{1+e^{-x}} h(x)=1+ex1

ReLU( Rectified Linear Unit)经常会用

h(x)={x(x⩾0)0(x<0)(3.2) h(x)= \begin{cases} x &(x\geqslant0)\\ 0 &(x<0) \end{cases} \tag{3.2} h(x)={x0(x0)(x<0)(3.2)

多维数组学习,numpy

这个部分可以放在之后记录,很重要的工具

3层神经网络设计

输出层的设计

这个和神经网络的应用有关系,回归问题就恒等函数,分类问题就softmax函数

softmax函数

yk=exp(ax)∑i=1nexp(ai) y_k = \frac{exp{(a_x)}}{\sum_{i=1}^nexp{(a_i)}} yk=i=1nexp(ai)exp(ax)

意义就是把输出值大的映射到概率中,从而可以看出分类的结果。

神经网络的学习

损失函数

  1. 有几种损失函数的选择
  • 均方误差

E=12(yk−tk)2 E = \frac{1}{2}(y_k - t_k)^2 E=21(yktk)2

yky_kyk 代表网络的输出,tkt_ktk监督数据

  • 交叉熵误差

E=−∑ktklogyk E = -\sum_k t_k log y_k E=ktklogyk

对于网络的输出$y_k$是概率,小于1,所以有一个负号。当这个分类正确的时候,也就是$t_k$对应1的位置的$y_k$的值比较大,那么这个E是比较小的,接近0的。
  1. mini-batch

    简单来说,就是随机选择一些数据来算损失函数,因为一直计算,计算量太大了

梯度下降

含有函数全部偏导的向量就是这个函数的梯度。

寻找最小值的梯度法称为梯度下降法 (gradient descent method)

x0=x0−η∂f∂x0 x_0 = x_0 -\eta\frac{\partial f}{\partial x_0} x0=x0ηx0f

η\etaη称为学习率,也是超参数。是人工设定的,无法通过学习得到。

算法实现

目的: 实现一个可以识别手写数字的神经网络,神经网络学习的内容是网络的权重偏置以拟合数据。

步骤:

  1. 准备数据集,mini-batch的方法选择一部分作为损失函数的输入值。
  2. 计算梯度。为了减小损失函数的值,就要求出每一个参数的梯度。loss就需要神经网络的输出和groud_truth进行计算。
  3. 更新。使参数沿着梯度下降的方向移动,从而减小损失函数。
  4. 根据epoch重复,并且在其中计算一些loss和accuracy来可视化。

这里的算法实现是两层。如果batch_size是1,也就是输入网络input_size=728(32×32),隐藏层随便50层,output_size=1×10。权重w1 (728×50),w2(50×10)。

如图所示:

在这里插入图片描述

误差反向传播

简介

在这里插入图片描述

反向传播主要两个加法和乘法

加法传播

在这里插入图片描述

上游的值原封不动给下面的线路

乘法传播
在这里插入图片描述

乘法的话根据求导公式可以推测出偏导数应该是另外一边的值,所以就是上游的值,乘上对面的值,就是当前线路的值。

激活函数的实现

激活函数主要就是Relu 和 Sigmod层的实现

在这里插入图片描述

sigmod函数

都是根据数学公式,然后推导出来的。主要用到了链式法则。

Affine、Softmax层的实现

Affine层是全连接层,可以理解为线性变换,Y=XW+BY = XW+BY=XW+B

对于该层的梯度求解:

∂L∂X=∂L∂YWT∂L∂W=XT∂L∂Y \frac{\partial L}{\partial \mathbf{X}} = \frac{\partial L}{\partial \mathbf{Y}} \mathbf{W^T}\\ {} \\ \frac{\partial L}{\partial \mathbf{W}} = \mathbf{X^T}\frac{\partial L}{\partial \mathbf{Y}} XL=YLWTWL=XTYL
在这里插入图片描述

Softmax层

在这里插入图片描述

把dout看作 1 的推导,最终的结果就是(y1−t1,y2−t2,y3−t3)(y_1-t_1 , y_2-t_2, y_3 - t_3)(y1t1,y2t2,y3t3)看起来不错的结果其中y是网络的输出,t是校准标签,那么loss小说明结果准确率高,反之则大。

反向传播计算速度快,把网络更加系统的分为层这个概念,添加了backward。

与学习相关的技巧

参数的更新

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻
找最优参数的问题,解决这个问题的过程称为最优化 (optimization)。

SGD

使用参数的梯度,沿梯度方向更新参数,并重复这个步骤多次,从而逐渐靠
近最优参数,这个过程称为随机梯度下降法 (stochastic gradient descent),
简称 SGD。

W=W−η∂L∂W \bold W = \bold W -\eta\frac{\partial L}{\partial \mathbf{W}} W=WηWL

Momentum

v←v−η∂L∂WW←W+v v \leftarrow v -\eta\frac{\partial L}{\partial \mathbf{W}} \\{}\\ \bold W \leftarrow \bold W +v vvηWLWW+v

AdaGrad

使用了学习率衰减的办法,随着学习的进行逐步衰减学习率。

h←h+∂L∂W⊙∂L∂WW←W−η∂L∂W h \leftarrow h +\frac{\partial L}{\partial \mathbf{W}}\odot\frac{\partial L}{\partial \mathbf W}\\{}\\ \bold W \leftarrow \bold W-\eta\frac{\partial L}{\partial \mathbf W} hh+WLWLWWηWL

这意味着,参数的元素中变动较大(被大幅更新)的元素的学习率将变小。也就是说,
可以按参数的元素进行学习率衰减,使变动大的参数的学习率逐渐减小。

Adam

它的理论有些复杂,直观地讲,就是融合了 Momentum 和 AdaGrad 的方法。通过组合前面两个方法的优点,有望实现参数空间的高效搜索。

Adam(Adaptive Moment Estimation)是一种用于优化随机梯度下降的优化算法。它结合了动量法(momentum)和自适应学习率的思想。Adam算法的主要优势在于能够适应不同参数的学习率,从而更有效地进行模型训练。

以下是Adam算法的主要步骤:

  1. 初始化参数: 初始化模型参数,包括权重(weights)和偏置(biases)。同时,初始化两个变量 m和 v为零向量,它们分别用于存储梯度的一阶矩和二阶矩估计。

  2. 计算梯度: 对于每个训练样本,计算相对于模型参数的梯度。

  3. 更新一阶矩和二阶矩估计: 使用指数加权移动平均来更新梯度的一阶矩估计 m 和二阶矩估计 v,分别通过以下公式计算:

    mt=β1⋅mt−1+(1−β1)⋅∇Jtvt=β2⋅vt−1+(1−β2)⋅(∇Jt)2 m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot \nabla J_t \\ v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot (\nabla J_t)^2 mt=β1mt1+(1β1)Jtvt=β2vt1+(1β2)(Jt)2

    其中,∇J 是梯度,β1 和 β*2 是衰减因子,一般取接近于1的值。

  4. 校正偏差: 由于在初始时 mv

被初始化为零向量,它们可能会偏向零。为了校正这一偏差,使用以下公式进行修正:

m^=mt1−β1tv^=vt1−β2t \hat{m} = \frac{m_t}{1 - \beta_1^t}\\ \hat{v} = \frac{v_t}{1 - \beta_2^t} m^=1β1tmtv^=1β2tvt

其中,t 是当前迭代的次数。

  1. 更新参数: 使用修正后的一阶矩估计 *m* 和二阶矩估计 *v* 来更新模型参数。学习率 α 是一个控制更新步长的超参数。
    θ=θ−α⋅m^v^+ϵ \theta = \theta - \alpha \cdot \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon} θ=θαv^+ϵm^

    其中,ϵ 是一个很小的数,避免除以零的情况。

Adam算法的优点在于它能够自适应地调整学习率,同时结合了动量项,有助于加速收敛并在参数空间中更有效地搜索。它在实践中通常表现出色,并被广泛用于深度学习中的模型训练。

权重的初始化

**为什么不能将权重初始值设为 0 呢?**严格地说,为什么不能将权重初始
值设成一样的值呢?这是因为在误差反向传播法中,所有的权重值都会进行
相同的更新。

比如,在 2 层神经网络中,假设第 1 层和第 2 层的权重为 0。这
样一来,正向传播时,因为输入层的权重为 0,所以第 2 层的神经元全部会
被传递相同的值。第 2 层的神经元中全部输入相同的值,这意味着反向传播
时第 2 层的权重全部都会进行相同的更新。因此,权重被更新为相同的值,并拥有了对称的值(重复的值)。这使得神经网络拥有许多不同的权重的意义丧失了。为了防止“权重均一化”(严格地讲,是为了瓦解权重的对称结构),必须随机生成初始值。

权重消失:

这里假设神经网络有 5 层,每层有 100 个神经元。然后,用高斯分布随机生成 1000 个数据作为输入数据,并把它们传给 5 层神经网络。激活函数使用 sigmoid 函数,各层的激活值的结果保存在 activations 变量中。

在这里插入图片描述

各层的激活值呈偏向 0 和 1 的分布。梯度的判断要根据激活函数的类型来看。这里使用的 sigmoid函数是 S 型函数,随着输出不断地靠近 0 (或者靠近 1),它的导数的值逐渐接近 0。因此,偏向 0 和 1 的数据分布会造成反向传播中梯度的值不断变小,最后消失。这个问题称为梯度消失 (gradient vanishing)。

在这里插入图片描述

这次呈集中在 0.5 附近的分布。因为不像刚才的例子那样偏向 0 和 1,所以不会发生梯度消失的问题。但是,激活值的分布有所偏向,说明在表现力上会有很大问题。所有的神经元都输出同样的值,对于网络来说没有意义了。

为了解决这个问题,就有论文中提到了Xavier 初始值。
在这里插入图片描述

He初始化

当前一层的节点数为 n 时,He 初始值使用标准差为2n\sqrt{\frac{2}{n}}n2,当Xavier 初始值是2n\sqrt{\frac{2}{n}}n2的高斯分布时,(直观上)可以解释为,因为 ReLU 的负值区域的值为 0,为了使它更有广度,所以需要 2 倍的系数。

总结一下,当激活函数使用 ReLU 时,权重初始值使用 He 初始值,当激活函数为 sigmoid 或 tanh 等 S 型曲线函数时,初始值使用 Xavier 初始值。这是目前的最佳实践。

Batch Normalization

Batch Norm 的思路是调整各层的激活值分布使其拥有适当的广度。

做法:

Batch Norm,顾名思义,以进行学习时的 mini-batch 为单位,按 mini-batch 进行正规化。具体而言,就是进行使数据分布的均值为 0、方差为 1 的正规化。通过将这个处理插入到激活函数的前面(或者后面) ,可以减小数据分布的偏向。

好处:

• 可以使学习快速进行(可以增大学习率)。
• 不那么依赖初始值(对于初始值不用那么神经质)。
• 抑制过拟合(降低 Dropout 等的必要性)。

正则化

过拟合:拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。

出现的原因:• 模型拥有大量参数、表现力强。 • 训练数据少。

如何抑制:

  1. 权值衰减,该方法通过在学习的过程中对大的权重进行惩罚,来抑制过拟合。这个在损失函数后加上λW\lambda WλW来实现。

神经网络的学习目的是减小损失函数的值。这时,例如为损失函数加上权重的平方范数(L2 范数)。这样一来,就可以抑制权重变大。用符号表示的话,如果将权重记为 W,L2 范数的权值衰减就是12λW2\frac{1}{2}\lambda W^221λW2后将这个
加到损失函数上。这里,λ 是控制正则化强度的超参数。λ设置得越大,对大的权重施加的惩罚就越重。此外,将12λW2\frac{1}{2}\lambda W^221λW2的求导结果变成 λW 。方便计算。

  1. Dropout

    Dropout 是一种在学习的过程中随机删除神经元的方法。训练时,随机
    选出隐藏层的神经元,然后将其删除。

CNN卷积神经网络

CNN中有卷积层和池化层,存在比较多的Conv-ReLU-Pooling操作。其中有padding(填充),stride(步长)等。

术语:输入 :输入特征图,输出:输出特征图

卷积层

可以理解为,卷积运算以一定间隔滑动滤波器的窗口并应用。

(N,C,H,W)依次批次,通道数,高,宽,来进行记录和运算。

池化层

池化是缩小高、长方向上的空间的运算。

实现

基于im2col提高卷积运算的效率,把输入的数据展开成适合滤波器(权重)的形式。在这里插入图片描述

池化层的例子可以帮助理解,要运算的那一个(2×2)矩阵,展开成一行向量,然后再把所有的向量合并,就变成对矩阵进行操作,极大的方便了运算。

CNN的代表

LeNet

在这里插入图片描述

AlexNet

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值