• 吴奂
    了解作者
  • matlab
    开发工具
  • 2KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 39
    下载次数
  • 2019-04-04 16:39
    上传日期
基于梯度下降的RNN,训练过程用到了BPTT算法,通俗易懂
RNN.zip
  • RNN.m
    5.6KB
内容介绍
% implementation of RNN clc clear close all %% training dataset generation binary_dim = 8; largest_number = 2^binary_dim-1; binary = cell(largest_number,1); int2binary = cell(largest_number,1); for i = 1:largest_number+1 binary{i} = dec2bin(i-1, 8); int2binary{i} = binary{i}; end %% input variables alpha = 0.1; input_dim = 2; hidden_dim = 20; output_dim = 1; %% initialize neural network weights synapse_0 = 2*rand(input_dim,hidden_dim) - 1; synapse_1 = 2*rand(hidden_dim,output_dim) - 1; synapse_h = 2*rand(hidden_dim,hidden_dim) - 1; synapse_0_update = zeros(size(synapse_0)); synapse_1_update = zeros(size(synapse_1)); synapse_h_update = zeros(size(synapse_h)); %% train logic for j = 0:19999 % generate a simple addition problem (a + b = c) a_int = randi(floor(largest_number/2)); % int version a = int2binary{a_int+1}; % binary encoding b_int = randi(floor(largest_number/2)); % int version b = int2binary{b_int+1}; % binary encoding % true answer c_int = a_int + b_int; c = int2binary{c_int+1}; % where we'll store our best guess (binary encoded) d = zeros(size(c)); if length(d)<8 pause; end overallError = 0; layer_2_deltas = []; layer_1_values = [zeros(1, hidden_dim)]; % 开始对一个序列进行处理,搞清楚一个东西,一个LSTM单元的输出其实就是隐含层 for position = 0:binary_dim-1 X = [a(binary_dim - position)-'0' b(binary_dim - position)-'0']; % X 是 input y = [c(binary_dim - position)-'0']'; % Y 是label,用来计算最后误差 % 这里是RNN,因此隐含层比较简单 % X ------------------------> input % sunapse_0 ----------------> U_i % layer_1_values(end, :) ---> previous hidden layer (S(t-1)) % synapse_h ----------------> W_i % layer_1 ------------------> new hidden layer (S(t)) layer_1 = logsig(X*synapse_0 + layer_1_values(end, :)*synapse_h); % layer_1 ------------------> hidden layer (S(t)) % layer_2 ------------------> 最终的输出结果,其维度应该与 label (Y) 的维度是一致的 % 这里的 sigmoid 其实就是一个变换,将 hidden layer (size: 1 x 16) 变换为 1 x 1 % 有写时候,如果输入与输出不匹配的话,使可以使用 softmax 进行变化的 % output layer (new binary representation) layer_2 = logsig(layer_1*synapse_1); % 计算误差,根据误差进行反向传播 % layer_2_error ------------> 此次(第 position+1 次的误差) % l 是真实结果 % layer_2 是输出结果 % layer_2_deltas 输出层的变化结果,使用了反向传播,见那个求导(输出层的输入是 layer_2,那就对输入求导即可,然后乘以误差就可以得到输出的diff) % did we miss?... if so, by how much? layer_2_error = y - layer_2; layer_2_deltas = [layer_2_deltas; layer_2_error*layer_2.*(1-layer_2)]; % 总体的误差(误差有正有负,用绝对值) overallError = overallError + abs(layer_2_error(1)); % decode estimate so we can print it out % 就是记录此位置的输出,用于显示结果 d(binary_dim - position) = round(layer_2(1)); % 记录下此次的隐含层 (S(t)) % store hidden layer so we can use it in the next timestep layer_1_values = [layer_1_values; layer_1]; end % 计算隐含层的diff,用于求参数的变化,并用来更新参数,还是每一个timestep来进行计算 future_layer_1_delta = zeros(1, hidden_dim); % 开始进行反向传播,计算 hidden_layer 的diff,以及参数的 diff for position = 0:binary_dim-1 % 因为是通过输入得到隐含层,因此这里还是需要用到输入的 % a -> (operation) -> y, x_diff = derivative(x) * y_diff % 注意这里从最后开始往前推 X = [a(position+1)-'0' b(position+1)-'0']; % layer_1 -----------------> 表示隐含层 hidden_layer (S(t)) % prev_layer_1 ------------> (S(t-1)) layer_1 = layer_1_values(end-position, :); prev_layer_1 = layer_1_values(end-position-1, :); % layer_2_delta -----------> 就是隐含层的diff % hidden_layer_diff,根据这个可以推算输入的diff以及上一个隐含层的diff % error at output layer layer_2_delta = layer_2_deltas(end-position, :); % 这个地方的 hidden_layer 来自两个方面,因为 hidden_layer -> next timestep, hidden_layer -> output, % 因此其反向传播也是两方面 % error at hidden layer layer_1_delta = (future_layer_1_delta*(synapse_h') + layer_2_delta*(synapse_1')) ... .* layer_1.*(1-layer_1); % let's update all our weights so we can try again synapse_1_update = synapse_1_update + (layer_1')*(layer_2_delta); synapse_h_update = synapse_h_update + (prev_layer_1')*(layer_1_delta); synapse_0_update = synapse_0_update + (X')*(layer_1_delta); future_layer_1_delta = layer_1_delta; end synapse_0 = synapse_0 + synapse_0_update * alpha; synapse_1 = synapse_1 + synapse_1_update * alpha; synapse_h = synapse_h + synapse_h_update * alpha; synapse_0_update = synapse_0_update * 0; synapse_1_update = synapse_1_update * 0; synapse_h_update = synapse_h_update * 0; if(mod(j,1000) == 0) err = sprintf('Error:%s\n', num2str(overallError)); fprintf(err); d = bin2dec(num2str(d)); pred = sprintf('Pred:%s\n',dec2bin(d,8)); fprintf(pred); Tru = sprintf('True:%s\n', num2str(c)); fprintf(Tru); out = 0; size(c) sep = sprintf('-------------\n'); fprintf(sep); end end
评论
    相关推荐
    • RNN.rar
      利用MATLAB实现循环神经网络的例子,便于大家更好的理解循环神经网络RNN的原理。
    • RNN代码.zip
      RNN递归神经网络,应用于自然语言处理等大数据处理领域
    • RNN.zip
      循环神经网络源码,带注释性说明,作为模板使用
    • RNN.rar
      使用Python编写,无框架实现CNN,RNN等深度神经网络
    • matlab代码跑了12个小时-RNN-Research-Journal:我的RNN独立研究课程的在线期刊。记录我的进度和我使用
      建立一个通过随机梯度下降“学习”的神经元。 构建一个没有隐藏层的简单分类神经网络。 用隐藏层构建一个简单的分类神经网络。 构建用于文本生成的单层“香草” RNN。 使用GRU单元构建单层RNN,以记住长期依赖关系。...
    • psgd_tf:预条件随机梯度下降的Tensorflow实现
      PSGD(预处理随机梯度下降)是一种通用的二阶优化方法。 PSGD通过其固有的处理非凸性和梯度噪声的能力使其与大多数现有方法有所不同。 请参考的设计思想。 已存档。 此更新的实现适用于tf2.x,并且还大大简化了...
    • sommatlab代码-Deep-learning-foundation:MLP,CNN,RNN,AE等的Matlab和NumP
      使用应用于成本函数的小批量梯度下降来训练网络,该函数计算应用于标签训练数据的分类器的交叉熵损失和权重矩阵上的L2正则项。 探索有助于提高性能的技巧/途径,例如找到良好的超参数,学习率衰减,Xavier初始化,...
    • RNTN:通过 RNN、RNTN 进行情感分析。 基于斯坦福的情绪分析页面
      没有特殊的参数调整(例如网格搜索优化),使用经典的随机梯度下降,可以获得大约 64% 的分类准确率。 所有文件都在 Numpy 文件夹中。 西诺 然后我尝试通过 Theano 在代码中添加 GPU 方法。 我的显卡不能很好地支持...
    • rnn-by-numpy:使用numpy实现rnn和语言模型
      本仓库主要用numpy从头开始构建rnn结构,包括前向传播算法 反向传播算法 学习率 随机梯度下降; 实例:给定一个x来预测y,虽然这个没有实际意义,所以在这里主要目的是为了阐释rnn的算法 x: SENTENCE_START what are ...
    • matlabcnhelp.rar
      matlab中文帮助很难找的,快速下载