🤖 深度神经网络(DNN)详细介绍
1️⃣ 什么是深度神经网络
- 定义:深度神经网络(Deep Neural Network, DNN)是由 多层神经元组成的人工神经网络,层数通常≥2。
- 特点:相较于传统的浅层神经网络,DNN 能够 自动学习数据的高层抽象特征。
- 目标:将输入映射到输出,通过学习优化模型参数,实现分类、回归或生成任务。
2️⃣ 基本结构
典型结构包括:
-
输入层(Input Layer)
-
隐藏层(Hidden Layers)
- 可以有多层
- 每层神经元通过 权重矩阵 + 偏置 + 激活函数 进行非线性变换
- 负责提取特征和模式
-
输出层(Output Layer)
-
输出预测结果
-
激活函数根据任务不同选择:
- 分类 → Softmax / Sigmoid
- 回归 → 线性函数
示意图:
输入层 -> 隐藏层1 -> 隐藏层2 -> ... -> 隐藏层n -> 输出层 |
|---|
3️⃣ 激活函数(Activation Functions)
- Sigmoid:0~1,易于概率输出,但容易梯度消失
- Tanh:-1~1,梯度比 sigmoid 大,仍可能梯度消失
- ReLU(Rectified Linear Unit) :
f(x)=max(0,x),目前最常用,收敛快
- Leaky ReLU / Parametric ReLU:解决 ReLU 死神经元问题
- Softmax:多分类输出概率
4️⃣ 损失函数(Loss Functions)
- 分类任务:交叉熵损失(Cross-Entropy Loss)
- 回归任务:均方误差(Mean Squared Error, MSE)
- 其他任务:可设计自定义损失函数
5️⃣ 前向传播(Forward Propagation)
- 输入向量
x 经过每层线性变换 + 激活函数 → 输出层预测值 y_hat
- 公式(隐藏层 l):
z^l = W^l * a^(l-1) + b^l |
|---|
6️⃣ 反向传播(Backpropagation)
-
目标:最小化损失函数,通过梯度下降更新参数
-
过程:
- 计算输出层误差
δ = y_hat - y
- 将误差反向传播到每层
- 更新权重和偏置:
η:学习率
- 可以使用 SGD、Adam、RMSprop 等优化器
7️⃣ 常用正则化和优化技巧
- Dropout:随机屏蔽部分神经元,防止过拟合
- Batch Normalization:加快训练收敛、稳定梯度
- Early Stopping:提前停止训练,避免过拟合
- 数据增强(Data Augmentation) :提升模型泛化能力
8️⃣ DNN 的应用领域
- 计算机视觉:图像分类、目标检测、图像生成(GAN)
- 自然语言处理:文本分类、机器翻译、情感分析
- 语音识别:语音转文本、语音合成
- 推荐系统:用户行为预测、个性化推荐
- 金融分析:信用评分、风险预测
9️⃣ 常见问题
| 问题 | 解决方法 |
|---|
| 梯度消失/梯度爆炸 | 使用 ReLU 激活函数、批量归一化 |
| 过拟合 | 数据增强、Dropout、正则化 |
| 训练慢 | 使用优化器 Adam、学习率调度、GPU加速 |
| 模型调参困难 | 网格搜索、随机搜索、贝叶斯优化 |
🔟 小结
- DNN 是深度学习的核心模型
- 核心思想:多层非线性变换 → 特征抽象 → 任务映射
- 训练过程依赖 前向传播 + 反向传播
- 应用广泛,从图像、语音到自然语言处理
👌 明白了,阿杰,我给你做一个 可视化的深度神经网络(DNN)教学示例,用 Python + Matplotlib 实现。功能如下:
- 简单多层神经网络(输入层 + 两个隐藏层 + 输出层)
- 手动输入数据
- 可视化 前向传播 和 权重更新
- 每次迭代显示输出结果变化
🛠️ Python 可视化 DNN 示例
import matplotlib.pyplot as plt |
|---|
# ======================= |
|---|
# ======================= |
|---|
``return 1 / (1 + np.exp(-x)) |
|---|
def sigmoid_derivative(x): |
|---|
# ======================= |
|---|
# ======================= |
|---|
W1 = np.random.randn(input_size, hidden_size1) |
|---|
b1 = np.zeros((1, hidden_size1)) |
|---|
W2 = np.random.randn(hidden_size1, hidden_size2) |
|---|
b2 = np.zeros((1, hidden_size2)) |
|---|
W3 = np.random.randn(hidden_size2, output_size) |
|---|
b3 = np.zeros((1, output_size)) |
|---|
# ======================= |
|---|
# ======================= |
|---|
X = np.array([[0,0],[0,1],[1,0],[1,1]]) |
|---|
y = np.array([[0],[1],[1],[0]]) # XOR |
|---|
# ======================= |
|---|
# ======================= |
|---|
def plot_network(output, epoch): |
|---|
``plt.title(f"Epoch {epoch+1}, 输出: {output.flatten()}") |
|---|
``plt.bar(range(len(output.flatten())), output.flatten()) |
|---|
# ======================= |
|---|
# ======================= |
|---|
``z1 = np.dot(X, W1) + b1 |
|---|
``z2 = np.dot(a1, W2) + b2 |
|---|
``z3 = np.dot(a2, W3) + b3 |
|---|
``delta3 = error * sigmoid_derivative(a3) |
|---|
``delta2 = delta3.dot(W3.T) * sigmoid_derivative(a2) |
|---|
``delta1 = delta2.dot(W2.T) * sigmoid_derivative(a1) |
|---|
``W3 += a2.T.dot(delta3) * learning_rate |
|---|
``b3 += np.sum(delta3, axis=0, keepdims=True) * learning_rate |
|---|
``W2 += a1.T.dot(delta2) * learning_rate |
|---|
``b2 += np.sum(delta2, axis=0, keepdims=True) * learning_rate |
|---|
``W1 += X.T.dot(delta1) * learning_rate |
|---|
``b1 += np.sum(delta1, axis=0, keepdims=True) * learning_rate |
|---|
``plot_network(a3, epoch) |
|---|
✅ 功能说明
- 网络结构:2 输入 → 3 隐藏1 → 2 隐藏2 → 1 输出
- 训练任务:XOR 示例,直观展示非线性学习能力
- 前向传播可视化:每轮迭代输出柱状图
- 交互式显示:通过
plt.pause 可看到输出变化
- 权重更新:每轮迭代通过反向传播更新权重和偏置
👌 明白了,阿杰,我给你做一个 高级动态图可视化 DNN 示例,功能如下:
- 显示 完整网络结构(输入层 → 隐藏层 → 输出层)
- 动态箭头显示信号流
- 节点颜色表示激活值大小
- 每次迭代展示 前向传播 + 输出变化
🛠️ Python 高级可视化 DNN 示例
import matplotlib.pyplot as plt |
|---|
# ======================= |
|---|
# ======================= |
|---|
``return 1 / (1 + np.exp(-x)) |
|---|
# ======================= |
|---|
# ======================= |
|---|
layers = [2, 3, 2, 1] # 输入2 → 隐藏3 → 隐藏2 → 输出1 |
|---|
weights = [np.random.randn(layers[i], layers[i+1]) for i in range(len(layers)-1)] |
|---|
biases = [np.zeros((1,layers[i+1])) for i in range(len(layers)-1)] |
|---|
# ======================= |
|---|
# ======================= |
|---|
X = np.array([[0,0],[0,1],[1,0],[1,1]]) |
|---|
y = np.array([[0],[1],[1],[0]]) # XOR |
|---|
# ======================= |
|---|
# ======================= |
|---|
def draw_network(activations, epoch): |
|---|
``for l, size in enumerate(layers): |
|---|
``layer_y = spacing_y * (size-1)/2 |
|---|
``pos[node_idx] = (layer_x, layer_y - n*spacing_y) |
|---|
``labels[node_idx] = f"{activations[l][0,n]:.2f}" if l < len(activations) else "" |
|---|
``for l in range(len(layers)-1): |
|---|
``idx_to = idx_from + layers[l] |
|---|
``for i in range(layers[l]): |
|---|
``for j in range(layers[l+1]): |
|---|
``G.add_edge(idx_from+i, idx_to+j, weight=weights[l][i,j]) |
|---|
``for l, size in enumerate(layers): |
|---|
``if l < len(activations): |
|---|
``node_colors.append(activations[l][0,n]) |
|---|
``nx.draw(G, pos, with_labels=True, labels=labels, node_color=node_colors, |
|---|
``node_size=1000, cmap=plt.cm.viridis, edge_color='gray', arrows=True) |
|---|
``plt.title(f"DNN 高级可视化 - Epoch {epoch+1}") |
|---|
# ======================= |
|---|
# ======================= |
|---|
``for W, b in zip(weights, biases): |
|---|
# ======================= |
|---|
# ======================= |
|---|
``for i in range(len(X)): |
|---|
``a = forward_pass(X[i].reshape(1,-1)) |
|---|
✅ 功能说明
- 网络结构动态显示:节点按层排列,箭头表示连接
- 节点颜色表示激活值:深色 → 高激活,浅色 → 低激活
- 每个节点显示输出值:便于理解每层输出
- 动态前向传播演示:每次迭代显示不同输入的激活变化
- 可扩展:可增加层数、节点数,或加入权重更新动画
www.52runoob.com/archives/68…