动手学习深度学习——从零开始推导和复现反向传播


  文中如有错误,或您有不同的看法,请评论中指出讨论,谢谢。

1.符号说明

  假设网络一共有0 ~ N层,其中0为输入层,N为输出层,1 ~ N-1为隐藏层。每层网络都有 n L n_L nL个神经元,L代表第L层网络。

  除了输入层以外,网络的每个神经元都有两个变量 a i ( L ) , b i ( L ) a^{(L)}_{i},b^{(L)}_{i} ai(L),bi(L),上下标分别表示第L层的第i个神经元, b i ( L ) b^{(L)}_{i} bi(L) a i ( L ) a^{(L)}_{i} ai(L)用激活函数 f ( x ) f(x) f(x)激活后的数值,即 b i ( L ) = f ( a i ( L ) ) b^{(L)}_{i}=f(a^{(L)}_{i}) bi(L)=f(ai(L))

  相邻的两层网络用权重 w i j ( L ) w^{(L)}_{ij} wij(L)连接,表示连接第L-1层第i个神经元和第L层第j个神经元的权重。

  网络的输出为 b 1 ( N ) , . . . , b n N ( N ) b_1^{(N)},...,b_{n_N}^{(N)} b1(N),...,bnN(N),这些输出会作为输入到一个设置好的损失函数 E ( x ) E(x) E(x)中,然后得到网络输出与标准值的损失值。

  为了方便之后写代码,所以要用矩阵/向量的方式来表示每层网络的变量。符号说明如下:

  • A ( L ) = [ a 1 ( L ) , a 2 ( L ) , . . . , a n L ( L ) ] 1 × n L A^{(L)}=[a^{(L)}_1,a^{(L)}_2,...,a^{(L)}_{n_L}]_{1\times n_L} A(L)=[a1(L),a2(L),...,anL(L)]1×nL
  • B ( L ) = [ b 1 ( L ) , b 2 ( L ) , . . . , b n L ( L ) ] 1 × n L B^{(L)}=[b^{(L)}_1,b^{(L)}_2,...,b^{(L)}_{n_L}]_{1\times n_L} B(L)=[b1(L),b2(L),...,bnL(L)]1×nL;
  • W ( L ) = [ w 11 ( L ) . . . w 1 n L ( L ) . . . . . . . . . w n L − 1 1 ( L ) . . . w n L − 1 n L ( L ) ] n L − 1 × n L W^{(L)}=\bigg[ \begin{matrix}w^{(L)}_{11} ... w^{(L)}_{1n_L}\\ .........\\ w^{(L)}_{n_{L-1}1} ... w^{(L)}_{n_{L-1}n_L}\end{matrix} \bigg]_{n_{L-1}\times n_{L}} W(L)=[w11(L)...w1nL(L).........wnL11(L)...wnL1nL(L)]nL1×nL

在这里插入图片描述

2.前向传播

  前向传播的主要作用就是根据网络的输入量来计算各层网络所有神经元的节点值 A ( L ) , B ( L ) A^{(L)},B^{(L)} A(L),B(L),最终根据网络的输出 B ( N ) B^{(N)} B(N)和输入量对应的样本标签值 Y Y Y计算损失值 E ( Y − B ( N ) ) E(Y-B^{(N)}) E(YB(N))

  由于前向传播比较简单,所以就不仔细分析了,就直接用矩阵变量来表示过程。

  1). 初始化所有的权重 W ( L ) , L = 1 , 2 , . . . , N W^{(L)},L=1,2,...,N W(L),L=1,2,...,N

  2). 网络的输入为 A ( 0 ) A^{(0)} A(0),激活函数设为 f ( x ) f(x) f(x),如果输入是矩阵,则表示对矩阵的每个元素执行 f ( x ) f(x) f(x)的映射;

  3). 然后就按顺序开始计算:

   A ( 0 ) × W ( 1 ) ⇒ A ( 1 ) = A ( 0 ) × W ( 1 ) ⇒ B ( 1 ) = f ( A ( 1 ) ) A^{(0)}\times W^{(1)}\Rightarrow A^{(1)}=A^{(0)}\times W^{(1)}\Rightarrow B^{(1)}=f(A^{(1)}) A(0)×W(1)A(1)=A(0)×W(1)B(1)=f(A(1))

   B ( 1 ) × W ( 2 ) ⇒ A ( 2 ) = B ( 1 ) × W ( 2 ) ⇒ B ( 2 ) = f ( A ( 2 ) ) B^{(1)}\times W^{(2)}\Rightarrow A^{(2)}=B^{(1)}\times W^{(2)}\Rightarrow B^{(2)}=f(A^{(2)}) B(1)×W(2)A(2)=B(1)×W(2)B(2)=f(A(2))

  …,

   B ( N − 1 ) × W ( N ) ⇒ A ( N ) = B ( N − 1 ) × W ( N ) ⇒ B ( N ) = f ( A ( N ) ) B^{(N-1)}\times W^{(N)}\Rightarrow A^{(N)}=B^{(N-1)}\times W^{(N)}\Rightarrow B^{(N)}=f(A^{(N)}) B(N1)×W(N)A(N)=B(N1)×W(N)B(N)=f(A(N))

  4).最后根据损失函数计算损失值, E ( Y − B ( N ) ) E(Y-B^{(N)}) E(YB(N)),其中 Y Y Y是网络输入对应的标签(正确值)。

