李宏毅深度学习笔记——呕心整理版

本文档系统地概述了李宏毅教授的深度学习课程精华,从机器学习与深度学习的基础概念出发,逐步深入探讨优化技巧、卷积神经网络、自注意力机制等核心主题,并解析Transformer的工作原理。

李宏毅深度学习笔记——呕心整理版

闲谈叨叨叨:

之前看过吴恩达的一部分课程,所以有一定理论基础,再看李宏毅的课程会有新的理解。我先以有基础的情况写完学习过程,后续再以零基础的角度补充细节概念(估计不会啦,因为懒~)。长篇预警!可以慢慢看。多数只是自己的笔记,不会太有语言的概念解释,建议自己看一遍视频(往后字可能会越来越多,听我慢慢叨咕吧)。笔记只是提供回忆、巩固理解的工具。若有问题,欢迎评论讨论,有时间我会改正哒!

经过我多年学习经验(没有啦~),预习真的很重要,其实更多是重复记忆,加深理解。我的建议是先看吴恩达的课程了解机器学习和深度学习的基本知识框架和概念,还有理论推导,理解就可以,这就相当于预习;然后看李宏毅的课程,换个思路,以实际应用加深理解,就会感觉吴恩达的课程缘由不太清楚的自然而然就通了;看李宏毅的课程同时,看刘二大人的pytorch课程,动手操作,学会后完成李宏毅的作业;pytorch需要线性代数和概率论(这些课上要好好学,忘了的可以速学一下考研课程)以及python基础,我会整理一些推荐课程和学习路线。

关于李宏毅课程的视频顺序,我大多是先看2021年,用2022年视频作为补充,快速过一遍,选修部分也看。视频链接还有一位大佬整理的资源我会附在正文的引入部分。

目录附上:


正片开始:

1 引入

1.1 机器学习&深度学习

机器学习就是寻找一个复杂函数

深度学习的函数就是类神经网络

  • 函数的输入可以是向量、矩阵、序列等等;
  • 函数的输出可以是数值(称为regression 回归)、类别(classification 分类)、文本、图片等等

在这里插入图片描述

回归 regression

在这里插入图片描述

分类 classification

在这里插入图片描述

structured learning

在这里插入图片描述

1.2 课程规划

——————————先更新到前5章——————————

Lecture1-5: Supervised Learning 监督学习

训练数据要有标注,数据集要知道输出值

缺点:耗费人工

Lecture 7: Self-supervised Learning

无标注资料——Pre-train

Lecture 6: Generative Adversarial Network(GAN)

Lecture 12: Reinforcement Learning(RL)强化学习

不知道怎么标注

Lecture 8: Anomaly detection 异常检测

Lecture 9: Explainable AI 可解释性AI

Lecture 10: Model attack 模型攻击

Lecture 11: Domain adaptation 域适应

Lecture 13: Network Compression

Lecture 14: life-long learning

Lecture 15: Meta learning

1.3 机器学习例子

根据过往观看次数预测明天的观看次数

1.3.1 训练过程(training)
  1. 含有未知参数的函数
    在这里插入图片描述

  2. 定义损失函数
    在这里插入图片描述

    标签 label:已知的对应结果

    求出 e 1 e_1 e1 e N e_N eN
    L o s s : L = 1 N ∑ n e n Loss: L=\frac{1}{N}\sum _ne_n Loss:L=N1nen

    补充:
    loss函数可自己定义,以下常见三类:MAE、MSE、交叉熵
    在这里插入图片描述在这里插入图片描述

    误差曲面(error surface)

    在这里插入图片描述

  3. 优化
    w ∗ , b ∗ = a r g min ⁡ w , b L w^*, b^* = arg \min_{w,b}L w,b=argw,bminL

    a r g m i n argmin argmin:使后面的公式最小的参数

    梯度下降 gradient descent

    假设只有 w w w一个参数

    在这里插入图片描述

    带上 b b b

    在这里插入图片描述

    超参数(hyper parameter):机器学习中,需要自己设定的参数

    学习率

    全局最小值与局部最小值的问题。后续补充,在2.1部分(手动跳转吧~ 无法页面内部跳转,气死我啦ヽ(*。>Д<)o゜)

    这个问题并不是最主要的,最常见的。其实是学习率!

    找到使loss最小的 w , b w,b w,b的值

    在这里插入图片描述

