云计算百科
云计算领域专业知识百科平台

机器学习速成笔记week5:神经网络

第5周

文章目录

  • 第5周
    • 九、神经网络:概述
      • 9.1 非线性模型
      • 9.2 模型表示
      • 9.3 特征和直观理解1
      • 9.4 样本和直观理解II
      • 9.5 多类分类
      • 9.6 激活函数分类
    • 十、神经网络的学习(Neural Networks: Learning)
      • 10.1 代价函数
      • 10.2 反向传播算法
      • 10.3 梯度消失和梯度爆炸
      • 10.4 Dropout正则化
      • 10.5 综合起来

神经网络科普

九、神经网络:概述

9.1 非线性模型

无论是线性回归还是逻辑回归都有这样一个缺点,即:当特征太多时,计算的负荷会非常大。

下面是一个例子,使用

x

1

x_1

x1,

x

2

x_2

x2 的多次项式进行预测时,可以应用的很好:

在这里插入图片描述

使用非线性的多项式项,能够建立更好的分类模型。但是假设有非常多的特征,此时构建一个非线性的多项式模型,结果将是数量非常惊人的特征组合,即便只采用两两特征的组合

(

x

1

x

2

+

x

1

x

3

+

x

1

x

4

+

.

.

.

+

x

2

x

3

+

x

2

x

4

+

.

.

.

+

x

99

x

100

)

(x_1x_2+x_1x_3+x_1x_4+…+x_2x_3+x_2x_4+…+x_{99}x_{100})

(x1x2+x1x3+x1x4++x2x3+x2x4++x99x100),这对于一般的逻辑回归来说需要计算的特征太多了。

普通的逻辑回归模型,不能有效地处理这么多的特征,这时候就需要神经网络。

神经网络是一种很古老的算法,它最初产生的目的是制造能模拟大脑的机器。 神经网络旨在发现数据中的非线性模式。在神经网络训练期间,模型会自动学习对输入数据执行的最佳特征交叉,以最大限度地减少损失。

神经网络逐渐兴起于二十世纪八九十年代,应用得非常广泛。但由于各种原因,在90年代的后期应用减少了。但是最近,神经网络又东山再起了。其中一个原因是:神经网络计算量偏大。由于近些年计算机的运行速度变快,才足以真正运行起大规模的神经网络。

9.2 模型表示

神经网络与大脑处理方式相似,每一个神经元都可以被认为是一个处理单元/神经核(processing unit/Nucleus),它含有许多输入/树突(input/Dendrite),并且有一个输出/轴突(output/Axon)。神经网络是大量神经元相互链接并通过电脉冲来交流的一个网络。

在这里插入图片描述

如果神经元想要向其他神经元传递消息,它就会就通过它的轴突,发送一段微弱电流给其他神经元。

下图是神经元连接另一个神经元树突的神经。首先神经元通过树突接收消息,在神经核做一些处理,然后将通过轴突把消息传给其他神经元。这就是所有人类思考的模型:我们的神经元把自己的收到的消息进行处理,并向其他神经元传递消息。

在数学中,我们用函数来表示神经核的处理方式。万物皆可用函数解释

在这里插入图片描述

五分钟秒懂神经网络原理 神经网络模型建立在很多神经元之上,每一个神经元又是一个学习模型。这些神经元(也叫激活单元,activation unit)首先使用仿射函数对输入

x

1

x_1

x1,

x

2

x_2

x2,

x

3

x_3

x3进行仿射变换,然后使用激活函数对其再进行非线性变换得到输出。下图是一个以逻辑回归模型作为激活函数的示例,在神经网络中,参数又可被成为权重(weight),事实上,此模型就是前面实现逻辑回归编程实战的原理。

在这里插入图片描述

可以设计一个神经网络,上一层的输出作为下一层的输入,类似于不断套娃计算直到输出结果,效果如下:

在这里插入图片描述

其中

x

1

x_1

x1,

x

