資源簡介
針對長短期記憶網絡(lstm)的算法過程做了詳細推導,有具體公式,長達十頁,也用matlab對該算法進行了實現,有運行程序和結果圖片。

代碼片段和文件信息
clc;close?all;clear
%%訓練數據初始化(做二進制加法)
binary_dim?????=?8;
largest_number?=?2^binary_dim?-?1;
binary?????????=?cell(largest_number?1);
for?i?=?1:largest_number?+?1
????binary{i}??????=?dec2bin(i-1?binary_dim);
????int2binary{i}??=?binary{i};
end
%%輸入變量初始化
alpha??????=?0.1;
input_dim??=?2;
hidden_dim?=?32;
output_dim?=?1;
allErr?=?[];
%%?初始化神經網絡權重
%遺忘門?forget_gate?=?sigmoid(X(t)?*?X_f?+?H(t-1)?*?H_f)?公式5
X_f?=?2?*?rand(input_dim?hidden_dim)?-?1;
H_f?=?2?*?rand(hidden_dim?hidden_dim)?-?1;
X_f_update?=?zeros(size(X_f));
H_f_update?=?zeros(size(H_f));
bf?=?2*rand(11)?-?1;
bf_update?=?0;
%?輸入門in_gate?=?sigmoid(X(t)?*?X_i?+?H(t-1)?*?H_i)??公式6?
X_i?=?2?*?rand(input_dim?hidden_dim)?-?1;
H_i?=?2?*?rand(hidden_dim?hidden_dim)?-?1;
X_i_update?=?zeros(size(X_i));
H_i_update?=?zeros(size(H_i));
bi?=?2*rand(11)?-?1;
bi_update?=?0;
%狀態門?g_gate?=?tanh(X(t)?*?X_g?+?H(t-1)?*?H_g)??公式7
X_g?=?2?*?rand(input_dim?hidden_dim)?-?1;
H_g?=?2?*?rand(hidden_dim?hidden_dim)?-?1;
X_g_update?=?zeros(size(X_g));
H_g_update?=?zeros(size(H_g));
bg?=?2*rand(11)?-?1;
bg_update?=?0;
out_para?=?2?*?rand(hidden_dim?output_dim)?-?1;
out_para_update?=?zeros(size(out_para));
%?輸出門out_gate????=?sigmoid(X(t)?*?X_o?+?H(t-1)?*?H_o)???公式9
X_o?=?2?*?rand(input_dim?hidden_dim)?-?1;
H_o?=?2?*?rand(hidden_dim?hidden_dim)?-?1;
X_o_update?=?zeros(size(X_o));
H_o_update?=?zeros(size(H_o));
bo?=?2*rand(11)?-?1;
bo_update?=?0;
%?C(t)?=?C(t-1)?.*?forget_gate?+?g_gate?.*?in_gate?公式8??
%?S(t)?=?tanh(C(t))?.*?out_gate??????公式10???????????????
%%?訓練
iter?=?100000;?%?訓練次數(1000次為一組,共100組數據)
for?j?=?1:iter
????%計算簡單加法?(a?+?b?=?c)
????a_int?=?randi(round(largest_number/2));???%?輸入十進制
????a?????=?int2binary{a_int+1};??????????????%?二進制編碼
????b_int?=?randi(floor(largest_number/2));???%輸入十進制
????b?????=?int2binary{b_int+1};??????????????%二進制編碼
????%?真實答案
????c_int?=?a_int?+?b_int;????????????????????%輸入十進制
????c?????=?int2binary{c_int+1};??????????????%二進制編碼
????%?存儲答案(二進制編碼)
????d?????=?zeros(size(c));????
????%?錯誤累積
????overallError?=?0;
????%?輸出層的差異,即(目標?-?輸出)
????output_deltas?=?[];
????%計算隱藏層?S(t)
????hidden_layer_values?=?[];
????cell_gate_values????=?[];
????%?初始化S(0)?為0向量
????hidden_layer_values?=?[hidden_layer_values;?zeros(1?hidden_dim)];
????cell_gate_values????=?[cell_gate_values;?zeros(1?hidden_dim)];
????%初始化記憶門
????%?隱藏層
????H?=?[];
????H?=?[H;?zeros(1?hidden_dim)];
????%?門細胞
????C?=?[];
????C?=?[C;?zeros(1?hidden_dim)];
????%?輸入門
????I?=?[];
????%?遺忘門
????F?=?[];
????%?輸出門
????O?=?[];
????%?狀態門
????G?=?[];
%?開始處理序列,即正向傳遞
%?注意:LSTM單元格的輸出是隱藏層,將其轉移到預測輸出
????for?position?=?0:binary_dim-1
????????X?=?[a(binary_dim?-?position)-‘0‘?b(binary_dim?-?position)-‘0‘];??%?X?輸入?大小:?1?x?input_dim
????????y?=?[c(binary_dim?-?position)-‘0‘]‘;?%?y?輸出?大小:?1?x?output_dim
????????%?使用公式5-10計算
????????in_gate?????=?sigmoid(X?*?X_i?+?H(end?:)?*?H_i?+?bi);??%公式5
????????forget_gate?=?sigmoid(X?*?X_f?+?H(end?:
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????8757??2019-09-09?19:49??LSTM_test.m
?????文件?????1143116??2019-09-09?20:07??賈偉偉_LSTM算法推導過程及代碼_1.pdf
?????文件???????22752??2019-09-09?19:48??訓練誤差.jpg
評論
共有 條評論