目录

一、非线性估值Non-Linear Hypothesis

二、神经网络建模 Neural Network

三、复习逻辑回归问题矩阵式

3.1 没有进行正则化

3.2 进行正则化

四、神经网络的代价函数

4.1 符号约定Notation

4.2 代价函数

五、反向传播算法 Backpropagation Alg

5.1 任务

5.2 一个训练样本

5.3 一个训练集

5.4 实现细节——随机初始化权重

5.5 实现细节——梯度检查

六、识别手写数字神经网络的实现过程

6.1 前项传播实现代价函数

6.2 前向传播+反向传播实现导数

6.3 实现随机初始化权重

6.4 实现sigmoid导数


复习Andrew Ng的课程Machine Learning,总结神经网络笔记一篇,涵盖课程week4、week5。

一、非线性估值Non-Linear Hypothesis

前面两篇博客讨论的技术——线性回归、逻辑回归,不管估值函数形式如何,参数与特征之间、特征各个维度之间的计算是都是线性的,也是。这里面没有出现如这样非线性的项。非线性的估值特别困难,原因在于非线性的特征太多,增长的速度也太快。

举个例子,在图像分类问题中,分类是否是一个“汽车”。一张50×50分辨率的图像有2500个像素,这2500个像素就是2500个特征(如果是RGB图像,那么就是2500×3=7500个特征)。如果加上非线性,即使只加入二次方的非线性,特征数也会达到约300万个。

      特征总数
+ + =

如此巨大的数据量使得非线性估值特别困难。因此,要想办法——引入神经网络Neural Network。神经网络要从神经元与大脑 Neurons & Brains说起。这个算法就是模仿神经系统工作的方式,详情看图,顺便认识几个医学、生物学英语单词。dendrite 树突,也就是神经元的输入;nucleus 细胞核; axon 轴突,也就是神经元的输出;

模仿神经元,我们建立自己的逻辑单元。输入有,其中“bias unit”偏置单元也就是,由于恒等于1,这个可以不在图中画出来。

二、神经网络建模 Neural Network

Neural Network一般分为3类层次

  1. 输入层input layer;一般记作layer1;
  2. 隐(含)层hidden layer;可以有多层,一般记作layer2、layer3……
  3. 输出层output layer,视模型情况确定输出个数;最后一层layer

约定符号Notation及推导

="activation" of unit i in layer j .  第j层的第i个单元的激励

=matrix of weights controlling function mapping from layer j to layer j+1. 从layer j映射到layer j+1的权重控制函数矩阵。

这个最简单的神经网络传播过程就是这样的

If network has units in layer j, units in layer j+1, then   will be dimension .

如果网络中layer j有个units,layer j+1有个units,那么将是一个维的矩阵。加了个1是因为每层都有偏置单元,偏置单元不是上一层的输出,但是得加上。比如上面推导的例子,网络第1层有3个单元,第2层有3个单元,那么

神经网络的分层结构,每一层都是下一层的输入。通过精心选择每一层的参数,就能构造出复杂的特征组合,从而避免了用第一层输入获得大量非线性组合的弊端。分层后,每层都作为下一层的输入,是更好的特征选择!!

三、复习逻辑回归问题矩阵式

重新考虑上一节的推导过程,可以写成矩阵式。训练集的特征,训练集的label是,我们要求取的参数是

    

3.1 没有进行正则化

3.2 进行正则化

正则化要特别注意,不要对进行正则化。在octave中下标从1开始,所以在处理相关的项(比如)时都要表示相应向量的第一个分量,coding时应注意。

四、神经网络的代价函数

4.1 符号约定Notation

=total No. of layers in network. 神经网络中的层数。

=No. of units(not counting bias unit) in layer . 第层中神经元的个数(不包括偏置单元)。

 训练集,共m个训练样本。

我们的多分类问题的label换了一个形式,不再是标量,而是一个向量,每个维度=1代表一个分类。

4.2 代价函数

其中,输出是一个向量表示该输出向量的第个分量,表示估值的第个分量。

第一项是适应代价函数,一个样本估值有k个分量,一个label有k个分量,先对k个分量偏差求和,再对m个样本求和。

第二项是正则化部分,是把每层矩阵的每个元素都平方求和。每个矩阵是行,列。再对个矩阵求和。求和项中从1开始计数,也就是不包括偏置单元的部分,也就是不包括

五、反向传播算法 Backpropagation Alg

5.1 任务