2

x_2

x2,

x

3

x_3

x3是输入单元(input units),将原始数据输入进行仿射变换输出到下一层。

a

1

a_1

a1,

a

2

a_2

a2,

a

3

a_3

a3是中间单元,它们负责将数据进行激活函数计算,然后呈递到下一层。 最后是输出单元,它负责计算

h

θ

(

x

)

{h_\\theta}\\left( x \\right)

hθ(x)

神经网络模型是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。下图为一个3层的神经网络,第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层称为隐藏层(Hidden Layers),因为这是神经网络内部的处理结果,我们看不见也难以解释结果。

在这里插入图片描述

  • a

    i

    (

    j

    )

    a_{i}^{\\left( j \\right)}

    ai(j) 代表第

    j

    j

    j 层的第

    i

    i

    i 个激活单元。

  • θ

    (

    j

    )

    {{\\theta }^{\\left( j \\right)}}

    θ(j)代表从第

    j

    j

    j 层映射到第$ j+1$ 层时的权重

  • g是激活函数,例如可以是sigmoid函数或其他

对于上图所示的模型,激活单元和输出分别表达为:

a

1

(

2

)

=

g

(

Θ

10

(

1

)

x

0

+

Θ

11

(

1

)

x

1

+

Θ

12

(

1

)

x

2

+

Θ

13

(

1

)

x

3

)

a_{1}^{(2)}=g(\\Theta _{10}^{(1)}{{x}_{0}}+\\Theta _{11}^{(1)}{{x}_{1}}+\\Theta _{12}^{(1)}{{x}_{2}}+\\Theta _{13}^{(1)}{{x}_{3}})

a1(2)=g(Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3)

a

2

(

2

)

=

g

(

Θ

20

(

1

)

x

0

+

Θ

21

(

1

)

x

1

+

Θ

22

(

1

)

x

2

+

Θ

23

(

1

)

x

3

)

a_{2}^{(2)}=g(\\Theta _{20}^{(1)}{{x}_{0}}+\\Theta _{21}^{(1)}{{x}_{1}}+\\Theta _{22}^{(1)}{{x}_{2}}+\\Theta _{23}^{(1)}{{x}_{3}})

a2(2)=g(Θ20(1)x0+Θ21(1)x1+Θ22(1)x2+Θ23(1)x3)

a

3

(

2

)

=

g

(

Θ

30

(

1

)

x

0

+

Θ

31

(

1

)

x

1

+

Θ

32

(

1

)

x

2

+

Θ

33

(

1

)

x

3

)

a_{3}^{(2)}=g(\\Theta _{30}^{(1)}{{x}_{0}}+\\Theta _{31}^{(1)}{{x}_{1}}+\\Theta _{32}^{(1)}{{x}_{2}}+\\Theta _{33}^{(1)}{{x}_{3}})

a3(2)=g(Θ30(1)x0+Θ31(1)x1+Θ32(1)x2+Θ33(1)x3)

h

Θ

(

x

)

=

g

(

Θ

10

(

2

)

a

0

(

2

)

+

Θ

11

(

2

)

a

1

(

2

)

+

Θ

12

(

2

)

a

2

(

2

)

+

Θ

13

(

2

)

a

3

(

2

)

)

{{h}_{\\Theta }}(x)=g(\\Theta _{10}^{(2)}a_{0}^{(2)}+\\Theta _{11}^{(2)}a_{1}^{(2)}+\\Theta _{12}^{(2)}a_{2}^{(2)}+\\Theta _{13}^{(2)}a_{3}^{(2)})

hΘ(x)=g(Θ10(2)a0(2)+Θ11(2)a1(2)+Θ12(2)a2(2)+Θ13(2)a3(2))

其中

z

(

1

)

=

Θ

10

(

1

)

x

0

+

Θ

11

(

1

)

x

1

+

Θ

12

(

1

)

x

2

+

Θ

13

(

1

)

x

3

