在上一篇笔记中我们一起学习了单层感知器的原理,但针对于异或问题。我们的单层神经网络就束手无策了

*异或运算: 0 0 输出为0,0 1输出为1, 1 0输出为 1, 1 1输出为 0

即,针对以下四个点(0,0)(0,1)(1,0)(1,1)对应标签0 ,1,1,0时,我们无法完成分类。

运算结果如图所示

这时候我们就要引入一个新的东西-线性神经网络

我们都知道感知器的激活函数时sign函数,即

该函数只有两个输出值,1和 -1。而线性神经网络的激活函数为 y = x, 即输出值可以为任意实数

线性神经网络采用的时LMS算法来调整网络权值和偏置

LMS算法简介

该算法的学习信号为

与感知器的非常相似,只是这里的实际输出为Wj .T*X ,相比于感知器,这里少了sign函数。其他则都差不太多。

线性神经网络结构

这里在输出的时候同时运用了线性函数和sign函数。为什么呢?

因为在运算时我们可以通过线性函数得到更好的结果,而输出的时候,因为我们的标签只有两个。假设我们不用sign函数,那输出结果可能有0.2 0.8 -0.3 -0.7,这样就无法分类了

为了完成我们的异或问题分类任务,我们先看下预备知识:

Delta学习规则:该学习规则也被称为来纳许感知器学习规则,Delta学习规则是利用梯度下降法的一般性学习规则。

代价函数(损失函数 Lost Function):

其中误差E是权值 Wj 的函数,若思想让误差E最小,Wj 则应与误差的负梯度成正比,即

有代价函数,可推导出误差梯度为

手写推导过程如下:

梯度下降法:

针对梯度下降法的讨论在这里不做解释了,不太理解的朋友可以看下这个

梯度下降(Gradient Descent)小结​www.cnblogs.com

针对梯度下降法的问题也有几个,1.学习率难以选取 2.容易进入局部最优解。这篇文章中不对局部最优解问题进行讨论。大家知道这个概念就可以了

线性网络解决非线性问题:

通过对神经元添加非线性输入,从而引入非线性成分,使等效的输入维度变大。即从X1,X2扩展为 X1,X1^2,X1*X2,X2^2,X2


代码实现:

通过修改单层感知器的代码就可以做出线性网络了。

对于四个点(0,0)(0,1)(1,0)(1,1)根据其标签[0,1,1,0]进行分类

这里X的输入为[X0,X1,X2,X1^2,X1*X2,X2^2] ,对应的权值也随机了6个。

对于实际输出O进行了修改,去掉了sign函数。

样本修改为四个点。

之后我们要设定一个函数用来计算两条分割线 def calculate(x,root)

作图中我们要注意一下,这里的分类线不再是直线了

首先我们推导一下算式

(字丑见笑了)

大家都是接受过初中教育的,对于一元二次方程解法应该不陌生,通常一元二次方程有两个解(根),即root。通过计算我们可以看到a b c分别对应了哪些元素。

然后通过求根公式画出线段

最后运行代码

可以看到最后循环了一千次结束的循环(即并没有得到与期望值相同的实际输出)

源码:

import numpy as np
import matplotlib.pyplot as plt# 输入数据
X = np.array([[1, 0, 0, 0, 0, 0],  # 解决异或问题[1, 0, 1, 0, 0, 1],[1, 1, 0, 1, 0, 0],[1, 1, 1, 1, 1, 1]])# 存为标签(一一对应数据)
Y = np.array([-1, 1, 1, -1])# 随机权值,三行一列,取值范围(-1,1)
W = (np.random.random(6) - 0.5) * 2print('W=', W)
# 设置学习率
lr = 0.11# 设置迭代次数
n = 0
# 设置输出值
O = 0def update():global X, Y, W, lr, nn += 1O = np.dot(X, W.T)W_C = lr * ((Y - O.T).dot(X)) / X.shape[0]  # 平均权值W = W_C + W  # 修改权值for _ in range(1000):update()  # 更新权值print(W)print(n)O = np.dot(X, W.T)  # 计算神经网络输出if (O == Y.T).all():  # 如果实际输出等于期望输出,模型收敛print("finished")print("epoch:", n)break# 正样本(标签为1)
X1 = [1, 0]
Y1 = [0, 1]# 负样本(标签为0)
X2 = [0, 1]
Y2 = [0, 1]def calculate(x, root):a = W[5]b = W[2] + x * W[4]c = W[0] + x * W[1] + x * x * W[3]if root == 1:return (-b + np.sqrt(b * b - 4 * a * c)) / (2 * a)if root == 2:return (-b - np.sqrt(b * b - 4 * a * c)) / (2 * a)# 作图
xdata = np.linspace(-1, 2)plt.figure()plt.plot(xdata, calculate(xdata, 1), 'r')
plt.plot(xdata, calculate(xdata, 2), 'r')plt.plot(X1, Y1, 'bo')
plt.plot(X2, Y2, 'yo')
plt.show()

神经网络 异或_深度学习入门笔记(2)线性神经网络相关推荐

  1. 为什么深层神经网络难以训练_深度学习与统计力学(III) :神经网络的误差曲面...

    谷歌和斯坦福最新合作综述报告,发表在物理学的顶级期刊"凝聚态物理年鉴"(Annual Review of Condensed Matter Physics).作者Yasaman B ...

  2. 深度学习入门笔记(六):浅层神经网络

    专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分 ...

  3. 深度学习入门笔记(五):神经网络的编程基础

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  4. 深度学习入门笔记(二十):经典神经网络(LeNet-5、AlexNet和VGGNet)

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  5. 深度学习入门笔记(十八):卷积神经网络(一)

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  6. 深度学习入门笔记(十九):卷积神经网络(二)

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  7. 深度学习入门笔记(八):深层网络的原理

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  8. 深度学习入门笔记(四):向量化

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  9. 深度学习入门笔记(十二):深度学习数据读取

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

最新文章

  1. web前端培训之Javascript如何改变数组的长度?
  2. 基于特征点匹配的自适应目标跟踪算法
  3. QT STUDY 模型-视图-控制器
  4. DNS原理及其解析过程(转)
  5. nginx缓存服务器
  6. 操作系统【五】分段内存管理+段页式内存管理
  7. linux字符设备驱动之字符之异步通知
  8. linux 守护进程_网络工程师之linux守护进程
  9. sed的高级命令和软件包管理器rpm
  10. Parallels中使用加密狗读取文件出现错误
  11. mac maven安装与配置镜像
  12. 外国同行看中国互联网“微创新”
  13. Python pyd文件的制作和编译,以及程序源代码的保护
  14. 【开箱即用】HTML5教程
  15. 发现在创建云服务器ecs实例的磁盘快照时_阿里云服务器怎么重装系统 阿里云VPS如何重装系统...
  16. Web前端页面访问权限控制总结
  17. android课程设计体重测量仪,智能体重检测仪设计与实现
  18. 如何让企业员工不觉得知识库是个鸡肋,附带工具推荐
  19. 软件测试是否应该为软件质量背锅?
  20. 【a】标签的伪类选择器

热门文章

  1. WEB-移动端图片适配-弹框
  2. pytorch 画loss曲线_Pytorch练习amp;#8211;绘制Loss曲线 - 易采站长站
  3. MySQL 存储过程的变量
  4. send/receive h264/aac file/data by rtp/rtsp over udp/tcp
  5. 实验二 20145237 20155226 2015234 实验报告 固件程序设计
  6. C#中如何动态加载DockPanel
  7. 让网页图片变灰色的三种方法
  8. 段错误原理:Segmentation fault: 11
  9. android 权限
  10. C++之基类构造函数初始化