《動(dòng)手學(xué)深度學(xué)習(xí)》第二章習(xí)題答案

《動(dòng)手學(xué)深度學(xué)習(xí)》第二章地址:https://zh-v2.d2l.ai/chapter_preliminaries/index.html

2.1 練習(xí)

  1. 運(yùn)行本節(jié)中的代碼辖源。將本節(jié)中的條件語(yǔ)句X == Y更改為X < YX > Y宣渗,然后看看你可以得到什么樣的張量薄霜。

代碼

X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
X>Y, X<Y

結(jié)果

(tensor([[False, False, False, False],
         [ True,  True,  True,  True],
         [ True,  True,  True,  True]]),
 tensor([[ True, False,  True, False],
         [False, False, False, False],
         [False, False, False, False]]))
  1. 用其他形狀(例如三維張量)替換廣播機(jī)制中按元素操作的兩個(gè)張量讶隐。結(jié)果是否與預(yù)期相同伞广?

代碼

a = torch.arange(6).reshape((3, 1, 2))
b = torch.arange(2).reshape((1, 2, 1))
c = a + b
a.shape, b.shape, c.shape

結(jié)果

(torch.Size([3, 1, 2]), torch.Size([1, 2, 1]), torch.Size([3, 2, 2]))

可以看到結(jié)果與預(yù)期相同

2.2 練習(xí)

創(chuàng)建包含更多行和列的原始數(shù)據(jù)集婶博。

生成數(shù)據(jù)

import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
    f.write('NumRooms,Alley,Price,Size\n')  # 列名榔昔,新增一列為Size
    f.write('NA,Pave,127500,100\n')  # 每行表示一個(gè)數(shù)據(jù)樣本
    f.write('2,NA,106000,150\n')
    f.write('4,NA,178100,200\n')
    f.write('NA,NA,140000,NA\n')
    f.write('3,Pave,NA,NA\n') # 新增一行
  1. 刪除缺失值最多的列蜈项。

代碼

import pandas as pd
data = pd.read_csv(data_file)
data.isna().sum(axis=0)  # 查看缺失值最多的列, 缺失值最多的為Alley列
data.drop('Alley', axis=1, inplace=True)

結(jié)果

缺失值個(gè)數(shù)統(tǒng)計(jì):

NumRooms    2
Alley       3
Price       1
Size        2
dtype: int64

刪除缺失值最多的列后的數(shù)據(jù)

   NumRooms     Price   Size
0       NaN  127500.0  100.0
1       2.0  106000.0  150.0
2       4.0  178100.0  200.0
3       NaN  140000.0    NaN
4       3.0       NaN    NaN
  1. 將預(yù)處理后的數(shù)據(jù)集轉(zhuǎn)換為張量格式

預(yù)處理的話聘殖,我們考慮前向后向填充晨雳,將缺失值填補(bǔ)上

代碼

data = data.fillna(method='bfill')
data = data.fillna(method='ffill')
torch.tensor(data.values)

結(jié)果

tensor([[2.0000e+00, 1.2750e+05, 1.0000e+02],
        [2.0000e+00, 1.0600e+05, 1.5000e+02],
        [4.0000e+00, 1.7810e+05, 2.0000e+02],
        [3.0000e+00, 1.4000e+05, 2.0000e+02],
        [3.0000e+00, 1.4000e+05, 2.0000e+02]], dtype=torch.float64)

2.3 練習(xí)

  1. 證明一個(gè)矩陣 A 的轉(zhuǎn)置的轉(zhuǎn)置是A,即 (A^?)^?=A 就斤。

對(duì)于A中的一個(gè)元素aij悍募,其在第 i 行第 j 列,轉(zhuǎn)置后出現(xiàn)在第 j 行第 i 列洋机,再轉(zhuǎn)置一次就出現(xiàn)在第 i 行第 j 列坠宴,又回到了原來(lái)的位置。所以绷旗,一個(gè)矩陣轉(zhuǎn)置的轉(zhuǎn)置還是它自己喜鼓。