z^{(1)}=\\Theta _{10}^{(1)}{{x}_{0}}+\\Theta _{11}^{(1)}{{x}_{1}}+\\Theta _{12}^{(1)}{{x}_{2}}+\\Theta _{13}^{(1)}{{x}_{3}}

z(1)=Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3称为仿射函数,仿射函数为线性函数,把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION ))

为了更好了了解Neuron Networks的工作原理,我们先把左半部分遮住:

在这里插入图片描述

右半部分其实就是以

a

1

,

a

2

,

a

3

a_1, a_2, a_3

a1,a2,a3为数据, 按照Logistic Regression的方式输出

h

θ

(

x

)

h_\\theta(x)

hθ(x)

在这里插入图片描述

其实神经网络就像是logistic regression,只不过我们把logistic regression中的输入向量

[

x

1

x

3

]

\\left[ x_1\\sim {x_3} \\right]

[x1x3] 变成了中间层的

[

a

1

(

2

)

a

3

(

2

)

]

\\left[ a_1^{(2)}\\sim a_3^{(2)} \\right]

[a1(2)a3(2)], 即:

h

θ

(

x

)

=

g

(

Θ

0

(

2

)

a

0

(

2

)

+

Θ

1

(

2

)

a

1

(

2

)

+

Θ

2

(

2

)

a

2

(

2

)

+

Θ

3

(

2

)

a

3

(

2

)

)

h_\\theta(x)=g\\left( \\Theta_0^{\\left( 2 \\right)}a_0^{\\left( 2 \\right)}+\\Theta_1^{\\left( 2 \\right)}a_1^{\\left( 2 \\right)}+\\Theta_{2}^{\\left( 2 \\right)}a_{2}^{\\left( 2 \\right)}+\\Theta_{3}^{\\left( 2 \\right)}a_{3}^{\\left( 2 \\right)} \\right)

hθ(x)=g(Θ0(2)a0(2)+Θ1(2)a1(2)+Θ2(2)a2(2)+Θ3(2)a3(2)) 我们可以把

a

1

,

a

2

,

a

3

a_1, a_2, a_3

a1,a2,a3看成更为高级的特征值,也就是

x

1

,

x

2

,

x

3

x_1, x_2, x_3

x1,x2,x3的进化体,并且它们是由

x

x

x

θ

\\theta

θ权重决定的,因为是梯度下降的,所以

a

a

a是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将

x

x

x次方厉害,也能更好的预测新数据。 这就是神经网络相比于逻辑回归和线性回归的优势。

9.3 特征和直观理解1

从本质上讲,神经网络能够通过学习得出其自身的一系列新特征。在普通的逻辑回归中,我们被限制为只能使用数据中的原始特征

x

1

,

x

2

,

.

.

.

,

x

n

x_1,x_2,…,{{x}_{n}}

x1,x2,,xn,我们虽然可以使用一些二项式项来组合这些特征,但是我们仍然受到这些原始特征的限制。在神经网络中,原始特征只是输入层,在上面三层的神经网络例子中,第三层也就是输出层做出的预测利用的是第二层的特征,而非输入层中的原始特征,可以认为第二层中的特征是神经网络通过学习后自己得出的一系列用于预测输出变量的新特征。

9.4 样本和直观理解II

逻辑主义提倡用逻辑语句来实现智能,即使用与、或等词来描述。而最初感知机算法被提出时轰动一时,其开辟通过数学运算来实现人工智能,感知机器即使用线性函数来分类,但随后被逻辑主义抨击,因为存在一种

XNOR

\\text{XNOR}

XNOR的逻辑关系不能被感知机实现(如图,线性函数不能将其分类),也就不能完全实现智能,机器学习因此陷入寒冬,直到神经网络的提出重新解决这一问题。

在这里插入图片描述

二元逻辑运算符(BINARY LOGICAL OPERATORS),当输入特征为布尔值(0或1)时,可以用一个单一的激活层计算,为了表示不同的运算符,只需要选择不同的权重即可。

