DL - LSTM


LSTM 长短记忆网络

LSTM 是 RNN 的升级版,应用更广泛。

解决的问题:

增加控制参数C,保留有价值的信息;

C 可以看做一个权重列表:[0, 0.1, 0.8, 1] 舍弃,小部分保留,大部分保留,全部保留。

LSTM 的重点是 控制参数怎么更新


如何训练C参数?

门是一种让信息选择式通过的方法
Sigmoid 神经网络层和一乘法操作

Sigmoid 公式:
g ( z ) = 1 1 + e − z g(z) = \frac{1}{1 + e^{-z}} g(z)=1+ez1

Sigmoid 在负无穷到正无穷的范围类,数值在 0–1 之间;
描述每个部分多少量可以通过,0代表不允许任何量通过,1 代表允许任何量通过。


1、决定丢弃信息

  • h t − 1 h_{t-1} ht1:上一层中间结果;
  • x t x_t xt:当前数据;
  • σ \sigma σ:激活函数;
  • f t f_t ft:所有值在 0-1 范围之间。 f t f_t ft C t − 1 C_{t-1} Ct1 组合,乘法操作,决定丢弃什么信息。

$ f_{t}=\sigma (W_{f} \cdot [h_{t-1}, x_{t} ]+b_{f} )$


2、确定要更新的信息

  • i t i_{t} it 要保留下来的新信息
  • C t C_{t} Ct 新数据形成的控制参数

$i_{t} = \sigma (W_{i} \cdot [h_{t-1}, x_{t} ] + b_{i} ) $

C ~ t = tanh ⁡ ( W C ⋅ [ h t − 1 , x t ] + b C ) \tilde{C}_{t} = \tanh (W_{C} \cdot [h_{t-1}, x_{t}]+b_{C} ) C~t=tanh(WC[ht1,xt]+bC)


3、更新细胞状态

$C_{t} = f_t * C_{t-1} + i_t * \tilde{C}_{t} $


4、输出信息

  • o t o_t ot:什么都没忘,全留下的信息
  • h t h_t ht:输出值
  • C t C_t Ct:更新完的结果

o t = σ ( W o [ h t − 1 , x t ] + b o ) o_t = \sigma (W_o [h_{t-1}, x_t] + b_o) ot=σ(Wo[ht1,xt]+bo)

h t = o t ∗ t a n h ( C t ) h_t = o_t * tanh(C_t) ht=ottanh(Ct)


参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用CNN-LSTM-Attention模型进行序列预测的MATLAB代码示例: ```matlab % 加载数据 load data.mat % 数据预处理 XTrain = permute(XTrain,[2 3 4 1]); XTest = permute(XTest,[2 3 4 1]); YTrain = categorical(YTrain); YTest = categorical(YTest); % 定义CNN层 layers = [ imageInputLayer([32 32 3]) convolution2dLayer(3,32,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) convolution2dLayer(3,64,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) convolution2dLayer(3,128,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) ]; % 定义LSTM层 inputSize = 128; numHiddenUnits = 64; numClasses = 10; lstmLayers = [ sequenceInputLayer(inputSize) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer ]; % 定义Attention层 attention = attentionLayer(numHiddenUnits); % 将CNN和LSTM层连接起来 layers = [ layers sequenceFoldingLayer('Name','fold') lstmLayers sequenceUnfoldingLayer('Name','unfold') attention ]; % 定义训练选项 options = trainingOptions('adam', ... 'MaxEpochs',30, ... 'MiniBatchSize',64, ... 'Plots','training-progress'); % 训练模型 net = trainNetwork(XTrain,YTrain,layers,options); % 测试模型 YPred = classify(net,XTest); accuracy = sum(YPred == YTest)/numel(YTest); disp(['Test accuracy: ' num2str(accuracy)]) ``` 需要注意的是,上述代码中用到的`attentionLayer`函数需要自行实现。你可以参考以下代码: ```matlab classdef attentionLayer < nnet.layer.Layer properties HiddenSize AttentionWeights end methods function layer = attentionLayer(hiddenSize,name) layer.HiddenSize = hiddenSize; layer.Name = name; layer.AttentionWeights = layer.initWeights(hiddenSize); end function weights = initWeights(~,hiddenSize) weights = randn(hiddenSize,1); end function Z = predict(layer,X) W = layer.AttentionWeights; Z = tanh(W'*X); end function [dLdX,dLdW] = backward(layer,X,~,dLdZ,~) W = layer.AttentionWeights; Y = layer.predict(X); dLdY = dLdZ.*(1-Y.^2); dLdW = dLdY*X'; dLdX = W*dLdY; end end end ``` 这个实现只是一个简单的示例,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值