【cs231n】lecture 7 Training Neural Networks(下)

Fancier optimization(更有效的优化)

SGD随机梯度下降算法的问题:

  1. 若损失函数对于某个权重W很敏感,而对于其他的W不太敏感,SGD会出现“之”字形的路线跨越等高线达到最低点,在多维度的问题上这个问题更加普遍。
    在这里插入图片描述
  2. 鞍点问题(鞍点saddle point:不是极大值也不是极小值的临界点),在鞍点上,梯度为0,这个点两边的方向,一个方向是梯度增加的方向,另一个方向是梯度减小的方向,对于多维问题,每一个维度都可能出现这种情况。
  3. 噪声问题,可能是由于批量化数据的时候产生的,在整个过程中的随机化处都可能产生,这使损失函数达到最小值的速度比较慢。在这里插入图片描述
    策略

SGD+Momentum,在随机梯度下降中,加入动量项

在这里插入图片描述
Momentum借用了物理中的动量概念,即前几次的梯度也会参与运算。为了表示动量,引入了一个新的变量v,v是之前的梯度的累加,但是每回合都有一定的衰减,p为衰减指数,一般取0.9或者0.99

可以理解为:将一个小球从山顶滚下山,即使到了鞍点,没有梯度,但是仍然还有之前刚下山时积累的动量,所以小球仍然能够越过鞍点,朝梯度下降的方向继续前进。

Nesterov Momentum

Nesterov Momentum是对Momentum的一个改进,在小球向下滚动的过程中,我们希望小球能够提前知道在哪些地方坡面会上升,这样在遇到上升坡面之前,小球就开始减速。这方法就是Nesterov Momentum。

核心思想:Momentum方法只注重 x t x_t xt项,而在Nesterov Momentum中, x t x_t xt可以看作是当前优化的一个“展望”位置,所以,是在 x t + p v t x_t + pv_t xt+pvt处求导。

AdaGrad

在这里插入图片描述
AdaGrad主要的特点是可以自动调整学习率,先对梯度进行一个平方和的累加,每次更新参数的时候需要用学习率除以累加和的开方,这里的1e-7是为了保证除以一个不会为0的数。

这样处理的好处是:若有两个坐标轴,一个方向上的梯度比较大,另一个的梯度比较小,累加小的梯度的平方,可以得到一个比较小的数,更新参数时除以一个小的数就可以得到一个比较大的数,相反,累加大的梯度的平方,得到一个比较大的数,更新参数时除以一个大的数就可以得到一个比较小的数。

存在的问题:随着训练时间的增长,这个平方和一直在增加,导致步长会变得越来越小。

RMSProp

在这里插入图片描述
这是对AdaGrad优化方法的变形,主要解决了上述步长越来越小的问题。这个方法仍然在计算梯度的平方和,但是不是简单的累加,而是给了一个衰减率decay_rate,当前的grad_squared先乘以衰减率,然后再加上当前梯度乘以(1-decay_rate)。这样随着时间的增长,步长不会一直变得越来越小。

Adam

在这里插入图片描述
这是上述两种思想的结合。first_moment是梯度的累加,second_moment是梯度平方和的累加,最后更新参数的时候用学习率乘以first_moment除以second_moment的开方。

这存在的问题是:刚开始我们把second_moment初始化为0,经过第一步之后,second_moment很接近于0,这样可能会导致步长很大,如果刚开始参数的初始化就不合理,再加上一个很大的步长,就会出现问题。

解决方法:增加bias correction来避免刚开始时步长很大的问题。
在这里插入图片描述

*二阶优化

之前的方法都是一阶优化的方法,二阶优化与一阶优化不一样的是不再需要学习率这个参数,但是增加了求二阶导数,根据二阶导数提供的信息,直接跳转到二阶导数最小的点,不再需要学习率。

提高模型在测试集上的准确率:Model Ensembles模型集成

先从不同的随机初始值上训练多个不同的模型,到了测试阶段,我们在这些模型上分别运行测试数据,然后平均这些测试结果。

Regularization(正则化)

正则化的作用是防止模型在训练集上过拟合。之前学习过L1,L2以及二者搭配使用的方法。
在这里插入图片描述
正则化还有其他的方法:Dropout
Dropout的思想是:网络在正向传播的过程中,在某一层上随机失活部分神经元,这样可以使模型的泛化能力更强,而不会过多的依赖某些局部特征。如下图所示
在这里插入图片描述
Dropout方法也可以看作使一种模型集成的学习方法,经过dropout失活部分神经元而得到多种模型,在训练时我们的输出是多个模型结果的加权平均。
在这里插入图片描述
所有正则化方法的共通点:在训练阶段增加随机性,也可以说是增加噪点,而在测试阶段,要努力消除之前增加的随机性。Batch Normalization、Data Augmentation、DropConnect(随机将权重矩阵W中的一些值置零)、Fractional Max Pooling、Stochastic Depth都是这样的思想。

Transfer Learning(迁移学习)

有时候过拟合问题是因为数据集太小,迁移学习的方法就是使用比较小的数据集训练神经网络。其思想是:首先在一个很大的数据集上训练卷积神经网络,然后再使用这个预训练的网络作为初始化网络后进行微调、或者作为特征提取器。
在这里插入图片描述

  • 若数据集接近,数据量较小,可以在原有网络的基础上只训练最后一层线性分类器。
  • 若数据集接近,数据量较大,可以精调网络。
  • 若数据集差别很大,数据量较小,这时候需要重新初始化大部分的网络。
  • 若数据集差别很大,数据量较大,可以精调网络的大多数层。

Model Zoo:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值