下图的神经元(三个权重分别为-30,20,20)可以被视为作用同于逻辑与(AND):

在这里插入图片描述

下图的神经元(三个权重分别为-10,20,20)可以被视为作用等同于逻辑或(OR):

在这里插入图片描述

下图的神经元(两个权重分别为 10,-20)可以被视为作用等同于逻辑非(NOT):

在这里插入图片描述

要实现XNOR 功能(输入的两个值必须一样,均为1或均为0),即

XNOR

=

(

x

1

AND

x

2

)

OR

(

(

NOT

x

1

)

AND

(

NOT

x

2

)

)

\\text{XNOR}=( \\text{x}_1\\, \\text{AND}\\, \\text{x}_2 )\\, \\text{OR} \\left( \\left( \\text{NOT}\\, \\text{x}_1 \\right) \\text{AND} \\left( \\text{NOT}\\, \\text{x}_2 \\right) \\right)

XNOR=(x1ANDx2)OR((NOTx1)AND(NOTx2)) 首先构造一个能表达

(

NOT

x

1

)

AND

(

NOT

x

2

)

\\left( \\text{NOT}\\, \\text{x}_1 \\right) \\text{AND} \\left( \\text{NOT}\\, \\text{x}_2 \\right)

(NOTx1)AND(NOTx2)部分的神经元:

在这里插入图片描述

然后将表示 AND 的神经元和表示

(

NOT

x

1

)

AND

(

NOT

x

2

)

\\left( \\text{NOT}\\, \\text{x}_1 \\right) \\text{AND} \\left( \\text{NOT}\\, \\text{x}_2 \\right)

(NOTx1)AND(NOTx2)的神经元以及表示 OR 的神经元进行组合:

在这里插入图片描述

就得到了一个能实现

XNOR

\\text{XNOR}

XNOR 运算符功能的神经网络。

按这种方法我们可以逐渐构造出越来越复杂的函数,也能得到更加厉害的特征值,这就是神经网络的厉害之处。

9.5 多类分类

当有不止两种分类时(也就是

y

=

1

,

2

,

3

.

y=1,2,3….

y=1,2,3.),比如以下这种情况,该怎么办?例如在输出层有4个值。

输入向量

x

x

x有三个维度,两个中间层,输出层4个神经元分别用来表示4类,下面是该神经网络的可能结构示例:

在这里插入图片描述

在这里插入图片描述

神经网络算法的输出结果为四种可能情形之一:

在这里插入图片描述

9.6 激活函数分类

常用作激活函数的三个数学函数是 Sigmoid 函数、tanh 函数和 ReLU 函数。

Sigmoid 函数对输入x执行以下转换,从而生成一个介于 0 到 1 之间的输出值,即逻辑回归算法中的处理函数。

tanh(简称“双曲正切”)函数会转换输入 x,以生成介于 -1 和 1 之间的输出值:F(x)=tan(h(x))

以下是此函数的图表:

在这里插入图片描述

整流线性激活函数(简称 ReLU)使用以下算法转换输出:

  • 如果输入值 x 小于 0,则返回 0。
  • 如果输入值 x 大于或等于 0,则返回输入值。

可以使用 max() 函数以数学方式表示 ReLU:F(x)=max(0,x)

下面是该函数的图表:

在这里插入图片描述

ReLU 作为激活函数的效果通常优于 S 型函数或 tanh 等平滑函数,因为它在神经网络训练期间不易受到梯度消失问题的影响。与这些函数相比,ReLU 的计算也更容易。

十、神经网络的学习(Neural Networks: Learning)

10.1 代价函数

首先引入标记方法:

假设神经网络的训练样本有

m

m

m个,每个包含一组输入

x

x

x和一组输出

y

y

y

L

L

L表示神经网络层数,

S

I

S_I

SI表示每层的neuron个数(

S

l

S_l

Sl表示l层神经元个数),

