机器学习周报第十二周

摘要

浅层神经网络和深度神经网络代表了神经网络在深度学习中的两个重要范畴,它们有着不同的结构和特点。浅层神经网络通常指的是只包含少数隐藏层的神经网络。这些网络的结构相对简单,参数较少。浅层网络适用于一些简单的任务,如线性回归或二分类问题。由于网络规模较小,训练和推理速度较快,因此在资源有限或需要快速响应的场景中具有优势。深度神经网络则是指包含多个隐藏层的神经网络。这些网络结构更加复杂,可以用来处理大规模和高维度的数据以及复杂的特征表示。深度神经网络在许多领域中都取得了卓越的成就,如计算机视觉、自然语言处理和强化学习。深度神经网络的深度结构允许它们学习到层级、抽象和高级的特征表示,这在处理复杂问题时非常有用。浅层神经网络适用于一些相对简单的任务,具有较低的计算复杂度。而深度神经网络则适用于处理更加复杂的问题,能够自动学习到更高级别的特征表示。深度神经网络在当今的深度学习应用中占据主导地位,但在某些情况下,浅层网络仍然具有一定的实用性。因此,在选择网络结构时,需要根据具体任务和资源要求来权衡浅层和深度网络的优劣。

Abstract

Shallow neural networks and deep neural networks represent two significant categories of neural networks in the field of deep learning, each with its own unique structure and characteristics. Shallow neural networks typically refer to neural networks with only a few hidden layers. These networks have relatively simple structures and fewer parameters. Shallow networks are suitable for relatively simple tasks such as linear regression or binary classification. Due to their smaller network size, they offer advantages in terms of training and inference speed, making them well-suited for resource-constrained or fast-response scenarios.On the other hand, deep neural networks are neural networks that consist of multiple hidden layers. These networks have more complex structures and are capable of handling large-scale and high-dimensional data as well as complex feature representations. Deep neural networks have achieved remarkable success in various domains, including computer vision, natural language processing, and reinforcement learning. The depth of these networks allows them to automatically learn hierarchical, abstract, and high-level feature representations, which is highly beneficial for tackling complex problems.In summary, shallow neural networks are suitable for relatively simple tasks, offering lower computational complexity. Deep neural networks, on the other hand, are well-suited for addressing more complex problems and have the capacity to automatically learn higher-level feature representations. Deep neural networks currently dominate the field of deep learning applications, but shallow networks still have practical utility in certain situations. Therefore, when selecting a network architecture, a balance between shallow and deep networks should be struck based on the specific task and resource requirements.

一、浅层神经网络

1.1 神经网络概述

浅层神经网络的示意图如下图所示。神经网络的结构与逻辑回归类似,只是神经网络的层数比逻辑回归多一层,多出来的中间那层称为隐藏层或中间层。从计算上来看,神经网络的正向传播和反向传播比logistic回归多了一次重复的计算。在表达式上,方括号上标[i]表示当前所处的层数;圆括号上标(i)表示第i个样本。对于第一层的z,将输入层和第一层的W和b做计算,在经过激活函数得到第一层的a。重复上述过程反复计算。最后计算输出层的损失函数。
在这里插入图片描述

1.2 神经网络表示

如图所示,输入特征x1,x2,x3竖向堆叠起来,这是神经网络的输入层(input layer);然后这里有另外一层的圆圈,称之为神经网络的隐藏层(hidden layer);最后这里是输出层(output layer),只有一个节点,它负责输出预测值y帽。在一个神经网络中,当你使用监督学习训练它时,训练集包含了输入x,还有目标输出y。“隐藏层”的含义是在训练集中这些中间节点的真实数值我们是不知道的,看不到它们的数值。
a表示激活(activations)的意思,它意味着网络中不同层的值会传递给后面。把隐藏层输出记为 a [ 1 ] a^{[1]} a[1],上标从0开始,当上标为0时, a [ 0 ] a^{[0]} a[0]表示的是输入层X。但是一般不把输入层当作一个标准的层。用下标表示第几个神经元,注意下标从1开始。例如 a 1 [ 1 ] a^{[1]}_1 a1[1]表示隐藏层第1个神经元(节点)。最后的输出层会产生某个数值 a [ 2 ] a^{[2]} a[2],是个实数。
在这里插入图片描述

