请选择 进入手机版 | 继续访问电脑版
楼主: 东方祥
6478 31

深度学习和神经网络入门指南(一)_CDA网校 [推广有奖]

学科带头人

56%

还不是VIP/贵宾

-

威望
2
论坛币
653784 个
通用积分
46542.3897
学术水平
203 点
热心指数
253 点
信用等级
195 点
经验
53746 点
帖子
520
精华
6
在线时间
2288 小时
注册时间
2015-3-25
最后登录
2024-3-20

东方祥 企业认证  发表于 2018-11-7 09:36:02 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. 掌握深度学习技巧的感觉就像现在领导着超级大国一样。从分类图像和翻译语言到构建自动驾驶汽车,所有这些任务都是由计算机驱动而不是人工操作。深度学习已经渗透到多个多样化的行业中,并且几乎每周都会继续开辟新的领域。
复制代码

(本文主要参考deeplearning.ai项目)

目录
1. 项目简介
2. 神经网络基础
    2.1 Logistic回归作为神经网络
    2.2 Python和矢量化
3. 浅层神经网络
4. 深度神经网络

1. 项目简介
    首先在第1部分简要介绍了深度学习和神经网络,在第2部分中,我们深入研究神经网络的基础知识。Andrew Ng解释了如何使用神经网络解决逻辑回归问题;在第3部分,讨论转向浅层神经网络,简要介绍激活函数,梯度下降和前向和后向传播;最后,Andrew Ng为我们讲授了最令人期待的主题 - 深度神经网络

2. 神经网络和深度学习
2.1. 深度学习简介
第一个模块的学习目标如下:
  • 了解推动深度学习兴起的主要趋势
  • 能够解释深度学习如何应用于监督学习
  • 了解什么是主要的模型类别(如CNN和RNN),以及何时应用它们
  • 能够识别深度学习何时(或不会)运作良好的基础知识

什么是神经网络?
考虑一个我们必须预测房屋价格的例子。我们给出的变量是房子的平方英尺(或平方米)的大小和房子的价格。现在假设我们有6所房子。先让我们绘制一个图表来想象我们正在看的东西:
Screenshot-from-2018-10-15-16-29-45.png

在x轴上,我们有房子的大小,在y轴上我们有相应的价格。线性回归模型将尝试绘制直线以拟合数据:
Screenshot-from-2018-10-12-12-43-27.png

所以,这里的输入(x)是房子的大小,输出(y)是价格。现在让我们看看如何使用简单的神经网络解决这个问题:
Screenshot-from-2018-10-12-13-19-40.png

在这里,神经元将接受输入,对其应用一些激活函数,并生成输出。最常用的激活功能之一是ReLU(整流线性单元):
1oePAhrm74RNnNEolprmTaQ.png

ReLu函数是指输入实数返回0或该数字。因此,如果输入10,输出将为10,如果输入为-10,则输出将为0.我们将在本文后面详细讨论激活函数。
现在让我们继续。如果使用ReLu激活函数根据房​​屋大小预测房屋价格,这就是预测的外观:

到目前为止,我们已经看到了一个带有单个神经元的神经网络,即我们只有一个特征(房子的大小)来预测房价。但实际上,我们必须考虑多种因素,如卧室数量邮政编码等?房价还取决于家庭规模社区位置学校质量。在这种情况下我们如何定义神经网络?
Screenshot-from-2018-10-12-13-55-07.png

这里有点复杂。在阅读时请参考上面的图像 - 我们将4个特征作为x的输入传递给神经网络,它自动识别输入中的一些隐藏特征,最后生成输出y。这就是具有4个输入和具有单个隐藏层的输出的神经网络如何看起来像:
Screenshot-from-2018-10-12-13-58-30.png

现在我们对神经网络的直觉有了直觉,让我们看看如何将它们用于监督学习问题。

基于神经网络的监督学习
监督学习是指我们需要找到一个能够将输入映射到相应输出的函数(给定一组输入 - 输出对)的任务。我们为每个给定的输入定义了输出,并在这些示例中训练模型。下面是一个非常方便的表,它讨论了监督学习的不同应用以及可用于解决这些问题的不同类型的神经网络:
输入(X)
输出(y)
应用
神经网络的类型
主页特色
价钱
房地产
标准神经网络
广告,用户信息
点击预测(0/1)
在线广告
标准神经网络
图片
图像类
照片标记
CNN
音频
文字记录
语音识别
RNN
英语
中文
机器翻译
RNN
图像,雷达信息
汽车的位置
自动驾驶
自定义/混合NN


