《跟我一起学深度学习》第1版勘误#

印刷版次:第1次#

NO. 1001

P53,标题 3) 测试PyTorch下,将 “如下脚来测试” 改为 “如下脚来测试”

NO. 1002

P68,公式(3-3)下,将"$y^{(i)}$表示第$i$个房屋的预测价格" 改为 “$\color{red}{\hat{y}}^{(i)}$表示第$i$个房屋的预测价格”

NO. 1003

P188,第4.6.4小结下,将 “VGG11模型进行了测试” 改为 “VGG16模型进行了测试”

NO. 1004

P190,标题 2.前向传播下,将第10行代码中 “nn.ReLU(inplace=True), " 删除

NO. 1005

P168,第4.3.7小结下,将 “及其左右” 改为 “及其作用

NO. 1006

P168,第4.4.1小节第2行末尾,将 “感知机卷积” 改为 “感知机",即去掉"卷积”

NO. 1007

P134,标题 2.惩罚系数下 第3行头,将 “环境模型” 改为 “缓解模型

NO. 1008

P460,公式(10-8)下,将 “$W^K_i\in R$, $W^O\in R$” 改为 “$W^K_i\in R^{\color{red}{d\times d_k}}$,$W^O\in R^{\color{red}{hd_v\times d}}$”

NO. 1009

P136,标题 3.模型训练下第1段文字,将 “第211行” 改为 “第210行” , 将 “第12行” 改为 “第11行”

NO. 1010

P143,公式(3-121)中,将 “$-\gamma$” 改为 “$\color{red}{\gamma}$” ,将 “其导数为$-\gamma$” 改为 “其导数为$\color{red}{\gamma}$",将页末处 “激活值$-\gamma$” 改为 “激活值$\color{red}{\gamma}$”

NO. 1011

P146,公式(3-125)下,将 “$n$表示样本总数” 改为 “$\color{red}{m}$表示样本总数”

NO. 1012

P441,标题2. 改造前向传播方法下,将第14行代码 “query = decoder_state[0]” 改为 “query = decoder_state[-1]” ;将下方第8行文字中 “tgt_in 的形状为 [batch_size, 1, embedding_size]” 改为 “tgt_in 的形状为 [batch_size, embedding_size]";将 “用于压缩维度,将变成[batch_size, embedding_size]” 改为 “用于扩张维度,将变成[batch_size, 1, embedding_size]

NO. 1013

P160,倒数第6行中,将 “单通道卷积核多通道” 改为 “单通道卷积多通道”

NO. 1014

P165,公式(4-6)下,将 “[14,14,64]” 改为 “[16,16,64]”

NO. 1015

P176,表4-2下第3行,将 “倒数第1个” 改为 “第1个”

NO. 1016

P182,标题4.6.2VGG结构下,将 “第1例” 改为 “第1

NO. 1017

P57,标题 2.使用 Jupyter Notebook 下, 将 “通过 –prot” 改为 “通过 –port

NO. 1018

P82,将公式(3-20)

$$ \begin{aligned} \frac{\partial J}{\partial w^1_{11}}&=\frac{\partial J}{\partial a^3_{1}}\frac{\partial a^3_{1}}{\partial z^3_{1}}\frac{\partial z^3_{1}}{\partial a^2_1}\frac{\partial a^2}{\partial z^2_1}\frac{\partial z^2_1}{\partial w^1_{11}}+\frac{\partial J}{\partial a^3_{2}}\frac{\partial a^3_{2}}{\partial z^3_{2}}\frac{\partial z^3_{2}}{\partial a^2_1}\frac{\partial a^2}{\partial z^2_1}\frac{\partial z^2_1}{\partial w^1_{11}}\\[3ex] \frac{\partial J}{\partial w^1_{12}}&=\frac{\partial J}{\partial a^3_{1}}\frac{\partial a^3_{1}}{\partial z^3_{1}}\frac{\partial z^3_{1}}{\partial a^2_1}\frac{\partial a^2}{\partial z^2_1}\frac{\partial z^2_1}{\partial w^1_{12}}+\frac{\partial J}{\partial a^3_{2}}\frac{\partial a^3_{2}}{\partial z^3_{2}}\frac{\partial z^3_{2}}{\partial a^2_1}\frac{\partial a^2}{\partial z^2_1}\frac{\partial z^2_1}{\partial w^1_{12}}\\ &\vdots\\ \frac{\partial J}{\partial w^2_{22}}&=\frac{\partial J}{\partial a^3_2}\frac{\partial a^3_2}{\partial z^3_2}\frac{\partial z^3_2}{\partial w^2_{22}} \end{aligned}\tag{3-20} $$