1.3.2 改进(很牛逼,建议有基础后回看)

在这里插入图片描述

线性模型太过简单。

model bias:线性模型具有很大的限制

怎么避免model bias?需要更复杂的含有未知参数的函数。

线性函数都可以用一段一段的函数组成,即可用常数+若干个蓝色函数表示。

在这里插入图片描述

那怎么表示蓝色函数呢?

sigmoid function(S函数):
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ y &= c\frac{1}…
在这里插入图片描述

调整sigmoid函数的 c , b , w c, b, w c,b,w制作各式各样的蓝色函数

在这里插入图片描述

所以…
y = b + ∑ i c i   s i g m o i d ( b i + w i x 1 ) y=b+\sum_i{c_i\ sigmoid(b_i+w_ix_1)} y=b+ici sigmoid(bi+wix1)
在这里插入图片描述

延伸一下(前方高能!!!):

y = b + ∑ j w j x j y=b+\sum_j{w_jx_j} y=b+jwjxj,则 y = b + ∑ i c i   s i g m o i d ( b i + ∑ j w i j x j ) y=b+\sum_i{c_i\ sigmoid(b_i+\sum_j{w_{ij}x_j})} y=b+ici sigmoid(bi+jwijxj)

在这里插入图片描述

绝了哇!!!这不就是神经网络的隐藏层计算嘛!!!

用矩阵表示一下

在这里插入图片描述

然后对每个 r r r计算sigmoid
α = σ ( r ) \alpha=\sigma(r) α=σ(r)
在这里插入图片描述

最后求y
y = b + c T α y=b+c^T\alpha y=b+cTα
在这里插入图片描述

整理一下
y = b + c T σ ( b + W x ) y = b+c^T\sigma(b+Wx) y=b+cTσ(b+Wx)
在这里插入图片描述

其中 x x x特征向量(feature) W , b , c T , b W,b,c^T,b W,b,cT,b(注意两个b不是一个意思哦~)是未知参数 ,将未知参数列成一列,统称为 θ \theta θ.

在这里插入图片描述

完美,更新了训练过程的第一步!!!

接下来,就是计算loss咯,没有什么变化,只是参数用 θ \theta θ表示,因为参数太多啦。所以loss函数为 L ( θ ) L(\theta) L(θ).

最后是优化,

在这里插入图片描述

在这里插入图片描述

梯度 gradient。一般不会有梯度为零的情况。

可能数据很多,不方便训练,可以将数据分为几个batch(后续补充,为什么这样做,在2.2部分),用一个batch计算损失值,然后**更新(update)**参数,再选下一个batch,继续更新,直到最后一个batch。

把所有的batch看过一遍,称为一个epoch

1.3.3 激活函数

ReLU (Rectified Linear Unit)
y = c   m a x ( 0 , b + w x 1 ) y=c\ max(0,b+wx_1) y=c max(0,b+wx1)
在这里插入图片描述

