# [神经网络(Neural Network)——表示](https://www.cnblogs.com/python27/p/MachineLearningWeek04.html)
## 动机(Motivation)
对于非线性分类问题,如果用多元线性回归进行分类,需要构造许多高次项,导致特征特多学习参数过多,从而复杂度太高。
## 神经网络(Neural Network)
一个简单的神经网络如下图所示,每一个圆圈表示一个神经元,每个神经元接收上一层神经元的输出作为其输入,同时其输出信号到下一层,其中每一层的第一个神经元称为bias unit,它是额外加入的其值为1,通常用+1表示,下图用虚线画出。
![](https://images2015.cnblogs.com/blog/353956/201512/353956-20151222132136327-452094003.jpg)
符号说明:
* a(j)i
表示第j层网络的第i个神经元,例如下图a(2)1* 就表示第二层的第一个神经元
* θ(j)
表示从第j层到第j+1层的权重矩阵,例如下图所有的θ(1)* 表示从第一层到第二层的权重矩阵
* θ(j)uv
表示从第j层的第v个神经元到第j+1层的第u个神经的权重,例如下图中θ(1)23* 表示从第一层的第3个神经元到第二层的第2个神经元的权重,需要注意到的是下标uv是指v->u的权重而不是u->v,下图也给出了第一层到第二层的所有权重标注
* 一般地,如果第j层有sj
个神经元(不包括bias神经元),第j+1层有sj+1个神经元(也不包括bias神经元),那么权重矩阵θj的维度是(sj+1×sj+1)
## 前向传播(Forward Propagration, FP)
后一层的神经元的值根据前一层神经元的值的改变而改变,以上图为例,第二层的神经元的更新方式为
a(2)1\=g(θ(1)10x0+θ(1)11x1+θ(1)12x2+θ(1)13x3)
a(2)2\=g(θ(1)20x0+θ(1)21x1+θ(1)22x2+θ(1)23x3)
a(2)3\=g(θ(1)30x0+θ(1)31x1+θ(1)32x2+θ(1)33x3)
a(2)4\=g(θ(1)40x0+θ(1)41x1+θ(1)42x2+θ(1)43x3)
其中g(z)为sigmoid函数,即g(z)\=11+e−z
### 1\. 向量化实现(Vectorized Implementation)
如果我们以向量角度来看待上述的更新公式,定义
a(1)\=x\=⎡⎣⎢⎢⎢x0x1x2x3⎤⎦⎥⎥⎥
z(2)\=⎡⎣⎢⎢⎢z(2)1z(2)1z(2)1⎤⎦⎥⎥⎥ θ(1)\=⎡⎣⎢⎢⎢θ(1)10θ(1)20θ(1)30θ(1)11θ(1)21θ(1)31θ(1)12θ(1)22θ(1)32θ(1)13θ(1)23θ(1)33⎤⎦⎥⎥⎥
则更新公式可以简化为
z(2)\=θ(1)a(1)
a(2)\=g(z(2))
z(3)\=θ(2)a(2)
a(3)\=g(z(3))\=hθ(x)
可以看到,我们由第一层的值,计算第二层的值;由第二层的值,计算第三层的值,得到预测的输出,计算的方式一层一层往前走的,这也是***前向传播***的名称由来。
### 2\. 与Logistic回归的联系
![](https://images2015.cnblogs.com/blog/353956/201512/353956-20151222224556952-10712436.jpg)
考虑上图没有隐藏层的神经网络,其中x\=⎡⎣⎢⎢⎢x0x1x2x3⎤⎦⎥⎥⎥
,θ\=\[θ0θ1θ2θ3\],则我们有hθ(x)\=a(2)1\=g(z(1))\=g(θx)\=g(x0θ0+x1θ1+x2θ2+x3θ3)
,可以看到这**正是Logistic回归的假设函数!!!**这种关系表明Logistic是回归是不含隐藏层的特殊神经网络,神经网络从某种程度上来说是对logistic回归的推广。
## 神经网络示例
对于如下图所示的线性不可分的分类问题,(0,0)(1,1)为一类(0,1)(1,0)为另一类,神经网络可以解决(见5)。首先需要一些简单的神经网络(1-4),其中图和真值表结合可以清楚的看出其功能,不再赘述。
![](https://images2015.cnblogs.com/blog/353956/201512/353956-20151223214953046-1750745155.png)
### 1\. 实现AND操作
![](https://images2015.cnblogs.com/blog/353956/201512/353956-20151223094529984-616170583.png)
### 2\. 实现OR操作
![](https://images2015.cnblogs.com/blog/353956/201512/353956-20151223094752015-250805061.png)
### 3\. 实现非操作
![](https://images2015.cnblogs.com/blog/353956/201512/353956-20151223211654468-561696106.png)
### 4\. 实现NAND=((not x1) and (not x2))操作
![](https://images2015.cnblogs.com/blog/353956/201512/353956-20151223224449531-1004396444.png)
### 5\. 组合实现NXOR=NOT(x1 XOR x2) 操作
该神经网络用到了之前的AND操作(用红色表示)、NAND操作(用青色表示)和OR操作(用橙色表示),从真值表可以看出,该神经网络成功地将(0, 0)(1,1)分为一类,(1,0)(0,1)分为一类,很好解决了线性不可分的问题。
![](https://images2015.cnblogs.com/blog/353956/201512/353956-20151223214757187-836059596.png)
## 神经网络的代价函数(含正则项)
J(Θ)\=−1m\[∑i\=1m∑k\=1Ky(i)klog(hθ(x(i)))k+(1−y(i)k)log(1−(hθ(x(i)))k)\]+λ2m∑l\=1L−1∑i\=1sl∑j\=1sl+1(Θ(l)ji)2
符号说明:
* m
* — 训练example的数量
* K
— 最后一层(输出层)的神经元的个数,也等于分类数(分K类,K≥3* )
* y(i)k
— 第i个训练exmaple的输出(长度为K个向量)的第k* 个分量值
* (hθ(x(i)))k
— 对第i个example用神经网络预测的输出(长度为K的向量)的第k* 个分量值
* L
* — 神经网络总共的层数(包括输入层和输出层)
* Θ(l)
— 第l层到第l+1* 层的权重矩阵
* sl
— 第l层神经元的个数, 注意i* 从1开始计数,bias神经元的权重不算在正则项内
* sl+1
— 第l+1
* 层神经元的个数
## 参考文献
\[1\] Andrew Ng Coursera 公开课第四周
\[2\] Neural Networks. https://www.doc.ic.ac.uk/~nd/surprise\_96/journal/vol4/cs11/report.html
\[3\] The nature of code. http://natureofcode.com/book/chapter-10-neural-networks/
\[4\] A Basic Introduction To Neural Networks. http://pages.cs.wisc.edu/~bolo/shipyard/neural/local.html
- BP神经网络到c++实现等--机器学习“掐死教程”
- 训练bp(神经)网络学会“乘法”--用”蚊子“训练高射炮
- Ann计算异或&前馈神经网络20200302
- 神经网络ANN的表示20200312
- 简单神经网络的后向传播(Backpropagration, BP)算法
- 牛顿迭代法求局部最优(解)20200310
- ubuntu安装numpy和pip3等
- 从零实现一个神经网络-numpy篇01
- _美国普林斯顿大学VictorZhou神经网络神文的改进和翻译20200311
- c语言-普林斯顿victorZhou神经网络实现210301
- bp网络实现xor异或的C语言实现202102
- bp网络实现xor异或-自动录入输入(写死20210202
- Mnist在python3.6上跑tensorFlow2.0一步一坑20210210
- numpy手写数字识别-直接用bp网络识别210201