




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
基于深度學習的代碼搜索第八章01理解基于深度學習的代碼搜索項目的意義和應用領域02掌握權重初始化和正則化在深度學習中的重要性和應用03熟悉不同的權重初始化方法和正則化技術04了解dropout的原理學習目標CONTENTS05掌握在PyTorch框架中實現(xiàn)權重初始化和正則化的方法和技巧01提高問題分析和解決的能力,能夠理解項目需求并制定相應的解決方案02增強團隊合作和溝通能力,能夠與他人合作完成項目任務03培養(yǎng)持續(xù)學習和創(chuàng)新的意識,能夠不斷更新知識和技能,適應新的技術發(fā)展04培養(yǎng)邏輯思維和系統(tǒng)思考能力,能夠分析問題并提出合理的解決方案素質目標CONTENTS05培養(yǎng)質量意識和工作責任心,能夠追求高質量的代碼和項目成果代碼搜索框架搭建模型訓練實踐任務代碼數(shù)據(jù)處理模型評估與應用第一節(jié)
項目學習情景假設你是一名初級程序員,正在開發(fā)一個新的軟件項目。在傳統(tǒng)的代碼搜索方式中,你可能會嘗試使用關鍵字進行搜索,但由于你對具體的API名或關鍵字缺乏了解,很難找到與你的需求完全匹配的代碼示例。即使你使用通用搜索引擎進行搜索,返回的結果也可能過于泛化或與你的問題不完全相關。然而,如果有一種新的代碼搜索方法,你可以用自然語言描述你想要實現(xiàn)的功能,并通過該方法搜索到與你的需求最相近的代碼示例,這將極大地提高你的開發(fā)效率。這種方法將借助人工智能的技術,通過深度學習和自然語言處理技術對代碼進行語義匹配,從而找到最符合你需求的代碼片段。任務需求描述在項目技術分析中,我們將討論構建基于深度學習的代碼搜索引擎所需的關鍵技術和方法。首先,為了實現(xiàn)代碼搜索引擎,我們需要構建一個大規(guī)模的代碼庫,其中包含各種編程語言的代碼示例。其次,我們需要使用自然語言處理技術來處理用戶的自然語言查詢語句。這包括將查詢進行分詞、詞性標注、命名實體識別等處理,以便更好地理解查詢的語義和意圖。另外,我們還需要設計合適的評估指標來衡量代碼之間的語義相似度。常用的指標包括余弦相似度、歐氏距離、曼哈頓距離等。最后,我們還可以考慮引入預訓練的語言模型來進一步提高代碼搜索的準確性和效果。項目技術分析項目學習情景第二節(jié)
權重初始化在深度學習模型中,權重初始化是非常重要的一步。適當?shù)臋嘀爻跏蓟梢詭椭P透斓厥諗坎@得更好的性能。錯誤的權重初始化可能導致梯度消失或梯度爆炸,使模型無法學習有效的表示,從而影響模型的性能和訓練效果。因此,了解權重初始化的原理和技巧是構建和訓練深度學習模型的關鍵知識。權重初始化是指在神經(jīng)網(wǎng)絡中設置初始權重的過程。每個神經(jīng)元的權重值起初是隨機初始化的,并且這些初始值可以對模型的訓練和收斂過程產生重要影響。正確的權重初始化可以幫助模型在訓練過程中更好地優(yōu)化和適應數(shù)據(jù)。權重初始化的定義第二節(jié)
權重初始化權重初始化的方法權重零初始化第二節(jié)
權重初始化權重初始化的方法例子1:x=torch.rand(512,512)foriinrange(100):a=torch.rand(512,512)x=a@xprint(x.mean(),x.std())輸出結果:tensor(inf)tensor(nan)例子2:x=torch.rand(512,512)foriinrange(100):a=torch.rand(512,512)x=a@xiftorch.isnan(x.std()):breakprint(i)輸出結果:16權重隨機初始化第二節(jié)
權重初始化權重初始化的方法盡可能的讓輸入和輸出服從相同的分布,這樣就能夠避免后面層的激活函數(shù)的輸出值趨向于0使用方法:torch.nn.init.xavier_uniform_(tensor:Tensor,gain:float=1.)torch.nn.init.xavier_normal_(tensor:Tensor,gain:float=1.)權重Xavier初始化第二節(jié)
權重初始化權重初始化的方法He初始化方法對非線性激活函數(shù)效果更好使用方法:torch.nn.init.kaiming_uniform_(tensor:Tensor,gain:float=1.)torch.nn.init.kaiming_normal_(tensor:Tensor,gain:float=1.)權重He初始化隨機初始化最簡單的權重初始化方法是隨機從某個分布中選擇初始權重。常用的分布包括均勻分布和正態(tài)分布。例如,可以使用均勻分布在[-r,r]的范圍內初始化權重,其中r是根據(jù)神經(jīng)元的輸入和輸出數(shù)量來確定的。零初始化將所有權重初始化為零的方法。然而,這種方法通常不建議使用,因為它會導致所有神經(jīng)元對稱地更新,無法破壞模型的對稱性。Xavier初始化Xavier初始化是一種常用的權重初始化方法,特別適用于具有sigmoid激活函數(shù)的網(wǎng)絡層。它根據(jù)輸入和輸出神經(jīng)元數(shù)量來計算合適的初始化范圍,從而避免了梯度消失或梯度爆炸問題。權重初始化He初始化He初始化是一種針對具有ReLU(RectifiedLinearUnit)激活函數(shù)的網(wǎng)絡層的權重初始化方法。與Xavier初始化類似,它根據(jù)輸入和輸出神經(jīng)元數(shù)量來計算合適的初始化范圍,以適應ReLU的非線性特性。第三節(jié)
正則化在深度學習中,過擬合是一個常見的問題,特別是在訓練數(shù)據(jù)較少的情況下。過擬合指的是模型在訓練數(shù)據(jù)上表現(xiàn)良好,但在新數(shù)據(jù)上表現(xiàn)不佳的現(xiàn)象。為了避免過擬合,我們需要一種方法來減少模型的復雜性,并使其更具泛化能力。正則化就是一種常用的方法,它可以幫助控制模型的復雜性,防止過擬合。正則化的定義第三節(jié)
正則化正則化的定義神經(jīng)網(wǎng)絡訓練學生學習第三節(jié)
正則化正則化是通過在模型的損失函數(shù)中引入額外的懲罰項來控制模型的復雜性。這個懲罰項通常與模型的參數(shù)相關,可以限制參數(shù)的取值范圍或降低參數(shù)的絕對值。正則化的目標是在最小化訓練數(shù)據(jù)的損失的同時,盡量減小模型的復雜性,從而提高模型的泛化能力。正則化可以應用于各種深度學習模型和任務中,特別是在有限的訓練數(shù)據(jù)情況下。它常用于神經(jīng)網(wǎng)絡、線性回歸、邏輯回歸等模型中,以減少模型的過擬合風險。正則化的定義L1正則化通過在損失函數(shù)中加入?yún)?shù)的絕對值之和作為懲罰項來控制模型的復雜性。它傾向于使一些參數(shù)變?yōu)?,從而實現(xiàn)特征選擇的效果。L1正則化可以用于特征選擇、稀疏表示等任務。L1正則化(L1Regularization)方法L2正則化通過在損失函數(shù)中加入?yún)?shù)的平方和的一半作為懲罰項來控制模型的復雜性。L2正則化可以防止參數(shù)過大,并使參數(shù)接近于0。它通常比L1正則化更常用,因為它計算簡單且有平滑的解。L2正則化(L2Regularization)正則化
通過指暫時隨機丟棄一部分神經(jīng)元及其連接,來達到防止過擬合的效果Dropout方法將網(wǎng)絡架構權重的一個隨機選擇子集設置為零,取代了在Dropout中對每個層隨機選擇激活函數(shù)的子集設置為零的做法。DropConnect正則化
早停法可以限制模型最小化代價函數(shù)所需的訓練迭代次數(shù)。早停法通常用于防止訓練中過度表達的模型泛化性能差。早停法方法正則化
第四節(jié)
模型介紹在開始訓練之前,我們找了一些前人的解決方案,依次復現(xiàn)并進行了比較。經(jīng)過復現(xiàn)和比較,我們認為DeepCodeSearch論文中(DCS論文)提到的CODEnn(Code-DescriptionEmbeddingNeuralNetwork)模型表現(xiàn)的較好。我們的目的是要通過自然語言的查詢語句來搜索對應的代碼,但是自然語言和程序代碼是異構的兩種數(shù)據(jù),直觀上找不到任何相似性,無法進行有效的搜索。如果我們可以將這兩種異構的數(shù)據(jù)嵌入(映射)到同一個向量空間,如下圖所示。模型介紹模型介紹這樣帶有相同或相似語義的自然語言查詢語句和對應的代碼就會離的很近,而不相關的自然語言查詢語句和代碼則會離得很遠。我們只要在該空間內找到距離最近的代碼就可以了。所以CodeSearch的整體系統(tǒng)架構可以由下圖所示:模型介紹基于上面的思路,系統(tǒng)中最核心的部分就是上圖圓圈中的模型部分,它可以把程序代碼和自然語言嵌入到同一個向量空間。DeepCodeSearch論文中提出的模型叫做CODEnn(Code-DescriptionEmbeddingNeuralNetwork),可以由下圖來表示:模型介紹具體模型的細節(jié)可以參考下圖所示。模型介紹我們嘗試對以上不同方法的不同組合進行比較,由于大數(shù)據(jù)集上的調參需要較大的時間和資源,我們假設在小數(shù)據(jù)集上表現(xiàn)較好的模型在大數(shù)據(jù)集上也會表現(xiàn)得很好。所以我們選用了GitHub上的Numpy倉庫的代碼來做實驗,比較各種參數(shù)的選擇。下圖是各個調參后訓練的結果。第五節(jié)
數(shù)據(jù)準備本案例將從github網(wǎng)站上爬取數(shù)據(jù)進行模型訓練。需要以下2中方法1、爬GitHub倉庫搜索頁/search?l=Python&o=desc&p=1&q=python+license%3Amit&s=stars&type=Repositories2、使用GitHub官方API/search/repositories?q=python+license%3Amit&language=python&sort=stars&page=1數(shù)據(jù)爬取第五節(jié)
數(shù)據(jù)準備將github上的代碼拉到本地。在收集到我們想要的GitHub倉庫列表后,使用git工具進行clone將數(shù)據(jù)下載到本地。數(shù)據(jù)爬取第五節(jié)
數(shù)據(jù)準備我們需要將數(shù)據(jù)集處理成模型需要的格式,主要分為以下幾步:1.抽取方法名、API序列、標識符、描述等信息這一步主要借助astor包來處理Python代碼,它可將代碼解析為抽象語法樹,這樣程序可以直接訪問結構化的數(shù)據(jù),很方便的取到代碼中的函數(shù)、描述、方法名等信息。然后將抽取到的每個函數(shù)的信息寫入到CSV文件中,每行代表一個函數(shù)。每行都有函數(shù)所在的本地文件路徑、GitHub鏈接、函數(shù)開始所在行號、方法名、API序列、標識符、描述等信息。數(shù)據(jù)預處理數(shù)據(jù)預處理2.數(shù)據(jù)清洗這一步我們進一步處理上一步得到的數(shù)據(jù)并做清洗。首先,對于方法名,如果方法名過短(少于3個字母),我們認為這是無意義的數(shù)據(jù),舍棄;有些函數(shù),比如初始化函數(shù)__init__一類的,也舍棄掉;另外,我們還需要對方法名按駝峰命名或_進行分割,得到一個類似于句子的序列,比如,將readFile和read_file處理為readfile。然后,如果一個描述為多行文本,我們只取第一行作為描述。如果一個代碼段沒有對應的描述,那么它不能參與訓練,但可以放在最后查詢的代碼庫中。最后需要對數(shù)據(jù)進行去重。大家可能深有體會,很多人在寫代碼的時候,經(jīng)常會將別人的實現(xiàn)原封不動的搬過來的,所以需要對代碼片段數(shù)據(jù)進行去重。數(shù)據(jù)預處理3.切分數(shù)據(jù)集清洗過的數(shù)據(jù)可以作為最后查詢的代碼庫來使用,但只有包含描述信息的數(shù)據(jù)可以用于訓練模型。用于訓練的數(shù)據(jù)按8:1:1再次拆分為訓練集、驗證集和測試集。4.導出為模型需要的格式這一步按照模型的要求將上面切分好的數(shù)據(jù)導出為HDF5格式的數(shù)據(jù)文件。第六節(jié)
訓練模型、模型應用以下使用PyTorch來定義和訓練模型,由于篇幅原因,這里省略了很多代碼,只介紹出了部分關鍵代碼。1.定義模型從前面模型細節(jié)圖中可以看到,我們對方法名、API序列、描述都使用了同樣的編碼器,我們可以針對序列數(shù)據(jù)統(tǒng)一定義一個編碼器:訓練模型訓練模型classSeqEncoder(nn.Module):def__init__(self,vocab_size,embed_size,hidden_size,rnn='lstm',bidirectional=True,pool='max',activation='tanh'):self.embedding=nn.Embedding(vocab_size,embed_size,padding_idx=0)self.rnn=rnn_choices[rnn](embed_size,hidden_size,bidirectional)self.pool=pool_choices[pool]self.activation=activations_choices[activation]defforward(self,input):embedded=F.dropout(self.embedding(input),0.25,self.training)rnn_output=F.dropout(self.rnn(embedded)[0],0.25,self.training)returnself.activation(self.pool(rnn_output,dim=1))訓練模型同樣的,針對標識符使用的MLP,我們也定義一個編碼器:classBOWEncoder(nn.Module):def__init__(self,vocab_size,embed_size,pool='max',activation='tanh'):self.embedding=nn.Embedding(vocab_size,embed_size)self.pool=pool_choices[pool]self.activation=activations_choices[activation]defforward(self,input):embedded=F.dropout(self.embedding(input),0.25,self.training)returnself.activation(self.pool(embedded,dim=1))訓練模型這樣,我們的代碼編碼網(wǎng)絡CoVV可以定義為:defforward_code(self,name,apis,tokens):name_repr=SeqEncoder(name)apis_repr=SeqEncoder(apis)tokens_repr=BOWEncoder(tokens)code_repr=nn.Linear(torch.cat((name_repr,apis_repr,tokens_repr),1))returntorch.tanh(code_repr)描述編碼網(wǎng)絡DGVV可以定義為:defforward_desc(self,desc):returnSeqEncoder(desc)訓練模型真實訓練時,我們給每個代碼段兩個描述,一個是原始描述,即正確的描述,另一個是隨機描述,即錯誤描述,然后選取下面的值作為loss,參考代碼如下:defforward(self,name,apis,tokens,desc_good,desc_bad):code_repr=forward_code(name,apis,tokens)good_sim=F.cosine_similarity(code_repr,forward_desc(desc_good))bad_sim=F.cosine_similarity(code_repr,forward_desc(desc_bad))return(margin-good_sim+bad_sim).clamp(min=1e-6)具體的代碼在2Lc\3WoqGl\coqGuu.b入中,對應的訓練命令為:pythonsrc/3Model/codenn.py--dataset_pathdata/py/final--model_pathdata/py/model--batch_size512--epoch800--gpu訓練模型成功運行后,可以看到命令行窗口中顯示出了tensorboard服務運行在哪個端口,默認是在6006端口。使用瀏覽器打開http://localhost:6006即可看到訓練數(shù)據(jù)。其中,loss的變化如下圖所示:第七節(jié)
不同初始化權重比較在深度學習中,初始化權重是模型訓練的關鍵步驟之一。合適的權重初始化方法可以對模型的訓練速度、收斂性和泛化能力產生重要影響。不同的初始化方法具有不同的特點,了解它們可以幫助選擇最合適的初始化策略。不同初始化權重比較隨機初始化權重使用從均勻分布或正態(tài)分布中隨機采樣的隨機數(shù)進行初始化。是最常用的方法之一,它可以打破對稱性并避免陷入局部最優(yōu)解。然而,隨機初始化的效果受到初始權重范圍的影響,選擇合適的范圍很重要。零初始化所有權重都初始化為零。雖然零初始化是一種簡單的方法,但它可能導致模型無法學習,因為所有的權重具有相同的值,無法提供足夠的變化。Xavier初始化由Glorot和Bengio提出的一種初始化方法,適用于激活函數(shù)為sigmoid或tanh的網(wǎng)絡。Xavier初始化通過根據(jù)輸入和輸出的維度來縮放權重的隨機初始化范圍。可以幫助避免梯度消失或梯度爆炸的問題。不同初始化權重比較He初始化由He等人提出的一種初始化方法,適用于使用ReLU或其變體的網(wǎng)絡。He初始化與Xavier初始化類似,但它將縮放因子調整為平方根倍數(shù),以適應ReLU的特性。第七節(jié)
不同初始化權重比較設計思想是根據(jù)前一層和后一層的神經(jīng)元數(shù)量來設置權重的初始值,以保持信號在前向傳播過程中的適當范圍。1、對于均勻分布的Xavier初始化(均勻版):從均勻分布中隨機初始化權重矩陣W,范圍為[-a,a],其中a=sqrt(6/(n+m))。2、對于高斯分布的Xavier初始化(高斯版):從高斯分布中隨機初始化權重矩陣W,均值為0,方差為variance,其中variance=2/(n+m)。Xavier初始化第七節(jié)
不同初始化權重比較Xavier初始化例子,假設有這樣一個網(wǎng)絡:輸入層(100個神經(jīng)元)隱藏層1(80個神經(jīng)元)
sqrt(6/(100+80))≈0.136;初始化分布范圍:[-0.136,0.136]隱藏層2(60個神經(jīng)元)sqrt(6/(80+60))≈0.153;
初始化分布范圍:[-0.153,0.153]
隱藏層3(40個神經(jīng)元)輸出層(10個神經(jīng)元)Xavier初始化不同初始化權重比較在PyTorch框架中,可以通過設置模型的權重初始化方法來使用不同的初始化策略。下面是一個使用PyTorch框架的示例代碼:importtorchimporttorch.nnasnn#自定義一個全連接神經(jīng)網(wǎng)絡classNeuralNetwork(nn.Module):def__init__(self):super(NeuralNetwork,self).__init__()self.fc1=nn.Linear(784,256)self.fc2=nn.Linear(256,128)self.fc3=nn.Linear(128,10)代碼實現(xiàn)不同初始化權重比較#使用Xavier初始化nn.init.xavier_uniform_(self.fc1.weight)nn.init.xavier_uniform_(self.fc2.weight)nn.init.xavier_uniform_(self.fc3.weight)defforward(self,x):x=torch.flatten(x,1)x=self.fc1(x)x=torch.relu(x)x=self.fc2(x)x=torch.relu(x)x=self.fc3(x)returnx#創(chuàng)建模型實例model=NeuralNetwork()第八節(jié)
更多正則化方法在深度學習中,我們的目標是找到一個能夠最小化損失函數(shù)的模型。然而,如果我們只關注最小化損失函數(shù),我們可能會得到一個過于復雜的模型,這個模型在訓練數(shù)據(jù)上表現(xiàn)得很好,但在新的數(shù)據(jù)上可能表現(xiàn)得很差。這就是所謂的過擬合。而正則化的目的就是為了解決過擬合的問題。正則化方法L1正則化(L1Regularization)也稱為Lasso正則化,它通過在損失函數(shù)中添加權重的絕對值之和來懲罰模型的復雜性。L1正則化可以促使模型產生稀疏的權重,即某些權重變?yōu)榱?,從而實現(xiàn)特征選擇和模型簡化。DropoutDropout是一種隨機丟棄神經(jīng)網(wǎng)絡中的部分神經(jīng)元的技術。它在訓練過程中以一定的概率將神經(jīng)元輸出置為零,這樣可以減少神經(jīng)元之間的共適應性,強迫模型學習更加魯棒的特征。在測試階段,Dropout通常會關閉或按照一定的縮放因子應用。L2正則化(L2Regularization)L2正則化通過在損失函數(shù)中加入?yún)?shù)的平方和的一半作為懲罰項來控制模型的復雜性。L2正則化可以防止參數(shù)過大,并使參數(shù)接近于0。它通常比L1正則化更常用,因為它計算簡單且有平滑的解。更多正則化方法EarlyStopping是一種簡單而有效的正則化方法。通過在驗證集上監(jiān)控模型的性能。在性能不再提升時停止訓練,防止模型過擬合訓練數(shù)據(jù)。訓練過程中監(jiān)控模型的驗證集性能實現(xiàn)。在驗證集上的性能不再提升時,可以停止訓練。正則化importnumpyasnp#L1正則化項defl1_regularizer(weights):returnnp.sum(np.abs(weights))#線性回歸模型classLinearRegression:def__init__(self,input_size,l1_regularizer):self.weights=np.zeros((input_size,))self.bias=0self.l1_regularizer=l1_regularizerL1正則化正則化defpredict(self,inputs):returnnp.dot(inputs,self.weights)+self.biasdeftrain(self,inputs,targets,learning_rate):predictions=self.predict(inputs)errors=targets-predictions#計算L1正則化項regularization=self.l1_regularizer(self.weights)#更新權重和偏置self.weights+=learning_rate*np.dot(inputs.T,errors)self.bias+=learning_rate*np.sum(errors)#更新L1正則化項self.weights-=learning_rate*self.l1_regularizer(self.weights)returnregularization正則化importtorchimporttorch.nnasnnclassCNN(nn.Module):
#定義網(wǎng)絡結構passmodel=CNN()
#實例化網(wǎng)絡模型criterion=nn.MSELoss()
#定義損失函數(shù)optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
#定義優(yōu)化器#定義L2正則化函數(shù)defl2_regularizer(weight,lambda_l2):returnlambda_l2*torch.norm(weight,2)L2正則化正則化#迭代訓練fori,datainenumerate(train_loader,0):inputs,labels=data
#解析數(shù)據(jù)optimi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度個人之間農業(yè)貸款借款合同
- 家長與孩子二零二五年度家務勞動責任履行協(xié)議
- 2025年度泳池救生員安全責任及應急響應規(guī)范協(xié)議
- 2025年度智慧城市建設預付款合作合同
- 二零二五年度酒店管理營業(yè)執(zhí)照及品牌加盟轉讓合同
- 二零二五年度房屋維修基金頂賬返還協(xié)議書
- 二零二五年度外墻保溫涂料產品環(huán)保認證與綠色標識合同
- 二零二五年度女方婚前財產協(xié)議婚姻安全與婚姻風險規(guī)避合同
- 二零二五年度裝配行業(yè)產品研發(fā)終止合同
- 石家莊市2025年度勞動合同電子化管理規(guī)范
- 橋梁鋼筋制作安裝施工方案
- 【課件】化學與人體健康課件九年級化學人教版下冊+
- 金融類競聘主管
- 2024年3月天津第一次高考英語試卷真題答案解析(精校打?。?/a>
- 2024年688個高考英語高頻詞匯
- 《歷史地理生物》課件
- 商標合資經(jīng)營合同
- 第六講當前就業(yè)形勢與實施就業(yè)優(yōu)先戰(zhàn)略-2024年形勢與政策
- 酒店大堂石材養(yǎng)護專項方案
- 2024-2030年中國家政服務行業(yè)經(jīng)營策略及投資規(guī)劃分析報告
- 2025年護士資格證考核題庫及答案
評論
0/150
提交評論