RNN求解过程推导与实现
来源:互联网 发布:淘宝售后客服消差评 编辑:程序博客网 时间:2024/05/29 16:42
RNN展开网络如下图
现令第t时刻的输入表示为,隐层节点的输出为,输出层的预测值,输入到隐层的权重矩阵,隐层自循环的权重矩阵,隐层到输出层的权重矩阵,对应的偏执向量分别表示为,输入层的某一个节点使用i标识,如,类似的隐层和输出层某一节点表示为。这里我们仅以三层网络为例。
那么首先正向计算
其中分别表示激活前对应的加权和,表示激活函数。
然后看看误差如何传递。
假设真实的输出应该是,那么误差可以定义为,是训练样本的index。整个网络的误差
我们将RNN再放大一些,看看细节
令则
矩阵向量化表示
所以梯度为:
其中是点乘符号,即对应元素乘。
代码实现:
我们可以注意到在计算梯度时需要用到的之前计算过的量,即需要保存的量包括,前向计算时隐层节点和输出节点的输出值,以及由时刻累积的。
这篇文章里使用python实现了基本的RNN过程。代码功能是模拟二进制相加过程中的依次进位过程,代码很容易明白。
这里改写成matlab代码
- functionerror =binaryRNN( )
- largestNumber=256;
- T=8;
- dic=dec2bin(0:largestNumber-1)-'0';% 将uint8表示成二进制数组,这是一个查找表
- %% 初始化参数
- eta=0.1;% 学习步长
- inputDim=2;% 输入维度
- hiddenDim=16; %隐层节点个数
- outputDim=1; % 输出层节点个数
-
- W=rand(hiddenDim,outputDim)*2-1;% (-1,1)参数矩阵
- U=rand(hiddenDim,hiddenDim)*2-1;% (-1,1)参数矩阵
- V=rand(inputDim,hiddenDim)*2-1;% (-1,1)参数矩阵
-
- delta_W=zeros(hiddenDim,outputDim);% 时刻间中间变量
- delta_U=zeros(hiddenDim,hiddenDim);
- delta_V=zeros(inputDim,hiddenDim);
- error=0;
- for p=1:10000
- aInt=randi(largestNumber/2);
- bInt=randi(largestNumber/2);
- a=dic(aInt+1,:);
- b=dic(bInt+1,:);
- cInt=aInt+bInt;
- c=dic(cInt+1,:);
- y=zeros(1,T);
-
- preh=zeros(1,hiddenDim);
- hDic=zeros(T,hiddenDim);
- %% 前向计算
- for t=T:-1:1% 注意应该从最低位计算,也就是二进制数组最右端开始计算
- x=[a(t),b(t)];
- h=sigmoid(x*V+preh*U);
- y(t)=sigmoid(h*W);
- hDic(t,:)=h;
- preh=h;
- end
-
- err=y-c;
- error=error+norm(err,2)/2;
- next_delta_h=zeros(1,hiddenDim);
- %% 反馈
- for t=1:T
- delta_y = err(t).*sigmoidOutput2d(y(t));
- delta_h=(delta_y*W'+next_delta_h*U').*sigmoidOutput2d(hDic(t,:));
-
- delta_W=delta_W+hDic(t,:)'*delta_y;
- if t<T
- delta_U=delta_U+hDic(t+1,:)'*delta_h;
- end
- delta_V=delta_V+[a(t),b(t)]'*delta_h;
- next_delta_h=delta_h;
- end
- % 梯度下降
- W=W-eta*delta_W;
- U=U-eta*delta_U;
- V=V-eta*delta_V;
-
- delta_W=zeros(hiddenDim,outputDim);
- delta_U=zeros(hiddenDim,hiddenDim);
- delta_V=zeros(inputDim,hiddenDim);
-
- ifmod(p,1000)==0
- fprintf('Samples:%d\n',p);
- fprintf('True:%d\n',cInt);
- fprintf('Predict:%d\n',bin2dec(int2str(round(y))));
- fprintf('Error:%f\n',norm(err,2)/2);
- end
- end
- end
-
- functionsx=sigmoid(x)
- sx=1./(1+exp(-x));
- end
-
- functiondx=sigmoidOutput2d(output)
- dx=output.*(1-output);
- end
0 0
- RNN求解过程推导与实现
- RNN和LSTM推导与实现
- 深度学习笔记——理论与推导之RNN的训练过程BPTT(五)
- RNN(Recurrent Neural Networks)公式推导和实现
- RNN递归神经网络的详细推导及C++实现
- 循环神经网络RNN以及LSTM的推导和实现
- 【Deep Learning】循环神经网络(RNN)推导和实现
- RNN及其公式推导
- RNN 神经网络数学推导
- RNN公式推导
- SVM推导过程及SMO详细求解过程(一)
- SVM推导过程及SMO详细求解过程(二)
- 支持向量机SVM推导及求解过程
- 支持向量机SVM推导及求解过程
- 正规方程求解特征参数的推导过程
- RNN和LSTM原理推导
- RNN的原理与TensorFlow代码实现
- RNN循环神经网络详解与源码实现
- 类初始化顺序执行结果
- spring Ioc的理解
- STM32F429——GPIO
- 系统开发生命周期
- 搭建私有的PyPI仓库源
- RNN求解过程推导与实现
- 数据类型(1)
- 感知神经网络模型与学习算法
- 鸟哥服务器篇——DHCP运作的原理
- 8.自定义函数
- 记android学习之路----android中的一些小技巧
- 类初始化时各个部分代码调用顺序
- Linux 中的某些重要的目录
- activity销毁处理