S

L

S_L

SL代表最后一层中处理单元的个数。

将神经网络的分类定义为两种情况:二类分类和多类分类,

二类分类:

S

L

=

0

,

y

=

0

o

r

1

S_L=0, y=0\\, or\\, 1

SL=0,y=0or1表示哪一类;

K

K

K类分类:

S

L

=

k

,

y

i

=

1

S_L=k, y_i = 1

SL=k,yi=1表示分到第

i

i

i类;

(

k

>

2

)

(k>2)

(k>2)

在这里插入图片描述

回顾逻辑回归问题中的代价函数: 在这里插入图片描述

在逻辑回归中,只有一个输出变量

y

y

y,又称标量(scalar),但是在神经网络中,可以有很多输出变量,此时

h

θ

(

x

)

h_\\theta(x)

hθ(x)是一个维度为

k

k

k的向量,对于输出层的每一个神经元都会有一个损失函数,总的损失函数需要对它们求和,因此代价函数会比逻辑回归更加复杂一些,为: 在这里插入图片描述 这个看起来复杂很多的代价函数背后的思想还是一样的,通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行数据都会给出

k

k

k个预测,然后在

k

k

k个预测中选择可能性最高的一个,将其与

y

y

y中的实际数据进行比较。

正则化的那一项排除每一层

θ

0

\\theta_0

θ0(偏差),最里层的循环

j

j

j循环权重矩阵的行(由

s

l

+

1

s_{l+1}

sl+1 层的激活单元数决定),循环

i

i

i则循环所有的列,由该层(

s

l

s_l

sl层)的激活单元数所决定,例如第一层到第二层的权重矩阵是五行三列。

10.2 反向传播算法

神经网络预测结果采用了一种正向传播方法,从第一层开始正向一层一层进行计算,直到最后一层的

h

θ

(

x

)

h_{\\theta}\\left(x\\right)

hθ(x)

现在,为了计算代价函数的偏导数

Θ

i

j

(

l

)

J

(

Θ

)

\\frac{\\partial}{\\partial\\Theta^{(l)}_{ij}}J\\left(\\Theta\\right)

Θij(l)J(Θ),需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。这是链式求导法则,以一个例子来说明反向传播算法。 五分钟搞懂反向传播算法 在这里插入图片描述

假设我们的训练集只有一个样本

(

x

(

1

)

,

y

(

1

)

)

\\left({x}^{(1)},{y}^{(1)}\\right)

(x(1),y(1)),神经网络是一个四层的神经网络,其中

K

=

4

S

L

=

4

L

=

4

K=4,S_{L}=4,L=4

K=4SL=4L=4

前向传播算法:

在这里插入图片描述

  • a

    (

    t

    )

    {a^{(t)}}

    a(t)是第t层的激活函数

  • z

    (

    t

    )

    {z^{(t)}}

    z(t)是仿射函数,即对输入作线性变换。

下面的公式推导过程见:https://blog.csdn.net/qq_29762941/article/details/80343185

假设损失函数是平方损失

1

2

(

a

(

4

)

y

)

2

\\frac{1}{2}(a^{(4)}-y)^2

21(a(4)y)2,激活函数是恒等函数

g

(

z

)

=

z

g(z)=z

g(z)=z。定义第t层误差是损失函数对

z

(

t

)

z^{(t)}

z(t)的梯度。 用

δ

(

t

)

\\delta^{(t)}

δ(t)来表示第t层误差,则:

δ

(

4

)

=

a

(

4

)

y

=

g

(

z

(

4

)

)

y

\\delta^{(4)}=a^{(4)}-y=g(z^{(4)})-y

δ(4)=a(4)y=g(z(4))y

可以看出根据定义计算的误差正好是最后一层的输出与样本y的差,证明这样定义求第t层误差公式是合理的。

利用这个误差值来计算前一层的误差,链式法则:

δ

(

3

)

=

