RNN的结构


用之前的输出和当前的输入作为新的输入输入带神经网络

tanh(x)=ex−e−xex+e−xtanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}tanh(x)=ex+e−xex−e−x​
Softmax(X)=eX∑iexiSoftmax(X)=\frac{e^X}{\sum_i{e^{x_i}}}Softmax(X)=∑i​exi​eX​
tanh(x)tanh(x)tanh(x)是非线性函数,使用非线性函数增强神经网络表达力,(。・∀・)ノ゙
Softmax(x)Softmax(x)Softmax(x)来处理最后的处理结果,计算每种结果的概率,在反向传播时的效果比最小二乘法更好┗|`O′|┛

前向传播

Xi=tanh(UiXi−1+ViHi+Bi)X_i=tanh\left( U_i X_{i-1} + V_i H_i + B_i \right)Xi​=tanh(Ui​Xi−1​+Vi​Hi​+Bi​)
Hi=XiH_i=X_iHi​=Xi​

  • XiX_iXi​ 是第i层的输出向量
  • HiH_iHi​ 是第i层的上个时刻输出向量
  • Ui,ViU_i,V_iUi​,Vi​分别是对输入数据处理的权重矩阵
  • BiB_iBi​是偏置
  • 每层神经网络按照这个公式递推就可以了
  • 用Softmax对最后一层处理

反向传播

对于每次的计算,求取其梯度,然后用梯度更新参数
∂ε(t)∂Ui=∂ε(t)∂Xn(t)∏k=i+1n∂Xk(t)∂Xk−1(t)(∑k=1t+1(∂Xk−1∂Ui∏T=kt∂Xi(T)∂Xi(T−1)))\frac{\partial \varepsilon\left(t\right)}{\partial U_i}=\frac{\partial \varepsilon\left(t\right)}{\partial X_n\left(t\right)} \prod_{k=i+1}^{n}\frac{\partial X_{k}\left(t\right)}{\partial X_{k-1}\left(t\right)} \left( \sum_{k=1}^{t+1} \left( \frac{\partial X_{k-1}}{\partial U_i} \prod_{T=k}^{t}\frac{\partial X_i\left(T\right)}{\partial X_i\left(T-1\right)}\right) \right)∂Ui​∂ε(t)​=∂Xn​(t)∂ε(t)​k=i+1∏n​∂Xk−1​(t)∂Xk​(t)​(k=1∑t+1​(∂Ui​∂Xk−1​​T=k∏t​∂Xi​(T−1)∂Xi​(T)​))
∂ε(t)∂Ui=∂ε(t)∂Xn(t)∏k=i+1n∂Xk(t)∂Xk−1(t)(∑k=1t+1(∂Xk−1∂Vi∏T=kt∂Xi(T)∂Xi(T−1)))\frac{\partial \varepsilon\left(t\right)}{\partial U_i}=\frac{\partial \varepsilon\left(t\right)}{\partial X_n\left(t\right)} \prod_{k=i+1}^{n}\frac{\partial X_{k}\left(t\right)}{\partial X_{k-1}\left(t\right)} \left( \sum_{k=1}^{t+1} \left( \frac{\partial X_{k-1}}{\partial V_i} \prod_{T=k}^{t}\frac{\partial X_i\left(T\right)}{\partial X_i\left(T-1\right)} \right) \right)∂Ui​∂ε(t)​=∂Xn​(t)∂ε(t)​k=i+1∏n​∂Xk−1​(t)∂Xk​(t)​(k=1∑t+1​(∂Vi​∂Xk−1​​T=k∏t​∂Xi​(T−1)∂Xi​(T)​))
∂ε(t)∂Ui=∂ε(t)∂Xn(t)∏k=i+1n∂Xk(t)∂Xk−1(t)(∑k=1t+1(∂Xk−1∂Bi∏T=kt∂Xi(T)∂Xi(T−1)))\frac{\partial \varepsilon\left(t\right)}{\partial U_i}=\frac{\partial \varepsilon\left(t\right)}{\partial X_n\left(t\right)} \prod_{k=i+1}^{n}\frac{\partial X_{k}\left(t\right)}{\partial X_{k-1}\left(t\right)} \left( \sum_{k=1}^{t+1} \left( \frac{\partial X_{k-1}}{\partial B_i} \prod_{T=k}^{t}\frac{\partial X_i\left(T\right)}{\partial X_i\left(T-1\right)} \right) \right)∂Ui​∂ε(t)​=∂Xn​(t)∂ε(t)​k=i+1∏n​∂Xk−1​(t)∂Xk​(t)​(k=1∑t+1​(∂Bi​∂Xk−1​​T=k∏t​∂Xi​(T−1)∂Xi​(T)​))
求其梯度的式子很长,需要追溯到上层神经网络的输出和其他时刻的时候神经网络的输出,所也要用递推的方法求梯度

代码实现

#include<bits/stdc++.h>
struct Matrix
{int rows,colums;float **val;void init(int _rows,int _colums){rows=_rows,colums=_colums;val=new float*[rows];for(int i=0; i<rows; i++){val[i]=new float[colums];for(int j=0; j<colums; j++)val[i][j]=(rand()%200-100)/100.0;}}
};
float tanh(float x){x=exp(x);x=x*x;return  (x-1)/(x+1);
}
struct NerualNetwork
{int layoutNum;float factor=0.02;Matrix *X,*U,*V,*H,*B;Matrix *D,*dU,*dV,*dB,*TU,*TV,*TB;Matrix Softmax;std::vector<int>layout;void addLayout(int number){layout.push_back(number);layoutNum++;}void bulid(){X=new Matrix[layoutNum];H=new Matrix[layoutNum];D=new Matrix[layoutNum];U =new Matrix[layoutNum];dU=new Matrix[layoutNum];TU=new Matrix[layoutNum];V =new Matrix[layoutNum];dV=new Matrix[layoutNum];TV=new Matrix[layoutNum];B =new Matrix[layoutNum];dB=new Matrix[layoutNum];TB=new Matrix[layoutNum];srand(time(NULL));X[0].init(layout[0],1);D[0].init(layout[0],1);for(int i=1;i<layoutNum;i++){X[i].init(layout[i],1);H[i].init(layout[i],1);D[i].init(layout[i],1);U[i].init(layout[i],layout[i-1]);dU[i].init(layout[i],layout[i-1]);TU[i].init(layout[i],layout[i-1]);V[i].init(layout[i],layout[i]);dV[i].init(layout[i],layout[i]);TV[i].init(layout[i],layout[i]);B[i].init(layout[i],1);dB[i].init(layout[i],1);TB[i].init(layout[i],1);}Softmax.init(layout[layoutNum-1],1);}void clearMenory(){for(int k=1;k<layoutNum;k++)for(int i=0;i<H[k].rows;i++)X[k].val[i][0]=0;}void InitTrainMenory(){for(int k=1;k<layoutNum;k++){for(int i=0;i<B[k].rows;i++)dB[k].val[i][0]=TB[k].val[i][0]=0;for(int i=0;i<U[k].rows;i++){memset(dU[k].val[i],0,dU[k].colums*4);memset(TU[k].val[i],0,TU[k].colums*4);}for(int i=0;i<V[k].rows;i++){memset(dV[k].val[i],0,dV[k].colums*4);memset(TV[k].val[i],0,TV[k].colums*4);}}}int updateSoftmax(){float sum=0;Matrix M=X[layoutNum-1];for(int i=0;i<M.rows;i++){Softmax.val[i][0]=exp(M.val[i][0]);sum+=Softmax.val[i][0];}int k=0;for(int i=0;i<M.rows;i++){Softmax.val[i][0]/=sum;if(Softmax.val[i][0]>Softmax.val[k][0])k=i;}return k;}Matrix run(int input){for(int i=0;i<X[0].rows;i++)X[0].val[i][0]=0;X[0].val[input][0]=1;for(int k=1;k<layoutNum;k++){for(int i=0;i<H[k].rows;i++)H[k].val[i][0]=X[k].val[i][0];for(int i=0;i<X[k].rows;i++){X[k].val[i][0]=B[k].val[i][0];for(int j=0;j<U[k].colums;j++)X[k].val[i][0]+=U[k].val[i][j]*X[k-1].val[j][0];for(int j=0;j<X[k].rows;j++)X[k].val[i][0]+=V[k].val[i][j]*H[k].val[j][0];X[k].val[i][0]=tanh(X[k].val[i][0]);}}return X[layoutNum-1];}void Partial(int label){if(label==-1){for(int i=0;i<D[layoutNum-1].rows;i++)D[layoutNum-1].val[i][0]=0;}else{updateSoftmax();for(int i=0;i<D[layoutNum-1].rows;i++)D[layoutNum-1].val[i][0]=Softmax.val[i][0];D[layoutNum-1].val[label][0]-=1;}for(int k=layoutNum-1;k>0;k--){for(int i=0;i<V[k].colums;i++){float sum=0;for(int j=0;j<V[k].rows;j++)sum+=V[k].val[j][i];for(int j=0;j<TU[k].colums;j++)TU[k].val[i][j]*=sum;for(int j=0;j<TV[k].colums;j++)TV[k].val[i][j]*=sum;TB[k].val[i][0]*=sum;}for(int i=0;i<TU[k].rows;i++)for(int j=0;j<TU[k].colums;j++){TU[k].val[i][j]=(TU[k].val[i][j]+X[k-1].val[j][0])*(1-X[k].val[i][0]*X[k].val[i][0]);dU[k].val[i][j]+=TU[k].val[i][j]*D[k].val[i][0];}for(int i=0;i<TV[k].rows;i++)for(int j=0;j<TV[k].colums;j++){TV[k].val[i][j]=(TV[k].val[i][j]+H[k].val[j][0])*(1-X[k].val[i][0]*X[k].val[i][0]);dV[k].val[i][j]+=TV[k].val[i][j]*D[k].val[i][0];}for(int i=0;i<TB[k].rows;i++){TB[k].val[i][0]=(TB[k].val[i][0]+1)*(1-X[k].val[i][0]*X[k].val[i][0]);dB[k].val[i][0]+=TB[k].val[i][0]*D[k].val[i][0];}for(int i=0;i<U[k].colums;i++){D[k-1].val[i][0]=0;for(int j=0;j<U[k].rows;j++)D[k-1].val[i][0]+=U[k].val[j][i]*(1-X[k].val[j][0]*X[k].val[j][0])*D[k].val[j][0];}}}void UpdateTrain(){for(int k=1;k<layoutNum;k++){for(int i=0;i<B[k].rows;i++)B[k].val[i][0]-=dB[k].val[i][0]*factor;for(int i=0;i<U[k].rows;i++)for(int j=0;j<U[k].colums;j++)U[k].val[i][j]-=dU[k].val[i][j]*factor;for(int i=0;i<V[k].rows;i++)for(int j=0;j<V[k].colums;j++){V[k].val[i][j]-=dV[k].val[i][j]*factor;}}}
}RNN;
int main()
{RNN.addLayout(5);RNN.addLayout(5);RNN.addLayout(5);RNN.bulid();for(int i=0;i<10000;i++){for(int j=0;j<5;j++){RNN.InitTrainMenory();RNN.clearMenory();for(int k=0;k<4;k++){RNN.run((k+j)%5);if(k==3)RNN.Partial((4+j)%5);else RNN.Partial(-1);}RNN.UpdateTrain();}}for(int j=0;j<5;j++){RNN.clearMenory();for(int k=0;k<4;k++)RNN.run((k+j)%5),printf("%c ",'a'+(k+j)%5);int ans=RNN.updateSoftmax();printf(" -->%c\n",'a'+(ans));}return 0;
}

用 a b c d e 训练RNN

输入四个字母 预测第五个字母是啥

cpp简单实现一下RNN神经网络相关推荐

  1. 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)

    深度学习算法及应用 一. 实验目的 二. 实验要求 三. 实验的硬件.软件平台 四. 实验原理 1.1. 深度学习概述 1.2. 深度学习的常见结构 1.3. 卷积神经网络(CNN) **卷积** * ...

  2. 利用RNN神经网络自动生成唐诗宋词

             RNN(Recurrent Neural Networks)在处理长序列有很强的优势,加上近来前向反馈算法的成功,导致RNN在长文本上得到了很好的应用. 简单来说RNN神经网络能够记 ...

  3. 使用RNN神经网络自动生成名字 (不使用深度学习框架,源码)

    本文讲解在不使用深度学习框架的情况下,构建一个基本的RNN神经网络来进行名字自动生成.RNN模型请看下面的三张图片.本文主要讲解数据集以及输入模型的数据格式. 数据集和可执行的源码下载地址:https ...

  4. 简单的全连接神经网络(tensorflow实现)

    简单的全连接神经网络,网络结构为2-2-1 代码如下: #encoding='utf-8' """ created on 2018-08-10 @author wt &q ...

  5. 银行股价预测——基于pytorch框架RNN神经网络

    银行股价预测--基于pytorch框架RNN神经网络 任务目标 数据来源 完整代码 流程分析 1.导包 2.读入数据并做预处理 3.构建单隐藏层Rnn模型 4.设计超参数,训练模型 5.加载模型,绘图 ...

  6. Python Djang 搭建自动词性标注网站(基于Keras框架和维基百科中文预训练词向量Word2vec模型,分别实现由GRU、LSTM、RNN神经网络组成的词性标注模型)

    引言 本文基于Keras框架和维基百科中文预训练词向量Word2vec模型,分别实现由GRU.LSTM.RNN神经网络组成的词性标注模型,并且将模型封装,使用python Django web框架搭建 ...

  7. 基于rnn神经网络的写唐诗机器人

    基于rnn网络的自动写唐诗机器人 项目目录: my_rnn_model用来保存训练的模型: clean_txt.py 脚本负责将清洗唐诗集(poetry.txt) 代码如下 poem_dir = &q ...

  8. rnn神经网络 层次_精讲深度学习RNN三大核心点,三分钟掌握循环神经网络

    每天给小编五分钟,小编用自己的代码,让你轻松学习人工智能.本文将剖析循环神经网络(RNN)的工作原理,精讲循环神经网络的特点和实现方式.野蛮智能,小白也能看懂的人工智能. 循环神经网络从何而来? 我在 ...

  9. 递归神经网络结构形式,RNN神经网络基本原理

    1.如何有效的区分和理解RNN循环神经网络与递归神经网络 RNN建立在与FNN相同的计算单元上,两者之间区别在于:组成这些神经元相互关联的架构有所不同.FNN是建立在层面之上,其中信息从输入单元向输出 ...

最新文章

  1. 2022-2028年中国商贸物流行业市场前瞻与投资战略规划分析报告
  2. 基于Arduino ATmega328人脸识别IOT演示门锁
  3. 20155230 2016-2017-2 《Java程序设计》第十周学习总结
  4. Ostinato 发包
  5. JAVA核心技术卷2:高级特征(原书第8版)
  6. 如何写年终总结(转)
  7. 项目实训第二周(车道线检测)
  8. OpenGL--------纹理处理
  9. Kruskal算法实现最小生成树MST(java)
  10. 艾宾浩斯遗忘曲线复习计划表Excel下载
  11. django WEB聊天室项目
  12. Jetson Nano python中文语音播报数字距离 基于pyttsx3
  13. 已知非线性规划问题,写出K-T条件
  14. 关于jul桥接slf4j失败问题的探究
  15. 文件Md5计算(C语言版)
  16. UR机器人PolyScope使用入门教程
  17. 小爱同学控制灯 局域网
  18. android电视分辨率是多少合适,电视分辨率多少合适,目前口碑最好的电视机推荐...
  19. 天价月饼被套上“紧箍咒”,499元成天花板?
  20. stm32f103vet6利用fsmc控制LIL9341液晶屏

热门文章

  1. 牵手华为云,云时通SRM助力企业采购数字化升级!
  2. win10+Ubuntu20.4双系统安装详细教程(包含bios设置)
  3. Android---WMS核心分析
  4. java 数组形式字符串_java 数组格式字符串转化为字符串
  5. 牛逼顿的一生:当智商高到一定程度,情商就不重要了
  6. 关于yd ui 移动端自适应的方案
  7. 计算机专业课学习清单(书籍+公开课)
  8. R语言 substitute
  9. curl服务器文件,curl 向远程服务器传输file文件
  10. wifi 广告推送 小记