当前位置: 首页 > news >正文

吴恩达深度学习复盘(4)神经网络的前向传播

笔者注

神经网络的前向传播(Forward Propagation)是指输入数据从输入层经过各隐藏层传递到输出层,逐层计算激活值的过程。这一过程不涉及参数更新,主要用于生成预测结果或为反向传播提供中间值。如果觉得理解起来过于抽象,就把这个过程作为为了得到结果所需要做的必要过程好了。

1. 神经网络结构基础

之前笔记介绍过

 神经网络由多层神经元组成,一般有3层结构:

- 输入层:接收原始数据。

- 隐藏层:1个或多个中间层,通过非线性变换提取特征。

- 输出层:生成最终预测结果。

- 神经元连接:每层神经元通过带权重的边与下一层神经元相连,权重决定输入信号的重要性。

2. 前向传播核心步骤

 假设神经网络有L层,第l层的输入为a^{(l-1)},输出为a^{(l)}。每一层的计算分为两步:

步骤1:线性变换(Linear Transformation)

 - 公式:z^{(l)} = W^{(l)} \cdot a^{(l-1)} + b^{(l)}

- W^{(l)}:第l层的权重矩阵(维度为 n^{(l)} \times n^{(l-1)})。

- b^{(l)}:第l层的偏置向量(维度为 n^{(l)} \times 1)。

- a^{(l-1)}:第l-1层的激活值(输入)。

- z^{(l)}:第l层的线性组合结果(未激活值)。

步骤2:非线性激活(Non-linear Activation)

 - 公式:a^{(l)} = \sigma(z^{(l)})

- \sigma(\cdot):激活函数(如ReLU、sigmoid、tanh等)。

- 作用:引入非线性,使神经网络能学习复杂模式。

3. 逐层计算示例

 以一个简单的3层网络(输入层→隐藏层→输出层)为例:

1. 输入层到隐藏层:

- 输入数据 a^{(0)} = X(假设X为样本矩阵,维度为n^{(0)} \times m,m为样本数)。

- 计算 z^{(1)} = W^{(1)} \cdot a^{(0)} + b^{(1)}

- 激活:a^{(1)} = \sigma(z^{(1)})

2. 隐藏层到输出层:

- 计算 z^{(2)} = W^{(2)} \cdot a^{(1)} + b^{(2)}

- 输出层激活(根据任务选择函数):

- 回归任务:线性激活a^{(2)} = z^{(2)}

- 分类任务:Softmax激活(输出概率分布)。

4. 激活函数的选择

 - 常见激活函数:

- Sigmoid:输出范围(0,1),适合二分类。

- ReLU:计算高效,缓解梯度消失(\sigma(z) = \max(0, z))。

- Softmax:输出层多分类常用,将值归一化为概率分布。

- 选择依据:根据任务类型(分类/回归)和网络深度(避免梯度问题)。

5. 矩阵运算的高效性

 - 向量化计算:通过矩阵乘法同时处理多个样本,避免循环。

- 示例:若有m个样本,每个样本的输入为 x_i,则 a^{(0)} = [x_1, x_2, ..., x_m],矩阵运算可批量计算所有样本的激活值。

6. 前向传播的作用

 - 预测阶段:输入新数据,逐层计算输出,得到预测结果。

- 训练阶段:为反向传播提供中间值(如各层的z和a),用于计算梯度并更新参数。

7.简单的算法示例代码

import numpy as np

# 定义激活函数
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

# 前向传播函数
def forward_propagation(X, W1, b1, W2, b2):
    # 输入层到隐藏层的线性变换
    z1 = np.dot(W1, X) + b1
    # 隐藏层的激活函数
    a1 = sigmoid(z1)
    # 隐藏层到输出层的线性变换
    z2 = np.dot(W2, a1) + b2
    # 输出层的激活函数
    a2 = sigmoid(z2)
    return a2

# 示例数据
# 输入特征,假设有3个样本,每个样本有2个特征
X = np.array([[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]]).T
# 隐藏层神经元数量
n_hidden = 3
# 输入层神经元数量
n_input = X.shape[0]
# 输出层神经元数量
n_output = 1

# 初始化权重和偏置
# 输入层到隐藏层的权重
W1 = np.random.randn(n_hidden, n_input)
# 隐藏层的偏置
b1 = np.zeros((n_hidden, 1))
# 隐藏层到输出层的权重
W2 = np.random.randn(n_output, n_hidden)
# 输出层的偏置
b2 = np.zeros((n_output, 1))

# 执行前向传播
output = forward_propagation(X, W1, b1, W2, b2)
print("前向传播的输出结果:")
print(output)
    

8. 总结

 前向传播的核心是将输入数据通过层层线性变换和非线性激活,最终映射到输出空间。其数学本质是复合函数的嵌套计算,而矩阵运算的优化使得这一过程在大规模数据上高效运行。理解前向传播是掌握反向传播、梯度下降等神经网络核心算法的基础。

相关文章:

  • Linux中的权限管理
  • git clone 提示需要登录 github
  • #Linux内存管理# 在32bit Linux中,内核空间的线性映射的虚拟地址和物理地址是如何换算的?
  • PWA 进阶教程(三): 如何在 PWA 中实现后台同步
  • mediacodec服务启动时加载media_codecs.xml
  • MySql面试总结(五)
  • 关于修改 vue Element admin、若依, 等后台管理系统模板的一些全局样式问题:
  • 这样看数组
  • 【TS学习】(19)TS中的类
  • 机器学习(八):K-Means聚类原理与实战
  • CSS3学习教程,从入门到精通, 化妆品网站 HTML5 + CSS3 完整项目(26)
  • Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件详解
  • bilibili全链路压测改造之全链自动化测试实践
  • ZLMediaKit 源码分析——[3] ZLToolKit 中EventPoller之网络事件处理
  • Jmeter操作(数据库)
  • 讯投 QMT 使用小技巧 -如何判断今天是不是交易日
  • Java 流程控制关键字全解析:break、continue 与 goto 的深度实践指南
  • uniapp APP端在线升级(简版)
  • Linux服务器配置安装与管理
  • Linux探秘坊-------10.基础IO
  • 复旦大学与上海杨浦共建市东医院
  • 支持企业增强战略敏捷更好发展,上海市领导密集走访外贸外资企业
  • 总没胃口,一吃就饱……别羡慕,也可能是生病了
  • 干部任职公示:陕西宁强、镇安两县县长拟进一步使用
  • 上海下周最高气温在30℃附近徘徊,夏天越来越近
  • 中国工程院院士、国医大师、现代中国针灸奠基人石学敏逝世