IT评测·应用市场-qidao123.com

标题: 24.11.26 神经网络 参数初始化 [打印本页]

作者: 尚未崩坏    时间: 2024-12-1 01:37
标题: 24.11.26 神经网络 参数初始化
神经网络


感知神经网络

神经网络(Neural Networks)是一种模仿人脑神经元网络结构的盘算模子,用于处置惩罚复杂的模式识别、分类和猜测等任务
 
生物学:
人脑可以看做是一个生物神经网络,由众多的神经元毗连而成

人脑神经元处置惩罚信息的过程:

神经网络由多个互相毗连的节点(即人工神经元)构成。
 
人工神经元

人工神经元(Artificial Neuron)是神经网络的基本构建单元,模仿了生物神经元的工作原理。其核心功能是接收输入信号,颠末加权求和和非线性激活函数处置惩罚后,输出结果。
构建人工神经元

人工神经元继承多个输入信息,对它们进行加权求和,再颠末激活函数处置惩罚,最后将这个结果输出。
 
构成部分


数学表现

如果有 n 个输入 x_1, x_2, \ldots, x_n,权重分别为 w_1, w_2, \ldots, w_n,偏置为 b,则神经元的输出 y 表现为:

此中,\sigma(z) 是激活函数。
 
对比生物神经元

人工神经元和生物神经元对好比下表:
生物神经元人工神经元细胞核节点 (加权求和 + 激活函数)树突输入轴突带权重的毗连突触输出
深入神经网络

神经网络是由大量人工神经元按层次结构毗连而成的盘算模子。每一层神经元的输出作为下一层的输入,终极得到网络的输出。
基本结构

神经网络有下面三个底子层(Layer)构建而成:


网络构建

我们使用多个神经元来构建神经网络,相邻层之间的神经元相互毗连,并给每一个毗连分配一个权重,经典如下:
 

留意:同一层的各个神经元之间是没有毗连的。  
全毗连神经网络

全毗连(Fully Connected,FC)神经网络是前馈神经网络的一种,每一层的神经元与上一层的所有神经元全毗连,常用于图像分类、文本分类等任务。
 
特点



 盘算步骤

参数初始化

神经网络的参数初始化是训练深度学习模子的关键步骤之一。初始化参数(通常是权重和偏置)会对模子的训练速率、收敛性以及终极的性能产生重要影响
固定值初始化

固定值初始化是指在神经网络训练开始时,将所有权重或偏置初始化为一个特定的常数值。这种初始化方法虽然简单,但在现实深度学习应用中通常并不保举。
全零初始化

将神经网络中的所有权重参数初始化为0。
方法:将所有权重初始化为零。
缺点:导致对称性粉碎,每个神经元在每一层中都会执行相同的盘算,模子无法学习。
应用场景:通常不消来初始化权重,但可以用来初始化偏置。
 
全1初始化

全1初始化会导致网络中每个神经元接收到相同的输入信号,进而输出相同的值,这就无法进行学习和收敛。所以全1初始化只是一个理论上的初始化方法,但在现实神经网络的训练中并不适用。
任意常数初始化

将所有参数初始化为某个非零的常数(如 0.1,-1 等)。虽然差别于全0和全1,但这种方法依然不能避免对称性粉碎的题目。
 
随机初始化

方法:将权重初始化为随机的小值,通常从正态分布或匀称分布中采样。
应用场景:这是最基本的初始化方法,通过随机初始化避免对称性粉碎。
Xavier 初始化

也叫做Glorot初始化。
方法:根据输入和输出神经元的数目来选择权重的初始值。权重从以下分布中采样:

或者


此中 n_{\text{in}} 是当前层的输入神经元数目,n_{\text{out}}是输出神经元数目。
优点:均衡了输入和输出的方差,得当Sigmoid 和 Tanh 激活函数。
应用场景:常用于浅层网络或使用Sigmoid 、Tanh 激活函数的网络。
 
He初始化

也叫kaiming 初始化。
方法:专门为 ReLU 激活函数设计。权重从以下分布中采样:

此中 n_{\text{in}} 是当前层的输入神经元数目。
优点:适用于ReLU 和 Leaky ReLU 激活函数。
应用场景:深度网络,尤其是使用 ReLU 激活函数时。
总结