代碼

import numpy as np
A = np.arange(12).reshape(3, 4)
A.T.T == A

結(jié)果

array([[ True,  True,  True,  True],
       [ True,  True,  True,  True],
       [ True,  True,  True,  True]])
  1. 給出兩個(gè)矩陣 AB,證明“它們轉(zhuǎn)置的和”等于“它們和的轉(zhuǎn)置”衔肢,即 A^?+B^?=(A+B)^?庄岖。

假設(shè)A第 i 行第 j 列的元素是 aij,B第 i 行第 j 列的元素是 bij角骤。對(duì)于 A^T + B^T隅忿,其第 j 行第 i 列的值為 aij + bij心剥;對(duì)于 (A + B)^T,其第 j 行第 i 列的值也為 aij + bij背桐,推廣至即可知A^T + B^T = (A + B)^T优烧。

代碼

import numpy as np
A = np.arange(12).reshape(3, 4)
B = np.arange(12, 24).reshape(3, 4)
(A.T + B.T) == (A + B).T

結(jié)果

array([[ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True]])
  1. 給定任意方陣AA+A^? 總是對(duì)稱的嗎?為什么?

是的链峭,首先我們看一下對(duì)稱矩陣的概念:
A 等于其轉(zhuǎn)置:A=A^?畦娄,則稱A為對(duì)稱矩陣”。將 A+A^?看做一個(gè)整體弊仪,證明如下:
(A+A^T)^T = A^T + (A^T)^T = A^T + A

  1. 我們?cè)诒竟?jié)中定義了形狀 (2,3,4) 的張量X熙卡。len(X)的輸出結(jié)果是什么?

代碼

X = torch.arange(24).reshape(2, 3, 4)
len(X)

結(jié)果

2
輸出的是0軸的數(shù)值励饵。

  1. 對(duì)于任意形狀的張量X,len(X)是否總是對(duì)應(yīng)于X特定軸的長(zhǎng)度?這個(gè)軸是什么?

len(X) 總對(duì)應(yīng)第 0 軸的長(zhǎng)度驳癌,上題已回答。

  1. 運(yùn)行A/A.sum(axis=1)曲横,看看會(huì)發(fā)生什么喂柒。你能分析原因嗎?

會(huì)出錯(cuò)禾嫉,原因在于A為5行4列的矩陣灾杰,維度為2,而A.sum(axis=1)則為長(zhǎng)度為5的向量熙参,二者無(wú)法相除艳吠,需要維度一致才會(huì)有廣播機(jī)制,也就是我們需要設(shè)置keepdims=True

  1. 考慮一個(gè)具有形狀 (2,3,4) 的張量孽椰,在軸0昭娩、1、2上的求和輸出是什么形狀?

課程中已講過(guò)黍匾,對(duì)哪個(gè)軸求和栏渺,可以看作是壓縮該維度,因此
軸0求和——>[3,4]
軸1求和——>[2,4]
軸2求和——>[2,3]
下面用代碼驗(yàn)證一下

代碼

X = torch.arange(24).reshape(2, 3, 4)
X.sum(axis=0).shape, X.sum(axis=1).shape, X.sum(axis=2).shape

結(jié)果

(torch.Size([3, 4]), torch.Size([2, 4]), torch.Size([2, 3]))
  1. 為linalg.norm函數(shù)提供3個(gè)或更多軸的張量锐涯,并觀察其輸出磕诊。對(duì)于任意形狀的張量這個(gè)函數(shù)計(jì)算得到什么?

計(jì)算得到張量中所有值的 L2范數(shù)。
numpy.linalg.norm參數(shù)ord默認(rèn)為None纹腌,此時(shí)對(duì)應(yīng)的即為L(zhǎng)2范數(shù)霎终,見下表

