AI学习笔记:[1]神经元与神经网络
上一篇:AI学习笔记:[0]什么是矩阵
学习吴恩达在网易云课堂上的《深度学习工程师》课程有一周了,差不多学完了4周的课程(只是理论学习,而非动手实践)。
1. 学习材料
在看吴恩达的课程前,我找了不少资料,比如:
- Deep Learning(深度学习)学习笔记整理系列
- 关于深度学习,看这一篇就够了
- 深度学习如何入门
- 台湾李宏毅教授《1天搞懂深度学习》
- DeepLearningBook读书笔记
- Tensorflow中文社区
- 神经网络入门
- Andrew Ng机器学习入门学习笔记
- 超智能体-分享最通俗易懂的深度学习教程
- 无痛的机器学习
需要的话还可以列出更多,但是这些只会让你越看越糊涂,什么是Sigmoid、LSTM、RNN、CNN,然后再加上一堆推导公式,让人直接晕菜。相比之下,吴恩达的课程则是从基本的理论开始,更单纯清晰,并辅于简单的Numpy的方法调用,很容易理解。
有时候学习太着急了反而不容易学好,因此还是推荐踏踏实实将这个课程视频看完。
当然课余资料仍然是不可避免的,我看了如下一些资料值得推荐:
- 书籍 《神经网络与深度学习》:其中关于神经网络的历史、感知机、以及基于Neuroph这个Java神经网络框架的演示非常棒(我目前只阅读到这部分)
- 博客 《神经网络入门》:形象讲解了神经元的工作原理、如何通过数学来进行建模
- 知乎专栏# 无痛的机器学习第一季:其中对于梯度下降算法等的解释非常详细,其他的内容我尚未阅读。
2. 吴恩达课程大纲
吴恩达的课程分为5个部分:
- 神经网络和深度学习
- 改善深层神经网络:超参数调试、正则化以及优化
- 结构化机器学习项目
- 卷积神经网络
- 序列模型
其中第一部分[神经网络和深度学习]又分为4周的课程:
- 深度学习概论:深度神经网络可以干什么
- 神经网络基础:logistic回归、梯度下降法、计算图、向量化、以及python的numpy和Jupyter的使用
- 浅层神经网络:神经网络表示、激活函数、激活函数的导数、神经网络的梯度下降法
- 深层神经网络:深层神经网络的表示、前向和后向传播、超参数
我总结成了以下思维导图,其中红色部分是本文涉及到的。
Deep Learning Specialization.png下面,进入正文。
3. 神经元
要理解什么是神经网络,需要从什么是神经元以及如何对神经元进行抽象建模进行了解,神经元也就是神经细胞。
神经元.png上图是生物课上学习到过的神经元,比较有意思的是如下两个组成部分:
- 细胞核周边冒出来的分支称为“树突”,用于接收刺激信号
- 中间长长的丝称为“轴突”,其末端也有一些分支,和其他神经元的“树突”连在一起,作用是将信号传递给其他神经细胞
人类的中枢神经系统中约有1000亿个神经元,每个神经元大概与1万个其他神经元相连,要用电脑去模拟人类的神经系统即便是大数据时代也是非常困难的。甚至有人将人类的大脑比喻成宇宙,因为宇宙中的恒星的数量可能和大脑中的神经元是差不多量级的,因此说每个人都顶着一个宇宙。
神经元的工作模式非常简单,接受来自“树突”的信号,来决定是否要“激发”,并且将状态通过“轴突”传递给下一个神经元。可以用简单的数据模型描述如下。
4.神经元的数据模型
神经元建模.png在吴恩达的课程中,输入被描述成
信号处理函数分为两部分(这两个部分很重要,是后续所有探讨的基石,一定要先搞懂):
- 权重加权(每个输入信号x1, x2, x3,对应的权重分别为w1, w2, w3,然后加上内部强度(用 b 表示)
- 激活函数(用 a=σ(z) 表示)
整个公式为:
用向量表示为:
其中:
如果你看过我的上一篇文章《AI学习笔记:[0]什么是矩阵》,你就会发现那篇文章最后一部分提到了这个公式。这里再重新叙述一次:w和x都是 3x1 的列向量,其中w转置后为 1x3 的行向量,因此与x相乘后为标量(实数),然后和 b 相加就得到标量 z。
z被代入到激活函数 a=σ(z) 得到神经元的输出,这里的 a 表示神经元的激活状态。
注意到这里的σ(z)还没有具体展开。 σ(z)被称为激活函数,具体有很多种,在整个神经网络中不同层的神经元可以使用不同的激活函数,以下将列举几种。
5. 激活函数
σ(z)激活函数有好几种,吴恩达讲的比较多的是这四种:
Sigmoid函数(知名度最高,但其实只是激活函数的其中一种)
Tanh函数
ReLu函数
Leaky ReLu函数
这四个函数的图形分别为:
激活函数图形.png吴恩达在课程中说:
- 几乎所有的情况下 Tanh 都要比 Sigmoid 要好
- 默认用 ReLu 就很好,可以参考下 ReLu(Rectified Linear Units)激活函数
至于为什么是这样,应该需要阅读好多论文才能懂,暂且先记住吧。
6. 神经网络
整个神经网络分为:输入层,隐藏层,输出层。一般说L层神经网络,指的是有L个隐层,输入层和输出层都不计算在内的。
两层神经网络.jpg在吴恩达的课程中,神经网络分为 浅层神经网络 和 深层神经网络,下图是 神经网络和深度学习Week4 中的图。
- 一个神经元被称为 逻辑斯蒂回归(logistic regression)
- 隐层(hidden layer)较少的被称为 浅层,而隐层较多的(比如这个图中的5 hidden layer)被称为 深层
基本上是层次越深越好,但是带来的计算成本都会增加,有时候不知道个该用多少的时候,就从logistic回归开始,一层一层增加。
神经网络的分类7. 神经网络的表达
在 4.神经元的数据模型 中已经清楚地用公式表达了一个样本输入一个神经元后的输出。下面看一个样本输入第一个隐层(1 hidden layer)如何表达。
以“神经网络的分类”图中的“1 hidden layer”为例,输入样本有3个特征x1, x2, x3
输入量表达为 x=(x1, x2, x3),对于一个神经元而言w=(w1, w2, w3),对于第一个有3个神经元的隐层而言:
其中,wn[l] 右上方括号中的l(字母L的小写,代表layer)表示第l个隐层,下标n表示第l层中的第n个神经元。wn[l]T 在本例中是1x3的行向量,因为有第一层有三个神经元,因此w是 3x3 的矩阵。
这里,bn[l]表示第l层的第n个节点的内部强度,是一个实数,因此这里的 b 是一个 3x1 的列向量。
所以,对第一层神经元而言,第一步计算z:
简化一下,就是
第二步计算a:
抽象一下,第 l-1 层输出到第 l 层的公式就是:
注意这里,用 a[l-1] 替代了 x,因为,实际上而言a[0]就是输入层x。
到此为止,已经通过数学公式归纳出一个样本输入到神经网络中并计算其输出的递归公式。仔细分析还是挺简单的,基本上只涉及简单的线性代数知识。
实际上以上就是吴恩达课程中的 向量化 的主要内容了。至于如何将 m 个样本整合到一个矩阵中,就请听下回分解了,本篇内容已经很多了,连我自己都感觉有点烧脑。
8. 下一步
下一步要学习和总结 计算图 和 损失函数,以及如何通过 梯度下降法 求解 w[l] 和 b[l],还会涉及到一些 导数、偏导数和 Numpy 的内容。
如果你喜欢本文,请不要吝啬你的点赞或打赏,毕竟一个红心就能让我高兴半天
请关注我的账号,预计会以一周一篇的频率进行更新~