和前面讨论过的技术一样,这次的任务是​​​​​​​,我们不断调整参数,使代价函数最小(找到局部最优解)。为此,我们需要推导两个公式,以用于计算。

  • ​​​​​​​

5.2 一个训练样本

以上面这个网络为例,给出了一个训练样本,先计算forward propagation。

再计算backpropagation。

Intuition: ="error" of node j in layer l.

For each output unit (layer L = 4) ,向量化表达就是

然后考虑其他隐藏层的输出误差。

注意到

注意到,之间的维度不同,根据我们实现的方式不同,矩阵考虑了偏置单元而g函数没有考虑偏置单元,因此两者在维度上会有不同。我们在第六节里面举例具体说明。

注意,不要计算 ,因为layer1是输入,就是训练集里面的特征,不存在error。

5.3 一个训练集

这一部分给出了反向传播算法的实现过程,直接写英文了。由于Andrew Ng的PPT里面使用了两个做索引,索引的内容又不一样,因此容易混淆。我们把对训练集的索引用大写字母来表示,这样就不会产生歧义了。

Traing Set

Set

For

Set

Perform forward propagation to compute for         Using , compute

Compute

最终结论,,由此得到代价函数的偏导数。

5.4 实现细节——随机初始化权重

与线性回归、逻辑回归的初始化权重不同,反向传播算法初始化权重一定不能全部初始化为0。

假如我们将权重的元素全部初始化为0,那么前向传播时,各个隐藏层神经元得到的输入和权重都是一样的,那么神经元的输出也都一样。反向传播时,各层的也是一样的,这也就意味着经过梯度下降以后,各个参数的变化值也是一样的。如此反复,每个神经元的输出都一样,最后输出层得到的每个特征也都是一样的,这就阻碍了神经网络的学习。

解决这个问题的办法就是随机初始化权重。我们选取一个足够小量,让各层权重在区间里面随机分布,这样权重足够小,学习的效率也更高。

选取的方法是,确定第层的映射矩阵大小,然后取

选取权重的方法是,随机生成之间的随机数,随机数乘以,再减去,这样随机数就会落在

5.5 实现细节——梯度检查

反向传播算法异常复杂,实现起来容易产生bug。而且,即使出现bug,梯度下降看起来也是正常的,无法从收敛结果上直观发现这类bug。因此要想办法发现bug。这就是梯度检查。

回想逼近切线的方法,我们逐渐逼近得到切线的斜率。图太难画了,直接截图Andrew Ng的PPT。

这个方法,也是选取一个足够小量(建议选择),计算,再计算

那么

我们可以用来估计的大小,两者之间的差值应小于

六、识别手写数字神经网络的实现过程

6.1 前项传播实现代价函数

这一部分,描述了神经网络作业的实现过程——识别手写数字神经网络。

训练集有5000个训练样本。输入是20×20的灰度图像,并被拉成一个400×1的特征向量,label是一个数字,表示图像被识别成0~9里面的一个数字。为了方便octave的索引,我们将数字0映射到label数字10,数字0~9映射到label数字0~9。

神经网络模型如图,有一个Input Layer,一个Hidden Layer,一个Output Layer。Hidden Layer有25个神经元。由此算来,加上偏置单元我们可以得到权重矩阵的维度。

根据代价函数的定义,我们分两部分实现。

前项传播实现训练集的部分,注意

  • 添加各层的偏置单元
  • Label 的向量化

实现正则化部分,注意权重都包含了偏置单元的权重,正则化部分不应该包含这一部分。可以将权重赋值给临时变量,再将偏置单元权重置0。

代价函数最终结果

6.2 前向传播+反向传播实现导数

初始化

遍历训练集所有的样本,对每个训练样本)进行前向传播,再反向传播求出,再累加

将累加后的除以训练集的大小m,得到。注意,这一步骤是在遍历训练集之后的操作。

正则化部分,注意正则化部分不包括偏置单元。

导数最终结果

6.3 实现随机初始化权重

这一部分的实现相对简单,参看 5.4 实现细节——随机初始化权重。

6.4 实现sigmoid导数

注意sigmoid的导数具有这样的性质,