(

Θ

(

3

)

)

T

δ

(

4

)

g

(

z

(

3

)

)

\\delta^{(3)}=\\left({\\Theta^{(3)}}\\right)^{T}\\delta^{(4)}\\ast g'\\left(z^{(3)}\\right)

δ(3)=(Θ(3))Tδ(4)g(z(3)) 其中

g

(

z

(

3

)

)

g'(z^{(3)})

g(z(3))是 激活函数的导数。而

(

θ

(

3

)

)

T

δ

(

4

)

(θ^{(3)})^{T}\\delta^{(4)}

(θ(3))Tδ(4)则是权重导致的误差的和。下一步是继续计算第二层的误差:

δ

(

2

)

=

(

Θ

(

2

)

)

T

δ

(

3

)

g

(

z

(

2

)

)

\\delta^{(2)}=(\\Theta^{(2)})^{T}\\delta^{(3)}\\ast g'(z^{(2)})

δ(2)=(Θ(2))Tδ(3)g(z(2))

根据递归,可得到

δ

(

t

1

)

=

(

Θ

(

t

1

)

)

T

δ

(

t

)

g

(

z

(

t

1

)

)

\\delta^{(t-1)}=(\\Theta^{(t-1)})^{T}\\delta^{(t)}\\ast g'(z^{(t-1)})

δ(t1)=(Θ(t1))Tδ(t)g(z(t1))

因为第一层是输入变量,不存在误差。有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设

λ

=

0

λ=0

λ=0,即不做任何正则化处理时有,链式法则:

Θ

i

j

(

l

)

J

(

Θ

)

=

a

j

(

l

1

)

δ

i

l

\\frac{\\partial}{\\partial\\Theta_{ij}^{(l)}}J(\\Theta)=a_{j}^{(l-1)} \\delta_{i}^{l}

Θij(l)J(Θ)=aj(l1)δil

  • l

    l

    l 代表目前所计算的是第几层。

  • j

    j

    j 代表权重矩阵中第

    i

    i

    i列,目前计算层中的激活单元的下标,也将是下一层的第

    j

    j

    j个输入变量的下标。

  • i

    i

    i 代表权重矩阵中第

    i

    i

    i行。

  • a

    j

    (

    l

    1

    )

    a_{j}^{(l-1)}

    aj(l1)即对仿射函数的权重求偏导的结果,结果是上一层的输入。

  • δ

    i

    l

    \\delta_{i}^{l}

    δil即损失函数对仿射函数求偏导,是我们定义的误差。

然后用学习率更新第t层的参数,再将第t层的误差传到第t-1层,继续循环更新。

上面介绍了反向传播算法,感觉简直是太复杂了,实在不知道这些步骤,到底应该如何合在一起使用。就好像一个黑箱,里面充满了复杂的步骤。这其实是正常的,相比于线性回归算法和逻辑回归算法而言,从数学的角度上讲,反向传播算法似乎并不简洁,对于反向传播这种算法,其实吴恩达说也经常感觉对反向传播算法的理解并不是十分深入,对于反向传播算法究竟是如何执行的,并没有一个很直观的理解。

10.3 梯度消失和梯度爆炸

在反向传播算法过程中,各层的梯度,特别是前面层的梯度,有时会接近0(梯度消失)或接近无穷(梯度爆炸)。梯度消失会导致参数更新停止,梯度爆炸会导致参数溢出,都会使学习无法有效的进行。

