Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
D_ACMER
apachecn-dl-zh
提交
9703f58e
A
apachecn-dl-zh
项目概览
D_ACMER
/
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,发现更多精彩内容 >>
提交
9703f58e
编写于
12月 12, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-12-12 22:17:12
上级
a8cd186b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
22 addition
and
22 deletion
+22
-22
new/handson-unsup-learn-py/08.md
new/handson-unsup-learn-py/08.md
+22
-22
未找到文件。
new/handson-unsup-learn-py/08.md
浏览文件 @
9703f58e
...
...
@@ -468,15 +468,15 @@ Epoch 600) Average loss per sample: 0.8058895015716553 (Code mean: 0.02853894419
正如我们将要讨论的,使用 ELBO 比处理公式的其余部分要容易得多,并且由于 KL 散度不会产生负面影响,所以如果我们最大化 ELBO,我们也将最大化对数似然率。
我们先前定义了
*p(z;θ)= N(0,I)*
; 因此,我们可以将
*q(z | x;*
*θ)*
建模为多元高斯模型,其中两个参数集(均值向量和协方差矩阵)由 a 表示 拆分概率编码器。 特别是,给定样本
`x`
,编码器现在必须同时输出平均向量
*μ(z | x;θ [q] )*
和 协方差矩阵
*Σ(z | x;θ [q] )*
。 为简单起见,我们可以假设矩阵是对角线,因此两个组件的结构完全相同。 结果分布为
*q(z | x;θ [q] )= N(μ(z | x;θ [q] ),Σ(z | x;θ [q] ))*
; 因此,ELBO 的第一项是两个高斯分布之间的负 KL 散度:
我们先前定义了
`p(z; θ) = N(0, I)`
; 因此,我们可以将
`q(z | x; θ)`
建模为多元高斯模型,其中两个参数集(均值向量和协方差矩阵)由
`a`
表示 拆分概率编码器。 特别是,给定样本
`x`
,编码器现在必须同时输出平均向量
`μ(z | x; θ[q])`
和 协方差矩阵
`Σ(z | x; θ[q])`
。 为简单起见,我们可以假设矩阵是对角线,因此两个组件的结构完全相同。 结果分布为
`q(z | x; θ[q]) = N(μ(z | x; θ[q]), Σ(z | x; θ[q])`
; 因此,ELBO 的第一项是两个高斯分布之间的负 KL 散度:
![](
img/30ba70c1-c5f3-4ea6-b019-0e51ab9b72ad.png
)
在前面的公式中,
`p`
是代码长度,因此它是均值和对角协方差向量的维数。 右侧的表达式非常容易计算,因为
*Σ*
是对角线的(也就是说,迹线是元素的总和,行列式是乘积)。 但是,当使用
**随机梯度下降**
(
**SGD**
)算法时,此公式的最大值尽管正确,但却不是可微的运算。 为了克服这个问题,作者建议重新分配分布。
在前面的公式中,
`p`
是代码长度,因此它是均值和对角协方差向量的维数。 右侧的表达式非常容易计算,因为
`Σ`
是对角线的(也就是说,迹线是元素的总和,行列式是乘积)。 但是,当使用
**随机梯度下降**
(
**SGD**
)算法时,此公式的最大值尽管正确,但却不是可微的运算。 为了克服这个问题,作者建议重新分配分布。
当提供一批时,对正态分布进行采样,获得
*α〜N(0,I)*
。 使用该值,可以使用概率编码器的输出来构建所需的样本:
*μ(z | x;θ [q] )+α• ∑(z | x;θ [q]*
*)^2*
。 该表达式是可区分的,因为
`α`
在每个批量中都是常数(当然,
*μ(z | x;θ [q] z | x;θ [q] )*
用神经网络参数化,它们是可微的
。
当提供一批时,对正态分布进行采样,获得
`α ~ N(0, I)`
。 使用该值,可以使用概率编码器的输出来构建所需的样本:
`μ(z | x; θ[q]) + α • ∑(z | x; θ[q])^2`
。 该表达式是可区分的,因为
`α`
在每个批量中都是常数(当然,就像
`μ(z | x; θ[q])`
和
`∑(z | x; θ[q])`
用神经网络参数化,它们是可微的)
。
ELBO 右侧的第二项是
*log p(x | z;*
*θ)*
的期望值。 不难看出,这样的表达式与原始分布和重构之间的交叉熵相对应:
ELBO 右侧的第二项是
`log p(x|z; θ)`
的期望值。 不难看出,这样的表达式与原始分布和重构之间的交叉熵相对应:
![](
img/443c5d4e-8661-4887-a98e-e6fe63f6ad03.png
)
...
...
@@ -675,7 +675,7 @@ for e in range(nb_epochs):
在本节中,我们将分析两个神经模型(Sanger 和 Rubner-Tavan 网络),它们可以执行
**主成分分析**
(
**PCA**
),而无需对协方差矩阵进行特征分解 或执行截断的 SVD。 它们都是基于
**Hebbian learning**
的概念(有关更多详细信息,请参阅
Dayan,P.和 Abbott,LF,
*Theoretical Neuroscience,MIT Press,*
2005 或 Bonaccorso, G.,
*Mastering Machine Learning Algorithms,*
Packt,2018),这是有关非常简单的神经元动力学的第一批数学理论之一。 然而,这些概念具有非常有趣的含义,尤其是在组件分析领域。 为了更好地了解网络的动力学,提供神经元基本模型的快速概述将很有帮助。 让我们考虑一个输入
*x∈^n*
和权重向量
*w ∈ ℜ^(n [)*
。 神经元执行点积(无偏差),以产生标量输出
`y`
:
在本节中,我们将分析两个神经模型(Sanger 和 Rubner-Tavan 网络),它们可以执行
**主成分分析**
(
**PCA**
),而无需对协方差矩阵进行特征分解 或执行截断的 SVD。 它们都是基于
**Hebbian learning**
的概念(有关更多详细信息,请参阅
《理论神经科学》),这是有关非常简单的神经元动力学的第一批数学理论之一。 然而,这些概念具有非常有趣的含义,尤其是在组件分析领域。 为了更好地了解网络的动力学,提供神经元基本模型的快速概述将很有帮助。 让我们考虑一个输入
`x ∈ R^n`
和权重向量
`w ∈ ℜ^n`
。 神经元执行点积(无偏差),以产生标量输出
`y`
:
![](
img/82b33ae4-637c-4004-b89b-c6e72863705d.png
)
...
...
@@ -683,7 +683,7 @@ for e in range(nb_epochs):
![](
img/d422484d-1407-4fbe-8258-bb66809bb7be.png
)
常数
*η*
是学习率。 完整的分析超出了本书的范围,但是有可能证明,一个 Hebbian 神经元(经过一些非常简单的修改,需要控制
`w`
的生长)可以改变突触的权重,因此在 足够多的迭代,它沿着数据集的第一个主成分
`X`
对齐。 从这个结果(我们不会证明)开始,我们可以介绍 Sanger 的网络。
常数
`η`
是学习率。 完整的分析超出了本书的范围,但是有可能证明,一个 Hebbian 神经元(经过一些非常简单的修改,需要控制
`w`
的生长)可以改变突触的权重,因此在 足够多的迭代,它沿着数据集的第一个主成分
`X`
对齐。 从这个结果(我们不会证明)开始,我们可以介绍 Sanger 的网络。
...
...
@@ -693,11 +693,11 @@ for e in range(nb_epochs):
Sanger 的网络模型由 Sanger 提出(在
Sanger,TD,
*单层线性前馈神经网络中的最佳无监督学习,Neural Networks,*
2,1989),以便提取第一个
*数据集的`X`的 k 个*
主成分,以在线过程降序排列(相反,标准 PCA 是需要整个数据集的批处理)。 即使有基于特定版本 SVD 的增量算法,这些神经模型的主要优点是它们处理单个样本的固有能力而不会损失任何性能。 在显示网络结构之前,有必要对 Hebb 规则进行修改,称为
**Oja 规则**
:
Sanger 的网络模型由 Sanger 提出(在
《单层线性前馈神经网络中的最佳无监督学习》),以便提取第一个数据集的
`X`
的
`k`
个
主成分,以在线过程降序排列(相反,标准 PCA 是需要整个数据集的批处理)。 即使有基于特定版本 SVD 的增量算法,这些神经模型的主要优点是它们处理单个样本的固有能力而不会损失任何性能。 在显示网络结构之前,有必要对 Hebb 规则进行修改,称为
**Oja 规则**
:
![](
img/eb954467-be52-42bb-a06d-e3d8cd62dd8c.png
)
引入此规则是为了解决标准 Hebbian 神经元无限增长的问题。 实际上,很容易理解,如果点积
*w^T x*
为正,Δw 将通过增加
`w`
的幅度来更新权重。 和更多。 因此,在进行大量迭代之后,模型可能会遇到溢出。 奥雅定律通过引入一种自动限制来克服这个问题,该自动限制迫使重量幅度饱和而不影响神经元找到第一个主要成分的方向的能力。 实际上,用
`w[k]`
表示第
`k`
<sup
class=
"calibre27"
>
次
</sup>
迭代之后的权重向量,可以证明以下内容:
引入此规则是为了解决标准 Hebbian 神经元无限增长的问题。 实际上,很容易理解,如果点积
`w^T x`
为正,Δw 将通过增加
`w`
的幅度来更新权重。 和更多。 因此,在进行大量迭代之后,模型可能会遇到溢出。 奥雅定律通过引入一种自动限制来克服这个问题,该自动限制迫使重量幅度饱和而不影响神经元找到第一个主要成分的方向的能力。 实际上,用
`w[k]`
表示第
`k`
次
迭代之后的权重向量,可以证明以下内容:
![](
img/09e7fdb7-16a9-4ec9-87ba-717623f9c860.png
)
...
...
@@ -707,11 +707,11 @@ Sanger 的网络基于 Oja 规则的修改版本,该规则定义为**广义 He
通用 Sanger 网络的结构
权重被组织成一个矩阵,
*W = {w [ij] }*
(
`w[ij]`
是连接突触前单元的权重 ,
`i`
,带有突触后单位,
`j`
); 因此,可以使用以下公式来计算输出的激活:
权重被组织成一个矩阵,
`W = {w[ij]}`
(
`w[ij]`
是连接突触前单元的权重 ,
`i`
,带有突触后单位,
`j`
); 因此,可以使用以下公式来计算输出的激活:
![](
img/e021d025-55ed-4793-b6d9-b8cec5b50302.png
)
但是,在这种网络中,我们对最终权重更感兴趣,因为它们必须等于第一个
`n`
主分量。 不幸的是,如果我们应用 Oja 规则而不做任何修改,则所有神经元都将找到相同的组件(第一个组件)。 因此,必须采用不同的策略。 从理论上讲,我们知道主成分必须正交。 因此,如果
`w[1]`
是具有第一个分量方向的向量,则可以强制
`w[2]`
正交于
`w[1]`
,依此类推。 该方法基于
**Gram-Schmidt 正交归一化程序**
。 让我们考虑两个向量-已经收敛的
`w[1]`
,和
*w [2] [0]*
, 任何干预措施,也将收敛于
`w[1]`
。 通过考虑此向量在
`w[1]`
上的投影,可以找到
`w[20]`
的正交分量:
但是,在这种网络中,我们对最终权重更感兴趣,因为它们必须等于第一个
`n`
主分量。 不幸的是,如果我们应用 Oja 规则而不做任何修改,则所有神经元都将找到相同的组件(第一个组件)。 因此,必须采用不同的策略。 从理论上讲,我们知道主成分必须正交。 因此,如果
`w[1]`
是具有第一个分量方向的向量,则可以强制
`w[2]`
正交于
`w[1]`
,依此类推。 该方法基于
**Gram-Schmidt 正交归一化程序**
。 让我们考虑两个向量-已经收敛的
`w[1]`
,和
`w[20]`
, 任何干预措施,也将收敛于
`w[1]`
。 通过考虑此向量在
`w[1]`
上的投影,可以找到
`w[20]`
的正交分量:
![](
img/67503a88-e4d1-468e-8b90-6d874d81a731.png
)
...
...
@@ -719,7 +719,7 @@ Sanger 的网络基于 Oja 规则的修改版本,该规则定义为**广义 He
![](
img/eb256bb9-cc11-492f-b9b7-5a0d54799d6a.png
)
第三部分必须正交于
`w[1]`
和
`w[2]`
,因此必须对所有
*n [*
单位,直到最终收敛。 而且,我们现在正在使用已经融合的组件,而是使用并行更新的动态系统。 因此,有必要将此程序纳入学习规则,如下所示:
第三部分必须正交于
`w[1]`
和
`w[2]`
,因此必须对所有
`n`
个
单位,直到最终收敛。 而且,我们现在正在使用已经融合的组件,而是使用并行更新的动态系统。 因此,有必要将此程序纳入学习规则,如下所示:
![](
img/350f6137-1ddd-447d-879a-79de245a6115.png
)
...
...
@@ -729,11 +729,11 @@ Sanger 的网络基于 Oja 规则的修改版本,该规则定义为**广义 He
![](
img/9aa37ec6-8cf8-4828-a845-ec719720409a.png
)
`Tril(·)`
函数计算方阵的下三角部分。 收敛性证明并非无关紧要,但在
*η*
单调减少的温和条件下,可以看到该模型如何以降序收敛到第一个
`n`
主成分。
`Tril(·)`
函数计算方阵的下三角部分。 收敛性证明并非无关紧要,但在
`η`
单调减少的温和条件下,可以看到该模型如何以降序收敛到第一个
`n`
主成分。
![](
img/9493c073-860c-40de-a254-d938060914d8.png
)
这样的约束并不难实现。 但是,一般来说,当
*η< 1*
并在迭代过程中保持恒定时,该算法也可以达到收敛。
这样的约束并不难实现。 但是,一般来说,当
`η < 1`
并在迭代过程中保持恒定时,该算法也可以达到收敛。
...
...
@@ -772,7 +772,7 @@ Eigenvectors: [[-0.79948496 0.60068611]
[
-
0.60068611
-
0.79948496
]]
```
特征值分别约为 12 和 29,,表示第一主成分(对应于转置特征向量矩阵的第一行,因此
*(-0.799,0.6)*
)为
比第二个要短得多。 当然,在这种情况下,我们已经通过对协方差矩阵进行特征分解来计算了主成分,但这只是出于教学目的。 Sanger 的网络将按降序提取组件; 因此,我们期望找到第二列作为权重矩阵的第一列,第一列作为权重矩阵的第二列。 让我们从初始化权重和训练常数开始:
特征值分别约为 12 和 29,,表示第一主成分(对应于转置特征向量矩阵的第一行,因此
`(-0.799, 0.6)`
比第二个要短得多。 当然,在这种情况下,我们已经通过对协方差矩阵进行特征分解来计算了主成分,但这只是出于教学目的。 Sanger 的网络将按降序提取组件; 因此,我们期望找到第二列作为权重矩阵的第一列,第一列作为权重矩阵的第二列。 让我们从初始化权重和训练常数开始:
```
py
import
numpy
as
np
...
...
@@ -842,7 +842,7 @@ Sanger 网络的最终配置
Rubner 和 Tavan 提出了另一种可以执行 PCA 的神经网络(在
Rubner,J.和 Tavan,P.中,
*主成分分析的自组织网络,Europhysics Letters,*
10(7), 1989
)。 但是,他们的方法基于协方差矩阵的去相关,这是 PCA 的最终结果(也就是说,就像使用自下而上的策略,而标准过程是自上而下的操作一样)。 让我们考虑一个零中心数据集
`X`
和一个网络,其输出为
*y∈^m*
向量。 因此,输出分布的协方差矩阵如下:
Rubner 和 Tavan 提出了另一种可以执行 PCA 的神经网络(在
《主成分分析的自组织网络》
)。 但是,他们的方法基于协方差矩阵的去相关,这是 PCA 的最终结果(也就是说,就像使用自下而上的策略,而标准过程是自上而下的操作一样)。 让我们考虑一个零中心数据集
`X`
和一个网络,其输出为
*y∈^m*
向量。 因此,输出分布的协方差矩阵如下:
![](
img/0a6cd2b9-0661-43cb-baeb-186e98dbda5e.png
)
...
...
@@ -850,7 +850,7 @@ Rubner 和 Tavan 提出了另一种可以执行 PCA 的神经网络(在 Rubner
通用 Rubner-Tavan 网络的结构
如您所见,与 Sanger 网络的主要区别在于每个输出单元(第一个输出单元除外)之前都存在求和节点。 这种方法称为
**分层横向连接**
,因为每个节点
*y [i] (i > 0)*
由直接组件
*组成 ] n [i]*
,加到所有先前的加权输出中。 因此,假设使用
*v^((i))*
表示法,以表示向量的
*i^第*
分量,
*i [*
,网络输出如下:
如您所见,与 Sanger 网络的主要区别在于每个输出单元(第一个输出单元除外)之前都存在求和节点。 这种方法称为
**分层横向连接**
,因为每个节点
`y[i] (i > 0)`
由直接组件
`n[i]`
组成,加到所有先前的加权输出中。 因此,假设使用
`v^(i)`
表示法,以表示向量的第
`i`
个分量
,网络输出如下:
![](
img/28b97b62-ca15-49e7-9117-686e2f01f49b.png
)
...
...
@@ -861,7 +861,7 @@ Rubner 和 Tavan 提出了另一种可以执行 PCA 的神经网络(在 Rubner
*
第三输出被强制与第一输出和第二输出去相关,依此类推
*
最后的输出被强制与所有先前的输出去相关
经过多次迭代后,每个生成的
*y [i] y [j]*
以及
*i≠j*
都为空,而
`C`
变成对角协方差矩阵。 此外,在上述论文中,作者证明了特征值(对应于方差)是按降序排序的; 因此,可以通过选择包含前
`p`
行和列的子矩阵来选择顶部的
`p`
组件。
经过多次迭代后,每个生成的
`y[i] y[j]`
以及
`i ≠ j`
都为空,而
`C`
变成对角协方差矩阵。 此外,在上述论文中,作者证明了特征值(对应于方差)是按降序排序的; 因此,可以通过选择包含前
`p`
行和列的子矩阵来选择顶部的
`p`
组件。
通过使用两个不同的规则(每个权重层一个)来更新 Rubner-Tavan 网络。 内部权重
`w[ij]`
通过使用 Oja 规则进行更新:
...
...
@@ -871,17 +871,17 @@ Rubner 和 Tavan 提出了另一种可以执行 PCA 的神经网络(在 Rubner
![](
img/03eed34d-9192-4583-a97f-86ed71c4cb4d.png
)
前一个公式的第一项
*-ηy<sup class="calibre27">(j)</sup> y^((k))*
负责解相关,而第二项类似于 Oja's 规则,用作防止权重溢出的自限制正则器。 特别地,
*-ηy<sup class="calibre27">(i)</sup> y^((k))*
项可以解释为更新规则的反馈信号
`w[ij]`
,它受
`w[ij]`
项校正的实际输出的影响。 考虑到 Sanger 网络的行为,不容易理解,一旦输出去相关,内部权重
`w[ij]`
就变成正交,代表
*的第一个主要成分 X*
。
前一个公式的第一项
`-ηy^(j) y^(k))`
负责解相关,而第二项类似于 Oja's 规则,用作防止权重溢出的自限制正则器。 特别地,
`-ηy(i) y^(k)`
项可以解释为更新规则的反馈信号
`w[ij]`
,它受
`w[ij]`
项校正的实际输出的影响。 考虑到 Sanger 网络的行为,不容易理解,一旦输出去相关,内部权重
`w[ij]`
就变成正交,代表第一个主要成分
`X`
。
以矩阵形式,权重
`w[ij]`
可以立即排列为
*W = {w [ij] }*
,这样在 在训练过程结束时,每一列都是
`C`
的特征向量(降序排列)。 相反,对于外部权重
`v[jk]`
,我们需要再次使用
`Tril(·)`
运算符:
以矩阵形式,权重
`w[ij]`
可以立即排列为
`W = {w[ij]}`
,这样在 在训练过程结束时,每一列都是
`C`
的特征向量(降序排列)。 相反,对于外部权重
`v[jk]`
,我们需要再次使用
`Tril(·)`
运算符:
![](
img/9080b2af-6409-4238-a6a8-8f230792ce22.png
)
因此,迭代
*t + 1*
的输出变为:
因此,迭代
`t + 1`
的输出变为:
![](
img/2868e72f-7437-444e-94e3-4c2068388a47.png
)
有趣的是,这样的网络经常输出。 因此,一旦应用了输入,就需要进行几次迭代才能使
`y`
稳定下来(理想情况下,更新必须持续到
*|| y^((t + 1))- y^((t)) ||→0*
)。
有趣的是,这样的网络经常输出。 因此,一旦应用了输入,就需要进行几次迭代才能使
`y`
稳定下来(理想情况下,更新必须持续到
`||y^(t + 1) - y^(t)|| → 0`
)。
...
...
@@ -922,7 +922,7 @@ prev_W = np.zeros((Xs.shape[1], n_components))
t
=
0
```
因此,我们选择采用等于 0.00001 的停止阈值(比较基于权重矩阵的两次连续计算的 Frobenius 范数)和最多 1,000 次迭代。 我们还设置了五个稳定周期和固定的学习率
*η= 0.0001*
。 我们可以开始学习过程,如下所示:
因此,我们选择采用等于 0.00001 的停止阈值(比较基于权重矩阵的两次连续计算的 Frobenius 范数)和最多 1,000 次迭代。 我们还设置了五个稳定周期和固定的学习率
`η = 0.0001`
。 我们可以开始学习过程,如下所示:
```
py
import
numpy
as
np
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录