改为

$$ \begin{aligned} \frac{\partial J}{\partial w^1_{11}}&=\frac{\partial J}{\partial a^3_{1}}\frac{\partial a^3_{1}}{\partial z^3_{1}}\frac{\partial z^3_{1}}{\partial a^2_1}\frac{\partial \color{red}{a^2_{1}}}{\partial z^2_1}\frac{\partial z^2_1}{\partial w^1_{11}}+\frac{\partial J}{\partial a^3_{2}}\frac{\partial a^3_{2}}{\partial z^3_{2}}\frac{\partial z^3_{2}}{\partial a^2_1}\frac{\partial \color{red}{a^2_{1}}}{\partial z^2_1}\frac{\partial z^2_1}{\partial w^1_{11}}\\[3ex] \frac{\partial J}{\partial w^1_{12}}&=\frac{\partial J}{\partial a^3_{1}}\frac{\partial a^3_{1}}{\partial z^3_{1}}\frac{\partial z^3_{1}}{\partial a^2_1}\frac{\partial \color{red}{a^2_{1}}}{\partial z^2_1}\frac{\partial z^2_1}{\partial w^1_{12}}+\frac{\partial J}{\partial a^3_{2}}\frac{\partial a^3_{2}}{\partial z^3_{2}}\frac{\partial z^3_{2}}{\partial a^2_1}\frac{\partial \color{red}{a^2_{1}}}{\partial z^2_1}\frac{\partial z^2_1}{\partial w^1_{12}}\\ &\vdots\\ \frac{\partial J}{\partial w^2_{22}}&=\frac{\partial J}{\partial a^3_2}\frac{\partial a^3_2}{\partial z^3_2}\frac{\partial z^3_2}{\partial w^2_{22}} \end{aligned}\tag{3-20} $$

NO. 1019

P86,第1段第2行,将 “导出了” 改为 “导出了”

NO. 1020

P96,最后1行,将 “(例如素)” 改为 “(例如素)”

NO. 1021

P90,将第1段文字第2行中 “带预测” 改为 “预测”;将第3段文字第2行中 “带预测” 改为 “预测”;将3.4.3节下第2行中 “内容导出” 改为 “内容导出”

NO. 1022

P130,最后1段倒数第3行,将 “$1-p=2.5$” 改为 “$\color{red}{x/(1-p)}=2.5$”

NO. 1023

P131,将公式(3-113)整体修改为

$$ E(o^{\prime}_i)=p\cdot\frac{0}{1-p}o_i+(1-p)\cdot\frac{1}{1-p}o_i=\frac{1-p}{1-p}o_i=o_i\tag{3-113} $$

NO. 1024

P46页,小标题 2.Python安装环境上,代码第1行中,将 “xedu” 改为 “edu”

NO. 1025

P303页,第7.1.8节小结下,第3行,将"介绍了RNM” 改为"介绍了RNN

NO. 1026

P308页,下方倒数第2个代码块中,将第3行 “b=torch.tensor([1,0,1])” 改为 “b=torch.tensor([1,5,1])”

NO. 1027

P599页,图10-65中,上面应是t=5,下面应是t=6,如下所示。

NO. 1028

P103页,图3-31中,将第一层神经元个数由768改为 784,即替换为下图

NO. 1029

