神经网络-前向算法

神经网络-前向算法

直观来看一波, 神经网络是咋样的.

  • 多个输入: 首先进行归一化
  • 神经元: 是一个抽象出来的概念, 多个输入的加权和
  • 中间是各神经元, 以"层"的方式的 "映射"
  • 输出了一个概率(向量)

前向算法

我们首先好奇的就是, 输入 --> 到输出是如何计算的, 看一波最简单的网络3层结构.

  • 输入层: 即看到最左边的3个输入节点
  • 线条: 权值, 图中的每根线条代表一个权值
  • 隐含层: 输入节点的加权和(各节点) + 偏置(bias)
  • A: 激活函数( Activation Function), 常用的有 ‘S‘型函数, 如 logic, tanh 等.
  • Softmax: 是一类函数统称, 将输出值映射为0-1之间
  • 输出层: 最后输出的一个向量, 每个分量的值之和为1

Tips:

隐含层可以多层; 偏置项 bias 是为了防止节点是 0的情况

激活函数: f(x) -> 0 -1 之间 将一个实值映射到 0-1之间

Softmat: f([x1, x2, x3]) -> [0.5, 0.3, 0.2] 将一个向量, "归一化" 的感觉

如何计算隐含层节点的值? 以1.23为例

\((1.23 = 0.5*0.1 + 0.8*0.1 + 1*0.7) + 0.4 = 1.23\)

1.23 -> 激活函数(1.23) -> 0.84

....

可以看出, 隐含层的第一个节点的值, 为前一层的所有节点的值的加权和, 再加上偏置

然后再通过激活函数, 然后... 最后再通过一个 Softmax 输出一个概率概率向量.

Activation Function 激活函数

作用: 将一个实数, 映射到 0-1 之间

比如常见的 双曲正切函数 tanh x

\(tanh\ x = \frac {sinh \ x}{cosh\ x} = \frac {e^{x} - e^{-x}} {e^{x} +e^{-x}} = \frac {e^{2x-1}} {e^{2x+1}}\)

>>> import math
>>> import numpy as np

>>> math.tanh(1.145)
0.8160909001379913

>>> np.tanh([1.66, -1.66])
array([ 0.93021718, -0.93021718])

>>> np.tanh([0.88, 1.23, 6.14, 10])
array([0.70641932, 0.84257933, 0.99999071, 1.000...])

感觉这玩意, 映射得有点猛, x 在 [-2, 2] 之间有点 "s"的波动, 超过 2就基本接近于 1了, 变化非常平缓. 像上边图中的 1.23的节点, 可以经过激活函数, 即 \(tanh\ (1.23) = 0.84\)... 以此类推.

隐含层节点, 通过激活函数的映射, 得到隐含层的输出节点. 这些节点跟 输出层的节点, 也是有 "连接, 线条(权重)"的关系的. 跟前面计算隐含层的节点是一样的计算方式.

图中2.08 是如何计算的

\((0.84 * 0.5 + 0.64 * 0.7 + 0.8 * 0.1 + 0.76 * 0.7) + 0.6 = 2.08\)

1.81 也是同样的算法

然后, 我们的目标, 是想输出一个概率值, 这里假设, 我们是一个分类问题

即如何将输出层的节点 \([2.08, 1.81]\) 变得像一个概率分布呢? 最常用的一种方式就是 Softmax. 这也是目前, 被应用得最多的方式.

Softmax 归一化指数函数

作用: f([1,2,3]) -> [0.2, 0.3, 0. 5], 即将输入向量, 归一化为一个概率分布, 写严格一点就是:

\(\sigma: R^k \rightarrow \{ z \in R^k | z_i > 0, \sum \limits_{i=1}^k z_i = 1\}\)

其中对于向量的一个分量:

\(\sigma(x)_i = \frac {e^{x_i}} {\sum \limits_{i=1}^k e^{x_i}}\)

import numpy as np 

def softmax(arr):
    """向量指数归一化输出"""
    return np.exp(arr) / np.sum(np.exp(arr))

>>> softmax([1, 3, 5])

array([0.01587624, 0.11731043, 0.86681333])

Softmax 的 Overflow (溢出)

