diff --git a/image/20180125_162704.png b/image/20180125_162704.png new file mode 100644 index 0000000..7e305fa Binary files /dev/null and b/image/20180125_162704.png differ diff --git a/image/20180125_195029.png b/image/20180125_195029.png new file mode 100644 index 0000000..a4be1ba Binary files /dev/null and b/image/20180125_195029.png differ diff --git a/week2.html b/week2.html index ef95ddf..bafaebb 100644 --- a/week2.html +++ b/week2.html @@ -220,8 +220,8 @@ header, .context-menu, .megamenu-content, footer { font-family: "Segoe UI", Aria -

4 多变量线性回归(Linear Regression with Multiple Variables)4.1 多特征(Multiple Features)4.2 多变量梯度下降(Gradient Descent for Multiple Variables)4.3 梯度下降实践1-特征值缩放(Gradient Descent in Practice I - Feature Scaling)4.4 梯度下降实践2-学习速率(Gradient Descent in Practice II - Learning Rate)4.5 特征和多项式回归(Features and Polynomial Regression)4.6 正规方程(Normal Equation)4.7 不可逆性正规方程(Normal Equation Noninvertibility)5 Octave/Matlab Tutorial5.1 Basic Operations5.2 Moving Data Around5.3 Computing on Data5.4 Plotting Data5.5 Control Statements: for, while, if statement5.6 向量化(Vectorization)5.x 常用函数整理

4 多变量线性回归(Linear Regression with Multiple Variables)

4.1 多特征(Multiple Features)

对于一个要度量的对象,一般来说会有不同维度的多个特征。比如之前的房屋价格预测例子中,除了房屋的面积大小,可能还有房屋的年限、房屋的层数等等其他特征:

这里由于特征不再只有一个,引入一些新的记号

: 特征的总数

: 代表样本矩阵中第 行,也就是第 个训练实例。

: 代表样本矩阵中第 行的第 列,也就是第 个训练实例的第 个特征。

参照上图,则有

多变量假设函数 表示为:

对于 ,和单特征中一样,我们将其看作基础数值。例如,房价的基础价格。

参数向量的维度为 ,在特征向量中添加 后,其维度也变为 , 则运用线性代数,可简化

: 矩阵的转置

: 某个样本的特征向量, 维特征量向量

: 为了计算方便我们会假设

注:该部分记号较多,记不住可随时回顾!

 

4.2 多变量梯度下降(Gradient Descent for Multiple Variables)

多变量代价函数类似于单变量代价函数,

,其中

前文提到梯度下降对于最小化代价函数的通用性,则多变量梯度下降公式即

解出偏导得:

可展开为:

当然,同单变量梯度下降一样,计算时需要同时更新所有参数。

,则得到同时更新参数的向量化(Vectorization)实现:

: 训练集数据, 维矩阵(包含额外特征

4.3 梯度下降实践1-特征值缩放(Gradient Descent in Practice I - Feature Scaling)

在应用梯度下降算法实践时,由于各特征值的范围不一,可能会影响代价函数收敛速度。

以房价预测问题为例,这里选取房屋面积大小和房间数量这两个特征。

下图中,左图是以原始数据绘制的代价函数轮廓图,右图为采用特征缩放(都除以最大值)后图像。左图中呈现的图像较扁,相对于使用特征缩放方法的右图,梯度下降算法需要更多次的迭代。

 

为了优化梯度下降的收敛速度,采用特征缩放的技巧,使各特征值的范围尽量一致

除了以上图人工选择并除以一个参数的方式,均值归一化(Mean normalization)方法更为便捷,可采用它来对所有特征值统一缩放:

使

对于特征的范围,并不一定需要使得 ,类似于 等也是可取的,而诸如 ,就显得过大/过小了。

另外注意,一旦采用特征缩放,我们就需对所有的输入采用特征缩放,包括训练集、测试集、预测输入等。

4.4 梯度下降实践2-学习速率(Gradient Descent in Practice II - Learning Rate)

通常,有两种方法来确定函数是否收敛

对于梯度下降,一般采用多次迭代收敛法来得出最小化代价函数的参数值,自动化测试收敛法(如设定 时判定收敛)则几乎不会被使用。

我们可以通过绘制代价函数关于迭代次数的图像,可视化梯度下降的执行过程,借助直观的图形来发现代价函数趋向于多少时能趋于收敛,依据图像变化情况,确定诸如学习速率的取值,迭代次数的大小等问题。

对于学习速率 ,一般上图展现的为适中情况,下图中,左图可能表明 过大,代价函数无法收敛,右图可能表明 过小,代价函数收敛的太慢。当然, 足够小时,代价函数在每轮迭代后一定会减少。

通过不断改变 值,绘制并观察图像,并以此来确定合适的学习速率。 尝试时可取

4.5 特征和多项式回归(Features and Polynomial Regression)

在特征选取时,我们也可以自己归纳总结,定义一个新的特征,用来取代或拆分旧的一个或多个特征。比如,对于房屋面积特征来说,我们可以将其拆分为长度和宽度两个特征,反之,我们也可以合并长度和宽度这两个特征为面积这一个特征。

线性回归只能以直线来对数据进行拟合,有时候需要使用曲线来对数据进行拟合,即多项式回归(Polynomial Regression)

比如一个二次方模型:

或者三次方模型:

或者平方根模型:

在使用多项式回归时,要记住非常有必要进行特征缩放,比如 的范围为 1-1000,那么 的范围则为 1- 1000000,不适用特征缩放的话,范围更有不一致,也更易影响效率。

4.6 正规方程(Normal Equation)

对于一些线性回归问题来说,正规方程法给出了一个更好的解决问题的方式。

正规方程法,即令 ,通过解析函数的方式直接计算得出参数向量的值 ,Octave/Matlab 代码: theta = inv(X'*X)*X'*y

: 矩阵 的逆,在 Octave 中,inv 函数用于计算矩阵的逆,类似的还有 pinv 函数。

X': 在 Octave 中表示矩阵 X 的转置,即

下表列出了正规方程法与梯度下降算法的对比

条件梯度下降正规方程
是否需要选取 需要不需要
是否需要迭代运算需要不需要
特征量大1适用,不适用, 复杂度
适用范围2各类模型只适用线性模型,且矩阵需可逆

正规方程法的推导过程

展开上式可得

注意到 都为标量,实际上是等价的,则

接下来对 求偏导,根据矩阵的求导法则:

所以有:

, 则有

 

4.7 不可逆性正规方程(Normal Equation Noninvertibility)

(本部分内容为选讲)

正规方程无法应用于不可逆的矩阵,发生这种问题的概率很小,通常由于

如果发现 的结果不可逆,可尝试:

对于这类不可逆的矩阵,我们称之为奇异矩阵退化矩阵

这种情况下,如果还想使用正规方程法,在Octave中,可以选用 pinv 函数,pinv 区别于 invpinv 函数被称为伪逆函数,在矩阵不可逆的时候,使用这个函数仍可正确地计算出 的值。

5 Octave/Matlab Tutorial

复习时可直接倍速回顾视频,笔记整理暂留。

5.1 Basic Operations

5.2 Moving Data Around

5.3 Computing on Data

5.4 Plotting Data

5.5 Control Statements: for, while, if statement

5.6 向量化(Vectorization)

5.x 常用函数整理


-
1 一般来说,当 超过 10000 时,对于正规方程而言,特征量较大。
+

4 多变量线性回归(Linear Regression with Multiple Variables)

4.1 多特征(Multiple Features)

对于一个要度量的对象,一般来说会有不同维度的多个特征。比如之前的房屋价格预测例子中,除了房屋的面积大小,可能还有房屋的年限、房屋的层数等等其他特征:

这里由于特征不再只有一个,引入一些新的记号

: 特征的总数

: 代表样本矩阵中第 行,也就是第 个训练实例。

: 代表样本矩阵中第 行的第 列,也就是第 个训练实例的第 个特征。

参照上图,则有

多变量假设函数 表示为:

对于 ,和单特征中一样,我们将其看作基础数值。例如,房价的基础价格。

参数向量的维度为 ,在特征向量中添加 后,其维度也变为 , 则运用线性代数,可简化

: 矩阵的转置

: 某个样本的特征向量, 维特征量向量

: 为了计算方便我们会假设

注:该部分记号较多,记不住可随时回顾!

 

4.2 多变量梯度下降(Gradient Descent for Multiple Variables)

多变量代价函数类似于单变量代价函数,

,其中

前文提到梯度下降对于最小化代价函数的通用性,则多变量梯度下降公式即

解出偏导得:

可展开为:

当然,同单变量梯度下降一样,计算时需要同时更新所有参数。

,则得到同时更新参数的向量化(Vectorization)实现:

: 训练集数据, 维矩阵(包含基本特征

4.3 梯度下降实践1-特征值缩放(Gradient Descent in Practice I - Feature Scaling)

在应用梯度下降算法实践时,由于各特征值的范围不一,可能会影响代价函数收敛速度。

以房价预测问题为例,这里选取房屋面积大小和房间数量这两个特征。

下图中,左图是以原始数据绘制的代价函数轮廓图,右图为采用特征缩放(都除以最大值)后图像。左图中呈现的图像较扁,相对于使用特征缩放方法的右图,梯度下降算法需要更多次的迭代。

 

为了优化梯度下降的收敛速度,采用特征缩放的技巧,使各特征值的范围尽量一致

除了以上图人工选择并除以一个参数的方式,均值归一化(Mean normalization)方法更为便捷,可采用它来对所有特征值统一缩放:

使

对于特征的范围,并不一定需要使得 ,类似于 等也是可取的,而诸如 ,就显得过大/过小了。

另外注意,一旦采用特征缩放,我们就需对所有的输入采用特征缩放,包括训练集、测试集、预测输入等。

4.4 梯度下降实践2-学习速率(Gradient Descent in Practice II - Learning Rate)

通常,有两种方法来确定函数是否收敛

  • 多次迭代收敛法

    • 无法确定需要多少次迭代
    • 较易绘制关于迭代次数的图像
    • 根据图像易预测所需的迭代次数
  • 自动化测试收敛法(比较阈值)

    • 不易选取阈值
    • 代价函数近乎直线时无法确定收敛情况

对于梯度下降,一般采用多次迭代收敛法来得出最小化代价函数的参数值,自动化测试收敛法(如设定 时判定收敛)则几乎不会被使用。

我们可以通过绘制代价函数关于迭代次数的图像,可视化梯度下降的执行过程,借助直观的图形来发现代价函数趋向于多少时能趋于收敛,依据图像变化情况,确定诸如学习速率的取值,迭代次数的大小等问题。

对于学习速率 ,一般上图展现的为适中情况,下图中,左图可能表明 过大,代价函数无法收敛,右图可能表明 过小,代价函数收敛的太慢。当然, 足够小时,代价函数在每轮迭代后一定会减少。

通过不断改变 值,绘制并观察图像,并以此来确定合适的学习速率。 尝试时可取

4.5 特征和多项式回归(Features and Polynomial Regression)

在特征选取时,我们也可以自己归纳总结,定义一个新的特征,用来取代或拆分旧的一个或多个特征。比如,对于房屋面积特征来说,我们可以将其拆分为长度和宽度两个特征,反之,我们也可以合并长度和宽度这两个特征为面积这一个特征。

线性回归只能以直线来对数据进行拟合,有时候需要使用曲线来对数据进行拟合,即多项式回归(Polynomial Regression)

比如一个二次方模型:

或者三次方模型:

或者平方根模型:

在使用多项式回归时,要记住非常有必要进行特征缩放,比如 的范围为 1-1000,那么 的范围则为 1- 1000000,不适用特征缩放的话,范围更有不一致,也更易影响效率。

4.6 正规方程(Normal Equation)

对于一些线性回归问题来说,正规方程法给出了一个更好的解决问题的方式。

正规方程法,即令 ,通过解析函数的方式直接计算得出参数向量的值 ,Octave/Matlab 代码: theta = inv(X'*X)*X'*y

: 矩阵 的逆,在 Octave 中,inv 函数用于计算矩阵的逆,类似的还有 pinv 函数。

X': 在 Octave 中表示矩阵 X 的转置,即

下表列出了正规方程法与梯度下降算法的对比

条件梯度下降正规方程
是否需要选取 需要不需要
是否需要迭代运算需要不需要
特征量大1适用,不适用, 复杂度
适用范围2各类模型只适用线性模型,且矩阵需可逆

正规方程法的推导过程

展开上式可得

注意到 都为标量,实际上是等价的,则

接下来对 求偏导,根据矩阵的求导法则:

所以有:

, 则有

 

4.7 不可逆性正规方程(Normal Equation Noninvertibility)

(本部分内容为选讲)

正规方程无法应用于不可逆的矩阵,发生这种问题的概率很小,通常由于

  • 特征之间线性相关

    比如同时包含英寸的尺寸和米为单位的尺寸两个特征,它们是线性相关的

  • 特征数量大于训练集的数量

如果发现 的结果不可逆,可尝试:

  • 减少多余/重复特征
  • 增加训练集数量
  • 使用正则化(后文)

对于这类不可逆的矩阵,我们称之为奇异矩阵退化矩阵

这种情况下,如果还想使用正规方程法,在Octave中,可以选用 pinv 函数,pinv 区别于 invpinv 函数被称为伪逆函数,在矩阵不可逆的时候,使用这个函数仍可正确地计算出 的值。

5 Octave/Matlab Tutorial

复习时可直接倍速回顾视频,笔记整理暂留。

5.1 Basic Operations

5.2 Moving Data Around

5.3 Computing on Data

5.4 Plotting Data

5.5 Control Statements: for, while, if statement

5.6 向量化(Vectorization)

5.x 常用函数整理


+
1 一般来说,当 超过 10000 时,对于正规方程而言,特征量较大。
2 梯度下降算法的普适性好,而对于特定的线性回归模型,正规方程是很好的替代品。
\ No newline at end of file diff --git a/week2.md b/week2.md index 7136e43..37b815b 100644 --- a/week2.md +++ b/week2.md @@ -61,7 +61,7 @@ $$ \theta = \theta - \alpha \frac{1}{m}(X^T(X\theta-y)) $$ -> $X$: 训练集数据,$m\times(n+1)$ 维矩阵(包含额外特征 $x_0=1$) +> $X$: 训练集数据,$m\times(n+1)$ 维矩阵(包含基本特征 $x_0=1$) ## 4.3 梯度下降实践1-特征值缩放(Gradient Descent in Practice I - Feature Scaling) diff --git a/week4.html b/week4.html index bdbb3d3..1870ebd 100644 --- a/week4.html +++ b/week4.html @@ -220,6 +220,6 @@ header, .context-menu, .megamenu-content, footer { font-family: "Segoe UI", Aria -

8 神经网络:表达(Neural Networks: Representation)

8.1 非线性假设(Non-linear Hypotheses)

理论上我们可以用多项式函数去近似任意函数(泰勒极数(Taylor series)),从而可得到任意问题的拟合曲线。

在实际处理时,特征量通常会很多,如果再构造高阶多项式等,特征数量将会急剧增加,这使得回归模型的复杂度太高,可见并不合适。神经网络无需构造高阶多项式,在特征量很大时也可以处理的很好。

那特征能有多大呢?下面是一个计算机视觉中的例子:

如上图,如果选取一小块 像素的灰度图片(一个像素只有亮度一个值),选择每个像素点作为特征,则特征总量 (换成 RGB(一个像素有三个值),则 ),如果将其两两组合作为新特征,则特征数量将为

8.2 神经网络和大脑(Neurons and the Brain)

脑科学家通过对动物实验,发现大脑中专用于处理听觉信号的脑皮层也能处理其他诸如视觉等信号,即如果切断其与耳朵的联系,将其与眼睛相连,则这块负责听觉的脑皮层区域也能接受并处理视觉信号,从而学会“看”。脑科学家通过这类换源实验,就推论假设大脑的学习算法只有一种(“one learning algorithm” hypothesis)。那么如果能找出这种学习算法并应用于计算机中,那梦想中和人一样的人工智能就成真了。

神经网络就源于模拟人类大脑,但其需要的计算量很大。随着计算机硬件性能的提高,神经网络逐渐从衰落变为流行,如今已广泛地被应用在各行各业中。

下图是根据研究做的一些应用(有兴趣可回顾视频):

BrainPort 系统:帮助失明人士通过摄像头以及舌尖感官“看”东西

触觉皮带:在朝北时蜂鸣器会发出声响,可使人拥有方向感(声音信号转换为方向信号)。

8.3 模型表示1(Model Representation I)

既然神经网络模仿的是大脑神经元,那就先看一下大脑的神经元长什么样吧:

来源: http://blog.csdn.net/zzwu/article/details/574931

想象一下印刷厂中流水线的工人(机器人也算哦),每个工人都有特定的任务,比如装订,塑封,贴防伪标识等等,工人们看到书本并处理完自己的任务后,就回放回传送带,紧接着传送带就传给下一个环节的工人,如此不断重复从而完成一个又一个环节,直到一本书印制完成。

那么类比一下,把上图中的细胞核(nucleus)类比成工人,轴突(axon)类比传送带,树突(dendrite)则比类比成工人的双眼。一个又一个细胞体,从树突接收需要处理的信息,对其进行处理后,再经由轴突通过电信号把处理完的信息传递出去,直到理解信息的内容。当然啦,我们大脑的实际上还要更为复杂,而且一个人的神经元数目就比地球上所有流水线的工人之和还要多呢~

人工神经网络中,树突对应输入(input),细胞核对应激活单元(activation unit),轴突对应输出(output)

我们一般把神经网络划分为三部分(注意,不是只有三层!),即输入层(input layer),隐藏层(hidden layer)和输出层(output layer)。

图中的一个圈表示神经网络中的一个激活单元,输入层对应输入单元,隐藏层对应中间单元,输出层则对应输出单元。中间激活单元应用激活函数(activation_function)处理数据。

下面列出一些已有概念在神经网络中的别称:

  • : 偏置单元(bias unit),=1
  • : 权重(weight),即参数。
  • 激活函数: ,即逻辑函数等。
  • 输入层: 对应于训练集中的特征
  • 输出层: 对应于训练集中的结果

: 第 层的第 个激活单元

: 从第 层映射到第 层时的权重矩阵。

: 从第 层的第 个单元映射到第 层的第 个单元的权重

: 第 层的激活单元数目(不包含偏置单元)

注意:

  • 符号较多,记不住可随时回顾!
  • 每个单元会作用于下一层的所有单元(矩阵乘法运算)。
  • 如果第 层有 个单元,第 层有 个单元, 是一个 维的权重矩阵。即每一层的权重矩阵大小都是非固定的。
  • 其中, 来自于偏置单元,这样意味着输出层不包含偏置单元,输入层和隐藏层需要增加偏置单元。

 

依据本节所给模型,有:

8.4 模型表示2(Model Representation II)

对第 层的所有激活单元应用激活函数,从而得到第 层激活单元的值:

对第 层的所有激活单元应用激活函数,从而得到输出:

上面的计算过程被称为前向传播(Forward propagation),即从输入层开始,一层一层地向下计算并传递结果。

 

再回顾一下逻辑回归:

是不是除了符号表示,其他都完全一样?其实神经网络就好似回归模型,只不过输入变成了中间单元 。从输入 开始,下一层的每个激活单元都包含了上一层的所有信息(单元值),通过最优化算法不断迭代计算,激活单元能得出关于输入 的更多信息,这就好像是在给假设函数加多项式。隐藏层的这些单元好似升级版的初始特征,从而能给出更好的预测。

 

向量化实现

定义

则有

预测结果即

 

即有

,通过该式即可计算神经网络中每一层的值。

扩展到所有样本实例:

,这时 是一个 维矩阵。

: 训练集中的样本实例数量

: 第二层神经网络中激活单元的数量

 

当然,神经网络不仅限于三层,每层的激活单元数量也并不固定:

8.5 例子和直观理解1(Examples and Intuitions I)

为了更好的理解神经网络,举例单层神经网络进行逻辑运算的例子。

下面的例子中, 为二进制数。

逻辑与(AND)运算(都为真值则结果才为真)神经网络:

回顾 sigmoid 函数图像,根据输入则有上图中右边的表格,即 。这样就实现了一个能够进行与运算的神经网络。

sigmoid function

 

再举一例,逻辑或(OR)运算(有一个真值则结果就为真)神经网络:

 

8.6 例子和直观理解2(Examples and Intuitions II)

下面逐步构建复杂一点的神经网络

如上图,我们分别构建了三个单层神经网络,将这三个网络组合起来,可得到一个新的神经网络,其可完成逻辑运算中的异或(XNOR)操作:

这里的组合即为

可见,特征值能不断升级,并抽取出更多信息,直到计算出结果。而如此不断组合,我们就可以逐渐构造出越来越复杂、强大的神经网络,比如用于手写识别的神经网络。

8.7 多类别分类(Multiclass Classification)

之前讨论的都是预测结果为单值情况下的神经网络,要实现多类别分类,其实只要修改一下输出层,让输出层包含多个输出单元即可。

举一个 4 分类问题的实例:

有四种分类情况,那么就让输出层包含 4 个输出单元即可,则 为 4 维向量。

神经网络中的多分类算法算是对 one-vs-all 思想的扩展,定义预测结果一共有 4 种情况:

如果预测结果

那么表示 ,即分为第 3 类,对应于图中的摩托车(Motorcycle)。

总结一下,要分为 类,就在输出层放置 个输出单元,对于单个样本实例, 则是一个 维结果向量,最后依据结果向量,得出属于哪个类

 

+

8 神经网络:表达(Neural Networks: Representation)

8.1 非线性假设(Non-linear Hypotheses)

理论上我们可以用多项式函数去近似任意函数(泰勒极数(Taylor series)),从而可得到任意问题的拟合曲线。

在实际处理时,特征量通常会很多,如果再构造高阶多项式等,特征数量将会急剧增加,这使得回归模型的复杂度太高,可见并不合适。神经网络无需构造高阶多项式,在特征量很大时也可以处理的很好。

那特征能有多大呢?下面是一个计算机视觉中的例子:

如上图,如果选取一小块 像素的灰度图片(一个像素只有亮度一个值),选择每个像素点作为特征,则特征总量 (换成 RGB(一个像素有三个值),则 ),如果将其两两组合作为新特征,则特征数量将为

8.2 神经网络和大脑(Neurons and the Brain)

脑科学家通过对动物实验,发现大脑中专用于处理听觉信号的脑皮层也能处理其他诸如视觉等信号,即如果切断其与耳朵的联系,将其与眼睛相连,则这块负责听觉的脑皮层区域也能接受并处理视觉信号,从而学会“看”。脑科学家通过这类换源实验,就推论假设大脑的学习算法只有一种(“one learning algorithm” hypothesis)。那么如果能找出这种学习算法并应用于计算机中,那梦想中和人一样的人工智能就成真了。

神经网络就源于模拟人类大脑,但其需要的计算量很大。随着计算机硬件性能的提高,神经网络逐渐从衰落变为流行,如今已广泛地被应用在各行各业中。

下图是根据研究做的一些应用(有兴趣可回顾视频):

BrainPort 系统:帮助失明人士通过摄像头以及舌尖感官“看”东西

触觉皮带:在朝北时蜂鸣器会发出声响,可使人拥有方向感(声音信号转换为方向信号)。

8.3 模型表示1(Model Representation I)

既然神经网络模仿的是大脑神经元,那就先看一下大脑的神经元长什么样吧:

来源: http://blog.csdn.net/zzwu/article/details/574931

想象一下印刷厂中流水线的工人(机器人也算哦),每个工人都有特定的任务,比如装订,塑封,贴防伪标识等等,工人们看到书本并处理完自己的任务后,就回放回传送带,紧接着传送带就传给下一个环节的工人,如此不断重复从而完成一个又一个环节,直到一本书印制完成。

那么类比一下,把上图中的细胞核(nucleus)类比成工人,轴突(axon)类比传送带,树突(dendrite)则比类比成工人的双眼。一个又一个细胞体,从树突接收需要处理的信息,对其进行处理后,再经由轴突通过电信号把处理完的信息传递出去,直到理解信息的内容。当然啦,我们大脑的实际上还要更为复杂,而且一个人的神经元数目就比地球上所有流水线的工人之和还要多呢~

人工神经网络中,树突对应输入(input),细胞核对应激活单元(activation unit),轴突对应输出(output)

我们一般把神经网络划分为三部分(注意,不是只有三层!),即输入层(input layer),隐藏层(hidden layer)和输出层(output layer)。

图中的一个圈表示神经网络中的一个激活单元,输入层对应输入单元,隐藏层对应中间单元,输出层则对应输出单元。中间激活单元应用激活函数(activation_function)处理数据。

下面列出一些已有概念在神经网络中的别称:

  • : 偏置单元(bias unit),=1
  • : 权重(weight),即参数。
  • 激活函数: ,即逻辑函数等。
  • 输入层: 对应于训练集中的特征
  • 输出层: 对应于训练集中的结果

: 第 层的第 个激活单元

: 从第 层映射到第 层时的权重矩阵。

: 从第 层的第 个单元映射到第 层的第 个单元的权重

: 第 层的激活单元数目(不包含偏置单元)

注意:

  • 符号较多,记不住可随时回顾!
  • 每个单元会作用于下一层的所有单元(矩阵乘法运算)。
  • 如果第 层有 个单元,第 层有 个单元, 是一个 维的权重矩阵。即每一层的权重矩阵大小都是非固定的。
  • 其中, 来自于偏置单元,这样意味着输出层不包含偏置单元,输入层和隐藏层需要增加偏置单元。

 

依据本节所给模型,有:

8.4 模型表示2(Model Representation II)

对第 层的所有激活单元应用激活函数,从而得到第 层激活单元的值:

对第 层的所有激活单元应用激活函数,从而得到输出:

上面的计算过程被称为前向传播(Forward propagation),即从输入层开始,一层一层地向下计算并传递结果。

 

再回顾一下逻辑回归:

是不是除了符号表示,其他都完全一样?其实神经网络就好似回归模型,只不过输入变成了中间单元 。从输入 开始,下一层的每个激活单元都包含了上一层的所有信息(单元值),通过最优化算法不断迭代计算,激活单元能得出关于输入 的更多信息,这就好像是在给假设函数加多项式。隐藏层的这些单元好似升级版的初始特征,从而能给出更好的预测。

 

向量化实现

定义

则有

预测结果即

 

即有

,通过该式即可计算神经网络中每一层的值。

扩展到所有样本实例:

,这时 是一个 维矩阵。

: 训练集中的样本实例数量

: 第二层神经网络中激活单元的数量

 

当然,神经网络不仅限于三层,每层的激活单元数量也并不固定:

8.5 例子和直观理解1(Examples and Intuitions I)

为了更好的理解神经网络,举例单层神经网络进行逻辑运算的例子。

下面的例子中, 为二进制数。

逻辑与(AND)运算(都为真值则结果才为真)神经网络:

回顾 sigmoid 函数图像,根据输入则有上图中右边的表格,即 。这样就实现了一个能够进行与运算的神经网络。

sigmoid function

 

再举一例,逻辑或(OR)运算(有一个真值则结果就为真)神经网络:

 

8.6 例子和直观理解2(Examples and Intuitions II)

下面逐步构建复杂一点的神经网络

如上图,我们分别构建了三个单层神经网络,将这三个网络组合起来,可得到一个新的神经网络,其可完成逻辑运算中的异或(XNOR)操作:

这里的组合即为

可见,特征值能不断升级,并抽取出更多信息,直到计算出结果。而如此不断组合,我们就可以逐渐构造出越来越复杂、强大的神经网络,比如用于手写识别的神经网络。

8.7 多类别分类(Multiclass Classification)

之前讨论的都是预测结果为单值情况下的神经网络,要实现多类别分类,其实只要修改一下输出层,让输出层包含多个输出单元即可。

举一个 4 分类问题的实例:

有四种分类情况,那么就让输出层包含 4 个输出单元即可,则 为 4 维向量。

神经网络中的多分类算法算是对 one-vs-all 思想的扩展,定义预测结果一共有 4 种情况:

如果预测结果 ,那么表示 ,即分为第 3 类,对应于图中的摩托车(Motorcycle)。

总结一下

多分类问题,要分为 类,就在输出层放置 个输出单元,对于单个样本实例,预测向量 维向量,我们则依据这个预测向量,得出该实例属于哪个类 。注意,神经网络中的预测和结果都是 维向量,而不再只是一个实数了。

\ No newline at end of file diff --git a/week4.md b/week4.md index 9578c3b..88849ca 100644 --- a/week4.md +++ b/week4.md @@ -188,9 +188,8 @@ $\Theta^{(1)} =\begin{bmatrix}-30 & 20 & 20 \newline 10 & -20 & -20\end{bmatrix} ![](image/20180117_011331.png) -如果预测结果 $h_\Theta(x) =\begin{bmatrix}0 \newline 0 \newline 1 \newline 0 \newline\end{bmatrix}$, +如果预测结果 $h_\Theta(x) =\begin{bmatrix}0 \newline 0 \newline 1 \newline 0 \newline\end{bmatrix}$,那么表示 $h_\Theta(x)_3$,即分为第 3 类,对应于图中的摩托车(Motorcycle)。 -那么表示 $h_\Theta(x)_3$,即分为第 3 类,对应于图中的摩托车(Motorcycle)。 - -**总结一下**,要分为 $k$ 类,就在输出层放置 $k$ 个输出单元,对于单个样本实例,$h_\Theta(x)$ 则是一个 $k$ 维结果向量,最后依据结果向量,得出属于哪个类 $y^{(i)}$。 +**总结一下** +多分类问题,要分为 $K$ 类,就在输出层放置 $K$ 个输出单元,对于单个样本实例,预测向量 $h_\Theta(x)$ 为 $K$ 维向量,我们则依据这个预测向量,得出该实例属于哪个类 $y^{(i)}$。注意,神经网络中的预测和结果都是 $K$ 维向量,而不再只是一个实数了。 \ No newline at end of file diff --git a/week5.html b/week5.html index 331198e..ef01559 100644 --- a/week5.html +++ b/week5.html @@ -2,7 +2,119 @@ -week5.md -

9 神经网络: 学习(Neural Networks: Learning)

9.1 代价函数(Cost Function)

神经网络的分类问题有两种:

  • 二元分类问题(01分类)

    只有一个输出单元 ()

  • 多元分类问题

    输出单元不止一个()

神经网络的代价函数公式:

: 神经网络的总层数

: 第 层激活单元的数量(不包含偏置单元)

: 分为第 个分类()的概率

: 输出层的输出单元数量,即类数 - 1

: 第 个训练样本的第 个分量值

: 维向量

 

注:此处符号表达和第四周的内容有异有同,暂时先按照视频来,有必要的话可以做下统一.

公式可长可长了是吧,但是不是有些熟悉?对照下逻辑回归中的代价函数:

在神经网络的代价函数中,

  • 左边的变化实际上是为了求解 分类问题,即公式会对每个样本特征都运行 次,并依次给出分为第 类的概率,
  • 右边的正则化项比较容易理解,每一层有多维矩阵 ,从左到右看这个三次求和式 ,就是对每一层间的多维矩权重 ,依次平方后求取其除了偏置权重部分的和值,并循环累加即得结果。

: 即 维向量

: 即 维矩阵

再次可见,神经网络背后的思想是和逻辑回归一样的。

 

9.2 反向传播算法(Backpropagation Algorithm)

类似于回归模型中的梯度下降算法,为了求解神经网络最优化问题,我们也要计算 ,以此

在神经网络中,代价函数看上去虽然不复杂,但要注意到其中 的求取实际上是由前向传播算法求得,即需从输入层开始,根据每层间的权重矩阵 依次计算激活单元的值 。 在最优化代价函数时,我们必然也需要最优化每一层的权重矩阵,再次强调一下,算法最优化的是权重,而不是输入

反向传播算法用于计算每一层权重矩阵的偏导 ,算法实际上是对代价函数求导的拆解。

  1. 首先运行前向传播算法,对于给定训练集 得到初始预测

  2. 接下来则应用反向传播算法,从输出层开始计算每一层预测的误差(error),以此来求取偏导。 -

  3. 输出层的误差即为预测与训练集结果的之间的差值:

    对于隐藏层中每一层的误差,都通过上一层的误差来计算:

    隐藏层中, 即为增加偏置单元后的 维度匹配,得以完成矩阵运算。

    即对于隐藏层,有 添加偏置单元

    解得

    则有

    求导前的公式不同于视频内容,经核实为视频内容错误。推导请阅下节。

    根据以上公式计算依次每一层的误差

  4. 初始化 矩阵,即令所有的 ,使得 为一个全零矩阵。

    然后依次求解 ,向量化实现即

  5. 求解完 后,最后则可求得偏导

    • , if ,
    • , if .(对应于偏置单元)

: 第 层的误差向量

: 第 层的第 个激活单元的误差

: 从第 层的第 个单元映射到第 层的第 个单元的权重代价的偏导(所有样本实例之和)

: 的样本均值与正则化项之和

 

注:无需计算 ,因为输入没有误差。

这就是反向传播算法,即从输出层开始不断向前迭代,根据上一层的误差依次计算当前层的误差,以求得代价函数的偏导。

应用反向传播(BP)算法的神经网络被称为 BP 网络,也称前馈网络(向前反馈)。

 

《机器学习》一书中提到的 BP 网络强大之处:

任何布尔函数都可由两层神经网络准确表达,但所需的中间单元的数量随输入呈指数级增长;

任何连续函数都可由两层神经网络以任意精度逼近;

任何函数都可由三层神经网络以任意程度逼近。

9.3 直观理解反向传播(Backpropagation Intuition)

这节给出了反向传播算法中误差的数学意义:

视频内容实际在上文都涉及到了,上节也做了解释:

反向传播算法,即从输出层开始不断向前迭代,根据上一层的误差依次计算当前层的误差,以求得代价函数的偏导。

不过,这块还是有些不好理解,可回顾视频。

前文提到输入层没有偏差,所以没有 ,同样的,偏置单元的值始终为 1,也没有误差,故一般会选择忽略偏置单元项的误差

下面以实际例子为基础给出推导证明。

 

神经网络中代价函数求导的推导过程

代价函数无正则化项时:

再次的,为了方便起见,这里假设样本只有一个,则有:

忆及 ,代入后整理后可得:

再次为了便于计算,我们用到如上图这个四层神经网络。

忆及 ,我们有

观察考虑各变量与 之间的关系,有

要计算 的偏导,就要按照关系不断往前看,每一次回头看,就称为一次反向传播。

把回头看的关系说的“微积分一点”,那就是 的微小改变会引起 的改变, 的微小改变会引起 的改变, 的微小改变又会引起 的改变,关系方向也可以反过来写:

如果你还记得微积分(不然你应该也不会看到这里(*^_^*)~),听起来像不像在暗示链式求导?

,则有 关于 的偏导:

再次忆及 ,则

则对于输出层,我们证得

再次忆及

即证得

对于任意的输出层 ,有 关系不变,故证得:

好了,接下来来看一下 关于 的偏导

仍然观察考虑各变量与 之间的关系,有

易求得

添加偏置单元 ,则

证明时为先求导后添加偏置单元,与前向传播算法顺序一致,实际实现时,求导和添加偏置单元的顺序可作调换,由于一般选择忽略偏置单元的误差,所以并不影响结果。

即证得

对于任意的隐藏层 ,有 关系不变,故证得:

再添回为了计算方便去掉的 和正则化项(时刻记住偏置单元不正则化),即为上节中 的偏导。

 

证明结束,留个课后作业呀,自己来计算一下 关于 的偏导,是不是能得到同样的结果?

9.4 实现注意点: 参数展开(Implementation Note: Unrolling Parameters)

在 Octave/Matlab 中,如果要使用类似于 fminunc 等高级最优化函数,其函数参数、函数返回值等都为且只为向量,而由于神经网络中的权重是多维矩阵,所以需要用到参数展开这个技巧。

将矩阵展开成向量

 

9.5 梯度检验(Gradient Checking)

9.6 随机初始化(Random Initialization)

9.7 总结起来(Putting It Together)

9.8 自主驾驶(Autonomous Driving)

+

9 神经网络: 学习(Neural Networks: Learning)

9.1 代价函数(Cost Function)

神经网络的分类问题有两种:

  • 二元分类问题(0/1分类)

    只有一个输出单元 ()

  • 多元()分类问题

    输出单元不止一个()

神经网络的代价函数公式:

: 神经网络的总层数

: 第 层激活单元的数量(不包含偏置单元)

: 分为第 个分类()的概率

: 输出层的输出单元数量,即类数 - 1

: 第 个训练样本的第 个分量值

: 维向量

 

注:此处符号表达和第四周的内容有异有同,暂时先按照视频来,有必要的话可以做下统一.

公式可长可长了是吧,但是不是有些熟悉?对照下逻辑回归中的代价函数:

在神经网络的代价函数中,

  • 左边的变化实际上是为了求解 分类问题,即公式会对每个样本特征都运行 次,并依次给出分为第 类的概率,
  • 右边的正则化项比较容易理解,每一层有多维矩阵 ,从左到右看这个三次求和式 ,就是对每一层间的多维矩权重 ,依次平方后求取其除了偏置权重部分的和值,并循环累加即得结果。

: 即 维向量

: 即 维矩阵

再次可见,神经网络背后的思想是和逻辑回归一样的,但由于计算复杂,实际上神经网络的代价函数 是一个非凸(non-convex)函数。

9.2 反向传播算法(Backpropagation Algorithm)

类似于回归模型中的梯度下降算法,为了求解神经网络最优化问题,我们也要计算 ,以此

在神经网络中,代价函数看上去虽然不复杂,但要注意到其中 的求取实际上是由前向传播算法求得,即需从输入层开始,根据每层间的权重矩阵 依次计算激活单元的值 。 在最优化代价函数时,我们必然也需要最优化每一层的权重矩阵,再次强调一下,算法最优化的是权重,而不是输入

反向传播算法用于计算每一层权重矩阵的偏导 ,算法实际上是对代价函数求导的拆解。

  1. 对于给定训练集 ,初始化每层间的误差和矩阵 ,即令所有的 ,使得每个 为一个全零矩阵。

  2. 接下来遍历所有样本实例,对于每一个样本实例,有下列步骤:

    1. 运行前向传播算法,得到初始预测

    2. 接下来则应用反向传播算法,从输出层开始计算每一层预测的误差(error),以此来求取偏导。

      输出层的误差即为预测与训练集结果的之间的差值:

      对于隐藏层中每一层的误差,都通过上一层的误差来计算:

      隐藏层中, 即为增加偏置单元后的 维度匹配,得以完成矩阵运算。

      即对于隐藏层,有 添加偏置单元

      解得

      则有

      求导前的公式不同于视频内容,经核实为视频内容错误。推导请阅下节。

      根据以上公式计算依次每一层的误差

    3. 然后依次求解累加误差 ,向量化实现即

  3. 遍历全部样本实例,求解完 后,最后则求得偏导

    • , if ,
    • , if .(对应于偏置单元)

: 第 层的误差向量

: 第 层的第 个激活单元的误差

: 从第 层的第 个单元映射到第 层的第 个单元的权重代价的偏导(所有样本实例之和)

: 的样本均值与正则化项之和

 

注:无需计算 ,因为输入没有误差。

这就是反向传播算法,即从输出层开始不断向前迭代,根据上一层的误差依次计算当前层的误差,以求得代价函数的偏导。

应用反向传播(BP)算法的神经网络被称为 BP 网络,也称前馈网络(向前反馈)。

 

《机器学习》一书中提到的 BP 网络强大之处:

任何布尔函数都可由两层神经网络准确表达,但所需的中间单元的数量随输入呈指数级增长;

任何连续函数都可由两层神经网络以任意精度逼近;

任何函数都可由三层神经网络以任意程度逼近。

9.3 直观理解反向传播(Backpropagation Intuition)

这节给出了反向传播算法中误差的数学意义:

视频内容实际在上文都涉及到了,上节也做了解释:

反向传播算法,即从输出层开始不断向前迭代,根据上一层的误差依次计算当前层的误差,以求得代价函数的偏导。

不过,这块还是有些不好理解,可回顾视频。

前文提到输入层没有偏差,所以没有 ,同样的,偏置单元的值始终为 1,也没有误差,故一般会选择忽略偏置单元项的误差

 

神经网络中代价函数求导的推导过程

代价函数无正则化项时:

再次的,为了方便起见,这里假设样本只有一个,则有:

忆及 ,代入后整理后可得:

再次为了便于计算,我们用到如上图这个四层神经网络。

忆及 ,我们有

观察考虑各变量与 之间的关系,有

要计算 的偏导,就要按照关系不断往前看,每一次回头看,就称为一次反向传播。

把回头看的关系说的“微积分一点”,那就是 的微小改变会引起 的改变, 的微小改变会引起 的改变, 的微小改变又会引起 的改变,关系方向也可以反过来写:

如果你还记得微积分(不然你应该也不会看到这里(*^_^*)~),听起来像不像在暗示链式求导?

,则有 关于 的偏导:

再次忆及 ,则

则对于输出层,我们证得

再次忆及

即证得

对于任意的输出层 ,有 关系不变,故证得:

好了,接下来来看一下 关于 的偏导

仍然观察考虑各变量与 之间的关系,有

易求得

添加偏置单元 ,则

证明时为先求导后添加偏置单元,与前向传播算法顺序一致,实际实现时,求导和添加偏置单元的顺序可作调换,由于一般选择忽略偏置单元的误差,所以并不影响结果。

即证得

对于任意的隐藏层 ,有 关系不变,故证得:

再添回为了计算方便去掉的 和正则化项(时刻记住偏置单元不正则化),即为上节中 的偏导。

 

证明结束,留个课后作业呀,自己来计算一下 关于 的偏导,是不是能得到同样的结果?

9.4 实现注意点: 参数展开(Implementation Note: Unrolling Parameters)

在 Octave/Matlab 中,如果要使用类似于 fminunc 等高级最优化函数,其函数参数、函数返回值等都为且只为向量,而由于神经网络中的权重是多维矩阵,所以需要用到参数展开这个技巧。

说白了,这个技巧就是把多个矩阵转换为一个长长的向量,便于传入函数,之后再根据矩阵维度,转回矩阵即可。

Octave/Matlab 代码:

 

reshape(A,m,n): 将向量 A 重构为 m * n 维矩阵。

9.5 梯度检验(Gradient Checking)

由于神经网络模型中的反向传播算法较为复杂,在小细节非常容易出错,从而无法得到最优解,故引入梯度检验。

梯度检验采用数值估算(Numerical estimation)梯度的方法,被用于验证反向传播算法的正确性。

把视 为一个实数,数值估算梯度的原理如上图所示,即有

其中, 为极小值,由于太小时容易出现数值运算问题,一般取

 

对于矩阵 ,有

Octave/Matlab 代码:

 

在得出 gradApprox 梯度向量后,将其同之前计算的偏导 比较,如果相等或很接近,即说明算法没有问题。

在确认算法没有问题后(一般只需运行一次),由于数值估计的梯度检验效率很低,所以一定要禁用它

9.6 随机初始化(Random Initialization)

逻辑回归中,初始参数向量全为 0 没什么问题,在神经网络中,情况就不一样了。

初始权重如果全为 0,忆及 ,则隐藏层除了偏置单元,都为 0,而每个单元求导的值也都一样,这就相当于是在不断重复计算同一结果,也就是算着算着,一堆特征在每一层都变成只有一个特征(虽然有很多单元,但值都相等),这样,神经网络的性能和效果都会大打折扣,故需要随机初始化初始权重。

随机初始化权重矩阵也为实现细节之一,用于打破对称性(Symmetry Breaking),使得

Octave/Matlab 代码:

当然,初始权重的波动也不能太大,一般限定在极小值 范围内,即

 

rand(m,n): 返回一个在区间 (0,1) 内均匀分布的随机矩阵。

: 和梯度下降中的 没有联系,这里只是一个任意实数,给定了权重矩阵初始化值的范围。

9.7 总结起来(Putting It Together)

一般来说,应用神经网络有如下步骤:

  1. 神经网络的建模(后续补充)

    • 选取特征,确定特征向量 的维度,即输入单元的数量。
    • 鉴别分类,确定预测向量 的维度,即输出单元的数量。
    • 确定隐藏层有几层以及每层隐藏层有多少个隐藏单元。

    默认情况下,隐藏层至少要有一层,也可以有多层,层数越多一般意味着效果越好,计算量越大。

  2. 训练神经网络

    1. 随机初始化初始权重矩阵

    2. 应用前向传播算法计算初始预测

    3. 计算代价函数 的值

    4. 应用后向传播宣发计算 的偏导数

    5. 使用梯度检验检查算法的正确性,别忘了用完就禁用它

    6. 丢给最优化函数得出最优化的权重值

      由于神经网络的代价函数非凸,最优化时不一定会收敛在全局最小值处,高级最优化函数能确保收敛在某个局部最小值处。

9.8 自主驾驶(Autonomous Driving)

描述了神经网络应用于自动驾驶的一个实例,用于打鸡血,笔记略。

\ No newline at end of file diff --git a/week5.md b/week5.md index e400767..2ade3fb 100644 --- a/week5.md +++ b/week5.md @@ -6,13 +6,13 @@ 神经网络的分类问题有两种: -- 二元分类问题(01分类) +- 二元分类问题(0/1分类) 只有一个输出单元 ($K=1$) -- 多元分类问题 +- 多元($K$)分类问题 - 输出单元不止一个($K\gt2$) + 输出单元不止一个($K\gt1$) 神经网络的代价函数公式: @@ -49,9 +49,7 @@ $J(\theta) = - \frac{1}{m} \sum_{i=1}^m [ y^{(i)}\ \log (h_\theta (x^{(i)})) + ( > > $\mathbb{R}^{m\times n}$: 即 $m \times n$ 维矩阵 -再次可见,神经网络背后的思想是和逻辑回归一样的。 - - +再次可见,神经网络背后的思想是和逻辑回归一样的,但由于计算复杂,实际上神经网络的代价函数 $J(\Theta)$ 是一个非凸(non-convex)函数。 ## 9.2 反向传播算法(Backpropagation Algorithm) @@ -59,38 +57,43 @@ $J(\theta) = - \frac{1}{m} \sum_{i=1}^m [ y^{(i)}\ \log (h_\theta (x^{(i)})) + ( 在神经网络中,代价函数看上去虽然不复杂,但要注意到其中 $h_\Theta(x)$ 的求取实际上是由前向传播算法求得,即需从输入层开始,根据每层间的权重矩阵 $\Theta$ 依次计算激活单元的值 $a$。 在最优化代价函数时,我们必然也需要最优化每一层的权重矩阵,再次强调一下,**算法最优化的是权重,而不是输入**。 +![](image/20180123_122124.png) + **反向传播算法**用于计算每一层权重矩阵的偏导 $\frac{\partial}{\partial\Theta}J(\Theta)$,算法实际上是对代价函数求导的拆解。 -1. 首先运行前向传播算法,对于给定训练集 $\lbrace (x^{(1)}, y^{(1)}) \cdots (x^{(m)}, y^{(m)})\rbrace$ 得到初始预测 $a^{(L)}=h_\Theta(x)$ +1. 对于给定训练集 $\lbrace (x^{(1)}, y^{(1)}) \cdots (x^{(m)}, y^{(m)})\rbrace$ ,初始化每层间的误差和矩阵 $\Delta$,即令所有的 $\Delta^{(l)}_{i,j}=0$,使得每个 $\Delta^{(l)}$ 为一个全零矩阵。 -2. 接下来则应用反向传播算法,从输出层开始计算每一层预测的**误差**(error),以此来求取偏导。 - ![](image/20180120_105744.png) +2. 接下来遍历所有样本实例,对于每一个样本实例,有下列步骤: -3. 输出层的误差即为预测与训练集结果的之间的差值:$\delta^{(L)} = a^{(L)} - y$, + 1. 运行前向传播算法,得到初始预测 $a^{(L)}=h_\Theta(x)$ 。 - 对于隐藏层中每一层的误差,都通过上一层的误差来计算: + 2. 接下来则应用反向传播算法,从输出层开始计算每一层预测的**误差**(error),以此来求取偏导。 - $\delta^{(l)} = (\Theta^{(l)})^T\delta^{(l+1)} .*\ \frac{\partial a^{(l)}}{\partial z^{(l)}}\; \; \; \; \; \text{for }l := L-1, L-2,\dots,2.$ + ![](image/20180120_105744.png) - 隐藏层中,$a^{(l)}$ 即为增加偏置单元后的 $g(z^{(l)})$,$a^{(l)}$ 与 $\Theta^{(l)}$ 维度匹配,得以完成矩阵运算。 + 输出层的误差即为预测与训练集结果的之间的差值:$\delta^{(L)} = a^{(L)} - y$, - 即对于隐藏层,有 $a^{(l)} = (g(z^{(l)})$ 添加偏置单元 $a^{(l)}_0 = 1)$ + 对于隐藏层中每一层的误差,都通过上一层的误差来计算: - 解得 $\frac{\partial}{\partial z^{(l)}}g(z^{(l)})=g'(z^{(l)})=g(z^{(l)}) .* \ (1-g(z^{(l)}))$, + $\delta^{(l)} = (\Theta^{(l)})^T\delta^{(l+1)} .*\ \frac{\partial a^{(l)}}{\partial z^{(l)}}\; \; \; \; \; \text{for }l := L-1, L-2,\dots,2.$ - 则有 $\delta^{(l)} = (\Theta^{(l)})^T\delta^{(l+1)} .*\ a^{(l)} .*\ (1-a^{(l)}), \ \ a^{(l)}_0 = 1$。 + 隐藏层中,$a^{(l)}$ 即为增加偏置单元后的 $g(z^{(l)})$,$a^{(l)}$ 与 $\Theta^{(l)}$ 维度匹配,得以完成矩阵运算。 - > $\delta^{(l)}$ 求导前的公式不同于视频内容,经核实为视频内容错误。推导请阅下节。 + 即对于隐藏层,有 $a^{(l)} = (g(z^{(l)})$ 添加偏置单元 $a^{(l)}_0 = 1)$ - ​ + 解得 $\frac{\partial}{\partial z^{(l)}}g(z^{(l)})=g'(z^{(l)})=g(z^{(l)}) .* \ (1-g(z^{(l)}))$, - 根据以上公式计算依次每一层的误差 $\delta^{(L)}, \delta^{(L-1)},\dots,\delta^{(2)}$。 + 则有 $\delta^{(l)} = (\Theta^{(l)})^T\delta^{(l+1)} .*\ a^{(l)} .*\ (1-a^{(l)}), \ \ a^{(l)}_0 = 1$。 -4. 初始化 $\Delta​$ 矩阵,即令所有的 $\Delta^{(l)}_{i,j}=0​$,使得 $\Delta​$ 为一个全零矩阵。 + > $\delta^{(l)}$ 求导前的公式不同于视频内容,经核实为视频内容错误。推导请阅下节。 - 然后依次求解 $\Delta^{(l)}_{i,j} := \Delta^{(l)}_{i,j} + a_j^{(l)} \delta_i^{(l+1)}$,向量化实现即 $\Delta^{(l)} := \Delta^{(l)} + \delta^{(l+1)}(a^{(l)})^T$ + ​ -5. 求解完 $\Delta$ 后,最后则可求得偏导 $\frac \partial {\partial \Theta_{i,j}^{(l)}} J(\Theta)=D_{i,j}^{(l)}$ + 根据以上公式计算依次每一层的误差 $\delta^{(L)}, \delta^{(L-1)},\dots,\delta^{(2)}$。 + + 3. 然后依次求解累加误差 $\Delta^{(l)}_{i,j} := \Delta^{(l)}_{i,j} + a_j^{(l)} \delta_i^{(l+1)}$,向量化实现即 $\Delta^{(l)} := \Delta^{(l)} + \delta^{(l+1)}(a^{(l)})^T$ + +3. 遍历全部样本实例,求解完 $\Delta$ 后,最后则求得偏导 $\frac \partial {\partial \Theta_{i,j}^{(l)}} J(\Theta)=D_{i,j}^{(l)}$ - $D^{(l)}_{i,j} := \dfrac{1}{m}\left(\Delta^{(l)}_{i,j} + \lambda\Theta^{(l)}_{i,j}\right)$, if $j\neq0$, - $D^{(l)}_{i,j} := \dfrac{1}{m}\Delta^{(l)}_{i,j}$, if $j=0$.(对应于偏置单元) @@ -138,8 +141,6 @@ $\delta_j^{(l)} = \dfrac{\partial}{\partial z_j^{(l)}} cost(t)$ 前文提到输入层没有偏差,所以没有 $\delta^{(1)}$,同样的,偏置单元的值始终为 1,也没有误差,故一般会选择**忽略偏置单元项的误差**。 -下面以实际例子为基础给出推导证明。 - **神经网络中代价函数求导的推导过程**: @@ -222,14 +223,112 @@ $$ 在 Octave/Matlab 中,如果要使用类似于 `fminunc` 等高级最优化函数,其函数参数、函数返回值等都为且只为向量,而由于神经网络中的权重是多维矩阵,所以需要用到参数展开这个技巧。 -将矩阵展开成向量 +说白了,这个技巧就是把多个矩阵转换为一个长长的向量,便于传入函数,之后再根据矩阵维度,转回矩阵即可。 +Octave/Matlab 代码: +```octave +% 多个矩阵展开为一个向量 +Theta1 = ones(11, 10); % 创建维度为 11 * 10 的矩阵 +Theta2 = ones(2, 4) * 2; % 创建维度为 2 * 4 的矩阵 +ThetaVec = [Theta1(:); Theta2(:)]; % 将上面两个矩阵展开为向量 + +% 从一个向量重构还原回多个矩阵 +Theta1 = reshape(ThetaVec(1:110), 11, 10) +Theta2 = reshape(ThetaVec(111:118), 2, 4) +% Theta2 = reshape(ThetaVec(111:(111 + 2 * 4) - 1), 2, 4) +``` + +> `reshape(A,m,n)`: 将向量 A 重构为 m * n 维矩阵。 ## 9.5 梯度检验(Gradient Checking) +由于神经网络模型中的反向传播算法较为复杂,在小细节非常容易出错,从而无法得到最优解,故引入梯度检验。 + +梯度检验采用数值估算(Numerical estimation)梯度的方法,被用于验证反向传播算法的正确性。 + +![](image/20180125_162704.png) + +把视 $\Theta$ 为一个实数,数值估算梯度的原理如上图所示,即有 $\dfrac{\partial}{\partial\Theta}J(\Theta) \approx \dfrac{J(\Theta + \epsilon) - J(\Theta - \epsilon)}{2\epsilon}$ + +其中,$\epsilon$ 为极小值,由于太小时容易出现数值运算问题,一般取 $10^{-4}$。 + + + +对于矩阵 $\Theta$,有 $\dfrac{\partial}{\partial\Theta_j}J(\Theta) \approx \dfrac{J(\Theta_1, \dots, \Theta_j + \epsilon, \dots, \Theta_n) - J(\Theta_1, \dots, \Theta_j - \epsilon, \dots, \Theta_n)}{2\epsilon}$ + +Octave/Matlab 代码: + +```octave +epsilon = 1e-4; +for i = 1:n, + thetaPlus = theta; + thetaPlus(i) += epsilon; + thetaMinus = theta; + thetaMinus(i) -= epsilon; + gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon); +end +``` + +在得出 gradApprox 梯度向量后,将其同之前计算的偏导 $D$ 比较,如果相等或很接近,即说明算法没有问题。 + +在确认算法**没有问题后**(一般只需运行一次),由于数值估计的梯度检验效率很低,所以一定要**禁用它**。 + ## 9.6 随机初始化(Random Initialization) -## 9.7 总结起来(Putting It Together) +逻辑回归中,初始参数向量全为 0 没什么问题,在神经网络中,情况就不一样了。 + +初始权重如果全为 0,忆及 $z^{(l)} = \Theta^{(l-1)}a^{(l-1)}$,则隐藏层除了偏置单元,都为 0,而每个单元求导的值也都一样,这就相当于是在不断**重复计算同一结果**,也就是算着算着,一堆特征在每一层都变成只有一个特征(虽然有很多单元,但值都相等),这样,神经网络的性能和效果都会大打折扣,故需要随机初始化初始权重。 + +随机初始化权重矩阵也为实现细节之一,用于打破对称性(Symmetry Breaking),使得 $\Theta^{(l)}_{ij} \in [-\epsilon,\epsilon]$ 。 + +Octave/Matlab 代码: + +当然,初始权重的波动也不能太大,一般限定在极小值 $\epsilon​$ 范围内,即 $\Theta^{(l)}_{i,j} \in [-\epsilon, \epsilon]​$。 + +```octave +If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11. + +Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON; +Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON; +Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON; +``` + +> `rand(m,n)`: 返回一个在区间 (0,1) 内均匀分布的随机矩阵。 +> +> $\epsilon$: 和梯度下降中的 $\epsilon$ 没有联系,这里只是一个任意实数,给定了权重矩阵初始化值的范围。 + +## 9.7 综合起来(Putting It Together) + +一般来说,应用神经网络有如下步骤: + +1. 神经网络的建模(后续补充) + - 选取特征,确定特征向量 $x$ 的维度,即输入单元的数量。 + - 鉴别分类,确定预测向量 $h_\Theta(x)$ 的维度,即输出单元的数量。 + - 确定隐藏层有几层以及每层隐藏层有多少个隐藏单元。 + + > 默认情况下,隐藏层至少要有一层,也可以有多层,层数越多一般意味着效果越好,计算量越大。 + +2. 训练神经网络 + + 1. 随机初始化初始权重矩阵 + + 2. 应用前向传播算法计算初始预测 + + 3. 计算代价函数 $J(\Theta)$ 的值 + + 4. 应用后向传播宣发计算 $J(\Theta)$ 的偏导数 + + 5. 使用梯度检验检查算法的正确性,别忘了用完就禁用它 + + 6. 丢给最优化函数最小化代价函数 + + > 由于神经网络的代价函数非凸,最优化时不一定会收敛在全局最小值处,高级最优化函数能确保收敛在某个**局部**最小值处。 + + + +## 9.8 自主驾驶(Autonomous Driving) + +![](image/20180125_195029.png) -## 9.8 自主驾驶(Autonomous Driving) \ No newline at end of file +描述了神经网络应用于[自动驾驶](https://www.coursera.org/learn/machine-learning/lecture/zYS8T/autonomous-driving)的一个实例,用于打鸡血,笔记略。