Hard Sigmoid就可以用ReLU组合表示
y = b + ∑ 2 i c i   m a x ( 0 , b i + ∑ j w i j x j ) y=b+\sum_{2i}{c_i\ max(0,b_i

<think>我们正在讨论在C#中进行安全的JSON反序列化时设置MaxDepth参数的含义。用户特别询问了当MaxDepth设置为128时,最大深度限制的具体含义。 根据引用[1]中的示例,MaxDepth用于限制JSON反序列化时可以处理的最大嵌套深度。在示例中,当MaxDepth设置为2时,尝试反序列化深度为3的嵌套列表([ [ [ '3', 'Three', 'III' ] ] ])会抛出异常。这表明MaxDepth参数用于防止过深的嵌套结构,以避免可能导致的栈溢出或拒绝服务(DoS)攻击。 因此,MaxDepth=128的含义是:允许反序列化的JSON数据结构的最大嵌套深度为128层。超过此深度的JSON数据将导致反序列化失败并抛出异常。 具体来说: - 在JSON中,深度是指嵌套的层级。例如: - 一个简单的对象:{} 深度为1 - 对象中包含一个数组:{ "a": [] } 深度为2 - 数组中包含对象:[ { "b": {} } ] 深度为3 - 设置MaxDepth=128意味着允许最多128层这样的嵌套。 这种限制对于安全至关重要,因为恶意用户可能会构造深度嵌套的JSON数据来消耗大量内存或导致栈溢出,从而引发DoS攻击。 在C#中,无论是使用System.Text.Json还是Newtonsoft.Json,都可以设置MaxDepth属性: - 在System.Text.Json中,通过JsonSerializerOptions.MaxDepth属性设置。 - 在Newtonsoft.Json中,通过JsonSerializerSettings.MaxDepth属性设置。 注意:默认情况下,Newtonsoft.Json的MaxDepth为64(根据引用[1]的示例推断),而System.Text.Json的默认MaxDepth为0(表示无限制,但在.NET Core 3.0及更高本中,默认限制为64)。因此,显式设置为128可以允许比默认更深的嵌套,但需要确保这个深度在安全可控范围内。 总结:MaxDepth=128为JSON反序列化设置了最大嵌套深度为128层,以防止深度嵌套导致的资源耗尽攻击。 §§相关问题§§ 1. 如何确定合适的MaxDepth值? 2. 在System.Text.Json中设置MaxDepth与Newtonsoft.Json有何不同? 3. 超出MaxDepth限制时,如何捕获并处理异常? </think>### C# JSON反序列化中 `MaxDepth = 128` 的含义解析 在 JSON 反序列化中设置 `MaxDepth = 128` 是指限制 JSON 结构的**最大嵌套深度**为 128 层。这是防范深度嵌套攻击(一种常见 DoS 攻击手段)的关键安全措施。 #### 深度限制原理 1. **嵌套层级计算** - 每层 `{}`(对象)或 `[]`(数组)增加 1 层深度 - 示例:`{ "a": [ { "b": {} } ] }` 的深度为 3 - 当深度超过设定值(如 128)时立即抛出异常[^1] 2. **安全防护机制** - 阻止恶意构造的超深 JSON(如深度 10,000+) - 避免递归解析导致栈溢出(StackOverflowException) - 防止内存耗尽型攻击(Memory Exhaustion) #### 配置示例 ```csharp // System.Text.Json 配置 var options = new JsonSerializerOptions { MaxDepth = 128, // 关键安全设置 PropertyNameCaseInsensitive = true }; var data = JsonSerializer.Deserialize<MyModel>(jsonString, options); // Newtonsoft.Json 配置 var settings = new JsonSerializerSettings { MaxDepth = 128, // 同作用 TypeNameHandling = TypeNameHandling.None }; var data = JsonConvert.DeserializeObject<MyModel>(jsonString, settings); ``` #### 深度限制的数学原理 JSON 解析的复杂度与深度呈指数关系: $$O(d) = k^d$$ 其中: - $d$ 为嵌套深度 - $k$ 为平均子节点数量 当 $d=128$ 且 $k\geq2$ 时,最坏情况需处理 $2^{128} \approx 3.4 \times 10^{38}$ 个节点(理论上不可行)。设置 `MaxDepth` 直接阻断此类攻击[^1]。 #### 典型场景建议值 | 场景 | 建议 MaxDepth | 依据 | |---------------------|--------------|--------------------------| | 用户输入表单 | 8-16 | 人工输入极少超过 5 层嵌套 | | 内部 API 通信 | 32-64 | 业务数据通常 < 20 层 | | 第三方数据集成 | 128 | 平衡安全性与兼容性 | | 高风险数据源 | ≤32 | 优先安全防护 | > **最佳实践**: > 1. 对不可信数据源(如用户上传)至少设置 `MaxDepth ≤ 64` > 2. 128 适用于可信但结构复杂的业务数据 > 3. 结合 `MaxDepth` 和 `SizeLimit`(数据长度限制)双防护[^3]
评论 48
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值