在使用Torch构建网络模子时,每个网络层的参数都有默认的初始化方法,同时还可以通过以上方法来对网络参数进行初始化。
 代码演示:
  1. import torch
  2. def t1():
  3.     # 任意常数初始化
  4.     model = torch.nn.Linear(4, 1)
  5.     print(model.weight)
  6.     model.weight.data.fill_(0)
  7.     print(model.weight)
  8. def t2():
  9.     # 全1填充初始化
  10.     model = torch.nn.Linear(4, 1)
  11.     torch.nn.init.ones_(model.weight)
  12.     print(model.weight)
  13. def t3():
  14.     # 任意常数初始化
  15.     model = torch.nn.Linear(4, 1)
  16.     torch.nn.init.constant_(model.weight, 0.63)
  17.     print(model.weight)
  18. def t6():
  19.     # Xavier初始化:正态分布
  20.     linear = torch.nn.Linear(in_features=6, out_features=4)
  21.     torch.nn.init.xavier_normal_(linear.weight)
  22.     print(linear.weight)
  23.     # Xavier初始化:均匀分布
  24.     linear = torch.nn.Linear(in_features=6, out_features=4)
  25.     torch.nn.init.xavier_uniform_(linear.weight)
  26.     print(linear.weight)
  27. def t7():
  28.     # He初始化 均匀分布
  29.     model = torch.nn.Linear(6, 8)
  30.     torch.nn.init.kaiming_uniform_(model.weight)
  31.     print(model.weight)
  32.     # He初始化 正态分布
  33.     model2 = torch.nn.Linear(6, 8)
  34.     torch.nn.init.kaiming_normal_(model2.weight)
  35.     print(model2.weight)
  36. if __name__ == '__main__':
  37.     t1()
  38.     t2()
  39.     t3()
  40.     t6()
  41.     t7()
复制代码
激活函数

激活函数的作用是在隐蔽层引入非线性,使得神经网络能够学习和表现复杂的函数关系,使网络具备非线性本事,增强其表达本事。
底子概念

 
非线性理解

如果在隐蔽层不使用激活函数,那么整个神经网络会体现为一个线性模子。我们可以通过数学推导来展示这一点。

假设:


一层网络的环境
对于单层网络(输入层到输出层),如果没有激活函数,输出
可以表现为:


两层网络的环境
假设我们有两层网络,且每层都没有激活函数,则:


代入到
中,可以得到:


我们可以看到,输出
是输入
的线性变换,因为:
此中


多层网络的环境
如果有L层,每层都没有激活函数,则第l层的输出为:

通过递归代入,可以得到:

表达式可简化为:


此中,
是所有权重矩阵的乘积,
是所有偏置项的线性组合。

云云可以看得出来,无论网络多少层,意味着:
   整个网络就是线性模子,无法捕获数据中的非线性关系。
  激活函数是引入非线性特性、使神经网络能够处置惩罚复杂题目的关键。
  
1.2 非线性可视化

我们可以通过可视化的方式去理解非线性的拟合本事::A Neural Network Playground
https://playground.tensorflow.org/
常见激活函数

sigmoid

  1. import matplotlib.pyplot as plt
  2. import torch
  3. def t001():
  4.     # 一行两列的图像绘制
  5.     _, ax = plt.subplots(1, 2)
  6.     # 绘制函数图像
  7.     x = torch.linspace(-10, 10, 100)
  8.     y = torch.sigmoid(x)
  9.     # 网格
  10.     ax[0].grid(True)
  11.     ax[0].set_title("sigmoid")
  12.     ax[0].set_xlabel("x")
  13.     ax[0].set_ylabel("y")
  14.     # 绘制
  15.     ax[0].plot(x, y)
  16.     # 绘制sigmoid导数曲线图
  17.     x = torch.linspace(-10, 10, 100, requires_grad=True)
  18.     # 自动求导
  19.     torch.sigmoid(x).sum().backward()
  20.     ax[1].grid(True)
  21.     ax[1].set_title("sigmoid's plot", color="red")
  22.     ax[1].set_xlabel("x")
  23.     ax[1].set_ylabel("y")
  24.     # 用自动求导的结果绘制曲线图
  25.     ax[1].plot(x.detach().numpy(), x.grad.detach().numpy())
  26.     plt.show()
  27. if __name__ == '__main__':
  28.     t001()
