回答一些关于深度神经网络的基本问题

本文深入解析了深度神经网络(DNN)的基本概念、工作原理及优化技巧。探讨了DNN相较于传统机器学习的优势,并详细介绍了反向传播算法的过程,以及如何通过正则化避免过拟合现象。

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

Deep Neural Network

个人认为,可以在不了解dnn背后原理的情况下,使用dnn解决问题(黑箱),但是想要更好的使用dnn,还是要下功夫了解dnn是怎么work的。

什么是DNN?

DNN 是一种以输入输出单元为基本组成成分,以连接这些单元的有向网络为主要算法结构,并最终构建一个可以接受输入数据,输出预测结果的有向图。它有两个重要的特性:1. 网络结构可以被修改,工程师可以根据任务需要,对网络结构进行调整,以提升预测效果;2. 目前有不少非常优秀的工具和平台,可以很好的将DNN应用到各种机器学习任务中。

为什么DNN可以比传统机器学习效果好?

首先,DNN有坚实的数学理论,universal approximation threom在理论上证明了任何连续函数都可以用DNN进行拟合。思路很简单:为了逼近任意的连续函数,我们只需要能在极小的区间,产生任意大小的凸起就可以了(最终我们可以把所有这样的小区间拼接在一起,就得到所需的函数)。和积分的思想差不多。
其次,DNN可以更好的提取原始数据的特征,而不像传统机器学习那样,需要人工提取。最后,DNN也不是万能的,并不是在所有问题上都比传统的机器学习方法好,要依情况而论。

DNN的back-propagation如何工作的?

DNN通过剃度下降算法对网络进行优化。它的优化过程就是反向传播。
首先,我们最终希望计算的是 Cwljk Cblj ,但是又不能直接一个一个参数的计算,因此我们通过一个中间变量来描述两个剃度:

jlkl1zlj=kwljkal1k+bljalj=σ(zlj) ()δlj=Czljδlj=kCalkalkzljCwljk=Czljzljwljk=δlj(wljkal1k)wljk=δljal1kCblj=δlj()δl+1jδljδlj=Czlj=kCzl+1kzl+1kzlj=kzl+1kzljδl+1kzl+1k=jwl+1kjalj+bl+1k=jwl+1kjσ(zlj)+bl+1kzl+1kzlj=wl+1kjσ(zlj)δl=((wl+1)Tδl+1)σ(zl)δljδlj=kCalkalkzljCalkalkalkalkzljzlj

什么是DNN的过拟合

举一个非常典型的例子,具体可以看链接
假设我们有N个二维的数据点:
error
我们可以用一个复杂的多项式去逼近这些数据点,
error
我们也可以用一个较为简单的接近线性的函数去逼近这些数据点,
error
从误差来说,复杂的多项式拟合的效果要比简单的多项式拟合的好得多。
但从另一个角度来说,现实世界中的事物规律,往往都是由简单的模型或者过程产生的,因此简单的模型可以更好的泛化,从而更好的适应新的数据。复杂的模型为了更好的拟合数据,倾向于制造非常多的特例以解释每个数据发生的原因,然而简单的模型则是用简单的理由去解释,如果有误差,可以归结于数据收集的误差。

正则化的目的也就在于此,通过对w进行约束,从而让整个模型变得更简单一点。
以下是常用的L2和L1正则化约束项对w的剃度下降更新过程的影响:

L2w2wwwηC0wηλnw=(1ηλn)wηC0w

L1|w|ww=wηλnsgn(w)ηC0www00

也就是,不管L2还是L1,目的都在于让w衰减,从而变得更小一点。
那么为什么w变小了之后,模型会变得更简单呢?
可以从两个角度来说,当w变小了之后,w所对应的x的变化 x ,所产生的影响也会相应变得小,从而限制模型尝试用特例来拟合数据点;另一方面,当w接近于0时,对应的x的取值几乎对整个模型产生不了影响了,相当于是被常数化了。

为什么训练DNN是困难的

训练DNN的过程中,有一个非常常见的困难,那就是gradient vanishing。以下是对neuralnetworksanddeeplearning中对gradient vanishing的解释的总结,更多细节参见官网
首先看下图,既可以看作是DNN中的一条传播路径,也可以看作是一个只有单个神经元的多层神经网络,以及对应节点b1的剃度。

事实上,一个DNN正是由非常多的这样的路径所组成的。
我们假设这个网络使用的激活函数都是sigmoid,

