rnnlm原始碼分析 七

2021-06-29 12:23:24 字數 2613 閱讀 7956

系列前言

rnnlm - recurrent neural network  language modeling toolkit(點此閱讀)

recurrent neural network based language model(點此閱讀)

extensions of recurrent neural network language model(點此閱讀)

strategies for training large scale neural network  

language models(點此閱讀)

statistical language models based on neural  

networks(點此閱讀)

a guide to recurrent neural networks and backpropagation(點此閱讀)

a neural probabilistic language model(點此閱讀)

learning long-term dependencies with gradient descent is difficult(點此閱讀)

can artificial neural networks learn language models?(點此閱讀)

前一篇是網路的前向計算,這篇是網路的學習演算法,學習演算法我在rnnlm原理及bptt數學推導中介紹了。學習演算法主要更新的地方在網路中的權值,這個最終版本的網路的權值大體可以分為三個部分來看:第乙個是網路中類似輸入到隱層的權值,隱層到輸出層的權值。第二個是網路中me的部分,即輸入層到輸出層的權值部分。第三個來看是bptt的部分。我先把整個網路的me+rnn圖放上來,然後再貼帶注釋的原始碼,結構圖如下:

下面**還是分成兩部分來看,一部分是更新非bptt部分,乙個是更新bptt部分,如下:

//反傳誤差,更新網路權值

void crnnlm::learnnet(int last_word, int word)

//更新me中的權值部分,這部分是正對word的

for (c=0; c0)

//和上面一樣,更新me中權值部分,這是對class的

for (a=vocab_size; a0)

else

//下一行

c+=layerc_size;

} //這裡是誤差向量,即**中的e hj (t)

for (a=0; a1

//更新syn1,相應的見公式

for (b=0; bc update

} }

else //無壓縮層的情況,更新syn1

else

c+=layer1_size;

} }

////到這裡,上面部分把到隱層的部分更新完畢

/////這裡就是最常規的rnn,即t時刻往前只展開了s(t-1)

if (bptt<=1)

//清空歷史資訊中的er值

for (a=0; a

//這裡恢復neu1,因為neu1反覆在迴圈中使用

for (b=0; b最後仍然和前面一樣,把整個函式完整的注釋版貼在下面:

//反傳誤差,更新網路權值

void crnnlm::learnnet(int last_word, int word)

//更新me中的權值部分,這部分是正對word的

for (c=0; c0)

//和上面一樣,更新me中權值部分,這是對class的

for (a=vocab_size; a0)

else

//下一行

c+=layerc_size;

} //這裡是誤差向量,即**中的e hj (t)

for (a=0; a1

//更新syn1,相應的見公式

for (b=0; bc update

} }

else //無壓縮層的情況,更新syn1

else

c+=layer1_size;

} }

////到這裡,上面部分把到隱層的部分更新完畢

/////這裡就是最常規的rnn,即t時刻往前只展開了s(t-1)

if (bptt<=1)

//todo這裡我理解是把**中的s(t-1)複製到s(t),準備下一次迴圈

for (a=0; a

//歷史中的s(t-2)複製到s(t-1)

if (step

for (a=0; a

}//清空歷史資訊中的er值

for (a=0; a

//這裡恢復neu1,因為neu1反覆在迴圈中使用

for (b=0; b

//將bptt後的權值改變作用到syn0上

for (b=0; b

}else

}//bptt完畢,將bptt_syn0的權值複製到syn0中來,這是word部分

if ((counter%10)==0)

}else }}

} }

}

rnnlm原始碼分析 一

系列前言 rnnlm recurrent neural network language modeling toolkit 點此閱讀 recurrent neural network based language model 點此閱讀 extensions of recurrent neural n...

muduo base庫原始碼分析(七)

執行緒池問題本質上也是生產者 消費者問題,生產者向任務佇列中新增任務,執行緒佇列中的執行緒從任務佇列中取出任務執行。task函式是要執行的任務 threads 是執行緒佇列,是乙個ptr vector,內部存放執行緒指標 queue 是任務佇列 start函式用來啟動執行緒池 建立固定個數的執行緒 ...

flannel 實戰與原始碼分析(七)

這是flannel最後一篇,我原本不準備介紹udp,因為這種方案的網路損耗實在是太多,大約一半損耗,vxlan大約是30 損耗。但基本的udp使用我還是想和大家分享一下的,主要是tun裝置的使用。像udp的registernetwork和vxlan一樣,我就不單獨說了backend udp udp ...