ord norm for matrices norm for vectors
None Frobenius norm 2-norm

2.4 練習(xí)

書中的函數(shù)此處不再贅述

  1. 繪制函數(shù) y=f(x)=x^3?\frac{1}x和其在 x=1處切線的圖像。

先求導(dǎo)數(shù):f'(x)=3x^2 +\frac {1}{x^2} 可得x=1時(shí)升薯,f'(1)=4莱褒,又因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=f(1)%20%3D%200" alt="f(1) = 0" mathimg="1">
因此切線為4x-4

代碼

x = np.arange(0.5, 1.5, 0.01)
plot(x, [x**3 - 1/x, 4*x-4], 'x', 'f(x)', legend=['f(x)', 'Tangent line (x=1)'])

結(jié)果

Figure_1.png
  1. 求函數(shù) f(x)=3x_1^2+5e^{x2}的梯度。

[6x_1, 5e^{x_2}]

  1. 函數(shù)f(x)=∥X∥_2的梯度是什么涎劈?

∥X∥_2 = \sqrt{(x_1^2 + x_2^2 + ……x_n^2)} 先對(duì)x_1求導(dǎo),可得:\frac {x_1} {\sqrt{(x_1^2 + x_2^2 + ……x_n^2)}}
同理類推:可得x_2广凸、x_3……x_n
因此其梯度為:[\frac {x_1} {\sqrt{\sum{_{i=1}^nx_i^2}}}, \frac {x_2} {\sqrt{\sum{_{i=1}^nx_i^2}}}阅茶,……,\frac {x_n} {\sqrt{\sum{_{i=1}^nx_i^2}}}]
簡(jiǎn)寫為:\frac{X} {∥X∥_2}

  1. 你可以寫出函數(shù) u=f(x,y,z)炮障,其中 x=x(a,b) 目派,y=y(a,b)z=z(a,b) 的鏈?zhǔn)椒▌t嗎?

\frac{\partial u} {\partial a} = \frac{\partial u} {\partial x}\frac{\partial x} {\partial a}+\frac{\partial u} {\partial y}\frac{\partial y} {\partial a}+\frac{\partial u} {\partial z}\frac{\partial z} {\partial a}
\frac{\partial u} {\partial b} = \frac{\partial u} {\partial x}\frac{\partial x} {\partial b}+\frac{\partial u} {\partial y}\frac{\partial y} {\partial b}+\frac{\partial u} {\partial z}\frac{\partial z} {\partial b}

2.5 練習(xí)

  1. 為什么計(jì)算二階導(dǎo)數(shù)比一階導(dǎo)數(shù)的開銷要更大胁赢?

因?yàn)橛?jì)算二階導(dǎo)數(shù)要在一階導(dǎo)數(shù)的基礎(chǔ)上再進(jìn)行求導(dǎo),開銷肯定會(huì)更大白筹。

  1. 在運(yùn)行反向傳播函數(shù)之后智末,立即再次運(yùn)行它,看看會(huì)發(fā)生什么徒河。

會(huì)發(fā)生運(yùn)行錯(cuò)誤系馆,因?yàn)榍跋蜻^(guò)程建立的計(jì)算圖,會(huì)在反向傳播后釋放顽照,所以第二次運(yùn)行反向傳播就會(huì)出錯(cuò)由蘑。這時(shí)在 backward 函數(shù)中加上參數(shù) retain_graph=True(保持計(jì)算圖),就能兩次運(yùn)行反向傳播了代兵。

代碼

x = torch.arange(12., requires_grad=True)
y = 2 * torch.dot(x, x)
y.backward()
x.grad  #  tensor([ 0.,  4.,  8., 12., 16., 20., 24., 28., 32., 36., 40., 44.])
y.backward() # 會(huì)報(bào)錯(cuò)
  1. 在控制流的例子中尼酿,我們計(jì)算d關(guān)于a的導(dǎo)數(shù),如果我們將變量a更改為隨機(jī)向量或矩陣植影,會(huì)發(fā)生什么裳擎?