以下是最常见的神经网络类型的直观表示:
Screenshot-from-2018-10-12-14-10-51.png

在本文中,我们将重点关注标准神经网络。您可能知道,监督学习可用于结构化和非结构化数据。
在我们的房价预测示例中,给定的数据告诉我们卧室的大小和数量。这是结构化数据,意味着每个特征,例如房屋的大小,卧室的数量等具有非常明确的含义。
相比之下,非结构化数据指的是诸如音频,原始音频或图像之类的内容,您可能希望识别图像或文本中的内容(如对象检测)。这里,特征可以是图像中的像素值,或者是一段文本中的单个词。目前还不清楚图像的每个像素代表什么,因此这属于非结构化数据伞。简单的机器学习算法适用于结构化数据。但是,当谈到非结构化数据时,它们的性能往往会下降很多。这就是神经网络被证明是如此有效和有用的地方。它们在非结构化数据上表现非常出色。如今,大多数突破性的研究都以神经网络为核心。

为什么深度学习起飞?
要理解这一点,请查看下图:
Screenshot-from-2018-10-12-14-29-37.png

随着数据量的增加,传统学习算法(如SVM和逻辑回归)的性能并未得到很大提高。事实上,它在某一点之后趋于稳定。在神经网络的情况下,模型的性能随着您提供给模型的数据的增加而增加。
基本上有三种尺度推动典型的深度学习过程:
  • 数据
  • 计算时间
  • 算法

为了改善模型的计算时间,激活函数起着重要作用。如果我们使用sigmoid激活函数,这就是我们最终得到的结果:
320px-Logistic-curve.svg_.png

最末端的斜率或该函数的梯度接近于零。因此,参数更新非常缓慢,导致学习速度非常慢。因此,从S形激活函数切换到ReLU(整流线性单元)是我们在神经网络中看到的最大突破之一。当x> 0时,当斜率为1时,ReLU更快地更新参数。这是更快地计算模型的主要原因。

2.2:深度学习简介
这个模块我们的目标是:
  • 构建逻辑回归模型,构建为浅层神经网络
  • 实现ML算法的主要步骤,包括进行预测,导数计算和梯度下降
  • 实现计算效率和高度矢量化的模型版本
  • 了解如何使用反向传播思维模式计算逻辑回归的导数
  • 熟悉Python和Numpy

因此该模块进一步分为两部分:
  • 第一部分:Logistic回归作为神经网络
  • 第二部分:Python和矢量化

让我们详细介绍每个部分。

第一部分:Logistic回归作为神经网络二进制分类
在二元分类问题中,我们有一个输入x,比如一个图像,我们必须将它归类为有猫或没有。如果它是猫,我们将为它分配1,否则为0.所以在这里,我们只有两个输出 - 图像包含猫或不包含猫。这是二元分类问题的一个例子。
在这种情况下,我们当然可以使用最流行的分类技术,即逻辑回归。

Logistic回归
我们有一个输入X(图像),我们想知道图像属于第1类(即猫)的概率。对于给定的X向量,输出将为:
\[$y = w^{T}*X + b$\]
这里w和b是参数。由于我们的输出y是概率,它应该在0和1之间。但是在上面的等式中,它可以取任何实际值,这对于获得概率没有意义。所以逻辑回归也使用sigmoid函数输出概率:
Screenshot-from-2018-10-12-15-17-08.png

对于任何值作为输入,它将仅返回0到1范围内的值。sigmoid函数的公式是:
Screenshot-from-2018-10-12-15-10-50.png

因此,如果z非常大,exp(-z)将接近0,因此sigmoid的输出将为1.类似地,如果z非常小,则exp(-z)将是无穷大,因此输出sigmoid将为0。
注意,参数w是nx维向量,b是实数。现在让我们看一下逻辑回归的成本函数。