造成梯度消失和梯度爆炸有两种原因:

  • 每一层误差向量的传播实际由矩阵的连乘决定,

    δ

    (

    t

    1

    )

    =

    (

    Θ

    (

    t

    1

    )

    )

    T

    δ

    (

    t

    )

    g

    (

    z

    (

    t

    1

    )

    )

    \\delta^{(t-1)}=(\\Theta^{(t-1)})^{T}\\delta^{(t)}\\ast g'(z^{(t-1)})

    δ(t1)=(Θ(t1))Tδ(t)g(z(t1)),如果矩阵

    (

    Θ

    (

    t

    1

    )

    )

    T

    g

    (

    z

    (

    t

    1

    )

    )

    (\\Theta^{(t-1)})^{T}g'(z^{(t-1)})

    (Θ(t1))Tg(z(t1))始终小于1,连乘得到的矩阵可能接近0造成梯度消失,相反接近无穷造成梯度爆炸。

  • 激活函数的导数

    g

    (

    z

    (

    t

    1

    )

    )

    g'(z^{(t-1)})

    g(z(t1))过小,会引起梯度消失,相反引起梯度爆炸。

  • 有一些防止梯度消失和梯度爆炸的技巧:

  • 恰当的参数随机化,一个经验的方法是对每个神经元的权重初始化根据正态分布取值。
  • 选取整流线性函数作为激活函数(ReLU),具体的原因现在其实也没有从理论上得以证明。
  • 使用特定的网络架构,ResNet和LSTM可以更好的避免梯度消失和梯度爆炸问题。
  • 归一化可以加快学习收敛速度,也可以在一定程度上避免梯度消失和梯度爆炸。
  • 10.4 Dropout正则化

    前面的代价函数考虑了L2正则化,还有一种正则化形式,称为Dropout 正则化,对神经网络很有用。Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。

    Dropout 通过随机移除部分神经元迫使每个神经元独立学习有用的特征,避免了模型对某些固定特征组合的依赖,从而提高了模型的泛化能力,减少过拟合。

    img

    Dropout 实现流程:

  • 初始化阶段:在神经网络的每一层中,设置一个 dropout rate(通常为 0.5),表示训练时每次迭代随机丢弃神经元的比例。输入层和输出层的神经元不会被丢弃,只有隐藏层的神经元会被随机选择。

  • 前向传播:在每次迭代的前向传播阶段,按照dropout rate随机选择隐藏层中的一部分神经元,并将其临时丢弃(设其输出为 0)。

  • 参数更新:将输入数据通过修改后的网络进行前向传播,计算得到的损失。 通过修改后的网络进行反向传播,根据损失对未被丢弃的神经元进行梯度更新(如随机梯度下降法)。被丢弃的神经元的参数不会更新,保持原样。

  • 循环过程:

    恢复被丢弃的神经元:恢复之前被临时丢弃的神经元,使其在下一次迭代中重新参与训练。 重新随机丢弃神经元:在下一次迭代中,重新随机选择隐藏层中的部分神经元进行丢弃。每批数据训练时,都会随机选择不同的神经元进行丢弃,确保模型每次训练的子网络都不同。

    重复上述的前向传播、参数更新、恢复和重新丢弃神经元的过程,直到训练完成。

  • 总结: 每轮梯度下降迭代时,它需要将训练数据分成若干批,然后分批进行迭代,每批数据迭代时,需要将原始的DNN模型随机去掉部分隐藏层的神经元,用残缺的DNN模型来迭代更新权重和偏差。每批数据迭代更新完毕后,要将残缺的DNN模型恢复成原始的DNN模型。

    注意:

  • dropout模型中的权重和偏差是共享的。所有的残缺DNN迭代时,更新的是同一组权重和偏差。
  • 由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。
  • 10.5 综合起来

    小结一下使用神经网络时的步骤:

    网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。

    第一层的单元数即训练集的特征数量。

    最后一层的单元数是结果的类的数量。

    如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。

    我们真正要决定的是隐藏层的层数和每个中间层的单元数。

    训练神经网络:

  • 参数的随机初始化
  • 利用正向传播方法计算所有的

    h

    θ

    (

    x

    )

    h_{\\theta}(x)

    hθ(x)

  • 计算代价函数

    J

    J

    J 的代码

  • 利用反向传播方法计算所有偏导数
  • 使用优化算法来最小化代价函数
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » 机器学习速成笔记week5:神经网络
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!