1.3 神经网络的输出

神经网络的计算与逻辑回归相似,可以看成是多次进行逻辑回归运算。对于两层神经网络,从输入层到隐藏层对应一次逻辑回归运算;从隐藏层到输出层对应一次逻辑回归运算。每层计算时,要注意对应的上标和下标,一般我们记上标方括号表示层次,下标表示第几个神经元。例如 a i [ l ] a^{[l]}_i ai[l]表示第l层的第i个神经元。注意,i从1开始,l从0开始。
在这里插入图片描述
接着将上述过程向量化。如下图所示。将神经网络计算过程向量化可以显著提高计算效率。通过向量化可以做到提高计算效率、简化代码、减少内存占用、提高通用性等效果。
在这里插入图片描述
以上是一个训练样本,多个训练样本的情况如下图所示。在书写标记上用上标(i)表示第i个样本,将其向量化后,得到的矩阵的行表示神经元个数,列表示样本数目m。这些矩阵,比如说Z和A,横向的话我们对所有训练样本用指标排序,所以横向对应了不同的训练样本,从左往右就扫过整个训练集,而竖向指标就对应神经网络的不同节点,这是隐藏单元的指标。
在这里插入图片描述
下图以三个实例为例,为了方便起见,将b的值设为0, Z [ 1 ] ( 1 ) Z^{[1](1)} Z[1](1) Z [ 1 ] ( 2 ) Z^{[1](2)} Z[1](2) Z [ 1 ] ( 3 ) Z^{[1](3)} Z[1](3)分别代表三个实例的Z,将它们的特征按列拼接在一起得到X,即可得到方程向量化在多样本时的实现。
在这里插入图片描述

1.4 激活函数

激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。在神经元中,输入的input经过一系列加权求和后作用于另一个函数,这个函数就是这里的激活函数。
激活函数可以分为线性激活函数(线性方程控制输入到输出的映射,如f(x)=x等)以及非线性激活函数(非线性方程控制输入到输出的映射,比如Sigmoid、Tanh、ReLU、LReLU、PReLU、Swish 等)。神经网络中每一层的输入输出都是一个线性求和的过程,下一层的输出只是承接了上一层输入函数的线性变换,所以如果没有激活函数,那么无论你构造的神经网络多么复杂,有多少层,最后的输出都是输入的线性组合,纯粹的线性组合并不能够解决更为复杂的问题。而引入激活函数之后,我们会发现常见的激活函数都是非线性的,因此也会给神经元引入非线性元素,使得神经网络可以逼近其他的任何非线性函数,这样可以使得神经网络应用到更多非线性模型中。
对于tanh函数,它的平均值更接近0,类似数据中心化的效果。这实际让下一层的学习更方便一点。而使用sigmoid函数的例外是二分类。在一般情况下,可以隐藏层用tanh函数,输出层用sigmoid函数。现在sigmoid函数和tanh函数都有一个缺点,如果z非常大或非常小时,那么导数的梯度(函数的斜率)可能就很小,接近0,这样会拖慢梯度下降算法。
最常用的默认激活函数是ReLU以及leaky ReLU。虽然当z为负数时,激活函数的导数为0,但是,通过大量的隐藏层可以实现少部分的z为负数,所以ReLU的性能一般优于tanh函数。
在这里插入图片描述
以上的四个激活函数都是非线性激活函数。事实证明,如果你使用线性激活函数或者没有激活函数,那么无论你的激活函数有多少层,一直在做的只是计算线性激活函数,所以不如去掉全部隐藏层。使用神经网络与直接使用线性模型的效果并没有什么两样。因此,隐藏层的激活函数必须要是非线性的。如果所有的隐藏层全部使用线性激活函数,只有输出层使用非线性激活函数,那么整个神经网络的结构就类似于一个简单的逻辑回归模型。
在这里插入图片描述
对于以上的激活函数,他们的导数如下图所示。
sigmoid函数:
在这里插入图片描述
tanh函数:
在这里插入图片描述
ReLu函数:
在这里插入图片描述
leaky ReLU:
在这里插入图片描述