Logistic回归成本函数
为了训练逻辑回归的参数w和b,我们需要一个成本函数。我们想要找到参数w和b,使得至少在训练集上,你有的输出(y-hat)接近实际值(y)。
我们可以使用下面定义的损失函数:
Screenshot-from-2018-10-12-15-22-09.png

该函数的问题在于优化问题变为非凸的,导致多个局部最优。因此,梯度下降对于这种损失函数不会很好。因此,对于逻辑回归,我们定义了一个不同的损失函数,它起到与上述损失函数类似的作用,并通过给出凸函数来解决优化问题:
Screenshot-from-2018-10-12-15-26-05.png

损失函数是针对单个训练示例定义的,该示例告诉我们在该特定示例中的表现如何。另一方面,成本函数用于整个训练集。逻辑回归的成本函数是:
Screenshot-from-2018-10-15-13-45-22.png

我们希望我们的成本函数尽可能小。为此,我们希望优化参数w和b。

梯度下降
这种技术有助于以最小化成本函数的方式学习参数w和b。逻辑回归的成本函数本质上是凸的(即只有一个全局最小值),这就是选择此函数而不是平方误差的原因(可以有多个局部最小值)。
让我们看一下梯度下降的步骤:
  • 初始化w和b(通常初始化为0用于逻辑回归)
  • 在最陡峭的下坡方向迈出一步
  • 重复步骤2,直到达到全局最佳值

Screenshot-from-2018-10-15-12-12-24.png



梯度下降的更新方程变为:
Screenshot-from-2018-10-15-12-15-19.png

这里,⍺是学习率,它控制每次迭代后我们应该采取多大的步骤。
如果我们位于上图所示的右侧,则斜率为正。使用更新的等式,我们将向左移动(即向下方向),直到达到全局最小值。然而,如果我们在左侧,斜率将是负的,因此我们将向右(向下方向)迈出一步,直到达到全局最小值。非常直观,对吧?
逻辑回归参数的更新方程是:
Screenshot-from-2018-10-15-12-20-12.png

拓展:
考虑一个函数f(a)= 3a,如下所示:
Screenshot-from-2018-10-15-12-25-04.png

此函数在任何点的导数都将给出该点的斜率。所以,
f(a = 2)= 3 * 2 = 6
f(a = 2.001)= 3 * 2.001 = 6.003
a = 2处函数的斜率/导数为:
斜率=高度/宽度

Screenshot-from-2018-10-15-12-27-48.png


斜率= 0.003 / 0.001 = 3
这就是我们计算函数的导数/斜率的方法。

计算图
这些图组织了特定函数的计算。考虑以下示例:
J(a,b,c)= 3(a + bc)
我们必须计算给定a,b和c的J. 我们可以将其分为三个步骤:
  • u = bc
  • v = a+u
  • J = 3v

让我们将这些步骤可视化为a = 5,b = 3和c = 2:
Screenshot-from-2018-10-15-12-45-11.png

这是我们计算输出的前向传播步骤,即J.我们也可以使用计算图进行反向传播,我们在上面的例子中更新了参数a,b和c。

具有计算图的衍生物
现在让我们看看我们如何借助计算图来计算导数。假设我们必须计算dJ / da。步骤将是:
  • 由于J是v的函数,因此计算dJ / dv:

dJ / dv = d(3v)/ dv = 3
  • 由于v是a和u的函数,因此计算dv / da:

dv / da = d(a + u)/ da = 1
  • 计算dJ / da:

dJ / da =(dJ / dv)*(dv / da)= 3 * 1 = 3
同样,我们可以计算dJ / db和dJ / dc:
Screenshot-from-2018-10-15-12-54-41.png

现在我们将一起采用计算图和梯度下降的概念,看看如何更新逻辑回归的参数。

Logistic回归梯度下降
为了快速回顾一下,逻辑回归的方程是:

其中L是损失函数。现在,对于两个特征(x1和x2),用于计算损失的计算图将是:
Screenshot-from-2018-10-15-12-59-20.png

这里,w1,w2和b是需要更新的参数。以下是执行此操作的步骤(对于w1):
  • 计算da:

da = dL / da =(-y / a)+(1-y)/(1-a)
  • 计算dz:

dz =(dL / da)*(da / dz)= [(-y / a)+(1-y)/(1-a)] * [a(1-a)] = ay
  • 计算dw1:

