type
status
date
slug
summary
tags
category
icon
password

一、代码练习-螺旋数据分类

机器学习中用于验证非线性分类模型的性能,核心特点是数据点在二维空间中呈现螺旋状的布局,不同类型也就是不同颜色的点构成的螺旋线的边界不清晰,使得分类的边界呈现高度的非线形。

代码练习过程

遇到的问题:仅下载plot脚本会报错ziegler.png找不到,这应该与挂载的云端硬盘和执行环境不一致导致,考虑到文件不大,就在导入plot之前将该文件下载到/res 下了。
线形分类代码:
运行中截图:
准确率50%左右
notion image
可视化结果:
足以说明该类任务线形分类方法无法胜任。
notion image
 
2层卷积代码:
与线性分类模型之间唯一的差别就是在原来线性模型的两个线性层中间加入了relu激活函数。
运行过程截图:
准确率95%左右。
notion image
运行结果截图:
可以看到,分类效果明显好于线性模型。
notion image
 

二、问题总结:

AlexNet特点:

  1. ReLU激活函数
    1. ReLU激活函数f(x) = max(0, x),相比于传统的sigmoid1/(1+e⁻ˣ)函数,使用ReLU激活函数因为对于正数输入导数始终为1,不会出现像sigmoid函数这样在输入过大时导数趋向于0,从而导致在反向传播时梯度不衰减,收敛过慢;其次就是sigmoid函数的指数运算涉及到浮点数运算,运算速度更慢,深层网络该问题更明显,但是ReLU不存在这样的问题。
  1. Dropout正则化
    1. 全连接层使用0.5概率的Dropout,显著减少过拟合(错误率降低1-2%)。
      训练过程中每个神经元以50%概率保留,剩余丢弃,为了保证激活值的期望不变,需要进行激活缩放,即保留的神经元输出需要缩放
      传统神经网络中,由于存在部分神经元依赖特定的特征或者相邻的神经元,导致模型过拟合。但Dropout强制每个神经元独立学习鲁棒特征(随机丢弃导致的鲁棒性),降低对局部特征的依赖。
  1. 采用重叠池化 池化窗口(3×3)大于步长(2),提升特征丰富性,缓解过拟合。
    1. 传统池化:LeNet采用2×2池化+步长2,相当于每个窗口独立采样,相邻像素无信息交互,导致原始数据75%被丢弃,边缘纹理特征丢失严重。
    2. 重叠池化:AlexNet使用3×3池化窗口+步长2,这样相当于纵向/横向会重叠一个像素,包含了更多的上下文信息,对物体形变的鲁棒性也更高

激活函数作用

激活函数是应用于神经网络中神经元或节点的数学函数。它的主要作用是根据神经元的加权输入决定神经元的输出。简单地说,它决定神经元是否应该被"激活"或"启动",如果是,则决定神经元进入下一层时信号的强度。这种机制对于在网络中引入非线性至关重要,使其能够从数据中学习复杂的模式和关系(比如图像,音频等复杂数据类型)。如果没有激活函数,神经网络无论有多少层,都会表现得像一个简单的线性回归模型,严重限制了它解决复杂现实世界问题的能力。

梯度消失

反向传播过程中,导数趋向于0,使得参数更新缓慢,无法快速收敛甚至不收敛。

神经网络更宽好还是更深好

  • 更深:参数量少,但是并行差;随着深度增加可以更抽象(更复杂的含义);容易梯度消失/爆炸
  • 更宽:参数量大,计算量大;缺乏层次性;梯度传播稳定,容易训练。
简单任务可以用宽而浅的网络,但是复杂任务就不合适了。
因此更深更好,牺牲训练时间,用合理的操作规避梯度消失等问题,适合进行图像处理、自然语言处理等任务。

为什么使用softmax

将神经元的原始输出转为概率分布,解决多分类问题。
与交叉熵损失配合实现高效的梯度计算

SGD和Adam

  • SGD是最基础的优化算法,核心思路是每次从训练数据中随机选一个样本或一点样本,计算损失函数关于模型的梯度,沿着梯度反方向更新参数。这样的处理思路计算更高效,因为对所有参数的处理都是一样的,但随之带来的问题就是在复杂的数据中容易陷入局部最小而无法更新参数。
  • Adam,自适应矩估计,顾名思义,此方法学习率不固定,结合了每个参数的历史梯度和梯度的平方来动态调整不同参数的学习步长。解决上述方法不足,但是存在的问题是内存占用高,因为需要对每个参数额外存储两个矩阵
  • Adam更优。
 
notion快速搭个人博客(真的超快!)泵引理讨论