Task01包含了線性回歸模型坦仍,softmax模型,多層感知機,文本預處理敬扛,語言模型晰洒,循環(huán)神經(jīng)網(wǎng)絡這幾塊內容
這里主要記錄一些零碎的筆記,
主要是關于理論
1啥箭、線性回歸模型就是使用了一個線性函數(shù)去擬合樣本谍珊,得到預測值,當然這是一個回歸模型急侥,所以是連續(xù)的抬驴。
2、softmax模型則是首先通過一個全連接層將特征空間變換為我們我們所需要的類別維度空間缆巧,然后將類別維度空間利用sigmoid函數(shù)放縮到[0,1]布持,變成概率的形式,概率大的就是我們需要的那一類
tips:softmax(t)=sotfmax(t+constant)這是課后習題總某人歸納出來的
3陕悬、多層感知機就是一個兩層的全連接層题暖,對特征空間進行變換,最后利用softmax輸出概率
4捉超、文本預處理就是先構建字典胧卤,然后利用字典的序號表示文本中的單詞
5、n-gram語言模型是基于n階馬爾科夫假設拼岳,認為一個單詞出現(xiàn)僅與前n-1個單詞有關
語言序列進行采樣的時候枝誊,有兩種采樣方式,一種是隨機采樣惜纸,一種是相鄰采樣叶撒。
我們的目標是從序列中每次獲取[batch_size,num_step]個小樣本耐版,
隨機采樣就是先將總的序列劃分成一個個num_step大小的小區(qū)間祠够,也就是一個個小序列,然后從一個個小序列里面隨機獲取batch_size個作為當前的輸入粪牲;
相鄰采樣則不一樣古瓤,它先將總的序列劃分成batch_size個分區(qū),當然要拋去多余的腺阳,并保證每個分區(qū)都是一樣大小落君,且可以被num_step整除,所以要再次拋去多余的亭引。然后采樣的時候從每個分區(qū)里面取出num_step個元素作為序列绎速,就有了batch_size個小序列了
6、循環(huán)神經(jīng)網(wǎng)絡是一種處理序列輸入的模型痛侍,因此可以用來處理語言朝氓,基本的循環(huán)神經(jīng)網(wǎng)絡擁有一個可以傳遞的隱藏層魔市,序列的當前輸入會通過上一個時間步的隱藏層獲取信息主届。
根據(jù)不同的采樣方式赵哲,循環(huán)神經(jīng)網(wǎng)絡里面隱藏層參數(shù)的初始化也有不同,具體來說就是君丁,相鄰采樣由于不同批次的數(shù)據(jù)是聯(lián)系到一起的枫夺,所以在一個epoch里面可以使用同一個隱藏層,一直傳遞下去绘闷,而且關鍵是橡庞,這個梯度也可以一直傳遞下去,只需要在不同的epoch之間印蔗,將隱藏層進行重新初始化扒最。
而隨機采樣,由于不同batch之間沒有內在聯(lián)系华嘹,所以每一個batch之間都需要將隱藏層進行梯度截斷吧趣,但是可以保留數(shù)值作為初始化值。
關于相鄰采樣進行梯度截斷的一些同學的解釋:
相鄰采樣為什么在每次迭代之前都需要將參數(shù)detach
是因為pytorch動態(tài)計算圖構建的原因耙厚,這里主要結合本次的視頻內容(循環(huán)神經(jīng)網(wǎng)絡使用相鄰采樣時)
分享自己的理解强挫,下圖是知乎上找到的,需要詳細了解pytorch動態(tài)圖相關的東西可以看下面給出
的參考鏈接
從上圖可以看出薛躬,一個動態(tài)圖是從葉子節(jié)點到葉子節(jié)點的一張圖俯渤,如上圖中的輸入是x,y,輸出是z.但是
需要注意的是,輸入的葉子節(jié)點其中有個參數(shù)requires_grad = False, 而最后輸出的葉子節(jié)點是
requires_grad = True. 當參數(shù)值為True的時候表示的是型宝,該節(jié)點可以計算梯度八匠,為False表示不能計算
節(jié)點梯度,而在反向傳播的時候對于不可以計算梯度的節(jié)點可以認為是圖反向傳播的終點趴酣。
現(xiàn)在來理解一下循環(huán)神經(jīng)網(wǎng)絡使用相鄰采樣的時候為什么要detach參數(shù)臀叙。
我們知道相鄰采樣的前后兩個批量的數(shù)據(jù)在在時間步上是連續(xù)的,所以模型會使用上一個批量的隱藏
狀態(tài)初始化當前的隱藏狀態(tài)价卤,表現(xiàn)形式就是不需要在一個epoch的每次迭代時隨機初始化隱藏狀態(tài)劝萤,那么
根據(jù)上面所說的。假如沒有detach的操作慎璧,每次迭代之后的輸出是一個葉子節(jié)點床嫌,并且該葉子節(jié)點的
requires_grad = True(從上面的計算圖就可以看出),也就意味著兩次或者說多次的迭代胸私,計算圖一直都是連著
的厌处,因為沒有遇到梯度計算的結束位置,這樣將會一直持續(xù)到下一次隱藏狀態(tài)的初始化岁疼。所以這將會導致
計算圖非常的大阔涉,進而導致計算開銷非常大缆娃。而每次將參數(shù)detach出來,其實就是相當于每次迭代之后雖然是
使用上一次迭代的隱藏狀態(tài)瑰排,只不過我們希望重新開始贯要,具體的操作就是把上一次的輸出節(jié)點的參數(shù)requires_grad
設置為False的葉子節(jié)點。
我們知道循環(huán)神經(jīng)網(wǎng)絡的梯度反向傳播是沿著時間進行反向傳播的椭住,而時間是不會停止的崇渗,所以我們會每隔一段時間、
進行一次反向傳播京郑,而我們這里的一段時間其實指的就是時間步宅广,我們希望每間隔時間步之后進行一次反向傳播,這樣
來減小在梯度反向傳播時帶來的計算開銷以及一定程度上緩解梯度消失或者爆炸的問題
以上是我對循環(huán)神經(jīng)網(wǎng)絡使用相鄰采樣為什么要detach參數(shù)的理解些举,可能也有問題跟狱,如果有問題希望可以指出來
參考鏈接:https://zhuanlan.zhihu.com/p/79801410
當我們再訓練網(wǎng)絡的時候可能希望保持一部分的網(wǎng)絡參數(shù)不變,只對其中一部分的參數(shù)進行調整户魏;或者值訓練部分分支網(wǎng)絡驶臊,并不讓其梯度對主網(wǎng)絡的梯度造成影響,這時候我們就需要使用detach()函數(shù)來切斷一些分支的反向傳播
detach():
返回一個新的Variable绪抛,從當前計算圖中分離下來的资铡,但是仍指向原變量的存放位置,不同之處只是requires_grad為false,得到的這個Variable永遠不需要計算其梯度幢码,不具有grad笤休。 即使之后重新將它的requires_grad置為true,它也不會具有梯度grad .這樣我們就會繼續(xù)使用這個新的Variable進行計算,后面當我們進行反向傳播時症副,到該調用detach()的Variable就會停止店雅,不能再繼續(xù)向前進行傳播
detach_()
將一個Variable從創(chuàng)建它的圖中分離,并把它設置成葉子variable .其實就相當于變量之間的關系本來是x -> m -> y,這里的葉子variable是x贞铣,但是這個時候對m進行了.detach_()操作,其實就是進行了兩個操作:
1.將m的grad_fn的值設置為None,這樣m就不會再與前一個節(jié)點x關聯(lián)闹啦,這里的關系就會變成x, m -> y,此時的m就變成了葉子結點。
2.然后會將m的requires_grad設置為False辕坝,這樣對y進行backward()時就不會求m的梯度窍奋。
其實detach()和detach()很像,兩個的區(qū)別就是detach()是對本身的更改酱畅,detach()則是生成了一個新的variable 琳袄。比如x -> m -> y中如果對m進行detach(),后面如果反悔想還是對原來的計算圖進行操作還是可以的 纺酸。但是如果是進行了detach_()窖逗,那么原來的計算圖也發(fā)生了變化,就不能反悔了餐蔬。
參考https://www.cnblogs.com/wanghui-garcia/p/10677071.html碎紊;參考:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-autograd/#detachsource佑附。