dw1 = [(dL / da)*(da / dz)] * dz / dw1 =(ay)* dz / dw1
同样,我们可以计算dw2和db。最后,权重将使用以下等式更新:
Screenshot-from-2018-10-15-13-07-59.png

请记住,这是针对单个培训示例的。我们将在实际场景中有多个示例。那么,让我们来看看如何计算'm'训练样例的梯度下降。

'm'例子的梯度下降
我们可以将“m”训练示例的预测和成本函数定义为:

参数的损失函数的导数可以写成:
Screenshot-from-2018-10-15-13-47-11.png

现在让我们看看我们如何为'm'示例应用逻辑回归:

  1. J = 0; dw1 = 0; dw2 =0; db = 0;               
  2. w1 = 0; w2 = 0; b=0;                           
  3. for i = 1 to m
  4.     # Forward pass
  5.     z(i) = W1*x1(i) + W2*x2(i) + b
  6.     a(i) = Sigmoid(z(i))
  7.     J += (Y(i)*log(a(i)) + (1-Y(i))*log(1-a(i)))
  8.    
  9.     # Backward pass
  10.     dz(i) = a(i) - Y(i)
  11.     dw1 += dz(i) * x1(i)
  12.     dw2 += dz(i) * x2(i)
  13.     db  += dz(i)
  14. J /= m
  15. dw1/= m
  16. dw2/= m
  17. db/= m

  18. # Gradient descent
  19. w1 = w1 - alpa * dw1
  20. w2 = w2 - alpa * dw2
  21. b = b - alpa * db
复制代码


这些for循环最终使计算变得非常慢。有一种方法可以替换这些循环,以使代码更有效。我们将在接下来的部分中介绍这些技巧。

第二部分 - Python和矢量化
到目前为止,我们已经看到如何使用梯度下降来更新逻辑回归的参数。在上面的例子中,我们看到如果我们有'm'训练样例,我们必须运行循环'm'次以获得输出,这使得计算非常慢。
我们可以使用矢量化而不是这些for循环,这是一种有效且时间有效的方法。

矢量
Vectorization基本上是一种摆脱代码中for循环的方法。它为“m”训练示例一起执行所有操作,而不是单独计算它们。让我们看一下逻辑回归的非向量化和向量化表示:
非矢量化形式:
z = 0对于范围内的i(nx):   z + = w  * x z + = b
现在,让我们看一下矢量化形式。我们可以用矢量形式表示w和x:
Screenshot-from-2018-10-15-14-28-02.png

现在我们可以使用以下方法计算所有训练样例的Z:
Z = np.dot(W,X)+ b( numpy 作为np导入)
NumPy库的点函数默认使用矢量化。这就是我们如何对乘法进行矢量化。现在让我们看看如何对整个逻辑回归算法进行矢量化。

矢量化Logistic回归
保持'm'训练样例,第一步是计算所有这些例子的Z:
Z = np.dot(WT,X)+ b
这里,X包含所有训练样例的特征,而W是这些例子的系数矩阵。下一步是计算输出(A),它是Z的S形:
A = 1/1 + np.exp(-Z)
现在,计算损失,然后使用反向传播来减少损失:
dz = A - Y.
最后,我们将计算参数的导数并更新它们:
dw = np.dot(X,dz.T)/ m
db = dz .sum()/ m
W = W - ⍺dw
b = b - ⍺db

用Python广播
广播使代码的某些部分更加高效。但是,不要只听我的话!我们来看一些例子:
  • obj.sum(axis = 0)


对列进行求和,而obj.sum(axis = 1)对行求和
  • obj.reshape(1,4)


通过广播值来改变矩阵的形状
Screenshot-from-2018-10-15-15-04-09.png

如果我们将100添加到(4×1)矩阵,它将100复制到(4×1)矩阵。类似地,在下面的示例中,将复制(1×3)矩阵以形成(2×3)矩阵:
Screenshot-from-2018-10-15-15-05-26.png

一般原则是:
Screenshot-from-2018-10-15-15-08-09.png

如果我们用(1,n)矩阵对(m,n)矩阵进行加,减,乘或除,则将其复制m次到(m,n)矩阵。这称为广播,它使计算速度更快。亲自尝试一下!

