Neural Networks(监督学习方法)

本文深入探讨了神经网络的学习过程,包括随机初始化权重的原因、成本函数的计算方式、反向传播算法的应用,以及梯度检查的重要性。通过实例解析,帮助读者理解如何利用神经网络解决复杂的数据分类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Neural Networks

1. 引入原因
简单的逻辑回归并不是一个在 n 很大时学习复杂的非线性假设的好办法(计算量过大)。
2. 初步认识

E.g. 输入一个28*28像素的表格,输出一个0-9之间的个位数

输入图像的每一个像素分别代表每一个神经元,其中装着的数字代表对应像素的灰度值,叫做“激活值(Activation)

参数展开:将28*28的矩阵转换成向量作为第一层激活值(中间为隐藏层),经过逐步训练,得到结果。

W:权重,每一条线上均赋有权重值。若果想表示一区域,可将其余区域的权重值设为0.
b:偏置。当w*a(i) > 0时,仍不想激发,此时可以设置偏置值。

Neural Networks Learing

总体步骤:
          1.随机初始化权重
          2.正向传播求出预测函数 h
          3.计算代价函数 J
          4.反向传播计算 J(θ) 对 θ 的偏导
          5.梯度检测
          6.使用梯度下降算法或者高级优化算法得到 θ,使得代价函数最小。

1. Random initialization(随机初始化)

Set initialTheta = zeros(n,1) 在逻辑回归是可用的,但在神经网络中是不允许的(对训练起不到任何作用,会导致所有的隐藏单元都以相同的函数作为输入,高度冗余)。
如果你把权重都初始化为 0,那么由于隐含单元开始计算同一个函数,所有的隐含单元就会对输出单元有同样的影响。一次迭代后同样的表达式结果仍然是相同的,即隐含单元仍是对称的。通过推导,两次、三次、无论多少次迭代,不管你训练网络多长时间,隐含单元仍然计算的是同样的函数。

方法(将权重随机初始化为接近 0 的数,范围在[-ε,ε]之间):
      ?[1] = ??.??????.?????(2,2) ∗  0.01 (根据需求设置值)
      ?[1] = ??.?????((2,1))
      ?[2] = ??.??????.?????(2,2) ∗  0.01 , ?[2] = 0

为什么需接近0:
      我们通常倾向于初始化为很小的随机数。如果?很大,那么你很可能最终停在(甚至在训练刚刚开始的时候)?很大的值,这会造成 tanh/Sigmoid 激活函数饱和在龟速的学习上。

2. Cost function(对比logistic回归)


Σ(k=1,K)项:k个输出单元之和(相比logistic仅一个输出)
标准化项(所有层的 θ):
              Σ(l=1,L)表示层数。θ^l表示从 l 层到 l+1 层的映射
              Σ(j=1,S(L+1))表示当前层的第几个激活值
              Σ(i=1,S(L))表示激活该值的第几个权重值

3. Backpropagation algorithm(反向传播算法)-梯度下降

Gradient computation

正向传播

反向传播
     δ:误差

     只需计算到第二层即可,同时不计算偏置项
     如果忽略标准化项,偏导数项 = 激活值 * δ

算法流程
     1.▲表示所有训练集偏导之和,最后处以 m
     2.for循环表示对所有训练集依次进行计算,先正向传播,再反向传播
     3.对于j = 0,表示偏置,不需要正则化,及不需要 (+λθ)
     4.最后将D带入梯度下降算法或高级优化算法中进行更新 θ,直到取得最小 J

4. Gradient checking(梯度检测)

目的: 确保梯度下降以正确的方式进行
注意:在使用你的代码进行学习之前,重要的是要关掉梯度检验(因为计算量非常大,导致运行速度很慢),同时在检验正确之后,也应立即关掉。

方法

反向传播公式推导

从最后一层的误差计算,误差是激活单元的预测与实际值之间的误差,用δ表示误差。即δ(4)=a(4)−y
对于单个激活单元的代价函数:J(θ)=−ylogh(x)−(1−y)log(1−h(x))

误差计算:

▲推导

### MATLAB 中深度神经网络教程与实例 #### 使用 MATLAB 进行卷积神经网络 (CNN) 的构建 MATLAB 提供了一个全面的环境来设计、训练和部署深度学习模型。对于图像处理任务,如对象检测和人脸识别,可以利用内置函数创建 CNN 架构[^1]。 ```matlab % 加载预定义的数据集并划分成训练集和测试集 digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ... 'nndatasets','DigitDataset'); imds = imageDatastore(digitDatasetPath, ... 'IncludeSubfolders',true,... 'LabelSource','foldernames'); % 将数据划分为训练集和验证集 [imdsTrain,imdsValidation] = splitEachLabel(imds,0.8); % 定义层结构 layers = [ imageInputLayer([28 28 1]) convolution2dLayer(5,20) batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) fullyConnectedLayer(10) softmaxLayer classificationLayer]; % 设置训练选项 options = trainingOptions('sgdm',... 'InitialLearnRate',0.01,... % 训练网络 convnet = trainNetwork(imdsTrain,layers,options); ``` 此代码片段展示了如何加载手写数字识别数据集,并建立一个简单的 CNN 来分类这些图片。通过调整参数设置以及增加更多复杂的层,能够进一步提升性能。 #### 自编码器和其他无监督特征提取方法 除了有监督的学习方式外,在某些情况下也可以考虑采用自编码器等无监督技术来进行特征表示学习[^3]: ```matlab hiddenSize = 50; autoenc = trainAutoencoder(trainData',... hiddenSize,... 'MaxEpochs',400,... 'L2WeightRegularization',0.004,... 'SparsityRegularization',4,... 'SparsityProportion',0.15,... 'ScaleData',false); ``` 这段脚本说明了怎样在一个给定的数据矩阵上训练稀疏自编码器,从而获得更紧凑有效的内部表达形式用于后续分析或其他机器学习任务之前。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值