复制代码
tanh

  1. import matplotlib.pyplot as plt
  2. import torch
  3. def t001():
  4.     # 一行两列的图像绘制
  5.     _, ax = plt.subplots(1, 2)
  6.     # 绘制函数图像
  7.     x = torch.linspace(-10, 10, 100)
  8.     y = torch.tanh(x)
  9.     # 网格
  10.     ax[0].grid(True)
  11.     ax[0].set_title("tanh")
  12.     ax[0].set_xlabel("x")
  13.     ax[0].set_ylabel("y")
  14.     # 绘制
  15.     ax[0].plot(x, y)
  16.     # 绘制sigmoid导数曲线图
  17.     x = torch.linspace(-10, 10, 100, requires_grad=True)
  18.     # 自动求导
  19.     torch.tanh(x).sum().backward()
  20.     ax[1].grid(True)
  21.     ax[1].set_title("tanh plot", color="red")
  22.     ax[1].set_xlabel("x")
  23.     ax[1].set_ylabel("y")
  24.     # 用自动求导的结果绘制曲线图
  25.     ax[1].plot(x.detach().numpy(), x.grad.detach().numpy())
  26.     plt.show()
  27. if __name__ == '__main__':
  28.     t001()
复制代码
ReLU

  1. import matplotlib.pyplot as plt
  2. import torch
  3. import torch.nn.functional as F
  4. def t001():
  5.     # 一行两列的图像绘制
  6.     _, ax = plt.subplots(1, 2)
  7.     # 绘制函数图像
  8.     x = torch.linspace(-10, 10, 100)
  9.     y = F.relu(x)
  10.     # 网格
  11.     ax[0].grid(True)
  12.     ax[0].set_title("ReLU")
  13.     ax[0].set_xlabel("x")
  14.     ax[0].set_ylabel("y")
  15.     # 绘制
  16.     ax[0].plot(x, y)
  17.     # 绘制sigmoid导数曲线图
  18.     x = torch.linspace(-10, 10, 100, requires_grad=True)
  19.     # 自动求导
  20.     F.relu(x).sum().backward()
  21.     ax[1].grid(True)
  22.     ax[1].set_title("ReLU plot", color="red")
  23.     ax[1].set_xlabel("x")
  24.     ax[1].set_ylabel("y")
  25.     # 用自动求导的结果绘制曲线图
  26.     ax[1].plot(x.detach().numpy(), x.grad.detach().numpy())
  27.     plt.show()
  28. if __name__ == '__main__':
  29.     t001()
复制代码
LeakyReLU

  1. import matplotlib.pyplot as plt
  2. import torch
  3. import torch.nn.functional as F
  4. def t001():
  5.     # 一行两列的图像绘制
  6.     _, ax = plt.subplots(1, 2)
  7.     # 绘制函数图像
  8.     x = torch.linspace(-10, 10, 100)
  9.     y = F.leaky_relu(x)
  10.     # 网格
  11.     ax[0].grid(True)
  12.     ax[0].set_title("leaky_ReLU")
  13.     ax[0].set_xlabel("x")
  14.     ax[0].set_ylabel("y")
  15.     # 绘制
  16.     ax[0].plot(x, y)
  17.     # 绘制sigmoid导数曲线图
  18.     x = torch.linspace(-10, 10, 100, requires_grad=True)
  19.     # 自动求导
  20.     F.leaky_relu(x).sum().backward()
  21.     ax[1].grid(True)
  22.     ax[1].set_title("leaky_ReLU plot", color="red")
  23.     ax[1].set_xlabel("x")
  24.     ax[1].set_ylabel("y")
  25.     # 用自动求导的结果绘制曲线图
  26.     ax[1].plot(x.detach().numpy(), x.grad.detach().numpy())
  27.     plt.show()
  28. if __name__ == '__main__':
  29.     t001()
复制代码
softmax


如何选择


 手写笔记


 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4