关于Python / Numpy Vectors的注释
如果使用以下方法形成数组:
  1. a = np.random.randn(5)
复制代码


它将创建一个形状(5,)数组,这是一个排名1的数组。在进行数组转置时,使用此数组会导致问题。相反,我们可以使用以下代码来形成向量而不是秩1数组:
  1. a = np.random.randn(5,1)#shape(5,1)列向量
复制代码
  1. a = np.random.randn(1,5)#shape(1,5)行向量
复制代码


要将(1,5)行向量转换为(5,1)列向量,可以使用:
  1. a = a.reshape((5,1))
复制代码


对于模块2来说就是这样。在下一节中,我们将深入探讨浅层神经网络的细节。

2.3 浅层神经网络
模块3的目标是:
  • 了解隐藏单元和隐藏层
  • 能够在神经网络中应用各种激活功能。
  • 使用隐藏层构建您的第一个前向和后向传播
  • 将随机初始化应用于神经网络
  • 熟练掌握深度学习符号和神经网络表示
  • 使用一个隐藏层构建和训练神经网络


神经网络概述
在逻辑回归中,为了计算输出(y = a),我们使用了下面的计算图:
Screenshot-from-2018-10-15-17-43-44.png

如果神经网络具有单个隐藏层,则结构将如下所示:
Screenshot-from-2018-10-15-17-45-29.png

并且计算输出的计算图将是:
X1 \ X2 => z1 = XW1 + B1 => a1 = Sigmoid(z1)=> z2 = a1W2 + B2 => a2 = Sigmoid(z2)=> l(a2,Y)X3 /神经网络表示
考虑以下神经网络的表示:
Screenshot-from-2018-10-15-17-49-48.png

你能确定上述神经网络中的层数吗?请记住,在计算NN中的层数时,我们不计算输入层。因此,上面显示的NN中有2层,即一个隐藏层和一个输出层。
第一层称为[0],第二层称为[1],最后一层称为[2]。这里'a'代表激活,它是神经网络的不同层传递到下一层的值。相应的参数是w [1],b [1]和w [1],b [2]:
Screenshot-from-2018-10-15-18-01-13.png

这就是神经网络的表示方式。接下来我们将看看如何计算神经网络的输出。

计算神经网络的输出
让我们详细了解神经网络的每个神经元是如何工作的。每个神经元接受一个输入,对它们执行一些操作(计算z = w [T] + b),然后应用sigmoid函数:
Screenshot-from-2018-10-15-18-06-22.png

该步骤由每个神经元执行。具有四个神经元的第一个隐藏层的等式将是:
Screenshot-from-2018-10-15-18-08-46.png

因此,对于给定的输入X,每个神经元的输出将是:
z [1] = W [1] x + b [1]
a [1] =σ(z [1])
z [2] = W [2] x + b [2]
a [2] =σ(z [2])
为了计算这些输出,我们需要运行一个for循环,它将为每个神经元单独计算这些值。但是请记住,使用for循环会使计算速度变慢,因此我们应该优化代码以摆脱这个for循环并更快地运行它。

跨多个示例进行矢量化
计算神经网络输出的非矢量化形式是:
对于i = 1到m:z [1] (i) = W [1] (i) x + b [1]a [1] (i) =σ(z [1] (i))z [2] (i) = W [2] (i) x + b [2]a [2] (i) =σ(z [2] (i))
使用这个for循环,我们分别计算每个训练样例的z和值。现在我们来看看如何进行矢量化。所有训练样例将合并在一个矩阵X中:
Screenshot-from-2018-10-15-18-20-11.png

这里,nx是特征的数量,m是训练样本的数量。用于计算输出的矢量化形式将是:
Z [1] = W [1] X + b [1]
A [1] =σ(Z [1])
Z [2] = W [2] X + b [2]
A [2] =σ(Z [2])
这将减少计算时间(在大多数情况下显着)。

激活功能
在计算输出时,应用激活功能。激活功能的选择极大地影响模型的性能。到目前为止,我们已经使用了sigmoid激活函数:
Screenshot-from-2018-10-15-18-49-431.png

但是,在某些情况下,这可能不是最佳选择。为什么?因为在图的极端,导数将接近于零,因此梯度下降将非常缓慢地更新参数。
还有其他功能可以取代此激活功能:
  • 正切:

Screenshot-from-2018-10-15-18-50-09.png

  • ReLU(早先已经介绍过):

Screenshot-from-2018-10-15-18-50-37.png


激活功能
优点
缺点
乙状结肠
在输出层中用于二进制分类
输出范围为0到1
正切
比乙状结肠更好
当点处于极端时,缓慢更新参数
RELU
当x> 0时斜率为1,更快地更新参数
x <0时的零斜率


我们可以根据我们试图解决的问题选择不同的激活函数。

为什么我们需要非线性激活功能?
如果我们在图层的输出上使用线性激活函数,它会将输出计算为输入要素的线性函数。我们首先将Z值计算为:
Z = WX + b
在线性激活函数的情况下,输出将等于Z(而不是计算任何非线性激活):
A = Z.
使用线性激活基本上没有意义。两个线性函数的组合本身就是一个线性函数,除非我们使用一些非线性激活,否则我们不会计算出更有趣的函数。这就是大多数专家坚持使用非线性激活功能的原因。
只有一种情况我们倾向于使用线性激活函数。假设我们想要预测房屋的价格(可以是任何正实数)。如果我们使用sigmoid或tanh函数,则输出的范围分别为(0,1)和(-1,1)。但价格也将超过1。在这种情况下,我们将在输出层使用线性激活函数。
一旦我们有了产出,下一步是什么?我们想要执行反向传播,以便使用梯度下降来更新参数。

神经网络的梯度下降
我们必须在双层神经网络中更新的参数是:w [1],b [1],w [2]和b [2],我们将最小化的成本函数是:

梯度下降步骤可概括为:


重复:计算预测(y' (i),i = 1,... m)    获得导数:dW [1],db [1],dW [2],db [2]   
更新:W [1] = W [1] - ⍺* dW [1]             b [1] = b [1] - ⍺* db [1]             W [2] = W [2] - ⍺* dW [2]             b [2] = b [2] - ⍺* db [2]

让我们快速看一下双层神经网络的前向和后向传播步骤。

前向传播:
Z [1] = W [1] * A [0] + b [1]     #A [0]为X.A [1] = g [1](Z [1])Z [2] = W [2] * A [1] + b [2] A [2] = g [2](Z [2])

反向传播:
dZ [2] = A [2] -  Y.   dW [2] =(dZ [2] * A [1] .T)/ mdb [2] = Sum(dZ [2])/ mdZ [1] =(W [2] .T * dZ [2])* g' [1](Z [1])#element product product(*)dW [1] =(dZ [1] * A [0] .T)/ m#A [0] = X.db [1] = Sum(dZ [1])/ m

这些是神经网络生成输出的完整步骤。注意,我们必须在开始时初始化权重(W),然后在反向传播步骤中更新。那么让我们来看看如何初始化这些权重。

随机初始化
我们以前已经看到,在逻辑回归算法的情况下,权重被初始化为0。但是我们应该将神经网络的权重初始化为0吗?这是一个相关的问题。让我们考虑下面的例子:
Screenshot-from-2018-10-15-19-40-27.png

如果权重初始化为0,则W矩阵将为:
Screenshot-from-2018-10-15-19-41-52.png

使用这些权重:
Screenshot-from-2018-10-15-19-42-44.png

最后在反向传播步骤:
Screenshot-from-2018-10-15-19-43-54.png

无论我们在一个层中使用了多少单位,我们总是得到与使用单个单位相同的输出。因此,我们不是将权重初始化为0,而是使用以下代码随机初始化它们:
w [1] = np.random.randn((2,2))* 0.01b [1] = np.zero((2,1))

我们将权重乘以0.01以初始化小权重。如果我们初始化大的权重,则激活将很大,导致零斜率(在sigmoid和tanh激活函数的情况下)。因此,学习会很慢。所以我们通常随机初始化小权重。

2.4 深度神经网络
现在是时候学习深度神经网络了!这些已成为当今行业和研究领域的流行语。无论我最近采用哪种研究论文,都不可避免地提到如何使用深度神经网络来推动研究背后的思考过程。
我们最终模块的目标是:
  • 将深度神经网络看作连续的块一个接一个地放在一起
  • 构建并训练深L层神经网络
  • 分析矩阵和向量维度以检查神经网络实现
  • 了解如何使用缓存将信息从前向传播传递到反向传播
  • 了解超参数在深度学习中的作用


深L层神经网络
在本节中,我们将研究前向和后向传播的概念如何应用于深度神经网络。但是你可能想知道世界上深层神经网络到底是什么?
浅与深是一个程度问题。逻辑回归是一个非常浅的模型,因为它只有一个层(记住我们不将输入计为一个层):
Screenshot-from-2018-10-16-11-38-06.png

更深层次的神经网络具有更多隐藏层:
Screenshot-from-2018-10-16-12-16-27.png

让我们看一下与深度神经网络相关的一些符号:
  • L是神经网络中的层数
  • n [l]是层l中的单元数
  • a [l]是第l层的激活
  • w [l]是z [l]的权重

这些是我们将在接下来的部分中使用的一些符号。在我们继续操作时记住它们,或者只是快速跳回到这里,以防你错过了什么。

深度神经网络中的前向传播
对于单个训练示例,前向传播步骤可写为:
z [l] = W [1] a [l-1] + b [l] a [l] = g [l](a [l])
我们可以为'm'训练示例矢量化这些步骤,如下所示:
Z [1] = W [1] A [l-1] + B [1] A [1] = g [1](A [1])
来自一个层的这些输出充当下一层的输入。我们无法在没有for循环的情况下计算神经网络的所有层的前向传播,因此这里有一个for循环很好。在进一步讨论之前,让我们看一下各种矩阵的维度,这些矩阵将帮助我们更好地理解这些步骤。

确保矩阵尺寸正确
分析矩阵的维度是检查代码纠正程度的最佳调试工具之一。我们将在本节中讨论每个矩阵的正确维度。请考虑以下示例:
Screenshot-from-2018-10-16-12-27-10.png

你能算出这个神经网络中的层数(L)吗?如果你猜对了,你是对的。有4个隐藏层和1个输出层。每层的单位是:
n [0] = 2,n [1] = 3,n [2] = 5,n [3] = 4,n [4] = 2,n [5] = 1
W,b及其衍生物的广义形式是:
  • W [l] =(n [1],n [l-1])
  • b [l] =(n [l],1)
  • dW [l] =(n [l],n [l-1])
  • db [l] =(n [l],1)
  • Z [1],A [1],dZ [1],dA [1] =(n [1],m)的维数

其中'm'是训练样例的数量。这些是一些通用矩阵维度,可帮助您顺利运行代码。
到目前为止,我们已经看到了深度神经网络的一些基础知识。但为什么我们首先需要深层代表?当存在更简单的解决方案时,为什 我们来看看吧!

为何深度表达?
在深度神经网络中,我们有大量的隐藏层。这些隐藏层实际上在做什么?要理解这一点,请考虑以下图像:
Screenshot-from-2018-10-16-12-40-23.png

深度神经网络发现与数据的关系(简单到复杂的关系)。第一个隐藏层可能正在做什么,试图找到简单的功能,如识别上图中的边缘。随着我们深入网络,这些简单的功能结合在一起形成更复杂的功能,如识别面部。利用深度神经网络的一些常见例子是:
  • 人脸识别











    • 图像==>边缘==>面部部分==>面部==>期望面部

  • 音频识别











    • 音频==>低级声音功能,如(sss,bb)==>音素==>单词==>句子



深度神经网络的构建模块
考虑深度神经网络中的任何层。该层的输入将是前一层(l-1)的激活,该层的输出将是它自己的激活。
  • 输入:a [l-1]
  • 输出:a [l]

该层首先计算应用激活的z [l]。此z [l]保存为缓存。对于后向传播步骤,它将首先计算da [l],即第1层激活的导数,权重dw [1],db [1],dz [1]的导数,最后是da [l-1] ]。让我们可视化这些步骤以降低复杂性:
Screenshot-from-2018-10-16-14-00-24.png

这就是深度神经网络的每个块(层)的工作原理。接下来,我们将看到如何实现所有这些块。