1.5 反向传播

使用计算图的方式来推导神经网络反向传播过程。在之前介绍逻辑回归时,就引入了计算图来推导正向传播和反向传播,其过程如下图所示。
在这里插入图片描述
这里不需要对输入x求导,因为监督学习的输入x是固定的,不优化x,所以就不对x求导。
在这里插入图片描述

1.6 随机初始化

对于logistic回归,可以将各个参数初始化为零,但如果神经网络的各参数数组全部初始化为0,再使用梯度下降算法,那会完全无效。假设有两个输入特征,将他们的W和b分别设置为零,导致两个神经元得到相同的结果,因为两个隐藏单元都在做完全一样的计算;当你计算反向传播时,出于对称性结果也是相同的。技术上假设输出的权重也是一样的,意味着节点计算完全一样的函数,完全对称。可以通过归纳法证明。在这种情况下,多个隐藏单元没有意义。对于多个输入特征也是一样的。
在这里插入图片描述
这个问题可以采用随机初始化来解决。

W_1 = np.random.randn((2,2))*0.01 #随机初始化 
b_1 = np.zero((2,1)) 
W_2 = np.random.randn((1,2))*0.01 
b_2 = 0

通常把权重矩阵初始化成非常小非常小的随机值,因为如果使用tanh函数或sigmoid激活函数,权重太大是计算出来的值可能落在平缓部分,梯度的斜率非常小,意味着梯度下降法会非常慢,学习过程也会非常慢。所以在每个W的后面都乘了0.01。在这里插入图片描述

二、 深层神经网络

2.1 深层神经网络的符号表示

深层神经网络是包含两个及以上个隐藏层的神经网络。如下图所示,是一个四层的有三个隐藏层的神经网络,然后隐藏层中的单元数目是5,5,3,然后有一个输出单元。我们用大写的L表示神经网络的总层数,这里L=4, n [ l ] n^{[l]} n[l] 表示l层上的单元数(节点数),所以当我们把输入层标为第0层时,则 n [ 1 ] n^{[1]} n[1] 表示第一个隐藏层的单元数为5,同样 n [ 2 ] = 5 n^{[2]}=5 n[2]=5 n [ 3 ] = 3 n^{[3]}=3 n[3]=3 n [ 4 ] = n [ L ] = 1 n^{[4]}=n^{[L]}=1 n[4]=n[L]=1,对于输入层 n [ 0 ] = n x = 3 n^{[0]}=n_x=3 n[0]=nx=3,表示3个输入特征x1,x2,x3。对于第l层,用 a [ l ] a^{[l]} a[l]表示l层的激活函数输出,由 a [ l ] = g ( z [ l ] ) a^{[l]}=g(z^{[l]}) a[l]=g(z[l])计算得到。
在这里插入图片描述

2.2 深层网络的正向传播

深度神经网络使用正向传播的过程如下图所示,向量化的过程与之类似。
在这里插入图片描述
在这里插入图片描述

2.3 正确的矩阵维数

