Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
d2l-zh
提交
9c10e01d
D
d2l-zh
项目概览
OpenDocCN
/
d2l-zh
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
d2l-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9c10e01d
编写于
8月 24, 2018
作者:
M
muli
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update opt-intro
上级
e7b23676
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
18 addition
and
29 deletion
+18
-29
chapter_optimization/optimization-intro.md
chapter_optimization/optimization-intro.md
+18
-29
未找到文件。
chapter_optimization/optimization-intro.md
浏览文件 @
9c10e01d
# 优化
算法概述
# 优化
与深度学习
本节将讨论优化与深度学习的关系以及优化在深度学习中的挑战。
## 优化与深度学习
在一个深度学习问题中,通常我们会预先定义一个损失函数。有了损失函数以后,我们就可以使用优化算法试图使其最小化。在优化中,这样的损失函数通常被称作优化问题的目标函数(objective function)。依据惯例,优化算法通常只考虑最小化目标函数。其实,任何最大化问题都可以很容易地转化为最小化问题:我们只需把目标函数前面的正号或负号取相反。
本节将讨论优化与深度学习的关系以及优化在深度学习中的挑战。在一个深度学习问题中,通常我们会预先定义一个损失函数。有了损失函数以后,我们就可以使用优化算法试图使其最小化。在优化中,这样的损失函数通常被称作优化问题的目标函数(objective function)。依据惯例,优化算法通常只考虑最小化目标函数。其实,任何最大化问题都可以很容易地转化为最小化问题:我们只需把目标函数前面的正号或负号取相反。
虽然优化为深度学习提供了最小化损失函数的方法,但本质上,这两者之间的目标是有区别的。
在
[
“欠拟合、过拟合和模型选择”
](
../chapter_deep-learning-basics/underfit-overfit.md
)
一节中,我们区分了训练误差和泛化误差。
...
...
@@ -16,7 +11,6 @@
本章中,我们只关注优化算法在最小化目标函数上的表现,而不关注模型的泛化误差。
## 优化在深度学习中的挑战
绝大多数深度学习中的目标函数都很复杂。因此,很多优化问题并不存在解析解,而需要使用基于数值方法的优化算法找到近似解。这类优化算法一般通过不断迭代更新解的数值来找到近似解。我们讨论的优化算法都是这类基于数值方法的算法。
...
...
@@ -49,20 +43,17 @@ def f(x):
gb.set_figsize((4.5, 2.5))
x = np.arange(-1.0, 2.0, 0.1)
fig = gb.plt.figure()
subplt = fig.add_subplot(111)
subplt.annotate('local minimum', xy=(-0.3, -0.25), xytext=(-0.77, -1.0),
arrowprops=dict(facecolor='black', shrink=0.05))
subplt.annotate('global minimum', xy=(1.1, -0.9), xytext=(0.6, 0.8),
arrowprops=dict(facecolor='black', shrink=0.05))
gb.plt.plot(x, f(x))
fig, = gb.plt.plot(x, f(x))
fig.axes.annotate('local minimum', xy=(-0.3, -0.25), xytext=(-0.77, -1.0),
arrowprops=dict(arrowstyle='->'))
fig.axes.annotate('global minimum', xy=(1.1, -0.95), xytext=(0.6, 0.8),
arrowprops=dict(arrowstyle='->'))
gb.plt.xlabel('x')
gb.plt.ylabel('f(x)');
```
深度学习模型的目标函数可能有若干局部最优值。当一个优化问题的数值解在局部最优解附近时,由于目标函数有关解的梯度接近或变成零,最终迭代求得的数值解可能只令目标函数局部最小化而非全局最小化。
### 鞍点
刚刚我们提到,梯度接近或变成零可能是由于当前解在局部最优解附近所造成的。事实上,另一种可能性是当前解在鞍点(saddle point)附近。举个例子,给定函数
...
...
@@ -73,11 +64,9 @@ $$f(x) = x^3,$$
```
{.python .input n=3}
x = np.arange(-2.0, 2.0, 0.1)
fig = gb.plt.figure()
subplt = fig.add_subplot(111)
subplt.annotate('saddle point', xy=(0, -0.2), xytext=(-0.52, -5.0),
arrowprops=dict(facecolor='black', shrink=0.05))
gb.plt.plot(x, x**3)
fig, = gb.plt.plot(x, x**3)
fig.axes.annotate('saddle point', xy=(0, -0.2), xytext=(-0.52, -5.0),
arrowprops=dict(arrowstyle='->'))
gb.plt.xlabel('x')
gb.plt.ylabel('f(x)');
```
...
...
@@ -89,16 +78,16 @@ $$f(x, y) = x^2 - y^2.$$
我们可以找出该函数的鞍点位置。也许你已经发现了,该函数看起来像一个马鞍,而鞍点恰好是马鞍上可坐区域的中心。
```
{.python .input n=4}
fig = gb.plt.figure()
ax = fig.add_subplot(111, projection='3d')
x, y = np.mgrid[-1:1:31j, -1:1:31j]
z = x**2 - y**2
ax.plot_surface(x, y, z, **{'rstride': 1, 'cstride': 1, 'cmap': "Greens_r"})
ax.plot([0], [0], [0], 'ro')
ax.view_init(azim=-50, elev=20)
gb.plt.xticks([-1, -0.5, 0, 0.5, 1])
gb.plt.yticks([-1, -0.5, 0, 0.5, 1])
ax.set_zticks([-1, -0.5, 0, 0.5, 1])
ax = gb.plt.figure().add_subplot(111, projection='3d')
ax.plot_wireframe(x, y, z, **{'rstride':2, 'cstride':2})
ax.plot([0], [0], [0], 'rx')
ticks = [-1, 0, 1]
gb.plt.xticks(ticks)
gb.plt.yticks(ticks)
ax.set_zticks(ticks)
gb.plt.xlabel('x')
gb.plt.ylabel('y');
```
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录