pytorch實現聊天機械人學習筆記 1

2021-10-07 10:47:27 字數 1882 閱讀 1697

本文以醫療智慧型問答為例子,簡單介紹下seq2seq模型下,pytorch如何實現聊天機械人.由於fly平台提供的競賽資料都很乾淨,基本上不需要什麼預處理.一般情況下預處理操作也就是把雜亂的問答一一對應起來,形成乙個資料集.資料集中每乙個問答就是一條記錄.

資料集生成後就需要生成字典.對於中文句子有兩種方式生成字典:

1.逐字生成字典,這樣生成的字典大小會小一些.2.分詞後,根據分詞結果生成字典.此處我一般使用jieba分詞

讀取資料集中每條記錄,呼叫以下**來生成字典

由於每乙個句子長度不一樣,所以需要統一把句子padding成max_length(最長句子的長度).這樣方便gpu計算.但是同時padding也會帶來乙個問題.比如,乙個句子長度為:4 ,max_length=10,這樣實際上後面6個時刻的value都是padding,最終forward的輸出應該是第4個時刻的輸出,後面的計算都是無用功.所以會生成乙個batch_size的列表來記錄每個句子的實際長度.

原始的輸入通常是batch_size個list,表示batch_size個句子.每次輸入的shape大小為(batch_size,max_length).但是seq2seq模型中每個模組用的都是gru(或者lstm),而gru中計算t時刻的輸出需要依賴t-1時刻生成的狀態值.所以無法在同乙個gru模組中計算乙個語句的所有時刻的輸出.於是我們需要轉換下輸入的shape.把(batch_size,max_length)轉換成(max_length,batch_size).

上述的兩個操作可以通過itertools.zip_longest函式很方便的實現.

1.encoder

encoder是個rnn,它會遍歷輸入的每乙個token(詞),每個時刻的輸入是上乙個時刻的隱狀態和輸入,然後會有乙個輸出和新的隱狀態。這個新的隱狀態會作為下乙個時刻的輸入隱狀態。每個時刻都有乙個輸出,對於seq2seq模型來說,我們通常只保留最後乙個時刻的隱狀態,認為它編碼了整個句子的語義,但是後面我們會用到attention機制,它還會用到encoder每個時刻的輸出。encoder處理結束後會把最後乙個時刻的隱狀態作為decoder的初始隱狀態。

輸入:輸出:

2.decoder

decoder也是乙個rnn,它每個時刻輸出乙個詞。每個時刻的輸入是上乙個時刻的隱狀態和上乙個時刻的輸出。一開始的隱狀態是encoder最後時刻的隱狀態,輸入是特殊的。然後使用rnn計算新的隱狀態和輸出第乙個詞,接著用新的隱狀態和第乙個詞計算第二個詞,…,直到遇到,結束輸出。普通的rnn decoder的問題是它只依賴與encoder最後乙個時刻的隱狀態,雖然理論上這個隱狀態(context向量)可以編碼輸入句子的語義,但是實際會比較困難。因此當輸入句子很長的時候,效果會很長。

輸入:input_step: shape是(1, batch_size)

last_hidden: 上乙個時刻的隱狀態, shape是(n_layers x num_directions, batch_size, hidden_size)

encoder_outputs: encoder的輸出, shape是(max_length, batch_size, hidden_size)

輸出:output: 當前時刻輸出每個詞的概率,shape是(batch_size, voc.num_words)

hidden: 新的隱狀態,shape是(n_layers x num_directions, batch_size, hidden_size)

class at***ecoderrnn(nn.module):

機械人學 機械人感知(Mapping)

軌跡規劃任務是再metric map的基礎上完成的。當然,層次最高的是語意圖,語意圖是未來研究的熱點方向。獲取metric map 的難度最大之處在於 1 感測器雜訊 may be solved by pgm 2 機械人在移動 location 問題 常見的map是基於ugv而言的,使用的地圖是oc...

機械人學 機械人視覺(特徵)

上回說到機械人視覺的核心任務是estimation,理論框架是射影幾何理論。在之前的作業中展現了單應變換的巨大威力。然而,整個estimation 的首要條件是已知畫素點座標,尤其是多幅圖中對應點的畫素座標。單幅影象的處理方法都是大路貨了,不贅述。這篇部落格想講講不變點檢測與不變特徵。由於機械人在不...

機械人學 機械人感知(Location)

location 最大的難度來自於測量誤差。里程計的計數誤差,測量與里程計的不統一等。所以我們需要一種演算法,能夠較高精度的確定機械人的位姿。此處粒子濾波器的作用似乎與卡爾曼濾波器相似,但是粒子濾波器可以有非0的均值 編碼器讀數 可以有非正太分布 你關我怎樣取樣 可以有非線性解 反正是大力出奇蹟,什...