3.反向传播

  反向传播顾名思义当然要从网络的反向开始,也就是损失函数。反向传播的主要目的是根据网络得到的损失值,计算损失值相对于网络每个权重的导数(梯度),然后每个权重都利用梯度下降法进行权重值的更新。从而开始下一轮的前向传播和反向传播,使损失值越来越小,而网络的预测值逐渐贴近真实值。

  那么重点就落在如何计算每个权重的梯度呢?(主要是基于“链式求导法”)

  1).先从第N-1层到第N层的权重 W ( N ) = { w i N − 1 i N ( N ) } W^{(N)}=\{w^{(N)}_{i_{N-1}i_N}\} W(N)={ wiN1iN(N)}开始分析:
∂ E ∂ w i N − 1 i N ( N ) = ∂ E ∂ a i N ( N ) ∂ a i N ( N ) ∂ w i N − 1 i N ( N ) = ∂ E ∂ b i N ( N ) ∂ b i N

<think>好的,我需要帮助用户寻找深度学习的练习题、资源教程。首先,用户提供的引用中提到了几本书教程,比如《python深度学习》[^1]、PyTorch教程[^2]、LeeDL Tutorial[^3],还有GitHub上的开源项目。这些是很好的资源,应该优先推荐。 接下来,用户可能需要不同类型的资源,包括理论书籍、实践教程、练习题集社区资源。练习题方面,Kaggle竞赛LeetCode算法题是不错的选择,可以锻炼实际应用能力。另外,书籍中的代码实践部分也可以作为练习,比如《深度学习入门》中的实现。 GitHub上的开源项目,比如LeeDL Tutorialfast.ai课程,提供了大量实战项目练习题,用户可以通过参与这些项目来提升技能。在线平台如CourseraUdacity的课程通常包含作业项目,这也是很好的练习资源。 还要考虑用户可能处于不同学习阶段,比如入门、进阶或实战,因此需要分层次推荐资源。例如,入门者可以从《python深度学习》开始,而进阶学习者可以参与Kaggle竞赛或阅读论文复现代码。 最后,确保所有推荐的资源都有引用来源,并且格式正确。检查是否有遗漏的重要资源,比如官方文档或知名社区,这些也是不可或缺的学习工具。整理好这些内容后,分点列出,结构清晰,便于用户查看。</think>以下是深度学习相关的练习题、资源教程推荐,结合了理论实践内容: ### 一、精选教程资源 1. **《Python深度学习》**(François Chollet著) - 特点:Keras框架入门,包含从神经网络基础到计算机视觉的完整案例 - 配套资源:书中所有代码示例均可通过GitHub获取 - 练习题建议:可尝试复现代码并修改网络结构观察效果变化 2. **PyTorch官方教程** - 包含60分钟快速入门教程图像分类、文本生成等实战项目 - 推荐练习:完成官方Tutorial中的「CIFAR10图像分类」任务 3. **《LeeDL Tutorial 深度学习详解》** - GitHub星标超1万的开源教程,包含数学推导代码实现 - 特色:每章配套习题含参考答案,例如: ```python # 习题示例:实现交叉熵损失函数 def cross_entropy(y_pred, y_true): return -np.sum(y_true * np.log(y_pred)) ``` - 建议:按照GitHub项目中的学习路线完成练习 ### 二、专项练习题资源 1. **Kaggle学习路径** - 微型课程:包含深度学习入门(含PyTorch/Keras双版本) - 配套练习:如「Digit Recognizer」手写数字识别竞赛 2. **《深度学习入门》(鱼书)习题** - 特色:从零实现神经网络,包含: $$ \text{ReLU}(x) = \max(0, x) $$ - 推荐练习:手动推导反向传播公式 3. **Stanford CS230课程作业** - 包含医疗图像分类、机器翻译等真实场景项目 - 需掌握的公式示例: $$ \text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}} $$ ### 三、实战提升资源 1. **Papers With Code** - 结合论文复现最新模型,如Transformer、Diffusion Model - 练习建议:选择经典论文(如ResNet)复现核心模块 2. **fast.ai实战课程** - 特色:Top-down学习法,第一课即可实现图像分类器 - 代码示例: ```python from fastai.vision.all import * path = untar_data(URLs.PETS)/'images' dls = ImageDataLoaders.from_name_func(path, get_image_files(path), valid_pct=0.2, seed=42) learn = vision_learner(dls, resnet34, metrics=error_rate) ``` 3. **OpenMMLab实战营** - 涵盖目标检测、图像分割等进阶主题 - 提供完整实验环境baseline代码 ### 四、学习建议 1. 入门阶段:先完成「MNIST手写识别」等基础项目 2. 提升阶段:通过Kaggle比赛理解模型调优技巧 3. 进阶阶段:参与GitHub开源项目或学术竞赛(如AI Challenger)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值