>>> softmax([100, 200, 300])
array([1.38389653e-87, 3.72007598e-44, 1.00000000e+00])

>>> softmax([1000, 2000, 3000]
... )
__main__:3: RuntimeWarning: overflow encountered in exp
__main__:3: RuntimeWarning: invalid value encountered in true_divide
array([nan, nan, nan])
>>> softmax([1000, 2000, 3000])
array([nan, nan, nan])

就会发现, 数学推导和写代码实现, 根本就是两码事. 推导是非常完美和直观的, 但写成代码一跑, 当值一大的话, 就overflow 了. 为啥呢, 因为, 计算机存储值是有 "精度" 的呀. 因此, 为了避免这种 bug, 从数学上, 将每个值 减去 该向量中的最大值 即可.

\(\frac {e^{x_i}} {\sum \limits_{i=1}^k e^{x_i}} = \frac {e^{x_i}} {\sum \limits_{i=1}^k e^{x_i}} \frac {e^{-m}}{e^{-m}} = \frac {e^{x_i-m}} {\sum \limits_{i=1}^k e^{x_i-m}}\)

def softmax(arr):
    """向量指数归一化输出"""
    m = np.max(arr)
    return np.exp(arr - m) / np.sum(np.exp(arr - m))

# test
>>> softmax([3,4,5])
array([0.09003057, 0.24472847, 0.66524096])
>>> softmax([1000, 2000, 3000])
array([0., 0., 1.])   

把上图的 输出层节点 -> Softmax 得到了一个概率分布.

>>> softmax([2.08, 1.81])
array([0.5670929, 0.4329071])
>>>

即对于这样一个分类问题, 这个神经网络完成了:

  • 输入特征: [年龄, 收入, 性别] -> [ 0.5, 0.8, 1]
  • 输出概率: [ 买房, 不买房] -> [0.57, 0.43]

我的感觉是, 此处, 训练了网络结构的复杂函数, f, 完成了 \(R^{3} \rightarrow R^{2}\) 的一个非线性映射

小结

这个例子, 其实就是一个比较完整的 神经网络前向算法. 当然, 这里有个假设, 每个权值在已知的情况下.

首先, 有一个网络结构, 需要定义, 输入层有几个节点, 输出有几个节点,

然后, 每个隐含层, 有对应的偏置 bias, (为了防止输出为零的情况, 类似之前朴素贝叶斯中的平滑参数是一样的). 还有一个激活函数的选择, Softmax 的选择等.

接着, 要确定, 每个节点间的 "权值线条", 隐含层 到输出层的 "权值线条" 假设这些权值是已经训练好了的话,

最后, 给定一个输入, 则沿着网络结构, 往前走, 最后就输出了呀.

so, 现在的问题是, 如何通过样本来训练这些权值线条, 这就要用到 BP算法, 即咱常说的 误差向后传递. 下篇再整.

原文地址:https://www.cnblogs.com/chenjieyouge/p/12185352.html

时间: 2024-10-11 02:05:16

神经网络-前向算法的相关文章

传统神经网络ANN训练算法总结 参考 。 以后研究

http://blog.163.com/yuyang_tech/blog/static/21605008320146451352506/ 传统神经网络ANN训练算法总结 2014-07-04 17:13:52|  分类: deeplearning |  标签:ann  |举报|字号 订阅 下载LOFTER我的照片书  | 原文来自:http://blog.csdn.net/bluebelfast/article/details/17139095 ——————————以下为原文——————————

三层神经网络自编码算法推导和MATLAB实现 (转载)

转载自:http://www.cnblogs.com/tornadomeet/archive/2013/03/20/2970724.html 前言: 现在来进入sparse autoencoder的一个实例练习,参考Ng的网页教程:Exercise:Sparse Autoencoder.这个例子所要实现的内容大概如下:从给定的很多张自然图片中截取出大小为8*8的小patches图片共10000张,现在需要用sparse autoencoder的方法训练出一个隐含层网络所学习到的特征.该网络共有3

传统神经网络ANN训练算法总结

