type
status
date
summary
password
category
slug
icon
基于 LSTM 的智能合约可重入攻击漏洞检测系统
智能合约是一种能够自动执行合约的计算机程序,其核心思想是将合约条款转化为可执行的代码,以实现自动化执行。在以太坊中,智能合约可以包含函数和变量,可以被其他用户或合 约调用。当智能合约中包含的函数被调用时,如果该函数调用了其他合约,且没有足够的限制条件,就可能导致重入攻击。
基于 LSTM 深度学习模型进行合约代码加载和二分类存储
一、学习基础知识
了解深度学习基础
通过模仿人脑神经网络的结构和功能来构建和训练模型,使其能够从数据中学习和提取特征,从而完成各种任务
- 神经网络(Neural Networks):神经网络是深度学习的基本构建模块,模仿了人脑神经元之间的连接和传递信息的方式。它包含输入层、隐藏层和输出层,信息通过网络的多个层级传递和处理。
- 层(Layers):神经网络由多个层组成,每一层包含一组神经元(节点),并且每个神经元与前一层和后一层的神经元相连。常见的层类型包括输入层、隐藏层和输出层。
- 权重(Weights):权重是连接神经元之间的参数,用来调整信息在网络中的传递和转换。训练过程就是通过调整权重来使网络输出逼近真实结果。
- 激活函数(Activation Function):激活函数定义了神经元输出的方式,将输入信号映射到一个新的输出值。常见的激活函数有Sigmoid、ReLU(Rectified Linear Unit)、Tanh等。
- 前向传播(Forward Propagation):在前向传播过程中,输入数据通过神经网络从输入层传递到输出层,每一层都会应用激活函数和权重来进行信息传递和处理。
- 反向传播(Backpropagation):反向传播是训练神经网络的关键步骤,通过计算预测值与真实值之间的误差,并沿着网络反向传播这个误差,来调整权重以减小误差。
- 损失函数(Loss Function):损失函数衡量了模型的预测值与真实值之间的差距,是训练过程中优化的目标。常见的损失函数有均方误差(MSE)、交叉熵等。
- 优化算法(Optimization Algorithm):优化算法用来更新神经网络的权重,以最小化损失函数。常见的算法有随机梯度下降(SGD)、Adam等。
- 深度(Depth):深度指的是神经网络中层的数量,深度网络可以学习更复杂的特征表示,但也容易引入更多的参数和计算复杂度。
- 迁移学习(Transfer Learning):迁移学习是指在一个任务上训练好的模型的知识可以迁移到另一个相关任务上,加速新任务的训练。
学习深度学习的基本概念,包括神经网络、激活函数、前向传播、损失函数、优化算法等。
标准神经网络的弊端
特点:前后关联强,“前因后果”
1.输入和输出数据在不同例子中可能有不同的长度
2、一个单纯的神经网络结构,它并不共享从文本的不同位置上学到的特征
3、参数量巨大
4、没有办法体现出时序上的”前因后果"
理解循环神经网络(RNN)
网络结构
特点
1、串联结构,体现出“前因后果”, 后面结果的生成,要参考前面的信息
面对不同的输入(两个方面) , 能学到不同的相应的结果
2、所有特征共享同一套参数日
极大减少了训练参数量
输入和输出数据在不同例子中可以有不同的长度
前向传播
损失函数
损失函数衡量了模型的预测值与真实值之间的差距
反向传播
根据预测与实际值之差,更改参数
缺点
当序列[太长时] , 容易导致[梯度消失]参数更新只能捕捉到局部依赖关系,没法再捕捉序列之间的[长期]关联或者依赖关系
这对应着吴恩达老师讲的那个例子: The cat, which ate already, ... was full就是后面的was还是were, 要看前面是cat,还是cats,
但是一一旦中间的这个which句子很长,cat的信息根本传不到was这里来。对was的更新没有任何帮助,这是RNN-个很大的不足之处
梯度消失导致只能学到局部信息
LSTM是一种RNN的变体,所以需要了解RNN的网络结构、特点以及在处理序列数据方面的问题。
RNN与LSTM的对比
RNN是想把所有信息都记住,不管是有用的信息还是没用的信息
LSTM :设计一个记忆细胞,具备选择性记忆的功能,可以选择记忆重要信息,过滤掉噪声信息,减轻记忆负担
二、深入理解LSTM模型
学习LSTM原理
学习LSTM的内部结构和原理,包括记忆细胞、输入门、遗忘门、输出门等。
LSTM缓解梯度消失问题(公式推导)
掌握LSTM的输入输出
理解LSTM的输入格式(序列数据)以及输出(隐藏状态和预测)。
三、LSTM模型训练过程(理论)
过程4
◆误差项沿时间的反向传递
◆将误差项传递上一层
◆权重梯度计算
四、编程环境以及简单LSTM代码实现
学习Colab使用(作为训练神经网络的平台)
pytorch中的LSTM的实现(代码学习)
简单实战
(使用正弦函数和余弦函数来构造时间序列,构造模型来学习正弦函数与余弦函数之间的映射关系,通过输入正弦函数的值来预测对应的余弦函数的值。)
我们取正弦函数的值作为LSTM的输入,来预测余弦函数的值。基于Pytorch来构建LSTM模型,采用1个输入神经元,1个输出神经元,16个隐藏神经元作为LSTM网络的构成参数,平均绝对误差(LMSE)作为损失误差,使用Adam优化算法来训练LSTM神经网络
代码
out
提供了在训练过程中损失函数的变化情况。随着训练的进行,损失逐渐减小,最终达到了设定的阈值,导致训练提前结束。这意味着模型已经收敛到较低的损失值,达到了预期的性能水平。
图中,红色虚线的左边表示该模型在训练数据集上的表现,右边表示该模型在测试数据集上的表现。
下一阶段:
深入LSTM模型,完成一个更为复杂的实战
五、数据准备
- 收集数据: 选择适当的数据集,时间序列
- 数据预处理: 对数据进行预处理,包括分词、编码、填充等。
六、构建LSTM模型
- 选择库和框架: 目前已选定深度学习框架PyTorch
- 构建模型: 掌握如何在选定的深度学习框架中创建LSTM层,了解层的参数设置和调整。
使用框架PyTorch创建LSTM模型,包括定义词嵌入层、LSTM层、全连接层等。
七、训练模型
- 定义损失函数: 对于分类问题,通常使用交叉熵损失函数。
- 选择优化器: 选择一个优化算法,如Adam、SGD等,用于更新模型参数以减小损失。
- 批量训练:
使用训练数据,通过反向传播算法对模型进行训练。每个训练周期(epoch)包含多次批量训练。