P332页,上面第2个代码块,第4~5行代码,将"朝辞仙子去,…… 临池水岸间。“这两行改为”朝辞白帝彩云间,万仞山阴独未还。燕子入时寒食好,玉杯销尽百年心。

NO. 1030

P549页上面第二段,第5行,将"……更新的上下文情境学习(In-Context Learning)或少样本学习(Few-Shot Learning)方法。“改为”……更新的上下文情境学习(In-Context Learning)方法。"

NO. 1031

P51页标题4. PyTorch安装下,将"pip install torch==2.0.1" 改为"pip install torch==2.0.1 –index-url https://download.pytorch.org/whl/cpu"

NO. 1032

P104页,公式(3-63),最前面将 $\delta^{L}_i$ 改为 $\color{red}{\delta^{L}_j}$

以上错误在第2次印刷中已经纠正。


印刷版次:第2次#

NO. 1033

P611页,标题“10.19.6 模型解码过程”上面,将“第8~12行用于……的解码输出。”这句话改为

第8行取原始输出的 logits 值。第9行是对模型输出的原始 logits 做约束和过滤,例如禁止某些词元生成,不过这里 logits_processor 内部默认没有进行任何处理。第10行是对 logits 做概率调整,它会影响生成的随机性,本质与10.15.2节中的 top_k_top_p_filtering 函数一致。第11~12行则是根据采样的策略来得到当前时刻的解码输出。

NO. 1034

P553页,标题“10.15.2 生成结果筛选”改为“10.15.2 生成结果采样

将10.15.2节下第2段“生成结果筛选的原理……根据采样策略得到预测值。”替换为:

虽然根据模型的输出 logits 便可以采样得到当前时刻的预测输出,但此时却可能输出一些极不合理的词元,因为低概率的词元同样可能被采样到,因此就需要通过某种策略来滤掉这些"不靠谱"的候选词,而这就是 Top-K 和 Top-P 采样的由来,如图10-44所示便是整个生成结果采样的原理示意图。

Top-K 采样的思路很直接,它只保留概率最高的前 K 个词元,把其余所有词元 的 logits 设为负无穷,然后在这 K 个候选里进行采样。尽管 Top-K 策略在一定程度上解决了候选词"不靠谱"这个问题,但是还没有完全解决,的问题在于 K 是一个固定值,假如词表一共上万个词,那 K 是取 30、50、还是 100 并不好确定,因为当模型非常"自信"时概率只会高度集中在少数几个词上,此时 K 无论取前面哪个值依旧可能会引入很多不必要的噪声;而当模型比较"困惑"时概率分布很很分散,K 太小又可能过于保守,错过一些合理的候选词。

进一步,Top-P 的做法是将所有词元按概率从高到低排列逐个累加,直到累积概率达到阈值 P 为止,保留这个集合内的所有词元,其余置为负无穷。可以看出,Top-P 采样不再固定候选词的数量,而是固定候选词的累积概率。

P554页,将本页最后一段“在上述代码中,第2行用于……多样和随机的文本。”替换为:

在上述代码中,第2行是检查top_k取值是否超过了序列长度,是则直接取序列长度。第3~5行便是图10-44中第①步处理后的结果,即据预测得到的logits取前Top_k为候选结果,并将剩余部分置为负无穷大。第6~13行则是图10-44中第②步中的处理过程。第7行表示对原始logits进行排序并得到排序后的结果以及在原始logits中的索引。第8~9行是对排序后的sorted_logits进行归一化处理并计算累积概率,同时得到大于top_p的位置标记。第10~11行是为了避免当top_p设置过小导致所有结果都被忽略所考虑的情况,所以需要将sorted_indx_to_remove 中的结果整体向后移动一位并将第1个位置直接置为F(表示一定会有一个筛选结果剩下)。第12~13行是根据indices_to_removelogits中满足条件的值忽略,设置为负无穷大。从这里可以看出,通过调整阈值top_p可以在不同的生成效果之间找到平衡,较小的阈值将导致模型生成更加集中和确定性的文本,而较大的阈值将产生更加多样和随机的文本。