传统神经网络ANN训练算法总结 学习/训练算法分类 神经网络类型的不同,对应了不同类型的训练/学习算法.因而根据神经网络的分类,总结起来,传统神经网络的学习算法也可以主要分为以下三类: 1)前馈型神经网络学习算法-----(前馈型神经网络) 2)反馈型神经网络学习算法------(反馈型神经网络) 3)自组织神经网络学习算法------(自组织神经网络) 以下我们将通过三类典型的神经网络模型分别阐述这三类不同的学习算法其区别与相似点. 虽然针对不同的网络模型,这里产生了三类不同类型的训练算法,但

前向算法Python实现

前言 这里的前向算法与神经网络里的前向传播算法没有任何联系...这里的前向算法是自然语言处理领域隐马尔可夫模型第一个基本问题的算法. 前向算法是什么? 这里用一个海藻的例子来描述前向算法是什么.网上有关于前向算法的严格数学推导,不过感觉还是海藻的例子比较好一些.网上的例子有很多都是有问题的,在本文中也都进行了相应的修正. 状态转移矩阵 相关性矩阵 初始状态序列:Sunny(0.63),Cloudy(0.17),Rainy(0.20) 我们想要求一个观察序列{Dry, Damp, Soggy}的概

隐马尔可夫模型的前向算法(java实现),今天奉上

隐马尔可夫模型的前向算法(手动实现),今天奉上,由于研究生期间,实现的时候没有多加注释,这里为了让更好的人进入自然语言处理领域,特此,将前向算法奉上,具体公式可参考52nlp的HMN系列博客. 参考了大部分网站公式和借鉴.在此表示感谢. 后向算法和维特比算法,后续更新. HMM类: 1 package jxutcm.edu.cn.hmm.model;  2   3 import jxutcm.edu.cn.hmm.bean.HMMHelper;  4   5 /**  6  * 实现了 HMM(

前向算法的数学意义上的实现

首先是前向算法 前向算法demo文件:fwd_demo.m 1 %% 前向算法的demo 2 %% 验证的例子参见<统计学习方法>p177 3 %% 4 5 % (编码:红1,白2) 6 % 初始概率分布 7 pi=[0.2 0.4 0.4] 8 9 % 概率转移矩阵 10 A=[ 0.5 0.2 0.3; 11 0.3 0.5 0.2; 12 0.2 0.3 0.5] 13 14 % 观察矩阵(发射矩阵) 15 B=[ 0.5 0.5; 16 0.4 0.6; 17 0.7 0.3] 18

HMM条件下的 前向算法 和 维特比解码

一.隐马尔科夫HMM假设: 有且只有3种天气:0晴天,1阴天,2雨天 各种天气间的隔天转化概率mp: mp[3][3] 晴天 阴天 雨天 晴天 0.33333 0.33333 0.33333 阴天 0.33333 0.33333 0.33333 雨天 0.33333 0.33333 0.33333 有2种活动:            0去公园,1不去公园 各种天气下进行各种活动的概率: w2a[3][2] 去公园 不去公园 晴天 0.75 0.25 阴天 0.4 0.6 雨天 0.25 0.75

隐马尔可夫模型中基于比例因子的前向算法(java实现)

直接上干货哈,其他子算法,后续补上. 1 package jxutcm.edu.cn.hmm.model;  2   3 import jxutcm.edu.cn.hmm.bean.HMMHelper;  4 import jxutcm.edu.cn.util.TCMMath;  5   6 /**  7  * [改进后的前向算法]  8  * [带比例因子修正的前向算法 :计算观察序列的概率 ]  9  * [注意] 改进后,就没必要使用后向算法来求观测序列概率了,直接利用中间比例因子scal

HMM:前向算法实例

看本篇文章,假设你已经知道HMM中的前向算法相关概念 如果不知道,推荐先学习HMM学习最佳范例中相关文章 这个问题来自于HMM学习最佳范例五:前向算法5 只不过再手动算一下,加深一下自己的理解 已知隐马尔科夫模型如下: 1.隐藏状态 (天气):Sunny,Cloudy,Rainy: 2.观察状态(海藻湿度):Dry,Dryish,Damp,Soggy: 3.初始状态概率: Sunny(0.63), Cloudy(0.17), Rainy(0.20): 4.状态转移矩阵: 5.混淆矩阵: M=4(