會(huì)發(fā)生運(yùn)行錯(cuò)誤,此處想說(shuō)明的其實(shí)是pytorch中張量無(wú)法對(duì)張量求導(dǎo)思币,只能是標(biāo)量對(duì)張量求導(dǎo)鹿响,因此如果我們將a修改為向量或矩陣,直接backward將會(huì)報(bào)錯(cuò)谷饿,需要對(duì)結(jié)果求和成一個(gè)標(biāo)量后方能求導(dǎo)惶我。

代碼

a = torch.randn(size=(3,1), requires_grad=True)
d = f(a)
d.backward() # 直接運(yùn)行這一步會(huì)報(bào)錯(cuò)
d.sum().backward() # 求和以后運(yùn)行就沒問題了
  1. 重新設(shè)計(jì)一個(gè)求控制流梯度的例子,運(yùn)行并分析結(jié)果博投。

我們?cè)O(shè)計(jì)一個(gè)范數(shù)如果大于10绸贡,則返回梯度為2,否則返回梯度為1贬堵。以下為代碼和結(jié)果

代碼

def f(a):
    if a.norm() > 10:
        b = torch.dot(a, a)
    else:
        b = a
    return b.sum()
a1 = torch.arange(12., requires_grad=True)
a2 = torch.arange(2., requires_grad=True)
d1 = f(a1)
d2 = f(a2)
d1.backward()
d2.backward()
a1.grad, a2.grad

結(jié)果

(tensor([ 0.,  2.,  4.,  6.,  8., 10., 12., 14., 16., 18., 20., 22.]), # 范數(shù)大于10時(shí)恃轩,梯度為2
 tensor([1., 1.])) # 范數(shù)小于10時(shí),梯度為1
  1. 使 f(x)=sin(x) 黎做,繪制 f(x) 和 df(x)dx 的圖像叉跛,其中后者不使用 f′(x)=cos(x) 。

代碼

x = torch.linspace(-5, 5, 100)
x.requires_grad_(True)
y = torch.sin(x)
y.sum().backward()
y = y.detach()
d2l.plot(x.detach(), [y, x.grad], 'f(x)', "f'(x)", legend=['f(x)', 'Tangent line']) # 不采用cos(x)蒸殿,而使用x.grad
d2l.plt.show()

結(jié)果

Figure_1.png

2.6 練習(xí)

  1. 進(jìn)行m=500組實(shí)驗(yàn)筷厘,每組抽取n=10個(gè)樣本鸣峭。改變mn,觀察和分析實(shí)驗(yàn)結(jié)果酥艳。

書中已有m=500摊溶,n=10的結(jié)果,此處將m換為5000充石,n換為20莫换,查看結(jié)果

代碼

import torch
from torch.distributions import multinomial
from d2l import torch as d2l
fair_probs = torch.ones([6]) / 6
counts = multinomial.Multinomial(20, fair_probs).sample((5000,))
cum_counts = counts.cumsum(dim=0)
estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True)
d2l.set_figsize((6, 4.5))
for i in range(6):
    d2l.plt.plot(estimates[:, i].numpy(),
                 label=("P(die=" + str(i + 1) + ")"))
d2l.plt.axhline(y=0.167, color='black', linestyle='dashed')
d2l.plt.gca().set_xlabel('Groups of experiments')
d2l.plt.gca().set_ylabel('Estimated probability')
d2l.plt.legend()

結(jié)果

m=500,n=10 m=5000,n=20
1.png
2.png