机器学习03-神经网络相关推荐

  1. 机器学习03:人工神经网络

    机器学习03:人工神经网络 人工神经元 人工神经元的结构 激活函数的选择 激活函数为什么是非线性的 常见的激活函数 神经网络 隐藏层的作用 使用代码训练神经网络 人工神经元 人工神经元的结构 人工神经 ...

  2. 03.PyTorch与CNN(4-1 机器学习和神经网络的基本概念(1))

    03.PyTorch与CNN(4-1 机器学习和神经网络的基本概念(1)) 一, 4-1 机器学习和神经网络的基本概念(1) 来自慕课网 一, 4-1 机器学习和神经网络的基本概念(1)

  3. 机器学习03:使用logistic回归方法解决猫狗分类问题

    机器学习03:使用logistic回归方法解决猫狗分类问题 文章目录 机器学习03:使用logistic回归方法解决猫狗分类问题 前言 1. Logistic回归原理 1.1 从线性回归说起 1.2 ...

  4. 基于Apache Spark的机器学习及神经网络算法和应用

    使用高级分析算法(如大规模机器学习.图形分析和统计建模等)来发现和探索数据是当前流行的思路,在IDF16技术课堂上,英特尔公司软件开发工程师王以恒分享了<基于Apache Spark的机器学习及 ...

  5. 机器学习实战-神经网络-21

    机器学习实战-神经网络-手写数字识别项目 # pip install scikit-learn --upgrade from sklearn.neural_network import MLPClas ...

  6. 【机器学习】神经网络BP理论与python实例系列

    理论部分 <机器学习--人工神经网络之发展历史(神经元数学模型.感知器算法)> <机器学习--人工神经网络之多层神经网络(多层与三层)> <机器学习--人工神经网络之后向 ...

  7. 机器学习——人工神经网络之BP算法编程(python二分类数据集:马疝病数据集)

    目录 一.理论知识回顾 1.神经网络模型 2.明确任务以及参数 1)待估参数: 2)超参数: 3)任务 3.神经网络数学模型定义 1)激活函数 ​ 2)各层权重.阈值定义 3)各层输入输出定义 4.优 ...

  8. 机器学习——人工神经网络之后向传播算法(BP算法)

    目录 一.后向传播算法的本质--梯度下降法求局部极值 1.w迭代公式的合理性 二.后向传播算法的推导(以二层神经网络为例) 1.问题描述(创建目标函数loss函数,求参数) 2.求解参数的流程(四步曲 ...

  9. 机器学习——人工神经网络之多层神经网络(多层与三层)

    目录 一.多层神经网络 1.多层神经网络数学模型 2.数学模型中的非线性函数fai 1)非线性函数fai存在的意义 2)非线性函数fai具体是什么? 3.多层神经网络与单层神经网络的区别与改进 1)单 ...

  10. 机器学习——人工神经网络之发展历史(神经元数学模型、感知器算法)

    目录 一.神经元的数学模型 ​ 二.感知器算法(SVM算法前身) 1.目的 2.流程 >>>问题1:下图w和b的调整是什么意思? 3.算法的有效性验证 1)原算法 2)增广矩阵 3) ...

最新文章

  1. 如何使用Linux内核中没有被导出的变量或函数
  2. 题目1185:特殊排序
  3. Java 集合系列(4): LinkedList源码深入解析2
  4. mysql 临时列_mysql – 在SQL中添加一个临时列,其中值取决于另一列
  5. linux raid卷,linux – Areca RAID卷和LVM对齐
  6. html5 字符相等,js里返回字符ok与字符ok比较不相等的问题
  7. Scala入门到精通——第二十二节 高级类型 (一)
  8. 3.C#基础之基本概念(完成)
  9. Android Studio Gradle构建脚本
  10. vue 根据swagger 生成接口_采用vue编写的功能强大的swagger-ui页面
  11. puppet(1.1-1.6)
  12. Web前端——JavaScript(bom文档对象模型)
  13. jQuery 第三章
  14. 彻底删除浏览器毒霸首页
  15. signal信号的处理过程
  16. 8通道温度采集器工作特性介绍
  17. Codeforces 115B Lawnmower
  18. (转载)分享一个昨天写的,3GQQ登录及取回sid的php源代码,内涵post/get访问网页的源代码。...
  19. C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
  20. python爬虫之woff 超详细 woff字体反扒 起点woff爬虫 字体爬虫 起点中文网woff

热门文章

  1. 【java】兴唐第十八节课
  2. pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器
  3. JS删除数组指定下标并添加到数组开头
  4. 给input type=color设置默认值
  5. python 字符编码问题
  6. Windows Phone SDK update for Windows Phone 7.8
  7. 如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)
  8. PHP-Fpm应用池配置
  9. Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)
  10. 查看sqlserver被锁的表以及如何解锁