前向和后向传播
前向传播步骤中的输入是[l-1],输出是[1]和高速缓存z [1],它是w [1]和b [l]的函数。因此,计算Z [1]和A [l]的矢量化形式是:
Z [l] = W [1] * A [l-1] + b [l]
A [l] = g [l](Z [1])
我们将为网络的每一层计算Z和A. 计算激活后,下一步是向后传播,我们使用导数更新权重。反向传播的输入是da [l],输出是da [l-1],dW [l]和db [l]。让我们看一下向后传播的向量化方程:
dZ [l] = dA [l] * g' [1](Z [1])dW [l] = 1 / m *(dZ [1] * A [l-1] .T)db [l] = 1 / m * np.sum(dZ [1],轴= 1,keepdims = True)dA [l-1] = w [l] .T * dZ [1]
这就是我们实现深度神经网络的方法。
深度神经网络的表现非常出色(如果您以前使用它们,可能不会太令人惊讶!)。仅运行几行代码可以获得满意的结果。这是因为我们正在向网络提供大量数据,并且正在使用隐藏层从该数据中学习。
选择正确的超参数有助于我们提高模型的效率。我们将在本系列的下一篇文章中介绍超参数调优的细节。

参数vs超参数
通过深入学习新人,这是一个经常被问到的问题。参数和超参数之间的主要区别在于参数是在训练期间由模型学习的,而超参数可以在训练模型之前进行更改。
深度神经网络的参数是W和b,模型在反向传播步骤期间更新。另一方面,深度NN有很多超参数,包括:
  • 学习率 - ⍺
  • 迭代次数
  • 隐藏层数
  • 每个隐藏层中的单位
  • 选择激活功能

这是对这两个方面之间差异的简要概述。我很乐意在下面的评论部分回答您可能遇到的任何问题。

结束笔记
恭喜您完成本次学习!以上我们学习了如何实现深度神经网络的前向和后向传播和梯度下降,以及矢量化如何帮助我们摆脱显式的for循环,使我们的代码在这个过程中更加高效。
在下一篇文章中,我们将看到如何通过超参数调整,正则化和优化来改进深度神经网络。这是深度学习中比较棘手和迷人的方面之一。







二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


Screenshot-from-2018-10-15-19-42-44 (1).png
Screenshot-from-2018-10-15-12-57-43.png
Screenshot-from-2018-10-15-12-20-12 (1).png
Screenshot-from-2018-10-12-15-30-15.png
Screenshot-from-2018-10-12-12-40-22.png
已有 1 人评分论坛币 收起 理由
happy_287422301 + 100 奖励积极上传好的资料

总评分: 论坛币 + 100   查看全部评分

东方祥 企业认证  发表于 2018-11-7 09:50:52 |显示全部楼层 |坛友微信交流群
信号的正向传播 ----> 误差的反向传播

使用道具

如果在这个人工智能的时代,作为一个有理想抱负的程序员,或者学生、爱好者,不懂深度学习这个超热的话题,似乎已经跟时代脱节了。

使用道具

深度学习对数学的要求,包括微积分、线性代数和概率论与数理统计等,让大部分的有理想抱负青年踟蹰前行。那么问题来了,理解深度学习,到底需不需要这些知识?

使用道具

网上的资料很多,不过大部分都不太适合初学者。不知道怎么入门

使用道具

东方祥 企业认证  发表于 2018-11-7 11:20:02 |显示全部楼层 |坛友微信交流群
诗人都在海底 发表于 2018-11-7 11:17
网上的资料很多,不过大部分都不太适合初学者。不知道怎么入门
深度学习确实需要一定的数学基础。如果不用深入浅出地方法讲,有些读者就会有畏难的情绪,因而容易过早地放弃。可以先大致对微积、线代、概率论分有个粗略的了解

使用道具

GKINGLIU 在职认证  发表于 2018-11-7 12:57:33 |显示全部楼层 |坛友微信交流群
it takes time to digest, thx

使用道具

dolaam 在职认证  发表于 2018-11-7 13:18:54 |显示全部楼层 |坛友微信交流群
谢谢楼主分享。

使用道具

007568lh 发表于 2018-11-7 13:34:54 |显示全部楼层 |坛友微信交流群
先收藏了

使用道具

晏几道 发表于 2018-11-7 15:18:45 |显示全部楼层 |坛友微信交流群
感谢楼主分享

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-28 22:39