在实现神经网络时,常用的一个检查代码是否有错的方法是过一遍算法中矩阵的维数。下图标注了各个变量的维数。下图中的模型一共有五层,即L=5。其中输入层 n [ 0 ] = 2 n^{[0]=2} n[0]=2 n [ 1 ] = 3 n^{[1]=3} n[1]=3 n [ 2 ] = 5 n^{[2]=5} n[2]=5 n [ 3 ] = 4 n^{[3]=4} n[3]=4 n [ 4 ] = 2 n^{[4]=2} n[4]=2 n [ 5 ] = 1 n^{[5]=1} n[5]=1。以第一层为例, Z [ 1 ] = W [ 1 ] X + b [ 1 ] Z^{[1]}=W^{[1]}X+b^{[1]} Z[1]=W[1]X+b[1]。这里的Z的形状为(3,1),即( n [ 1 ] n^{[1]} n[1],1),W的形状为(3,2),即( n [ 1 ] n^{[1]} n[1] n [ 0 ] n^{[0]} n[0]),X的形状为(2,1),即( n [ 0 ] n^{[0]} n[0],1)。b的形状为(3,1),即( n [ 1 ] n^{[1]} n[1],1)。由此可得,当计算第l层的隐藏层时,矩阵的维数规律为:
W [ l ] : ( n [ l ] , n [ l − 1 ] ) W^{[l]}:(n^{[l]},n^{[l-1]}) W[l]:(n[l],n[l1])
b [ l ] : ( n [ l ] , 1 ) b^{[l]}:(n^{[l]},1) b[l]:(n[l],1)
z [ l ] , a [ l ] : ( n [ l ] , 1 ) z^{[l]},a^{[l]}:(n^{[l]},1) z[l],a[l]:(n[l],1)
dw和w维度相同,db和b维度相同,且w和b向量化维度不变,z,a和x在多个实例向量化的情况下会变。
在这里插入图片描述
多个样本的情况如下图所示,向量化后得到如下结果。
在这里插入图片描述
在这里插入图片描述

三、权重衰减

在训练参数化机器学习模型时, 权重衰减(weight decay)是最广泛使用的正则化的技术之一,通常被称为L2正则化。权重衰减的公式为: L ( w , b ) + λ 2 ∣ ∣ w ∣ ∣ 2 L(w,b)+\frac{\lambda }{2} ||w||^{2} L(w,b)+2λ∣∣w2。当 λ = 0 \lambda=0 λ=0时,恢复为原来的损失函数,不为0时,则可以起到限制w的值的作用。

from matplotlib import pyplot as plt
import torch
from torch import nn
from d2l import torch as d2l

n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5
true_w, true_b = torch.ones((num_inputs, 1)) * 0.01, 0.05
train_data = d2l.synthetic_data(true_w, true_b, n_train)
train_iter = d2l.load_array(train_data, batch_size)
test_data = d2l.synthetic_data(true_w, true_b, n_test)
test_iter = d2l.load_array(test_data, batch_size, is_train=False)

def init_params():
    w = torch.normal(0, 1, size=(num_inputs, 1), requires_grad=True)
    b = torch.zeros(1, requires_grad=True)
    return [w, b]

def l2_penalty(w):
    return torch.sum(w.pow(2)) / 2

def train(lambd):
    w, b = init_params()
    net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_loss
    num_epochs, lr = 100, 0.003
    animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log',
                            xlim=[5, num_epochs], legend=['train', 'test'])
    for epoch in range(num_epochs):
        for X, y in train_iter:
            # 增加了L2范数惩罚项,
            # 广播机制使l2_penalty(w)成为一个长度为batch_size的向量
            l = loss(net(X), y) + lambd * l2_penalty(w)
            l.sum().backward()
            d2l.sgd([w, b], lr, batch_size)
        if (epoch + 1) % 5 == 0:
            animator.add(epoch + 1, (d2l.evaluate_loss(net, train_iter, loss),
                                     d2l.evaluate_loss(net, test_iter, loss)))
    print('w的L2范数是:', torch.norm(w).item())

train(lambd=0)
plt.show()

下图是原来损失函数的情况。
在这里插入图片描述
下图是采取权重衰减后得到的结果。
在这里插入图片描述

总结

浅层神经网络适用于一些相对简单的任务,具有较低的计算复杂度。而深度神经网络则适用于处理更加复杂的问题,能够自动学习到更高级别的特征表示。深度神经网络在当今的深度学习应用中占据主导地位,但在某些情况下,浅层网络仍然具有一定的实用性。因此,在选择网络结构时,需要根据具体任务和资源要求来权衡浅层和深度网络的优劣。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值