對(duì)比以上結(jié)果可知,第二次的效果更好骤铃,更加趨近于 0.167拉岁。原因可能是第一張圖實(shí)驗(yàn)組數(shù)為 500 組,而第二張圖有 5000 組惰爬,實(shí)驗(yàn)組數(shù)越多喊暖,實(shí)驗(yàn)偏差就會(huì)分布的更加平均,效果就會(huì)更好撕瞧。(此處對(duì)比試驗(yàn)最好將第二張圖的n也設(shè)置為10陵叽,不過(guò)限于篇幅就不再展示了~大家可以下來(lái)多嘗試)

  1. 給定兩個(gè)概率為P(A)、P(B)的事件丛版,計(jì)算P(A\cup B)巩掺、P(A\cap B)的上限和下限。

P(A\cup B)上限為P(A)+P(B)硼婿,下限為max(P(A),P(B))

image.png
上限 下限
2022-01-06 11-41-51 的屏幕截圖.png
2022-01-06 11-42-04 的屏幕截圖.png

P(A\cap B)上限為min(P(A),P(B))锌半,下限為0

image.png

上限 下限
2022-01-06 11-44-33 的屏幕截圖.png
2022-01-06 11-44-59 的屏幕截圖.png
  1. 假設(shè)我們有一系列隨機(jī)變量,例如A 寇漫、 BC 刊殉,其中 B 只依賴于 A ,而 C 只依賴于 B 州胳,你能簡(jiǎn)化聯(lián)合概率 P(A,B,C) 嗎记焊?

根據(jù)題意可得:A,B,C滿足馬爾科夫鏈A——>B——>C 下面開始推導(dǎo)
P(A,B,C)=P(C|A,B)P(A,B)=P(C|A,B)P(B|A)P(A)
其中P(C|A,B)=P(C|B) =====>馬爾科夫鏈
因此最終化簡(jiǎn)為:P(C|B)P(B|A)P(A)

  1. 在 2.6.2.6節(jié)中,第一個(gè)測(cè)試更準(zhǔn)確栓撞。為什么不運(yùn)行第一個(gè)測(cè)試兩次遍膜,而是同時(shí)運(yùn)行第一個(gè)和第二個(gè)測(cè)試?

原因是如果進(jìn)行兩次第一種測(cè)試,兩次測(cè)試沒有條件獨(dú)立性瓤湘,不能使用上面的公式進(jìn)行計(jì)算瓢颅,而且兩次測(cè)試結(jié)果大概率相同,效果并不好弛说。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挽懦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子木人,更是在濱河造成了極大的恐慌信柿,老刑警劉巖冀偶,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異渔嚷,居然都是意外死亡进鸠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門形病,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)客年,“玉大人,你說(shuō)我怎么就攤上這事窒朋〔蟀眨” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵侥猩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我抵赢,道長(zhǎng)欺劳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任铅鲤,我火速辦了婚禮划提,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邢享。我一直安慰自己鹏往,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布骇塘。 她就那樣靜靜地躺著伊履,像睡著了一般。 火紅的嫁衣襯著肌膚如雪款违。 梳的紋絲不亂的頭發(fā)上唐瀑,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音插爹,去河邊找鬼哄辣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赠尾,可吹牛的內(nèi)容都是我干的力穗。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼气嫁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼当窗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起杉编,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤超全,失蹤者是張志新(化名)和其女友劉穎咆霜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘶朱,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛾坯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疏遏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脉课。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖财异,靈堂內(nèi)的尸體忽然破棺而出倘零,到底是詐尸還是另有隱情,我是刑警寧澤戳寸,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布呈驶,位于F島的核電站,受9級(jí)特大地震影響疫鹊,放射性物質(zhì)發(fā)生泄漏袖瞻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一拆吆、第九天 我趴在偏房一處隱蔽的房頂上張望聋迎。 院中可真熱鬧,春花似錦枣耀、人聲如沸霉晕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牺堰。三九已至,卻和暖如春缝彬,著一層夾襖步出監(jiān)牢的瞬間萌焰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工谷浅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扒俯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓一疯,卻偏偏與公主長(zhǎng)得像撼玄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墩邀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容