精华内容
下载资源
问答
  • 数学建模之BP神经网络

    千次阅读 多人点赞 2018-08-15 14:44:32
    BP网络是一种多层前馈神经网络,它的名字源于在网络训练中,调整网络权值的训练算法是反向传播算法(即BP学习算法). BP网络是一种具有三层或者三层以上神经元的神经网络,包括输入层,隐含层和输出层,上下层之间实现全...

    1. BP网络基本数学原理

    BP网络是一种多层前馈神经网络,它的名字源于在网络训练中,调整网络权值的训练算法是反向传播算法(即BP学习算法).
    BP网络是一种具有三层或者三层以上神经元的神经网络,包括输入层,隐含层和输出层,上下层之间实现全连接,而同一层的神经元之间无连接,输入层神经元和隐含层神经元之间的是网络的权值,即两个神经元之间的连接强度.隐含层或输出层任一神经元将前一层所有神经元传来的信息进行整合,通常还会在整合的信息中添加一个阈值.当一对学习样本提供给输入神经元后,神经元的激活值(该层神经元输出值)从输入层经过各隐含层向输出层传播,在输出层的各神经元获得网络的输入响应,然后按照减少网络输出与实际输出样本之间误差的方向,从输出层反向经过各隐含层回到输入层,从而逐步修正各隐含权值,这种算法称为误差反向传播算法,即BP算法.
    随着这种误差逆向传播修正的反复进行,网络对输入模式的正确率也不断上升.BP算法的核心是数学中的负梯度下降理论,即BP算法总是沿着误差下降最快的方向进行.

    2. BP网络求解过程

    (1) 原始数据的输入
    (2) 数据归一化
    (3) 网络训练
    (4) 对原始数据进行仿真
    (5) 将原始数据仿真的结果与已知样本进行对比
    (6) 对新数据进行仿真

    3. 实例:基于matlab工具箱公路运量预测

    clc                          % 清屏
    clear all;                  %清除内存以便加快运算速度
    close all;                  %关闭当前所有figure图像
    %原始数据 
    %人数(单位:万人)
    sqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 ...
           41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
    %机动车数(单位:万辆)
    sqjdcs=[0.6 0.75 0.85 0.9 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2 2.25 2.35 2.5 2.6...
            2.7 2.85 2.95 3.1];
    %公路面积(单位:万平方公里)
    sqglmj=[0.09 0.11 0.11 0.14 0.20 0.23 0.23 0.32 0.32 0.34 0.36 0.36 0.38 0.49 ... 
             0.56 0.59 0.59 0.67 0.69 0.79];
    %公路客运量(单位:万人)
    glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...
            22598 25107 33442 36836 40548 42927 43462];
    %公路货运量(单位:万吨)
    glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...
            13320 16762 18673 20724 20803 21804];
    p=[sqrs;sqjdcs;sqglmj];  %输入数据矩阵
    t=[glkyl;glhyl];           %目标数据矩阵
    %利用mapminmax函数对数据进行归一化
    [pn,input_str]=mapminmax(p);
    [tn,output_str]=mapminmax(t);
    %建立BP神经网络,相对旧一点的matlab版本,新版本中newff函数使用更简洁一些
    net=newff(pn,tn,[3 7 2],{'purelin','logsig','purelin'});
    %10轮回显示一次结果
    net.trainParam.show=10;
    %学习速度为0.05
    net.trainParam.lr=0.05;
    %最大训练次数为5000次
    net.trainParam.epochs=5000;
    %均方误差
    net.trainParam.goal=0.65*10^(-3);
    %网络误差如果连续6次迭代都没有变化,训练将自动终止(系统默认的)
    %为了让程序继续运行,用以下命令取消这条设置
    net.divideFcn='';
    %开始训练,其中pn,tn分别为输入输出样本
    net=train(net,pn,tn);
    %利用训练好的网络,基于原始数据对BP网络仿真
    an=sim(net,pn);
    
    %利用函数mapminmax把仿真得到的数据还原为原始的数量级
    %新版本推荐训练样本归一化和反归一化都使用mapminmax函数
    a=mapminmax('reverse',an,output_str);
    %本例因样本容量有限,使用训练数据进行测试,通常必须用新鲜数据进行测试
    x=1990:2009;
    newk=a(1,:);
    newh=a(2,:);
    figure(2);
    %绘制公路客运量对比图
    subplot(2,1,1);plot(x,newk,'k-o',x,glkyl,'b--+')
    legend('网络输出客运量','实际客运量');
    xlabel('年份');
    ylabel('客运量/万人');
    title('运用工具箱客运量学习和测试对比图');
    %绘制公路货运量对比图
    subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+')
    legend('网络输出货运量','实际货运量');
    xlabel('年份');ylabel('货运量/万吨');
    title('运用工具箱货运量学习和测试对比图');
    % 利用训练好的网络进行预测
    %2010年和2011年的相关数据
    % 当用训练好的网络对新数据pnew进行预测时,也应作相应的处理
    pnew=[73.39 75.55
          3.9635 4.0975
          0.9880 1.0268];  
    %利用原始输入数据的归一化参数对新数据进行归一化
    pnewn=mapminmax('apply',pnew,input_str);
    %利用归一化的数据进行仿真
    anewn=sim(net,pnewn);
    %把仿真得到的数据还原为原始的数量级
    anew=mapminmax('reverse',anewn,output_str)

    程序输出:
    这里写图片描述

    参考: MATLAB在数学建模中的应用.

    展开全文
  • 卷积神经网络(如何构造,怎么解释,自组织映射的原理,径向基函数也看看);RNN,STLM作为了解;聚类:如何从混合密度估计到kmeans;准则;挑战性问题;层次聚类;谱聚类(原理,写出一种算法,基本计算过程)。...
  • gram语言模型1.2.1 n-gram数学原理1.2.2 n-gram缺点1.3 为什么要研究语言建模1.4 LM理解二、神经网络语言模型2.1 基于窗口的语言模型2.2 RNN2.3 RNN优缺点2.4 如何训练RNN模型2.5 RNN反向传播2.5.1 基本计算公式及其...

    一、语言模型

    1.1 什么是语言模型(LM)

    语言模型是指利用当前序列预测下一个可能出现的词。
    P(x(1),,x(T))=P(x(1))×P(x(2)x(1))××P(x(T)x(T1),,x(1))=t=1TP(x(t)x(t1),,x(1))\begin{aligned} P\left(\boldsymbol{x}^{(1)}, \ldots, \boldsymbol{x}^{(T)}\right) &=P\left(\boldsymbol{x}^{(1)}\right) \times P\left(\boldsymbol{x}^{(2)} | \boldsymbol{x}^{(1)}\right) \times \cdots \times P\left(\boldsymbol{x}^{(T)} | \boldsymbol{x}^{(T-1)}, \ldots, \boldsymbol{x}^{(1)}\right) \\ &=\prod_{t=1}^{T} P\left(\boldsymbol{x}^{(t)} | \boldsymbol{x}^{(t-1)}, \ldots, \boldsymbol{x}^{(1)}\right) \end{aligned}
    在这里插入图片描述
    输入法的联想功能就是这个原理

    1.2 n-gram语言模型

    训练一个语言模型的一种简单方法是n-gram, n-gram是指大小为n滑动步长为1的窗口框选出的单词块。包括:

    • unigrams
    • bigrams
    • trigrams
    • 4-grams

    1.2.1 n-gram数学原理

    假设:第t+1个词x(t+1)x^{(t+1)}由前n-1个词决定:
    在这里插入图片描述
    由条件概率的定义:
    在这里插入图片描述
    可以通过直接统计这么gram的频数获得这些n-gram和(n-1)-gram的概率。即:
    Pcount(x(t+1),x(t),,x(tn+2))count(x(t),,x(tn+2))P\approx \frac{\operatorname{count}\left(\boldsymbol{x}^{(t+1)}, \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}\right)}{\operatorname{count}\left(\boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}\right)}

    1.2.2 n-gram缺点

    以4-grams为例:

    • n-gram模型确实十分简单,但是为了简化问题,丢掉上下文显然是不合理的假设。
    • 稀疏问题: 如果在测试集中出现了一个词,这个词在训练集中没有出现过
      • 导致未登录词的概率为0(解决方案:给每一个词都初始化一个很小的概率,即平滑操作,从而将计数的稀疏矩阵转换为稠密矩阵)
      • 导致分母为零, 且包含这个未登录词的三元组计数都为0(解决办法:只看前两个词/前一个词)。
    • 存储问题:计数需要存储所有出现的n-gram, 复杂度可能为n的指数量级。

    此外,当n越大时,理论上预测效果越好,但稀疏问题会变得非常严峻。

    1.3 为什么要研究语言建模

    • 语言建模是衡量我们对自然语言理解的一项基本任务(benchmark task)
    • 这是很多语言任务的子模块之一,例如:
      • 预测输入
      • 语音识别
      • 手写字符识别
      • 拼写/语法检查
      • 机器翻译
      • 自动摘要

    1.4 LM理解

    LM是指一个用来预测下一个词的系统,RNN不是LM,只是一种实现LM的方式。

    二、神经网络语言模型

    2.1 基于窗口的语言模型

    上一节课我们用到了这个模型
    在这里插入图片描述
    这个模型带来以下提升:

    • 没有稀疏问题
    • 不需要存储所有的grams片段

    仍然存在的问题:

    • 固定的窗口太小
    • 增大窗口就需要增大W
    • 由于窗口再大都不为过,那么W也就可能无限增大
    • 权重中每个部分只学到了窗口中某个位置的信息。

    因此我们需要一个能够处理任意长度的神经网络结构。

    2.2 RNN

    注意下面这里的y^\hat y实际上就是RNN隐藏层的状态向量。
    在这里插入图片描述
    当t=0时,h0就是隐藏层初始状态,t>0时,隐藏层的计算公式如下:
    h(t)=σ(Whh(t1)+Wee(t)+bh)(2.2.1)h^{(t)} = \sigma (W_hh^{(t-1)} + W_ee^{(t)} + \boldsymbol b_h) \tag {2.2.1}
    y^(t)=softmax(Uh(t)+bU)\hat y^{(t)} = softmax(Uh^{(t)} + \boldsymbol b_U)
    这里的WhW_h类似马尔科夫链中的转移矩阵。
    在这里插入图片描述

    2.3 RNN优缺点

    优点:

    • 处理任意长度输入序列
    • 计算一个时间步可以利用前面多个时间步的信息
    • 由于对每个时间步使用同一个权重,学习到的信息是对称的

    缺点:

    • 并行度低,计算慢
    • 实际使用时只有短距离的信息依赖

    2.4 如何训练RNN模型

    1. 对于一个语料库构成的一个文本序列x(1),,x(T)x^{(1)}, \cdots, x^{(T)}, 将其喂给RNN,对每个x(t)x^{(t)}, 都输出一个y^(t)\hat y^{(t)}(一个n-class维向量)

    2. 损失函数是在每一个y^(t)\hat y^{(t)}处使用一个softmax函数将其转换为概率分布,并用交叉熵计算其损失
      J(t)(θ)=CE(y(t),y^(t))=wVyw(t)logy^w(t)=logy^xt+1(t) J ^ { ( t ) } ( \theta ) = C E \left( \boldsymbol { y } ^ { ( t ) } , \hat { \boldsymbol { y } } ^ { ( t ) } \right) = - \sum _ { w \in V } \boldsymbol { y } _ { w } ^ { ( t ) } \log \hat { \boldsymbol { y } } _ { w } ^ { ( t ) } = - \log \hat { \boldsymbol { y } } _ { x t + 1 } ^ { ( t ) }

    3. 将这T个交叉熵平均作为整体损失:
      J(θ)=1Tt=1TJ(t)(θ)=1Tt=1Tlogy^xt+1(t) J ( \theta ) = \frac { 1 } { T } \sum _ { t = 1 } ^ { T } J ^ { ( t ) } ( \theta ) = \frac { 1 } { T } \sum _ { t = 1 } ^ { T } - \log \hat { \boldsymbol { y } } _ { \boldsymbol { x } _ { t + 1 } } ^ { ( t ) }

    4. 老规矩,在整个数据集上面计算一次损失并更新代价太大,因此使用SGD,通常将语料中的一句话作为一个序列,每次更新使用多句话构成一个batch.

    2.5 RNN反向传播

    2.5.1 基本计算公式及其推导

    如何计算J(t)(θ)J^{(t)}(\theta)对重复使用的权重矩阵WhW_h的偏导?先给出ppt的答案:
    J(t)Wh=i=1tJ(t)Wh(i) \frac { \partial J ^ { ( t ) } } { \partial \boldsymbol { W } _ { \boldsymbol { h } } } = \left. \sum _ { i = 1 } ^ { t } \frac { \partial J ^ { ( t ) } } { \partial \boldsymbol { W } _ { \boldsymbol { h } } } \right| _ { ( i ) }
    来看看课堂上的推导讲解,这里要知道在每一个样本的计算中,Wh=Wh(1)==Wh(T)W_h = W_h|_{(1)} = \cdots = W_h|_{(T)}, 因为训练过程中每一个batch计算完才会更新一次。
    在这里插入图片描述
    这个看着可能还是不太能理解,我们从数学公式上下手也很简单。根据公式2.2.1:
    h(t)=σ(Whh(t1)+Wee(t)+bh)h^{(t)} = \sigma (W_hh^{(t-1)} + W_ee^{(t)} + b_h)
    u=Whh(t1)+Wee(t)+bhu = W_hh^{(t-1)} + W_ee^{(t)} + \boldsymbol b_h, 由于h(t1)h^{(t-1)}是W的函数,J(t)J^{(t)} 为与h(t)h^{(t)}相关的交叉熵损失,因此直接考虑
    h(t)Wh=h(t)σ(u)(uW+uh(t1)h(t1)W)=h(t)Wh(t)+λh(t1)Wh\begin{aligned} \frac { \partial h ^ { ( t ) } } { \partial { W } _ { \boldsymbol { h } } } & =\frac { \partial h ^ { ( t ) } } {\sigma(u)} (\frac{\partial u}{\partial W} + \frac{\partial u}{\partial h^{(t-1)}}\frac{\partial h^{(t-1)}}{\partial W}) \\ &= \left. \frac { \partial h ^ { ( t ) } } {\partial W_h}\right|_{(t)}+ \lambda\frac { \partial h ^ { ( t -1) } } {\partial W_h} \end{aligned}
    可以看到这个式子能够被递归展开,而且展开的深度为t。要注意这里是对所有time-step权重求偏导,而反向传播时是一步一步的计算,不需要递归展开。

    2.5.2 时间序上的反向传播

    由于RNN的真实输出为最后一个time-step的隐藏层h(T)h^{(T)}, 因此反向传播要从这里开始,计算最后一个时间步对W的梯度。整个方向传播的结果就相当于2.5.1中的计算公式。
    在这里插入图片描述

    2.5.3 RNN-LM文本预测及生成

    直接预测下一个time-step的隐藏层向量即可。RNN可以模仿任意语言风格,甚至能够精确的学习到语言中的引号匹配等问题。

    2.6 RNN其他用法

    1. 序列标注(词性标注、命名实体识别)
      在这里插入图片描述
    2. 情感分类
      在这里插入图片描述
    3. 用作编码器模块(encoder module)
      在这里插入图片描述
    4. 用于语音识别、手写字符识别、自动摘要等文本生成任务
      在这里插入图片描述

    三、评价语言模型:困惑度(perplexity)

    使用困惑度评价指标,直观上理解该公式,就是要使LM预测给定语料的概率尽可能大。
    perplexitv=t=1T(1PLM(x(t+1)x(t),,x(1)))1/T=t=1T(1y^xt+1(t))1/T=exp(1Tt=1Tlogy^xt+1(t))=exp(J(θ))\begin{aligned} perplexitv &= \prod_{t=1}^{T}(\frac{1}{P_{LM}(x^{(t+1)}|x^{(t)},\cdots,x^{(1)})})^{1/T} \\ &= \prod _ { t = 1 } ^ { T } \left( \frac { 1 } { \hat { \boldsymbol { y } } _ { x _ { t + 1 } } ^ { ( t ) } } \right) ^ { 1 / T } \\&= \exp \left( \frac { 1 } { T } \sum _ { t = 1 } ^ { T } - \log \hat { \boldsymbol { y } } _ { \boldsymbol { x } _ { t + 1 } } ^ { ( t ) } \right) \\ &= \exp ( J ( \theta ) ) \end{aligned}
    这与我们训练时的目标函数一致,越小的困惑度的模型越好。除此之外,也可以使用word error rate来评价模型。

    四、术语笔记

    1. 本节课中的RNN被称作普通RNN(vanilla RNN)
    2. RNN升级版:GRU、LSTM、多层RNN
    3. 课程结束应该能理解“stacked bidirectional LSTM with residual connections and self-attention”这样的术语。
    展开全文
  • R语言与网站分析

    2014-09-05 15:31:55
    7.4.3 反向传播算法 276 7.4.4 R 语言实现 282 7.4.5 隐藏层中神经单元数 目的确定 283 7.5 分类器的性能评估 284 7.5.1 混淆矩阵 284 7.5.2 ROC 曲线和AUC 287 7.5.3 提升度和提升曲线 291 7.5.4 洛伦兹...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

反向传播神经网络建模基本原理