Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lzh_me
apachecn-dl-zh
提交
e09ab47f
A
apachecn-dl-zh
项目概览
lzh_me
/
apachecn-dl-zh
与 Fork 源项目一致
Fork自
OpenDocCN / apachecn-dl-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-dl-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e09ab47f
编写于
8月 28, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-08-28 21:28:45
上级
cf24dd6d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
44 addition
and
28 deletion
+44
-28
docs/handson-tl-py/2.md
docs/handson-tl-py/2.md
+44
-28
未找到文件。
docs/handson-tl-py/2.md
浏览文件 @
e09ab47f
...
...
@@ -492,23 +492,23 @@ Out [1]:
通常,在 ML 中,我们希望最小化几个变量
`f`
的实值函数:
`R^n -> R`
。 几个变量的实值函数的一个简单示例是热板温度函数
`f(x1, x2) = 50 - x1^2 - 2x2^2`
,其在板上的坐标为
`x = (x1, x2)`
。 在深度学习中,我们通常最小化损失函数,该函数是多个变量(例如神经网络中的权重)的函数。 这些函数具有许多局部最小值,许多鞍点被非常平坦的区域包围,并且它们可能具有也可能没有任何全局最小值。 所有这些使得优化此类功能非常困难。
几个变量的函数的导数表示为偏导数,当我们更改其中一个输入变量
`x[i]`
时,函数将衡量函数的变化率 输入变量常量。 关于所有变量的偏导数向量称为
`f`
的
**梯度向量**
,用
`∇f`
表示。 我们还可以找出函数相对于任意方向
!
[](
img/7453a5d1-4826-47f8-bff3-93e57214e1cb.png
)
(单位向量)的变化速度。 这是通过在单位向量!
[](
img/9d284e1e-ba87-4fdf-ad26-6fa3fe11d2f0.png
)
,即点积!
[](
img/80cad1ea-5177-4884-9617-442850bcbf2f.png
)
的方向上投影梯度向量
`∇f`
来计算的。 这在!
[](
img/f443e501-7c1a-4178-83ba-57a4570cac93.png
)
方向上被称为
`f`
的
**定向导数**
,通常用!
[](
img/288daaeb-84d1-4175-8929-81e2947101a3.png
)
表示。 为了使
`f`
最小化,我们需要找到一个方向!
[](
img/d482809f-0e10-45e6-8321-9859a4c068ce.png
)
,在其中要更改!
[](
img/30eca925-b966-4297-9627-8c75345a7cff.png
)
,以使
`f`
的值最大程度地减小。
几个变量的函数的导数表示为偏导数,当我们更改其中一个输入变量
`x[i]`
时,函数将衡量函数的变化率 输入变量常量。 关于所有变量的偏导数向量称为
`f`
的
**梯度向量**
,用
`∇f`
表示。 我们还可以找出函数相对于任意方向
`v`
(单位向量)的变化速度。 这是通过在单位向量
`v`
,即点积
`∇f · v`
的方向上投影梯度向量
`∇f`
来计算的。 这在
`v`
方向上被称为
`f`
的
**定向导数**
,通常用
`∇[v]`
表示。 为了使
`f`
最小化,我们需要找到一个方向
`u`
,在其中要更改
`x`
,以使
`f`
的值最大程度地减小。
令
!
[](
img/a00a62b9-5e97-490d-97ee-800fb15a456a.png
)
为非常接近!
[](
img/6e0e4adc-92fd-419f-8809-aca43ca684e1.png
)
的点,即!
[](
img/3f400373-77e3-4fbe-8655-b312ddf67dc5.png
)
非常小。 首先,泰勒级数围绕!
[](
img/d90cb654-5761-44ca-b03a-e253fed0e9b2.png
)
的阶展开式为:
令
`x[a]`
为非常接近
`x`
的点,即
`||x - x[a]||`
非常小。 首先,泰勒级数围绕
`x`
的阶展开式为:
![](
img/c7b1a382-402e-4cd3-8c9a-783da142e863.png
)
上式中的最后一项对于
!
[](
img/93c63280-e0c9-49ad-b444-bd4c0edded2d.png
)
足够接近!
[](
img/0d2a1479-384c-4e61-b85e-ff85ae34a29f.png
)
可以忽略。 第二项表示
`f`
沿!
[](
img/f9c99c79-4b1c-4293-9227-179a6277c4d8.png
)
的方向导数。 这里有:
上式中的最后一项对于
`x[a]`
足够接近
`x`
可以忽略。 第二项表示
`f`
沿
`x[a] - x`
的方向导数。 这里有:
![](
img/323c9d93-2e26-419b-9ed4-16099e6a5350.png
)
因此,如果
`cos(θ)`
最小,则
!
[](
img/b074fe7b-5c31-4dca-97b3-b7f37a8ee172.png
)
最大减小,即 -1,如果
`θ = π`
,即!
[](
img/37f6f397-2a16-407c-be9f-22e1ff9df205.png
)
应该指向与梯度向量,
`f`
相反的方向,则!
[](
img/b074fe7b-5c31-4dca-97b3-b7f37a8ee172.png
)
会最大程度地减小。 这是最陡下降方向:!
[](
img/4ddc9f0b-c283-4a72-9649-82b5ae997c49.png
)
或
**最陡梯度下降**
的方向。 我们在下图中对此进行说明:
因此,如果
`cos(θ)`
最小,则
`f(x)`
最大减小,即 -1,如果
`θ = π`
,即
`x[a] - x`
应该指向与梯度向量,
`f`
相反的方向,则
`f(x)`
会最大程度地减小。 这是最陡下降方向:
`-∇f`
或
**最陡梯度下降**
的方向。 我们在下图中对此进行说明:
![](
img/dc2ec3d2-6f44-4905-85bf-cf64dc2599ed.png
)
热板
*热板*
示例:给定坐标(
`x`
和
`y`
)上的温度由函数
`f(x, y) = 50 - y^2 - 2x^2`
表示。 板在中心
`(0, 0)`
处最热,温度为 50。点
`(x, y)`
处的梯度向量由给出
`f = (-4x, -2y)`
。 板上的点
`(2.3, 2)`
的温度为
**40**
。 该点位于恒温轮廓上。 显然,如红色箭头所示,在与梯度相反的方向上移动,步长为
ε
,温度降低至
**30**
。
*热板*
示例:给定坐标(
`x`
和
`y`
)上的温度由函数
`f(x, y) = 50 - y^2 - 2x^2`
表示。 板在中心
`(0, 0)`
处最热,温度为 50。点
`(x, y)`
处的梯度向量由给出
`f = (-4x, -2y)`
。 板上的点
`(2.3, 2)`
的温度为
**40**
。 该点位于恒温轮廓上。 显然,如红色箭头所示,在与梯度相反的方向上移动,步长为
`ε`
,温度降低至
**30**
。
让我们使用
`tensorflow`
实现热板温度函数的梯度下降优化。 我们需要初始化梯度下降,所以让我们从
`x = y = 2`
开始:
...
...
@@ -554,11 +554,19 @@ step (9) x=57.85,y=12.38347, T=-6796.81, Gradient=[-231.40375, -24.766947]
# 雅可比矩阵和黑森矩阵
有时,我们需要优化其输入和输出为向量的函数。 因此,对于输出向量的每个分量,我们需要计算梯度向量。 对于
!
[](
img/d2a960c4-8726-4451-b37b-87c7453cc2d0.png
)
,我们将有
`m`
个梯度向量。 通过将它们排列成矩阵形式,我们得到
`n x m`
个偏导数!
[](
img/b302ed2d-cd9a-4870-9f71-fc6bc31b7871.png
)
的矩阵,称为
**Jacobian 矩阵**
。
有时,我们需要优化其输入和输出为向量的函数。 因此,对于输出向量的每个分量,我们需要计算梯度向量。 对于
`f: R^n -> R^m`
,我们将有
`m`
个梯度向量。 通过将它们排列成矩阵形式,我们得到
`n x m`
个偏导数
`J[ij] = ∂f(x)[i]/∂x[j]`
的矩阵,称为
**Jacobian 矩阵**
。
对于单个变量的实值函数,如果要在某个点测量函数曲线的曲率,则需要计算在更改输入时导数将如何变化。 这称为
**二阶导数**
。 二阶导数为零的函数没有曲率,并且是一条平线。 现在,对于几个变量的函数,有许多二阶导数。 这些导数可以布置在称为
**Hessian 矩阵**
的矩阵中。 由于二阶偏导数是对称的,即
!
[](
img/3657cb60-4e28-4e83-bd5b-324637f867ad.png
)
,Hessian 矩阵是实对称的,因此具有实特征值。 相应的特征向量代表不同的曲率方向。 最大和最小特征值的大小之比称为黑森州的
**条件数**
。 它测量沿每个本征维的曲率彼此相差多少。 当 Hessian 条件数较差时,梯度下降的效果较差。 这是因为,在一个方向上,导数迅速增加,而在另一个方向上,它缓慢地增加。 梯度下降并没有意识到这一变化,因此,可能需要很长时间才能收敛。
对于单个变量的实值函数,如果要在某个点测量函数曲线的曲率,则需要计算在更改输入时导数将如何变化。 这称为
**二阶导数**
。 二阶导数为零的函数没有曲率,并且是一条平线。 现在,对于几个变量的函数,有许多二阶导数。 这些导数可以布置在称为
**Hessian 矩阵**
的矩阵中。 由于二阶偏导数是对称的,即
:
对于我们的温度示例,Hessian 为!
[](
img/96c6867c-f6a9-4daa-bb4b-aa31e80cf6a9.png
)
。 最大曲率的方向是最小曲率的方向的两倍。 因此,沿着
`y`
遍历,我们将更快地到达最小点。 从前面的
*热板*
图中所示的温度轮廓中也可以看出这一点。
![](
img/3657cb60-4e28-4e83-bd5b-324637f867ad.png
)
Hessian 矩阵是实对称的,因此具有实特征值。 相应的特征向量代表不同的曲率方向。 最大和最小特征值的大小之比称为黑森州的
**条件数**
。 它测量沿每个本征维的曲率彼此相差多少。 当 Hessian 条件数较差时,梯度下降的效果较差。 这是因为,在一个方向上,导数迅速增加,而在另一个方向上,它缓慢地增加。 梯度下降并没有意识到这一变化,因此,可能需要很长时间才能收敛。
对于我们的温度示例,Hessian 为:
![](
img/96c6867c-f6a9-4daa-bb4b-aa31e80cf6a9.png
)
最大曲率的方向是最小曲率的方向的两倍。 因此,沿着
`y`
遍历,我们将更快地到达最小点。 从前面的
*热板*
图中所示的温度轮廓中也可以看出这一点。
我们可以使用二阶导数曲率信息来检查最佳点是最小还是最大。 对于单个变量,
`f'(x) = 0`
,
`f''(x) > 0`
表示
`x`
是
`f`
的局部最小值, 并且
`f'(x) = 0`
,
`f''(x) < 0`
表示
`x`
是局部最大值。 这称为
**二阶导数测试**
(请参见下图
*解释曲率*
)。 类似地,对于几个变量的函数,如果 Hessian 在
`x`
为正定(即所有本征值均为正),则
`f`
会在
`x`
达到局部最小值。 如果 Hessian 在
`x`
处为负定值,则
`f`
在
`x`
处达到局部最大值。 如果 Hessian 同时具有正和负特征值,则
`x`
是
`f`
的鞍点。 否则,测试没有定论:
...
...
@@ -742,7 +750,7 @@ history = model.fit(X, y, batch_size=5, epochs=30,verbose=2)
![](
img/780a5531-7c6f-4872-b6fd-dba4f22ac05f.png
)
该误差导数直接取决于 Sigmoid 函数
!
[](
img/d1c377c4-f931-40de-9351-bd1a7960efcb.png
)
的导数。 现在,当
`y[n]`
高度负值时,Sigmoid 函数趋于 0;当
`y[n]`
高度正值时,Sigmoid 函数趋于 1。 从 Sigmoid 曲线的平坦水平区域可以明显看出,对于
`y[n]`
的这种值,梯度可以缩小得太小。 因此,即使
`t[n]`
和
`y[n]`
不一致,对于这些数据点,平方误差导数也将具有很小的更新。 很多 也就是说,它们被网络严重错误分类。 这称为
**消失梯度问题**
。 因此,基于最大似然的交叉熵损失几乎始终是训练逻辑单元的首选损失函数。
该误差导数直接取决于 Sigmoid 函数
`σ'(y[n])`
的导数。 现在,当
`y[n]`
高度负值时,Sigmoid 函数趋于 0;当
`y[n]`
高度正值时,Sigmoid 函数趋于 1。 从 Sigmoid 曲线的平坦水平区域可以明显看出,对于
`y[n]`
的这种值,梯度可以缩小得太小。 因此,即使
`t[n]`
和
`y[n]`
不一致,对于这些数据点,平方误差导数也将具有很小的更新。 很多 也就是说,它们被网络严重错误分类。 这称为
**消失梯度问题**
。 因此,基于最大似然的交叉熵损失几乎始终是训练逻辑单元的首选损失函数。
# 损失函数
...
...
@@ -832,7 +840,7 @@ with tf.Session() as sess:
单层非线性单元对于它可以学习的输入输出转换的能力仍然有限。 可以通过查看 XOR 问题来解释。 在 XOR 问题中,我们需要一个神经网络模型来学习 XOR 函数。 XOR 函数采用两个布尔输入,如果它们不同则输出 1,如果输入相同则输出 0。
我们可以将其视为输入模式为
`X = {(0, 0), (0, 1), (1, 0), (1, 1)}`
的模式分类问题。 第一个和第四个在类 0 中,其他在第 1 类中。让我们将此问题视为回归问题,损失为
**均方误差**
(
**MSE**
),并尝试使用线性单元。 通过分析求解,得出所需权重:
!
[](
img/55fd42ef-4c13-4489-9347-c211bf44fb7c.png
)
和偏差:!
[](
img/17cef5d3-7769-4265-be84-58350fa79917.png
)
。 该模型为所有输入值输出 0.5。 因此,简单的线性神经元无法学习 XOR 函数。
我们可以将其视为输入模式为
`X = {(0, 0), (0, 1), (1, 0), (1, 1)}`
的模式分类问题。 第一个和第四个在类 0 中,其他在第 1 类中。让我们将此问题视为回归问题,损失为
**均方误差**
(
**MSE**
),并尝试使用线性单元。 通过分析求解,得出所需权重:
`w = (0, 0)`
和偏差:
`b = 1/2`
。 该模型为所有输入值输出 0.5。 因此,简单的线性神经元无法学习 XOR 函数。
解决 XOR 问题的一种方法是使用输入的不同表示形式,以便线性模型能够找到解决方案。 这可以通过向网络添加非线性隐藏层来实现。 我们将使用带有两个隐藏单元的 ReLU 层。 输出是布尔值,因此最适合的输出神经元是逻辑单元。 我们可以使用二进制交叉熵损失来学习权重:
...
...
@@ -894,7 +902,7 @@ plt.scatter(x=projection[:, 0], y=projection[:, 1], c=('g'))
反向传播技术是在 1970 年代发明的,它是一种用于对复杂的嵌套函数或函数功能进行自动区分的一般优化方法。 但是,直到 1986 年,Rumelhart,Hinton 和 Williams 发表了一篇论文,标题为
[
《通过反向传播的误差学习算法》
](
https://www.iro.umontreal.ca/~vincentp/ift3395/lectures/backprop_old.pdf
)
,该算法的重要性已为大型 ML 社区所认可。 反向传播是最早能够证明人工神经网络可以学习良好内部表示的方法之一。 也就是说,它们的隐藏层学习了非平凡的功能。
反向传播算法是在单个训练示例上针对每个权重计算误差导数
!
[](
img/780f07f3-072e-4f03-8501-24a3786efbe4.png
)
的有效方法。 为了理解反向传播算法,让我们首先代表一个带有计算图符号的神经网络。 神经网络的计算图将具有节点和有向边,其中节点代表变量(张量),边代表连接到下一个变量的变量的运算。 如果
`y = f(x)`
,则变量
`x`
通过有向边连接到
`y`
,对于某些功能
`f`
。
反向传播算法是在单个训练示例上针对每个权重计算误差导数
`dE/dθ`
的有效方法。 为了理解反向传播算法,让我们首先代表一个带有计算图符号的神经网络。 神经网络的计算图将具有节点和有向边,其中节点代表变量(张量),边代表连接到下一个变量的变量的运算。 如果
`y = f(x)`
,则变量
`x`
通过有向边连接到
`y`
,对于某些功能
`f`
。
例如,逻辑单元的图形可以表示如下:
...
...
@@ -902,29 +910,31 @@ plt.scatter(x=projection[:, 0], y=projection[:, 1], c=('g'))
(左)逻辑回归作为计算图。 (右)三层网络计算图的 BP 算法信息流
我们用
`u[1], u[2], ..., u[n]`
表示计算节点。 另外,我们按顺序排列节点,以便可以一个接一个地计算它们。
`u[n]`
是一个标量-损失函数。 让我们用节点
!
[](
img/8d79995a-b082-4768-9f41-24bc1876767d.png
)
表示网络的参数或权重。 要应用梯度下降,我们需要计算所有导数!
[](
img/d632f776-113d-4a9f-b1ae-f66c03800e11.png
)
。 可以通过遵循从输入节点到最终节点!
[](
img/8919728b-7557-44b8-8fd1-b475ea3ac5c1.png
)
的计算图中的有向路径来计算该图的正向计算。 这称为
**前向传播**
。
我们用
`u[1], u[2], ..., u[n]`
表示计算节点。 另外,我们按顺序排列节点,以便可以一个接一个地计算它们。
`u[n]`
是一个标量-损失函数。 让我们用节点
`θ[k]`
表示网络的参数或权重。 要应用梯度下降,我们需要计算所有导数
`∂u^n/∂θ[k]`
。 可以通过遵循从输入节点到最终节点
`∂u^n`
的计算图中的有向路径来计算该图的正向计算。 这称为
**前向传播**
。
由于图中的节点为张量,因此要计算偏导数
!
[](
img/fea9ce1d-e694-44a2-97c6-8d3199f28e9c.png
)
,将使用多个变量函数的导数链式规则,该规则由雅可比矩阵与梯度的乘积表示。 反向传播算法涉及一系列这样的雅可比梯度积。
由于图中的节点为张量,因此要计算偏导数
`∂u^n/∂θ[k]`
,将使用多个变量函数的导数链式规则,该规则由雅可比矩阵与梯度的乘积表示。 反向传播算法涉及一系列这样的雅可比梯度积。
反向传播算法表示如下:
1.
给定输入向量
!
[](
img/437e289f-8d33-4ea2-aafe-6c6113edfeba.png
)
,目标向量!
[](
img/d1691af1-2b86-419c-971e-13d4fa14d885.png
)
,用于测量网络错误的成本函数
`C`
以及网络的初始权重集,以计算网络的前向通过并计算损耗
`C`
1.
给定输入向量
`X = {x[n]}`
,目标向量
`Y = {t[n]}`
,用于测量网络错误的成本函数
`C`
以及网络的初始权重集,以计算网络的前向通过并计算损耗
`C`
2.
向后传递-对于每个训练示例
!
[](
img/11b43902-51d6-40ce-914e-052f4d4571e9.png
)
,针对每个层参数/权重计算损耗的导数
`C`
-此步骤讨论如下:
2.
向后传递-对于每个训练示例
`(x[n], t[n])`
,针对每个层参数/权重计算损耗的导数
`C`
-此步骤讨论如下:
1.
通过对输入目标对或它们的小批量的所有梯度求平均值来组合各个梯度
2.
更新每个参数
!
[](
img/2390e48b-8e9b-415e-a628-158fdda7e2b1.png
)
,α
为学习率
2.
更新每个参数
`Δθ[l] = -α · ∂C/∂θ[l]`
,
`α`
为学习率
我们将使用完全连接的三层神经网络解释
*反向传播*
。 上图显示了为此的计算图。 令
`z(i)`
表示图中的计算节点。 为了执行反向传播,导数
!
[](
img/861ffce6-b1a1-4b20-a4e8-0d7aee34152b.png
)
的计算将与正向传递的反向顺序完全相同。 这些由向下箭头指示。 让我们表示关于层
`l`
的输入
`z(l)`
的成本函数的导数 !
[](
img/147cb37b-5b4e-42c8-a1a8-11cd608e32ef.png
)
。 对于最顶层,让!
[](
img/396956bf-0eda-471a-a398-3e739b37e214.png
)
。 为了递归计算,让我们考虑一个单层。 一层具有输入
`z(l)`
和输出
`z(l+1)`
。 同样,该层将接受输入!
[](
img/849d376a-0a44-417d-9b75-9474549e2b03.png
)
并产生!
[](
img/36eaace3-e9a1-4cd0-af03-7f709279986a.png
)
和!
[](
img/480965bb-c9e2-42b1-9b06-0003135d17a1.png
)
。
我们将使用完全连接的三层神经网络解释
*反向传播*
。 上图显示了为此的计算图。 令
`z(i)`
表示图中的计算节点。 为了执行反向传播,导数
`∂C/∂z(i)`
的计算将与正向传递的反向顺序完全相同。 这些由向下箭头指示。 让我们表示关于层
`l`
的输入
`z(l)`
的成本函数的导数
`δ(l)`
。 对于最顶层,让
`δ(4) = 1`
。 为了递归计算,让我们考虑一个单层。 一层具有输入
`z(l)`
和输出
`z(l+1)`
。 同样,该层将接受输入
`δ(l + 1)`
并产生
`δ(l)`
和
`∂C/∂θ[l]`
。
对于层
`l`
,!
[](
img/05f06392-f5cc-44ff-8755-ebeded169ff2.png
)
对于层
`l`
:
`i`
代表梯度!
[](
img/8caf892b-6c7d-44d5-a6d9-7203956b40b4.png
)
的第
`i`
个分量。
![](
img/05f06392-f5cc-44ff-8755-ebeded169ff2.png
)
`i`
代表梯度
`δ(l)[i]`
的第
`i`
个分量。
因此,我们得出了用于计算反向消息的递归公式。 使用这些,我们还可以计算关于模型参数的成本导数,如下所示:
![](
img/05544f28-196c-4245-83df-4fcf348f236d.png
)
反向传播算法在计算图中相对于其祖先
`x`
,计算标量成本函数
`z`
的梯度。 该算法开始于计算关于其本身的成本
`z`
的导数
!
[](
img/4931835b-36f1-4802-8af9-b2163f218c48.png
)
。 可以通过将当前梯度乘以产生
`z`
的运算的雅可比行列式来计算关于
`z`
父级的梯度。 我们一直向后遍历计算图并乘以雅可比行列式,直到达到输入
`x`
为止。
反向传播算法在计算图中相对于其祖先
`x`
,计算标量成本函数
`z`
的梯度。 该算法开始于计算关于其本身的成本
`z`
的导数
`∂z/∂z = 1`
。 可以通过将当前梯度乘以产生
`z`
的运算的雅可比行列式来计算关于
`z`
父级的梯度。 我们一直向后遍历计算图并乘以雅可比行列式,直到达到输入
`x`
为止。
# 神经网络学习中的挑战
...
...
@@ -938,9 +948,11 @@ plt.scatter(x=projection[:, 0], y=projection[:, 1], c=('g'))
![](
img/28d6a247-eb12-45c2-a471-8673b8610e63.png
)
其中
`g`
是梯度向量,
`H`
是
`f(x)`
在
`x[0]`
时的 Hessian。 如果ε是我们使用的学习率,则根据梯度下降的新点为
`x[0] - ε[g]`
。 将其替换为 Taylor 系列展开式,我们得到!
[](
img/88f6f0bb-b7d9-4a33-8d96-f46e8db8138b.png
)
。
其中
`g`
是梯度向量,
`H`
是
`f(x)`
在
`x[0]`
时的 Hessian。 如果ε是我们使用的学习率,则根据梯度下降的新点为
`x[0] - ε[g]`
。 将其替换为 Taylor 系列展开式,我们得到:
![](
img/88f6f0bb-b7d9-4a33-8d96-f46e8db8138b.png
)
注意,如果
`-ε g^t g + ½ε^2 g^T H[g] > 0`
,则与
`x[0]`
相比,新点的函数值会增加。 同样,在存在强梯度的情况下,我们将具有较高的平方梯度范数
!
[](
img/1aed3478-51ba-4d72-ab7d-319d0cdf1658.png
)
,但同时,如果其他数量为
`g^T H[g]`
增长一个数量级,那么我们将看到
`f(x)`
的下降速度非常缓慢。 但是,如果此时可以缩小学习率ε,则可能会在某种程度上使这种影响无效,因为
`g^T H[g]`
数量乘以!
[](
img/2167107a-9494-45ca-8029-30567768daba.png
)
。 可以通过在训练时期绘制平方梯度范数和
`g^T H[g]`
来监测疾病的影响。 我们在
*热板*
中看到了如何计算梯度范数的示例。
注意,如果
`-ε g^t g + ½ε^2 g^T H[g] > 0`
,则与
`x[0]`
相比,新点的函数值会增加。 同样,在存在强梯度的情况下,我们将具有较高的平方梯度范数
`||g||^2 = g^T g`
,但同时,如果其他数量为
`g^T H[g]`
增长一个数量级,那么我们将看到
`f(x)`
的下降速度非常缓慢。 但是,如果此时可以缩小学习率ε,则可能会在某种程度上使这种影响无效,因为
`g^T H[g]`
数量乘以
`ε^2`
。 可以通过在训练时期绘制平方梯度范数和
`g^T H[g]`
来监测疾病的影响。 我们在
*热板*
中看到了如何计算梯度范数的示例。
# 局部最小值和鞍点
...
...
@@ -1010,12 +1022,16 @@ adam = optimizers.Adam(clipnorm=1.)
# 初始化启发式
让我们考虑具有
*m*
输入和
*n*
输出单位的密集层:
让我们考虑具有
`m`
输入和
`n`
输出单位的密集层:
1.
从均匀分布
`[-1/√m, 1/√m]`
中采样每个重量。
1.
从均匀分布!
[](
img/b7040153-d418-490d-bbde-52337e6c9c8d.png
)
中采样每个重量。
2.
Glorot 和 Bengio 建议使用统一分布初始化的规范化版本:
2.
Glorot 和 Bengio 建议使用统一分布初始化的规范化版本:!
[](
img/f9f07288-c498-4754-98ab-67000c76d58c.png
)
。 它被设计为在每一层中具有相同的梯度变化,称为
**Glorot Uniform**
。
3.
从平均值为 0 且方差为!
[](
img/ee49aebe-d4f7-4d07-b7bb-d7df651b096d.png
)
的正态分布中采样每个权重。 这类似于 Glorot Uniform,称为
**Glorot Normal**
。
![](img/f9f07288-c498-4754-98ab-67000c76d58c.png)
它被设计为在每一层中具有相同的梯度变化,称为 **Glorot Uniform** 。
3.
从平均值为 0 且方差为
`√(2/(m+n))`
的正态分布中采样每个权重。 这类似于 Glorot Uniform,称为
**Glorot Normal**
。
4.
对于非常大的图层,单个权重将变得非常小。 要解决此问题,另一种方法是仅初始化
*k*
非零权重。 这称为
**稀疏初始化**
。
5.
将权重初始化为随机正交矩阵。 可以在初始权重矩阵上使用 Gram-Schmidt 正交化。
...
...
@@ -1084,8 +1100,8 @@ RMSprop 通过采用先前平方梯度的 EWMA 来修改 AdaGrad 算法。 它
可以看到,像前面示例中的多项式一样,过拟合模型的权重非常大。 为了避免这种情况,可以将罚分项Ω添加到目标函数中,这将使权重更接近原点。 因此,惩罚项应该是权重范数的函数。 同样,可以通过乘以超参数α来控制惩罚项的效果。 因此我们的目标函数变为:
`E(w) + αΩ(w)`
。 常用的惩罚条款是:
*
**L2 正则化**
:惩罚项由
!
[](
img/4dd47053-3b9d-460f-8bd7-cf9137534599.png
)
给出。 在回归文献中,这称为
**岭回归**
。
*
**L1 正则化**
:惩罚项由
!
[](
img/ae806812-bef5-4846-a7fd-698bdd380b0e.png
)
给出。 这称为
**LASSO 回归**
。
*
**L2 正则化**
:惩罚项由
`Ω = 1/2 · ||w||^2`
给出。 在回归文献中,这称为
**岭回归**
。
*
**L1 正则化**
:惩罚项由
`Ω = ||w||[1] = Σ[i](w[i])`
给出。 这称为
**LASSO 回归**
。
L1 正则化导致稀疏解; 也就是说,它会将许多权重设置为零,因此可以作为回归问题的良好特征选择方法。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录