关于神经网络中隐藏层和神经元的深入理解

最近复习了一下基础知识,看到MLP的结构,关于隐藏层和神经元有了新的一些理解。


隐藏层的意义

要说明隐藏层的意义,需要从两个方面理解,一个是单个隐藏层的意义,一个是多层隐藏层的意义

单个隐藏层的意义

隐藏层的意义就是把输入数据的特征,抽象到另一个维度空间,来展现其更抽象化的特征,这些特征能更好的进行线性划分。

举个栗子,MNIST分类。
输出图片经过隐藏层加工, 变成另一种特征代表 (3个神经元输出3个特征), 将这3个特征可视化出来。就有了下面这张图, 我们发现中间的隐藏层对于"1"的图片数据有了清晰的认识,能将"1"的特征区分开来。
隐藏层内的维度空间

多个隐藏层的意义

多个隐藏层其实是对输入特征多层次的抽象,最终的目的就是为了更好的线性划分不同类型的数据(隐藏层的作用)

怎么理解这句话呢,举个有趣的例子,如下图所示。
在这里插入图片描述

我们的输入特征是:身高、体重、胸围、腿长、脸长等等一些外貌特征,输出是三个类:帅气如彭于晏,帅气如我,路人。
那么隐藏层H1中,身高体重腿长这些特征,在H1中表达的特征就是身材匀称程度,胸围,腰围,臀围这些可能表达的特征是身材如何,脸长和其他的一些长表达的特征就是五官协调程度。
那么把这些特征,再输入到H2中,H2中的神经元可能就是在划分帅气程度,身材好坏了,然后根据这些结果,分出了三个类。
很遗憾,帅气程度略输彭于晏一筹。

那么,是不是隐藏层约多就越好呢,可以特征划分的更清楚啊?
理论上是这样的,但实际这样会带来两个问题

  1. 层数越多参数会爆炸式增多
  2. 到了一定层数,再往深了加隐藏层,分类效果的增强会越来越不明显。上面那个例子,两层足以划分人是有多帅,再加几层是要得到什么特征呢?这些特征对划分没有什么提升了。

神经元的意义

现在终于彻底明白为什么西瓜书、花书讲神经网络之前要讲logistic regression了。就是所谓的感知器的意义。

我现在把一个神经元(感知器)的作用理解成为一种线性划分方式。
一个决策边界,一个神经元,就是线性划分,多个神经元,就是多个线性划分,而多个线性划分就是不断在逼近决策边界。可以把这个过程想象成积分过程。

一个决策边界就是又多个线性划分组成的。

那么如果神经元数量很多很多,这就导致会有很多个线性划分,决策边界就越扭曲,基本上就是过拟合了。

换一个角度来说神经元,把它理解为学习到一种东西的物体,如果这种物体越多,学到的东西就越来越像样本,也就是过拟合。


对于其他深度学习的网络来说,CNN,RNN其实是一个道理,filter层不也是找到更抽象的特征吗。LSTM增加forget gate,就不是为了让神经元不要学得太像而得到的。

so,温故而知新,可以吹逼矣。

### 隐藏层的作用原理 在神经网络架构中,隐藏层位于输入层输出层之间,其主要作用在于捕捉并表示数据中的复杂模式与特征。通过多层非线性变换,隐藏层能够使模型具备更强的数据表达能力更高的抽象层次。 #### 数据特征提取 隐藏层通过对前一层传递过来的信息进行加权求再经过激活函数转换来实现对原始输入信号逐步深入的理解过程[^1]。每一层都会基于上一层的结果计算新的特征向量作为下一层的输入直到最终形成可以用于分类或者回归预测的有效表征形式。 #### 解决欠拟合与过拟合问题 适当调整隐藏层数目以及各层节点数对于防止出现欠拟合现象至关重要——即当网络结构过于简单不足以描述训练集内部规律时会发生这种情况;反之如果设置得太过复杂则容易引起过拟合从而降低对外部样本的适应性表现。因此合理规划隐藏层的设计方案成为提高整体性能的重要环节之一。 ```python import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x)) class NeuralNetwork: def __init__(self, input_nodes, hidden_nodes, output_nodes): self.input_nodes = input_nodes self.hidden_nodes = hidden_nodes self.output_nodes = output_nodes # 初始化权重矩阵 self.weights_input_hidden = np.random.randn(self.hidden_nodes, self.input_nodes) self.weights_hidden_output = np.random.randn(self.output_nodes, self.hidden_nodes) def forward_pass(self, X): # 计算隐含层净输入 net_hidden = np.dot(self.weights_input_hidden, X.T).T out_hidden = sigmoid(net_hidden) # 应用激活函数 # 输出层计算 net_outputs = np.dot(out_hidden, self.weights_hidden_output.T) final_outputs = sigmoid(net_outputs) return final_outputs ``` 上述代码展示了如何定义一个简单的两层(单个隐藏层)前馈型神经网络,并实现了正向传播的过程。这里使用了`sigmoid()`作为激活函数应用于隐藏层输出以引入非线性特性。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值