从sigmoid的剃度值变化函数可以看出本身sigmoid的剃度取值范围就是比较低的,而且在0-1范围内,衰减速度很快。而经过多层的累乘之后,一个节点的数值变化对损失函数的影响会变得很小,导致层级越低的节点训练越慢越困难。
tanh的剃度取值变化稍微比sigmoid好一点:

但同样会让剃度变得很小。
RELU可以比较好的解决这个问题,因为RELU不设定上限。
不过RELU依然有一个下限,这也是Leaky RELU试图解决的。

<think>好的,我需要帮助用户了解基本深度神经网络的实验方法或教程。首先,我应该回顾用户的问题和之前的引用内容。用户提到想了解实验方法和教程,所以我需要整理出一个清晰的步骤指南,可能包括数据准备、模型构建、训练与调优、评估等环节。 根据引用[4],用户之前有关于使用Keras构建神经网络的实战经验,所以可能需要以Keras为例来说明。同时,引用[1]中提到了深层神经网络的教程,引用[3]提到了NNIE的应用场景,但这些可能不是用户当前的重点。用户需要的是基础的实验步骤,所以应该聚焦在数据预处理、模型搭建、训练流程等。 接下来,我需要确保回答符合系统级指令,比如正确使用LaTeX格式。例如,提到损失函数时应该用$L = -\sum y_i \log(\hat{y}_i)$这样的格式。同时,要生成相关问题,可能需要包括模型优化、过拟合处理、工具选择等方向。 还要注意引用文献的正确标注,比如在提到反向传播时引用[1],提到Keras时引用[4],深度学习发展时引用[2]。需要自然地插入引用标识,避免打断阅读流程。 可能的结构可以是分步骤说明,每个步骤包含关键点和示例代码,用Python和Keras展示。然后列出相关问题,帮助用户进一步探索。需要确保语言简洁,逻辑清晰,符合用户要求的“结构清晰,逐步解决问题”。</think>### 深度学习基本深度神经网络实验教程 以下是构建基本深度神经网络DNN)的实验流程及关键步骤,以分类任务为例,使用Keras框架进行实现[^4]。 --- #### 1. **数据准备与预处理** - **数据集选择**:常用MNIST手写数字数据集(包含60,000张训练图像和10,000张测试图像)。 - **数据归一化**:将像素值从$[0,255]$缩放到$[0,1]$,公式为: $$x_{\text{norm}} = \frac{x}{255}$$ - **标签编码**:使用独热编码(One-Hot Encoding)处理分类标签,例如标签“3”转换为$[0,0,0,1,0,0,0,0,0,0]$。 ```python from keras.datasets import mnist from keras.utils import to_categorical (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train.reshape(-1, 28*28).astype('float32') / 255.0 X_test = X_test.reshape(-1, 28*28).astype('float32') / 255.0 y_train = to_categorical(y_train) y_test = to_categorical(y_test) ``` --- #### 2. **模型构建** - **网络结构**:输入层(784维)→ 隐藏层(512神经元,ReLU激活)→ 输出层(10神经元,Softmax激活)。 - **数学表达式**: 隐藏层输出:$h = \text{ReLU}(W_1 x + b_1)$ 输出层概率:$\hat{y} = \text{Softmax}(W_2 h + b_2)$ 损失函数(交叉熵):$L = -\sum_{i=1}^{10} y_i \log(\hat{y}_i)$ ```python from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(512, activation='relu', input_shape=(784,))) model.add(Dense(10, activation='softmax')) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ``` --- #### 3. **模型训练与调优** - **超参数设置**:批量大小(batch_size=128)、训练轮次(epochs=10)。 - **反向传播**:通过梯度下降算法更新权重,优化损失函数[^1]。 - **验证集划分**:通常从训练集中拆分20%作为验证集。 ```python history = model.fit(X_train, y_train, validation_split=0.2, epochs=10, batch_size=128) ``` --- #### 4. **模型评估与可视化** - **测试集评估**:计算准确率与损失值。 - **训练曲线分析**:绘制损失和准确率随训练轮次的变化曲线,检测过拟合/欠拟合。 ```python test_loss, test_acc = model.evaluate(X_test, y_test) print(f'测试集准确率:{test_acc:.4f}') import matplotlib.pyplot as plt plt.plot(history.history['accuracy'], label='训练准确率') plt.plot(history.history['val_accuracy'], label='验证准确率') plt.xlabel('训练轮次') plt.ylabel('准确率') plt.legend() plt.show() ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值