关灯
得知互动 门户 互联网+ SEO/SEM 查看内容
0

5分钟带你解读Python人工智能优化算法

摘要: 梯度降落是神经网络中盛行的优化算法之一。一样平常来说,我们想要找到最小化偏差函数的权重和毛病。梯度降落算法迭代地更新参数,以使团体网络的偏差最小化。梯度降落是迭代法的一种,可以用于求解最小二乘题目(线性 ...

梯度降落是神经网络中盛行的优化算法之一。一样平常来说,我们想要找到最小化偏差函数的权重和毛病。梯度降落算法迭代地更新参数,以使团体网络的偏差最小化。

5分钟带你解读Python人工智能优化算法

梯度降落是迭代法的一种,可以用于求解最小二乘题目(线性和非线性都可以)。在求解呆板学习算法的模子参数,即无束缚优化题目时,梯度降落(Gradient Descent)是最常接纳的方法之一,另一种常用的方法是最小二乘法。在求解丧失函数的最小值时,可以通过梯度降落法来一步步的迭代求解,得到最小化的丧失函数和模子参数值。反过来,假如我们必要求解丧失函数的最大值,这时候就必要用梯度上升法来迭代了。在呆板学习中,基于根本的梯度降落法开展了两种梯度降落方法,分别为随机梯度降落法和批量梯度降落法。

该算法在丧失函数的梯度上迭代地更新权重参数,直至到达最小值。换句话说,我们沿着丧失函数的斜坡方向下坡,直至到达山谷。根本头脑大抵如图3.8所示。假如偏导数为负,则权重增添(图的左边部门),假如偏导数为正,则权重减小(图中右半部门) 42 。学习速率参数决定了到达最小值所需步数的巨细。

5分钟带你解读Python人工智能优化算法

随机梯度最小化的根本头脑

5分钟带你解读Python人工智能优化算法

偏差曲面

探求全局最好方案的同时制止局部极小值是一件很有挑衅的事变。这是由于偏差曲面有许多的峰和谷,如图3.9所示。偏差曲面在一些方向上大概是高度弯曲的,但在其他方向是平展的。这使得优化过程非常复杂。为了制止网络陷入局部极小值的田地,通常要指定一个冲量(momentum)参数。

5分钟带你解读Python人工智能优化算法

图3.9 典范优化题目的复杂偏差曲面

我很早就发现,利用梯度降落的反向流传通常收敛得非常迟钝,大概根本不收敛。在编写第一个神经网络时,我利用了反向流传算法,该网络包罗一个很小的数据集。网络用了3天多的时间才收敛到一个办理方案。幸亏我接纳一些步伐加速了处置惩罚过程。

阐明 固然反向流传相干的学习速率相对较慢,但作为前馈算法,其在展望大概分类阶段是相称快速的。

5分钟带你解读Python人工智能优化算法

随机梯度降落

传统的梯度降落算法利用整个数据集来盘算每次迭代的梯度。对于大型数据集,这会导致冗余盘算,由于在每个参数更新之前,非常相似的样本的梯度会被重新盘算。随机梯度降落(SGD)是真实梯度的近似值。在每次迭代中,它随机选择一个样原来更新参数,并在该样本的相干梯度上移动。因此,它遵守一条曲折的通往极小值的梯度路径。在某种水平上,由于其缺乏冗余,它每每能比传统梯度降落更快地收敛到办理方案。

阐明 随机梯度降落的一个非常好的理论特性是,假如丧失函数是凸的 43 ,那么包管能找到全局最小值。

代码实践

理论已充足多了,接下来敲一敲着实的代码吧。

一维题目

假设我们必要求解的目的函数是:

()=2+1f(x)=x2+1

5分钟带你解读Python人工智能优化算法

显然一眼就知道它的最小值是 =0x=0 处,但是这里我们必要用梯度降落法的 Python 代码来实现。

#!/usr/bin/env python 
# -*- coding: utf-8 -*-
"""
一维题目的梯度降落法示例
"""


def func_1d(x):
"""
目的函数
:param x: 自变量,标量
:return: 因变量,标量
"""
return x ** 2 + 1


def grad_1d(x):
"""
目的函数的梯度
:param x: 自变量,标量
:return: 因变量,标量
"""
return x * 2


def gradient_descent_1d(grad, cur_x=0.1, learning_rate=0.01, precision=0.0001, max_iters=10000):
"""
一维题目的梯度降落法
:param grad: 目的函数的梯度
:param cur_x: 当前 x 值,通过参数可以提供初始值
:param learning_rate: 学习率,也相称于设置的步长
:param precision: 设置收敛精度
:param max_iters: 最大迭代次数
:return: 局部最小值 x*
"""
for i in range(max_iters):
grad_cur = grad(cur_x)
if abs(grad_cur) < precision:
break # 当梯度趋近为 0 时,视为收敛
cur_x = cur_x - grad_cur * learning_rate
print("第", i, "次迭代:x 值为 ", cur_x)

print("局部最小值 x =", cur_x)
return cur_x


if __name__ == '__main__':
gradient_descent_1d(grad_1d, cur_x=10, learning_rate=0.2, precision=0.000001, max_iters=10000)

就是这么酷吧!用Python明白剃度降落,喜好的小同伴点个关注、转发、收藏哦!


路过

雷人

握手

鲜花

鸡蛋

说点什么...

已有0条评论

最新评论...

本文作者
2020-9-26 03:20
  • 0
    粉丝
  • 9605
    阅读
  • 0
    回复

关注帮客优品

扫描关注,了解最新资讯

联系人:叶先生
Q Q:956130084
EMAIL:956130084@qq.com
地址:中国·武汉
热门评论
排行榜

关注我们:微信订阅号

官方微信

APP下载

全国服务Q Q:

956130084

中国·湖北

Email:956130084@qq.com

Copyright   ©2015-2022  站长技术交流论坛|互联网技术交流平台Powered by©Discuz!技术支持:得知网络  

鄂公网安备 42018502006730号

  ( 鄂ICP备15006301号-5 )